前回、iCustomを使ってインジゲーターの値を取得して矢印が表示されているかどうかの判別をすることができました。
参考記事:
iCustomでインジゲーターの値を取得する
これができることによって、基本的には矢印サインが出るインジゲーターなどをEA化することができるようになります。
これはでかいです。
なぜかって?
それは、自分が作ったインジゲーターはもちろんのこと、
無料で配布されているものや市販されているものもEA化できる
からです。
EA化することができれば、過去検証のバックテストなんかもできるようになります。
まあ、バックテストの成績がいいからこのロジックはいいというわけではありませんが、
目安としては使えるかなって気がします。
利確値とか損切値もパラメーターで変更することができれば、数パターンの検証をして、
その中から自分に合った設定でトレードすることもできるので、
EAやバックテストの結果も使い方次第になるってことですかね。
少し、話がそれましたが、
早速インジゲーターをEA化してみたいと思います。
以下から作成過程を説明していきます。
今回も、前回同様に「
CROSS MA」を使って紹介していきます。
このインジゲーターは処理も少なくロジックがシンプルなので使いやすいです。
参考インジゲーター:
CROSS MA01
さて、ここからEAのコードを書いていきます。
まず、外部変数のposを宣言しておきます。
これは作り方によっては、必要ないかもしれませんがわかりやすいように書いときます。
extern int pos = 0;
なんのためのものかというと、売買サインが出て、注文するときに連続して注文するのを防ぐためにポジション数のカウントをしておくためのものです。
これを入れとかないと、1つのサインで連続して注文してポジションが大量になってしまうので、それを回避するために使います。
今回は、シンプルに矢印のサインが出た次の足の始値で売買をさせるように作ってみます。
本当は、決済処理とか細かい設定が必要になるんですが...。
そのあたりについては、また別の機会にご紹介していきたいと思います。
void OnTick()
{
①int Ticket = 0;
②double UPArrow = iCustom(NULL,0,"cross_ma",2,1);
③double DWNArrow = iCustom(NULL,0,"cross_ma",3,1);
④if(pos == 0)
{
⑤if(UPArrow == EMPTY_VALUE && DWNArrow != EMPTY_VALUE)
{
⑥Ticket=OrderSend(Symbol(),OP_SELL,0.1,Bid,10,NULL,NULL,1001,0,Blue);
⑦pos = 1;
}
⑧if(UPArrow != EMPTY_VALUE && DWNArrow == EMPTY_VALUE)
{
⑨Ticket = OrderSend(Symbol(),OP_BUY,0.1,Ask,10,NULL,NULL,1002,0,Red);
⑩pos = 1;
}
}
}
それでは、コードの説明をしていきます。
①int Ticket = 0;
注文されたポジションのチケット番号を代入するためにint型の変数Ticketを宣言して0を代入しておきます。
②double UPArrow = iCustom(NULL,0,"cross_ma",2,1);
double型の変数UPArrowにiCustomでcross_maの1本前の足の2番目のラインインデックス番号に入っている値を取得します。
③double DWNArrow = iCustom(NULL,0,"cross_ma",3,1);
double型の変数DWNArrowにiCustomでcross_maの1本前の足の3番目のラインインデックス番号に入っている値を取得します。
④if(pos == 0)
ポジション数が0のときという条件文。
⑤if(UPArrow == EMPTY_VALUE && DWNArrow != EMPTY_VALUE)
if文で、UPArrow(上矢印)の値が空っぽ、かつ、DMWArrow(下矢印)が空っぽではないという条件を指定します。
⑥Ticket=OrderSend(Symbol(),OP_SELL,0.1,Bid,10,NULL,NULL,1001,0,Blue);
上記の条件を満たしたときに、売り注文処理をします。
⑦pos = 1;
ポジション数を1にします。
⑧if(UPArrow != EMPTY_VALUE && DWNArrow == EMPTY_VALUE)
if文で、UPArrow(上矢印)の値が空っぽではない、かつ、DMWArrow(下矢印)が空っぽという条件を指定します。
⑨Ticket = OrderSend(Symbol(),OP_BUY,0.1,Ask,10,NULL,NULL,1002,0,Red);
上記の条件を満たしたときに、買い注文処理をします。
⑩pos = 1;
ポジション数を1にします。
こんな短いコードですが、EAの注文処理は完成です。
注意点としては、iCustomでインジゲーターの値を取得しているので、
MT4に値を取得する元となるインジゲーターを必ず入れておく必要があります。
インジゲーターが入っていないと、EAがどこから値を取得していいのかわからなくなってしまうので、
エラーが出てEAがうまく動きません。
なので、インジゲーターをEA化するときには、元となるインジゲーターのファイルを「Indicators」フォルダの中に保存しておきます。
また、今回はEAになるので、作成したEAのファイルは「Experts」フォルダの中に保存しておきます。
ついでにもうひとつ注意点として、
矢印などのサインがオブジェクトで作られている場合は、今回のやり方では値を取得することができません。
サインがオブジェクトで作られているインジゲーターは別の方法で値を取得しなければならないので、
その方法についてはまた次回以降、紹介していきたいと思います。
それでは、コンパイルして実行してみます。
参考MQL:
iCustom
参考MQL:
OrderSend
いかがだったでしょうか?
今回は、矢印が表示された次の足の始値で注文してポジションを持つだけというシンプルなEAを作ってみました。
これだけだと、EAとして成り立ちませんが、
矢印サインをちゃんと判別してポジションを持つことができたので、
あとはこれに決済の条件や決済注文の処理などを追加してあげれば、
自動売買させることができるようになります。
そのあたりについては、また詳しく書いていきたいと思います。
ちなみに私はインジゲーターをEA化するときには、効率的に作業したいので、
ベースとなる骨組みは
MT4EAエディタで作って、
そこから細かい部分を自分で作っていくようにしています。
参考記事:
EAを簡単に作成できるMT4EAエディタが便利
まあ、人それぞれ作る方法がいろいろあると思うので、自分に合った方法で作っていくのがいいと思います。
さて、今回はインジゲーターから少し離れて、簡単なEAを作ってみましたが、
これからもインジゲーターをメインに作りながらEAのほうも少しずつ作っていく予定です。
また作りながら記事も書いていきたいと思います。
それでは、また。