今回は、以前作成した「
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化していきたいと思います。
それでは、また。