【MQL4テクニック】サインツールの作り方。コピペ+αで今すぐにオリジナルサインツールが作れます!!

MQL4テクニック

MT4で使えるサインツールなどを作るために、矢印サインをチャートに表示する方法をご紹介します。

作り方は「オブジェクト型」と「バッファ型」の2パターンがあります。
バッファ型サインツールを紹介するブログやエンジニアが多いようですが、個人的には圧倒的にオブジェクト型をオススメします。

バッファ型だけでサインツールを作ってきた方も、これを機に是非お試しください。

オブジェクト型のサインを表示

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 - 1;
   if(limit < 0) limit = 1;
   for(int shift = 0; shift < limit; shift++){
   
      ObjectDelete("obj" + Time[shift]); 
      
      int anchor, arrow_code;
      double signPos;

      if (/*ハイエントリー条件*/){
         signPos = Low[shift];
         anchor = ANCHOR_TOP;
         arrow_code = 233;
      }

      if (/*ローエントリー条件*/){
         signPos = High[shift];
         anchor = ANCHOR_BOTTOM;
         arrow_code = 234;
      }
      
      ObjectCreate("obj" + Time[shift], OBJ_ARROW, 0, Time[shift], signPos);
      ObjectSetInteger(0, "obj" + Time[shift], OBJPROP_ANCHOR, anchor);
      ObjectSetInteger(0, "obj" + Time[shift], OBJPROP_ARROWCODE, arrow_code);
      ObjectSetInteger(0, "obj" + Time[shift], OBJPROP_COLOR, clrYellow);
      ObjectSetInteger(0, "obj" + Time[shift], OBJPROP_WIDTH, 1);
   }
   return(rates_total);
}

全体を見ると長く感じますが、やっていることはそこまで難しくありません。

それでは順番にコードの意味を解説していきます。

//ハイエントリー
signPos = Low[shift];
anchor = ANCHOR_TOP;      
ObjectCreate("obj" + Time[shift], OBJ_ARROW, 0, Time[shift], signPos);
ObjectSetInteger(0, "obj" + Time[shift], OBJPROP_ANCHOR, anchor);

//ローエントリー
signPos = High[shift];
anchor = ANCHOR_BOTTOM;
ObjectCreate("obj" + Time[shift], OBJ_ARROW, 0, Time[shift], signPos);
ObjectSetInteger(0, "obj" + Time[shift], OBJPROP_ANCHOR, anchor);

ObjectCreate関数でオブジェクトを作成します。

ObjectCreate第五引数には表示する価格を指定します。

つまり、ここにローソク足の高値安値を渡すことで、髭の先にサインを表示することが出来ます。

OBJPROP_ANCHORプロパティは表示する際の基準となる点を設定出来ます。

「ANCHOR_TOP」を指定するとオブジェクトの上が基準に、「ANCHOR_BOTTOM」を指定するとオブジェクトの下が基準になるので、これを利用することでサインがローソク足に重なることなく綺麗に表示することができます。

arrow_code = 234; // ローサインの時のアローコード
arrow_code = 233; // ハイサインの時のアローコード
ObjectSetInteger(0, "obj" + Time[0], OBJPROP_ARROWCODE, 233);  

OBJPROP_ARROWCODEプロパティでサインの種類指定します。
今回はハイサインを233、ローサインを234として割り当てています。

ArrowCodeの一覧はこちらです。

ObjectSetInteger(0, "obj" + Time[0], OBJPROP_COLOR, clrYellow);
ObjectSetInteger(0, "obj" + Time[shift], OBJPROP_WIDTH, 1);

サインの色と大きさを指定します。

あなたのやりたいことがきっと見つかる!
MQL4テクニック 逆引き集 はこちら

バッファ型のサインを表示

#property  strict
#property  indicator_buffers 2
#property  indicator_color1 clrYellow
#property  indicator_color2 clrYellow
#property  indicator_width1 1
#property  indicator_width2 1

double up[], down[];

int OnInit(){

   IndicatorBuffers(2);

   SetIndexBuffer(0, up);
   SetIndexBuffer(1, down);
   
   SetIndexStyle(0, DRAW_ARROW, STYLE_SOLID);
   SetIndexStyle(1, DRAW_ARROW, STYLE_SOLID); 
   
   SetIndexArrow(0, 233);
   SetIndexArrow(1, 234);
   
   return(INIT_SUCCEEDED);
}


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 - 1;
   if(limit < 0) limit = 1;
   for(int shift = 0; shift < limit; shift++){
   
      up[shift] = EMPTY_VALUE;
      down[shift] = EMPTY_VALUE; 
      
      if (/*ハイエントリー条件*/){
         up[shift] = Low[shift] - 5 * Point;
      }
      
      if (/*ローエントリー条件*/){
         down[shift] = High[shift] + 5 * Point;
      }
   }
   return(rates_total);
}

バッファ型のほうがオブジェクトに比べて扱うのは簡単です。

インジケーターバッファ特有の設定がありますので、順番に解説していきます。

#property  indicator_buffers 2

一番最初に何種類のインジケーターバッファを使うかを指定します。
今回はハイサイン、ローサインの2種類なので、「2」を指定します。

#property  indicator_color1 clrYellow
#property  indicator_color2 clrYellow
#property  indicator_width1 1
#property  indicator_width2 1

サインの色と大きさを指定します。
今回はどちらも黄色を指定していますが、バラバラに設定しても大丈夫です。

double up[], down[];

インジケーターバッファ用の配列をdouble型で作成します。

IndicatorBuffers(2);

SetIndexBuffer(0, up);
SetIndexBuffer(1, down);

バッファを二つ作成し、それぞれ用意した配列を割り当てます。

SetIndexArrow(0, 233);
SetIndexArrow(1, 234);

サインの種類をアローコードを用いて指定します。
今回はハイサインを233、ローサインを234に割り当てています。

ArrowCodeの一覧はこちらです。

//ハイエントリー
up[shift] = Low[shift] - 5 * Point;

//ローエントリー
down[shift] = High[shift] + 5 * Point;

バッファ配列にサインを表示したい価格を代入してサインを表示します。
インジケーターバッファではオブジェクト型のようにアンカーを弄れないため綺麗に髭に合わせて表示することは出来ませんが、数値 * Point で表示する高さを調節できます。

まとめ

サインツールを作成するメリットは、

  • エントリーポイントが明確になる
  • 現在の相場での効力を把握できる
  • アラートを組合わせることで、チャートに張り付く必要が無くなる
  • バックテストなどを用いた分析が容易になる
  • 自動売買化も可能
  • 自分にとって一番使いやすいものが実現できる

などなど、挙げようとするとキリがありません。

MQL4エンジニアとしての必須テクニックになりますので、今すぐにマスターしましょう!

POINT

こちらの記事で悩みが解決されない場合は、
MQL4 User Community に参加してお気軽にご質問ください。

MQL4初心者の方や開発に行き詰った方の悩みを、 様々なソフトウェアやツールを開発してきた経験豊富なエンジニアたちが解決いたします。