MT4 - インジゲーターの値を取得してEA化する方法

sitemap
世界最強のFXキャッシュバックサイト
オブジェクトでインジゲーターを作る方法【矢印サイン版】
公開日:2018/11/25
前回、前々回とiCustomを使ってインジゲーターの値を取得したり、チャートに矢印が表示されているかどうかの判別などをしてみました。

参考記事:iCustomでインジゲーターの値を取得する
参考記事:インジゲーターをEA化する方法

自分でこのようにインジゲーターをEA化することができるようになったことで、インジゲーターの幅も広がりましたし、EAの作成も簡単にできるようになってきました。

まだまだ、奥が深いですけど、モチベーションは高いです。

なんてったって、作りたいものが山ほどあるので...。

試行錯誤して勉強しながら頑張ります。

さて、今回は、今までとは別の作り方でインジゲーターを作ってみたいと思います。

その作り方とは、

インジゲーターの矢印サインをオブジェクトで作る

です。

これって必要?って思う方もいるかと思いますが、

作るインジゲーターや使い道によって必要になることもあります。

そのあたりの説明は長くなってしまうので、省略させていただきます。

今回は練習という意味で、最近よく例として紹介している「CROSS MA」をオブジェクトで作っていきます。

このインジゲーターは練習とか説明用としてはとても便利です。

では、早速インジゲーターを作っていきたいと思います。

以下から作成過程を説明していきます。
オブジェクトで矢印サインを作る
先ほど書いたように、今回も、「CROSS MA」を使って紹介していきます。

参考インジゲーター:CROSS MA01

このインジゲーターは何度か紹介していますが、2本の移動平均線がゴールデンクロスしたときとデッドクロスしたときに矢印サインを表示するというシンプルなインジゲーターです。

ということで、最初に、2本の移動平均線の値を取得して比較していかなければならないので、

移動平均線の値を代入しておくたまの変数を用意します。

と、その前に、

移動平均線の期間もパラメーターで変更できたほうが便利なので、

まず、外部変数のF_MA_Period(短期移動平均線の期間)とS_MA_Period(長期移動平均線の期間)を宣言しておきます。

extern int F_MA_Period = 5;
extern int S_MA_Period = 10;

あと、この処理も不要かもしれませんが、書いておきます。

インジゲーターを起動したときに表示されているオブジェクトをすべて削除します。

他のインジゲーターと併用して使いたい場合は、削除してしまうので、ないほうがいいです。

int init()
{
   ObjectsDeleteAll();     
		
	return(0);
}

さて、ここから主となる、start()の中の処理を書いていきます。

今回は、現在の足から100本分、遡って矢印を表示するという簡易的なインジゲーターを作ります。

全部の足をチェックして矢印を表示することもできますが、そのあたりの処理は元になってる「CROSS MA」や別のインジゲーターを参考にしてみてください。

それでは、以下よりコードを書いていきます。

int start()
{

①for (int i=0; i<100; i++) { ②double F_MA01 = iMA(NULL,0,F_MA_Period,0,MODE_EMA,PRICE_CLOSE,i); ③double S_MA01 = iMA(NULL,0,S_MA_Period,0,MODE_EMA,PRICE_CLOSE,i); ④double F_MA02 = iMA(NULL,0,F_MA_Period,0,MODE_EMA,PRICE_CLOSE,i+1); ⑤double S_MA02 = iMA(NULL,0,S_MA_Period,0,MODE_EMA,PRICE_CLOSE,i+1); ⑥string obj_name = "obj"+i; ⑦if(F_MA02 < S_MA02 && F_MA01 > S_MA01) { ⑧ObjectCreate(obj_name,OBJ_ARROW,0,0,0); ⑨ObjectMove(obj_name,0,Time[i],Low[i]-10*Point); ⑩ObjectSet(obj_name, OBJPROP_ARROWCODE, 233); ⑪ObjectSet(obj_name, OBJPROP_WIDTH,5); ⑫ObjectSet(obj_name, OBJPROP_COLOR, Red); } ⑬if(F_MA02 > S_MA02 && F_MA01 < S_MA01) { ⑭ObjectCreate(obj_name,OBJ_ARROW,0,0,0); ⑮ObjectMove(obj_name,0,Time[i],High[i]+20*Point); ⑯ObjectSet(obj_name, OBJPROP_ARROWCODE, 234); ⑰ObjectSet(obj_name, OBJPROP_WIDTH,5); ⑱ObjectSet(obj_name, OBJPROP_COLOR, Blue); } } return(0); }

今回は、オブジェクトで矢印サインを作って表示するということで、

どうやってやろうかなと思ったんですが、

