MT4 - インジゲーターの値(矢印など)をiCustomで取得する

sitemap
世界最強のFXキャッシュバックサイト
iCustomでインジゲーターの値を取得する
公開日:2018/11/20
まだまだインジゲーターを作るのが楽しくてしょうがない管理人です。

あると便利なものから独自ロジックに必要なものまでたくさんのインジゲーターを量産中です。

ということで、今回もインジゲーターの作り方について書いておこうと思ったんですが、

そーいえば、EAって全然作ってなかったなあと思い、

今回はEAを作成する準備段階のことについて書いていきたいと思います。

ちょうど、以前にサインが出るインジゲーターをいくつか作ってあったので、

まずは、そのサインをEA化できるかなってことで、試行錯誤しながら開発しています。

単純に、サインを出す部分に注文処理を書いてあげればできちゃうんだけど、

それだとなんかおもしろくないってことで、試してみたかったことをやってみました。

今回試してみたかったことは、

「iCustomでインジゲーターの値を取得する」

ということです。

インジゲーターって無料のものから有料のものまでたくさんあります。

そのインジゲーターを自分でEA化できたら、バックテストもできるし、

リアルトレードを自動で行うこともできるようになります。

これって、なかなか便利ですよね?

今回は、EA化する前にこのインジゲーターで表示される矢印とかのサインの値を取得して、

矢印が表示されているのか、表示されていないかの判別をやってみたいと思います。

それでは、以下から作成過程を説明していきます。
iCustomで矢印の値を取得する
今回は、以前作成した「CROSS MA」を使って紹介していきます。

このインジゲーターは、2本の移動平均線がクロスしたら矢印を表示するというシンプルなものなので、

例としてはわかりやすくていいかなと思います。

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

まずは、CROSS MAのコードを見て、矢印の処理をチェックしときます。

double BufFastMA[];
double BufSlowMA[];
double BufBuy[];
double BufSell[];

最初の記述で、Double型の配列、BufBuy[]とBufSell[]で矢印を指定しています。

次に、ラインインデックス番号が何番になっているかをチェックします。

	SetIndexBuffer(0,BufFastMA);
	SetIndexBuffer(1,BufSlowMA);
	SetIndexBuffer(2,BufBuy);
	SetIndexBuffer(3,BufSell);

OnInit内でラインインデックス番号を指定していました。

2番にBufBuy、3番にBufSellを指定しています。

これで、Cross MAのチェックは終了です。

ここから、矢印の値を取得する記述について説明していきます。

参考記事:移動平均線のクロスでアラートとプッシュ通知させる
参考記事:移動平均線を利用した手法について

今回は、現在の足から数本前の足まで遡って、矢印が表示されているか、非表示になっているかを

チェックしながら、値を取得していきたいと思います。

int OnInit()
  {
  
   ①int limit = 20;
   
   ②for(int i = 0; i < limit; i++)
   {
      
   ③double UPArrow = iCustom(NULL,0,"cross_ma",2,i);
   ④double DWNArrow = iCustom(NULL,0,"cross_ma",3,i);
   
   ⑤if(UPArrow == EMPTY_VALUE && DWNArrow != EMPTY_VALUE)
   {
   
   ⑥Print(i+"本前  "+"上矢印:からっぽ"+"   "+"下矢印:表示");
   
   }
   
   ⑦if(UPArrow != EMPTY_VALUE && DWNArrow == EMPTY_VALUE)
   {
   
   ⑧Print(i+"本前  "+"上矢印:表示"+"   "+"下矢印:からっぽ");
   
   ⑨} else{
   
   ⑩Print(i+"本前  "+"上矢印:からっぽ"+"   "+"下矢印:からっぽ");
   
   }
   
   ⑪Print(i+"本前  "+"UP:"+UPArrow+"   DWN:"+DWNArrow);
      
   }

   return(INIT_SUCCEEDED);
  }

それでは、コードの説明をしていきます。

