MT4:インジケーターのMQL4サンプルまとめ

MT4:インジケーターのMQL4サンプルまとめ

MT4 の MQL4 でつくるインジケーターのよく使う組み合わせをまとめてみました(主に自分用)。どれもコピペで機能をつけ加えることができる簡単なものです。

今後も、新たに見つけたり思いついたものがあれば、ここに加えていく予定です!

MT4:インジケーターのMQL4サンプルまとめ

  1. 特定の条件下でアラート、メール、アプリのプッシュ通知
  2. 2本のラインの間を塗りつぶす

1. 特定の条件下でアラート、メール、アプリのプッシュ通知

MQL4

input bool D_Alert     = false; //アラート機能
input bool M_Alert     = false; //メール機能
input bool P_Alert     = false; //プッシュ通知機能
input bool Sig_Alert   = false; //シグナルのアラート

double GCBuffer[];
double DCBuffer[];

datetime b4time;

// 初期化処理
int OnInit() {

   SetIndexBuffer( /*適切な数字*/ ,GCBuffer );
   SetIndexBuffer( /*適切な数字*/ ,DCBuffer );

   return( INIT_SUCCEEDED );
}

// ゴールデンクロス・デットクロスを計算する
void calcGcDc( int i ){
    // 計算処理
}

// 計算処理
int OnCalculate( const int rates_total
               , const int prev_calculated
               , const datetime &time[]
               , const double &open[]
               , const double &high[]
               , const double &low[]
               , const double &close[]
               , const long &tick_volume[]
               , const long &volume[]
               , const int &spread[]) {

   bool check1 ,check2 ,newGC ,newDC ,someSig;
   string title ,titleSig ,text ,textSig;

   int limit = rates_total - prev_calculated;
   if( prev_calculated > 0 ) limit++;
   
   bool isNewCandle = Time[0]!=b4time && limit==2;

   if( isNewCandle ) {
      calcGcDc(1);
   
      check1 = D_Alert || M_Alert || P_Alert;
      check2 = Sig_Alert;
      
      if( check1 && check2 ) {
         newGC = GCBuffer[1] != EMPTY_VALUE;
         newDC = DCBuffer[1] != EMPTY_VALUE;
         
         someSig = ( Sig_Alert && ( newGC || newDC ) );
         
         if( someSig ) {
            textSig = Sig_Alert ? ( newGC ? "GC Sig Line!! " : ( newDC ? "DC Sig Line!! " : "" ) ) : "";
            text = "( "+StringSubstr( Symbol() ,0 ,6 )+" - "+IntegerToString( Period() )+" )  "+textSig;
            
            if( D_Alert ) Alert( text );
            if( P_Alert ) SendNotification( text );
   
            if( M_Alert ) {
               titleSig = Sig_Alert ? newGC ? "GC Sig!" : newDC ? "DC Sig!" : "" : "";
               title = "( "+StringSubstr( Symbol() ,0 ,6 )+" - "+IntegerToString( Period() )+" )  "+titleSig;
               SendMail( title ,text );
            }
         }
      }
   }

   b4time = Time[0];
   return( rates_total );
}

目次へ

2. 2本のラインの間を塗りつぶす

TradingViewだと、標準でついている機能。MT4だと対応していない。2本の線の間に縦線(ヒストグラム)を描画することはできるけど、見づらいしカッコわるい。あと、オシレーターではそれすらできない。MT4では三角形を大量に描画することで似たようなことが実現できる。

NQL4

input int Show_fill   = 200; //塗りつぶしの表示期間(多いと重い、0で非表示)

datetime b4time;

// ラインの間を塗りつぶすための関数
void PaintFill( int k ,bool repaint ) {
    
    if( !repaint ) obj_num++;    
    string objname1 = obj_prefix + IntegerToString( obj_num ) + "-1";
    string objname2 = obj_prefix + IntegerToString( obj_num ) + "-2";
    
    datetime t0 = Time[k] ,t1 = Time[k+1];
    double a0 = mSlowD[k] ,a1 = mSlowD[k+1];
    double b0 = lSlowD[k] ,b1 = lSlowD[k+1];
    
    color c0 = a0 >= b0 ? c_up : c_down;
    color c1 = a1 >= b1 ? c_up : c_down;
    
    if( !repaint ) {
       ObjectCreate( objname1 ,OBJ_TRIANGLE ,win ,t1,a1 ,t1,b1 ,t0,a0 );
       ObjectCreate( objname2 ,OBJ_TRIANGLE ,win ,t1,b1 ,t0,a0 ,t0,b0 );
       ObjectSet( objname1 ,OBJPROP_SELECTABLE ,false);
       ObjectSet( objname2 ,OBJPROP_SELECTABLE ,false);
       ObjectSet( objname1 ,OBJPROP_HIDDEN ,true);
       ObjectSet( objname2 ,OBJPROP_HIDDEN ,true);
    } else {
       ObjectMove( objname1 ,0 ,t1,a1 );
       ObjectMove( objname1 ,1 ,t1,b1 );
       ObjectMove( objname1 ,2 ,t0,a0 );
       ObjectMove( objname2 ,0 ,t1,b1 );
       ObjectMove( objname2 ,1 ,t0,a0 );
       ObjectMove( objname2 ,2 ,t0,b0 );
    }
    ObjectSet( objname1 ,OBJPROP_COLOR ,c1);
    ObjectSet( objname2 ,OBJPROP_COLOR ,c0);
}

int OnInit() {
   // 塗りつぶしのオブジェクトをすべて削除
   ObjectsDeleteAll( chart_id ,obj_prefix );

   // 各種処理
}

// インジケーター削除時の処理
void OnDeinit( const int reason ) {
   // 塗りつぶしのオブジェクトをすべて削除
   ObjectsDeleteAll( chart_id ,obj_prefix );       
}

// 計算処理
int OnCalculate( const int rates_total
               , const int prev_calculated
               , const datetime &time[]
               , const double &open[]
               , const double &high[]
               , const double &low[]
               , const double &close[]
               , const long &tick_volume[]
               , const long &volume[]
               , const int &spread[] ) {

   int limit = rates_total - prev_calculated;
   if( prev_calculated > 0 ) limit++;

   bool isNewCandle = Time[0]!=b4time && limit==2;

   if( !isNewCandle )
      if( Show_fill > 0 ) PaintFill( 0 ,true );   
   
   if( isNewCandle ) {
      if( Show_fill > 0 ) {
         ObjectsDeleteAll( chart_id ,obj_prefix );
         for( int i=rates_total-2; i>=0; i-- ) {
            if( i < Show_fill ) PaintFill( i ,false );
         }
      }
   }
   
   b4time = Time[0];
   return( rates_total );
}

目次へ

Back to Top

abbamboo

タカハシ / 7年目の兼業トレーダー

このブログの目的は、「学習の備忘録」と「アウトプットして理解を深めること」。「トレードで稼ぐために学んだこと」を徹底的に公開していきます。

元・日本料理の板前、現・金融畑のウェブ屋さん
保有資格:証券外務員1種、認定テクニカルアナリスト

更新のお知らせは、各SNSやLINEで。LINEだと1対1でお話することもできます!

>> このブログと著者についての詳細
>> 使っているツールの紹介

Investment Tech Hack

Sorry... doesn't support your browser

To get the best possible experience using our site we recommend that you upgrade to a modern web browser. Investment Tech Hackではご利用中のブラウザサポートはしていません。
Internet Explorerのアップグレード行う、もしくはその他のブラウザを使用しての閲覧をお願いします。