MQLでチャートに矢印を描画する

MQLで複数インジケータが一定条件になった場合、チャート上に矢印表示をしたいと思い、調べたので、その内容をメモします。

仕様

今回は、条件等を以下のように制限してシンプルに矢印表示を実装します。

・一分毎の最初のティックにて、矢印をチャートに表示する。

・一分毎の最初のティックで、上矢印、下矢印の表示を繰り返す。

・ObjectCreate関数にて表示する方法を採用する。

・EAにて実装する。

使用する関数

・ObjectDeleteAll()関数

描画したオブジェクトをすべて削除する関数。ObjectsDeleteAll(ChartID())とすることで、適用したチャートのオブジェクトがすべて削除されます。

・ObjectsCreate()関数

指定したチャート位置にオブジェクトを作成します。

参考:https://www.mql4-encyclopedia.com/objectcreate/

今回は、EAを適用したチャート、メインウィンドウのろうそく足のところに、上矢印と下矢印を表示したいので、以下の使い方をします。

ObjectCreate(ChartID(), "オブジェクト名", OBJ_ARROW_DOWN, 0, Time[0], Close[0]);

プログラム

#property copyright "panda"
#property link "https://panda-clip.com/"
#property version "1.00"
#property strict

bool up_down_flg = True;
int arrow_cnt = 1;

//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
  ObjectsDeleteAll(ChartID());
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
  ObjectsDeleteAll(ChartID());
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
  static datetime time = Time[0];
  if(Time[0] != time){//excute every one minuit.
    if(up_down_flg){
      ObjectCreate(ChartID(), "ARROW" + IntegerToString(arrow_cnt), OBJ_ARROW_DOWN, 0, Time[0], Close[0]);
      up_down_flg = False;
    }
    else{
      ObjectCreate(ChartID(), "ARROW" + IntegerToString(arrow_cnt), OBJ_ARROW_UP, 0, Time[0], Close[0]);
      up_down_flg = True;
    }
    arrow_cnt++;
    time = Time[0];
  }
}
//+------------------------------------------------------------------+

初期化等

・EAのInit時、Deinit時にそれぞれすべてのオブジェクトを削除しています。

OnTick()での処理

・if(Time[0] != time)の条件で、毎分の最初のティックのみ処理を行うようにしています。

参考:http://forex.toyolab.com/?p=666

・arrow_cntの変数をカウンターとして、矢印の数をカウントします。カウントされた矢印は、矢印名として使用されます。

ObjectCreate関数の"BUY" + IntegerToString(arrow_cnt)にて、arrow_cntを文字列に変換したのち、"ARROW"という文字列と結合し矢印名とします。これは、一回作成されたオブジェクトの名前を重複して使用できないため、このように矢印番号を変化させて矢印を作成するに至りました。

ここでは単純にInt型にてカウントしているだけなので、Int型数値上限までしか矢印は作成できないので、改良は必要です。

・if(up_down_flg)にて、矢印の毎分の上下を切り替えています。