ObjectCreateのOBJ_ARROWを使って、「Wingdings Font」でコードを指定して矢印を作ってみました。

⑧~⑫と⑭~⑱の処理で矢印を作って指定した位置に表示しています。

順番にコードを説明していきます。

①for (int i=0; i<100; i++)
for文で現在の足から100本分の足をチェックしていきます。

②double F_MA01 = iMA(NULL,0,F_MA_Period,0,MODE_EMA,PRICE_CLOSE,i);
double型の変数F_MA01にiMAでi本前の(短期)移動平均線の値を取得して代入します。

③double S_MA01 = iMA(NULL,0,S_MA_Period,0,MODE_EMA,PRICE_CLOSE,i);
double型の変数S_MA01にiMAでi本前の(長期)移動平均線の値を取得して代入します。

④double F_MA02 = iMA(NULL,0,F_MA_Period,0,MODE_EMA,PRICE_CLOSE,i+1);
double型の変数F_MA02にiMAでi+1本前の(短期)移動平均線の値を取得して代入します。

⑤double S_MA02 = iMA(NULL,0,S_MA_Period,0,MODE_EMA,PRICE_CLOSE,i+1);
double型の変数S_MA02にiMAでi+1本前の(長期)移動平均線の値を取得して代入します。

⑥string obj_name = "obj"+i;
string型の変数obj_nameに文字列「obj」とiの値を合体させて代入する。

⑦if(F_MA02 < S_MA02 && F_MA01 > S_MA01)
i+1本前の短期移動平均線が長期移動平均線より小さい、かつ、i本前の短期移動平均線が長期移動平均線より大きい、という条件文。

⑧ObjectCreate(obj_name,OBJ_ARROW,0,0,0);
オブジェクト名「obj_name」、オブジェクトの種類「OBJ_ARROW」、オブジェクトの位置「0、0、0」と指定。

⑨ObjectMove(obj_name,0,Time[i],Low[i]-10*Point);
オブジェクトの位置をTime[i]、Low[i]-10*Pointへ移動します。

⑩ObjectSet(obj_name, OBJPROP_ARROWCODE, 233);
オブジェクトのコードを233(上矢印)に指定します。

⑪ObjectSet(obj_name, OBJPROP_WIDTH,5);
オブジェクトの太さ(大きさ)を5に指定します。

⑫ObjectSet(obj_name, OBJPROP_COLOR, Red);
オブジェクトの色をRed(赤)に指定します。

⑬if(F_MA02 > S_MA02 && F_MA01 < S_MA01)
i+1本前の短期移動平均線が長期移動平均線より大きい、かつ、i本前の短期移動平均線が長期移動平均線より小さい、という条件文。

⑭ObjectCreate(obj_name,OBJ_ARROW,0,0,0);
オブジェクト名「obj_name」、オブジェクトの種類「OBJ_ARROW」、オブジェクトの位置「0、0、0」と指定。

⑮ObjectMove(obj_name,0,Time[i],High[i]+20*Point);
オブジェクトの位置をTime[i]、High[i]+20*Pointへ移動します。

⑯ObjectSet(obj_name, OBJPROP_ARROWCODE, 234);
オブジェクトのコードを234(下矢印)に指定します。

⑰ObjectSet(obj_name, OBJPROP_WIDTH,5);
オブジェクトの太さ(大きさ)を5に指定します。

⑱ObjectSet(obj_name, OBJPROP_COLOR, Blue);
オブジェクトの色をBlue(青)に指定します。

ここまで作るのに少し時間がかかりましたが、完成してみると、

意外と思ったより短いコードで書くことができました。

たぶん、もっと効率よく書くこともできると思います。

とりあえず、ここまでをコンパイルして実行してみます。

参考MQL:iMA
参考MQL:ObjectCreate
参考MQL:ObjectMove
参考MQL:ObjectSet

実行結果
オブジェクト版CROSS MA

移動平均線がクロスされたところで矢印が表示されています。
まとめ
いかがだったでしょうか?

今回は、オブジェクトで矢印サインを作って表示するインジゲーターを作ってみましたが、ベースさえわかってしまえば、あとは同じかなって感じがしました。

要は、条件文は一緒で、表示方法とか表示位置のコードの書き方がわかればどんなインジゲーターもオブジェクトで作れるんじゃない?

というのが、今のところの印象です。

これから、いろんなインジゲーターを作っていく予定ですが、

できるだけ、オブジェクト版とそうじゃない版の2種類を比較しながら作っていきたいと思います。

また何か作ったら、作り方などをメモとして残していきます。

それでは、また。
今回使用したMQL一覧
関連ページ
big_candlestick_judgment
スポンサードリンク
Twitter