①int limit = 20;
遡る本数を指定できるように、int型の変数limitを設定します。
今回は、とりあえず20本分を指定。

②for(int i = 0; i < limit; i++)
for文で現在の足からlimitで指定した足の本数分、遡って繰り返し処理します。

③double UPArrow = iCustom(NULL,0,"cross_ma",2,i);
Double型の変数UPArrowにiCustomでcross_maの2番目のラインインデックス番号に入っている値を取得します。

④double DWNArrow = iCustom(NULL,0,"cross_ma",3,i);
Double型の変数DWNArrowにiCustomでcross_maの3番目のラインインデックス番号に入っている値を取得します。

⑤if(UPArrow == EMPTY_VALUE && DWNArrow != EMPTY_VALUE)
if文で、UPArrow(上矢印)の値が空っぽ、かつ、DWNArrow(下矢印)が空っぽではないという条件を指定します。

⑥Print(i+"本前 "+"上矢印:からっぽ"+" "+"下矢印:表示");
上記の条件を満たしたときに、Printで結果をログに表示させます。

⑦if(UPArrow != EMPTY_VALUE && DWNArrow == EMPTY_VALUE)
if文で、UPArrow(上矢印)の値が空っぽではない、かつ、DWNArrow(下矢印)が空っぽという条件を指定します。

⑧Print(i+"本前 "+"上矢印:表示"+" "+"下矢印:からっぽ");
上記の条件を満たしたときに、Printで結果をログに表示させます。

⑨}else{
elseで、それ以外の条件のときの処理を指定します。

⑩Print(i+"本前 "+"上矢印:からっぽ"+" "+"下矢印:からっぽ");
上記の条件を満たしたときに、Printで結果をログに表示させます。

⑪Print(i+"本前 "+"UP:"+UPArrow+" DWN:"+DWNArrow);
各足ごとのUPArrowとDWNArrowに入っている値を、Printで結果をログに表示させます。

こんな短いコードですが、コンパイルして実行してみます。

参考MQL:iCustom
参考MQL:Print

実行結果
サブウインドウ四角

今回は、Printを使ってログを表示させているので、下のウインドウに結果が表示されます。

上矢印が表示されているときは、「上矢印:表示」、下矢印が表示されているときは、「下矢印:表示」というログが表示されます。

表示されていないときは、「からっぽ」と表示されます。

もうひとつ今回は、1本ずつ上矢印の値と下矢印の値を取得してログに表示しています。

ここで、あれ?と思ったんですけど、

からっぽのときにもなんか値が入ってる...。

2147483647という謎の数字が入っているのがわかると思います。

この数字はなんだろうと思ったんですが、

処理はうまくできていて、矢印の値と位置も正確に取得できているので、

今回は見なかったことにして、スルーします。すみません。

さて、ログを見ると、ちょうど、2本前の足に下矢印、5本前の足に上矢印、9本前の足に下矢印が表示されていることがわかります。

このときのチャートが以下のような感じになっています。

チャート

一番右の足が現在の足になって、その足が0本目の足になります。

そこから左に遡って数えていくと、2本前の足に下矢印、5本前の足に上矢印、9本前の足に下矢印が表示されているのがわかると思います。

うまく、矢印の値が取得できて判別ができています。

あとは、これをちょこっと応用すれば、EA化することができそうです。
まとめ
いかがだったでしょうか?

今回は、インジゲーターで表示される矢印の値を取得して、矢印が表示されているかどうかの判別をしてみました。

これができるようになると、矢印以外の値、たとえば、

ボリンジャーバンドの値とかCCIの値も取得できるようになります。

また、本来の目的である、インジゲーターをEA化するときに必要な情報(矢印が表示されたらなど)を取得することができるので、

あとは、必要なところに注文と決済の処理を追加すれば、EAを作ることができるようになります。

これでまた幅が広がりました。

このあと、インジゲーターを実際にEA化していきたいと思います。

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