オリジナルインディケータをサブウィンドウ側に表示する

MT4
スポンサーリンク

MT4(MQL4)でオリジナルインディケータを作った際、MACDとかのようにサブウィンドウ側に表示したい!となった時に場合について解説します。

サブウィンドウに表示するコード

#property indicator_separate_window

やり方自体はとても簡単で、この1文を先頭部に追加するだけでサブウィンドウに表示されるようになります。

サンプルソース

MACDが下から上へゴールデンクロスした場合は-1、上から下へデッドクロスした場合は+1、それ以外は0とする簡単なサンプルです。

//+------------------------------------------------------------------+
//|                                                         test.mq4 |
//|                                    Copyright 2020, mef Software. |
//|                                             https://fx-prog.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, mef Software."
#property link      "https://fx-prog.com/"
#property version   "1.00"
#property strict
#property indicator_separate_window
     
#property indicator_buffers 1
#property indicator_color1 Red
     
int BarLimit=1000;
     
     
double CrossJyoutai[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
{
   //ライン格納用
   ArrayInitialize(CrossJyoutai,EMPTY_VALUE);
   SetIndexBuffer(0,CrossJyoutai);   
   SetIndexStyle(0,DRAW_SECTION);
     
   //0ライン用
   SetLevelValue(0,0);
           
   return(INIT_SUCCEEDED);
}
     
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
{
     
   init();
   int i;
     
   //----現在から過去で見る
   for(i=BarLimit; i>=0; i--)
   {
      if(getMACDSign(3,1,i)==true)
      {
         CrossJyoutai[i]=1;
      }
      else if(getMACDSign(4,1,i)==true)
      {
         CrossJyoutai[i]=-1;
      }
      else
      {
         CrossJyoutai[i]=0;
      }
     
     
   }
   return(0);
}
//+------------------------------------------------------------------+
     
//+------------------------------------------------------------------+
//|【関数】MACDのクロスを探す                                              |
//|                                                                  |
//|【引数】 IN OUT  引数名             説明                            |
//|        --------------------------------------------------------- |
//|       ○      aType              上下                             |
//|                                      1:下から上へ                 |
//|                                      2:上から下へ                 |
//|                                      3:下から上へ(マイナス域の場合のみ)|
//|                                      4:上から下へ(プラス域の場合のみ) |
//|                                                                  |
//|       ○      limit              どこまで遡るか                      |
//|       ○      i                  現在のBar位置                    |
//|【戻値】True(クロス有り) or False(クロス無し)                             |
//|                                                                  |
//|【備考】なし                                                         |
//+------------------------------------------------------------------+
bool getMACDSign(int type,int limit,int i)
{
   int n;
   bool sign = false;
   double MACD_1,Signal_1,MACD_2,Signal_2;
     
   limit = i + limit;
   i     = i + 1;
        
   //下から上へのクロス
   if(type==1){
      for(n=i;n<=limit;n++){
         MACD_1 = iCustom(NULL,0,"MACD",12,26,9,0,n);
         MACD_2 = iCustom(NULL,0,"MACD",12,26,9,0,n+1);         
         Signal_1 = iCustom(NULL,0,"MACD",12,26,9,1,n);      
         Signal_2 = iCustom(NULL,0,"MACD",12,26,9,1,n+1);      
           
         if(MACD_2 <= Signal_2 && MACD_1 > Signal_1)      
         {
            sign=true;
            break;
         }
      }
   }
   //上から下へのクロス
   else if(type==2){
      for(n=i;n<=limit;n++){
         MACD_1 = iCustom(NULL,0,"MACD",12,26,9,0,n);
         Signal_1 = iCustom(NULL,0,"MACD",12,26,9,1,n);      
         MACD_2 = iCustom(NULL,0,"MACD",12,26,9,0,n+1);
         Signal_2 = iCustom(NULL,0,"MACD",12,26,9,1,n+1);
              
         if(MACD_2 >= Signal_2 && MACD_1 < Signal_1)
         {
            sign=true;
            break;
         }
      }
   }
     
   //下から上へのクロス
   if(type==3){
      for(n=i;n<=limit;n++){
         MACD_1 = iCustom(NULL,0,"MACD",12,26,9,0,n);
         MACD_2 = iCustom(NULL,0,"MACD",12,26,9,0,n+1);         
         Signal_1 = iCustom(NULL,0,"MACD",12,26,9,1,n);      
         Signal_2 = iCustom(NULL,0,"MACD",12,26,9,1,n+1);      
           
         if(MACD_2 <= Signal_2 && MACD_1 > Signal_1 && MACD_1 <= 0 )
         {
            sign=true;
            break;
         }
      }
   }
   //上から下へのクロス
   else if(type==4){
      for(n=i;n<=limit;n++){
         MACD_1 = iCustom(NULL,0,"MACD",12,26,9,0,n);
         Signal_1 = iCustom(NULL,0,"MACD",12,26,9,1,n);      
         MACD_2 = iCustom(NULL,0,"MACD",12,26,9,0,n+1);
         Signal_2 = iCustom(NULL,0,"MACD",12,26,9,1,n+1);
              
         if(MACD_2 >= Signal_2 && MACD_1 < Signal_1 && MACD_1 >= 0 )
         {
            sign=true;
            break;
         }
      }
   }
        
   return(sign);
}

サブウィンドウに表示されるようになりました。

コンパイル方法等分からないという場合はこちら

コメント