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)にて、矢印の毎分の上下を切り替えています。