前回まで、矢印サインのインジゲーターをオブジェクトで作ったり、オブジェクトの名前や値を取得しました。
参考記事:
オブジェクトの名前や値を取得する方法
参考記事:
オブジェクトでインジゲーターを作る方法【矢印サイン版】
今回は、いよいよオブジェクトで作成したインジゲーターをEA化してみます。
以前、iCustomでインジゲーターの値を取得してインジゲーターをEA化しましたが、
今回は、オブジェクトで作ってあるインジゲーターなので、
同じやり方では、EA化することができません。
参考記事:
インジゲーターをEA化する方法
参考記事:
iCustomでインジゲーターの値を取得する
ということで、オブジェクトの名前や値、位置を取得して、
売買サインを判断して注文するようにEAを作っていきたいと思います。
何度も言っていますが、これができるようになるとかなり便利です。
なぜなら、基本的に、
どんなインジゲーターでもEA化できる
からです。
インジゲーターは、矢印サインやラインを表示したり、
数値などをオブジェクトのテキストで表示したりしているので、
今までやってきたことができると、どんな情報でも取得できて、
売買条件を追加すれば、EAが作れます。
今回紹介する方法は、一番簡単な方法になりますが、
ほかにもいろいろな方法があるので、また次回以降に紹介していきたいと思います。
それでは、早速インジゲーターをEA化してみたいと思います。
以下から作成過程を説明していきます。
今回も、前回同様にオブジェクトで作った「CROSS MA」を使って紹介していきます。
いつもどおり、わかりやすいように遠回りしてコードを書いていくので、
多少、長めのコードになります。
まず、外部変数を宣言しておきます。
これは作り方によっては、必要ないかもしれませんがわかりやすいように書いときます。
①int obj_total = 0;
②int pos = 0;
①int obj_total = 0;
表示されているオブジェクトの数を入れるための変数。
②int pos = 0;
ポジション数を入れるための変数。
今回も、シンプルに矢印のサインが出た次の足の始値で売買をさせるように作ってみます。
ちゃんと、決済処理とか細かい設定を入れたほうがいいんですが...。
省略させていただきます。
void OnTick()
{
①int Ticket = 0;
②static datetime time = Time[0];
③if(Time[0] != time)
{
④obj_total = ObjectsTotal();
⑤int i = 0;
⑥for(i = 0; i < obj_total; i++)
{
⑦string obj_name = ObjectName(i);
⑧datetime obj_time = ObjectGet(obj_name,OBJPROP_TIME1);
⑨if(obj_time == Time[1])
{
⑩double obj_price = ObjectGet(obj_name,OBJPROP_PRICE1);
⑪if(pos == 0)
{
⑫if(obj_price != 0 && obj_price > Close[1])
{
⑬Ticket=OrderSend(Symbol(),OP_SELL,0.1,Bid,10,NULL,NULL,1001,0,Blue);
⑭pos = 1;
}
⑮if(obj_price != 0 && obj_price < Close[1])
{
⑯Ticket = OrderSend(Symbol(),OP_BUY,0.1,Ask,10,NULL,NULL,1002,0,Red);
⑰pos = 1;
}
}
}
}
⑱time = Time[0];
}
}
それでは、コードの説明をしていきます。
①int Ticket = 0;
注文されたポジションのチケット番号を代入するためにint型の変数Ticketを宣言して0を代入しておきます。
②static datetime time = Time[0];
変数timeに現在の足の時刻を代入します。
③if(Time[0] != time)
現在の足の時刻が、timeではないときという条件文。
④obj_total = ObjectsTotal();
オブジェクトの総数を変数「obj_total」に代入します。
⑤int i = 0;
変数の宣言。
⑥for(i = 0; i < obj_total; i++)
オブジェクトの総数分、繰り返し処理を行う。
⑦string obj_name = ObjectName(i);
オブジェクト名を変数「obj_name」を代入します。
⑧datetime obj_time = ObjectGet(obj_name,OBJPROP_TIME1);
オブジェクトが表示されている時刻を取得して、変数「obj_time」に代入します。
⑨if(obj_time == Time[1])
1本前の足の時刻とobj_timeが同じだったらという条件文。
⑩double obj_price = ObjectGet(obj_name,OBJPROP_PRICE1);
オブジェクトが表示されている価格を取得して、変数「obj_price」に代入します。
⑪if(pos == 0)
ポジション数が0のときという条件文。
⑫if(obj_price != 0 && obj_price > Close[1])
obj_priceが0ではない、かつ、obj_priceが1本前の足の終値より大きいという条件文。
⑬Ticket=OrderSend(Symbol(),OP_SELL,0.1,Bid,10,NULL,NULL,1001,0,Blue);
上記の条件を満たしたときに、売り注文処理をします。
⑭pos = 1;
ポジション数を1にします。
⑮if(obj_price != 0 && obj_price < Close[1])
obj_priceが0ではない、かつ、obj_priceが1本前の足の終値より小さいという条件文。
⑯Ticket = OrderSend(Symbol(),OP_BUY,0.1,Ask,10,NULL,NULL,1002,0,Red);
上記の条件を満たしたときに、買い注文処理をします。
⑰pos = 1;
ポジション数を1にします。
⑱time = Time[0];
現在の足の時刻を変数「time」に代入します。
以上で、EAの注文処理は完成です。
注意点としては、
MT4に値を取得する元となるインジゲーターを必ず入れておく必要があります。
インジゲーターが入っていないと、EAがどこから値を取得していいのかわからなくなってしまうので、
エラーが出てEAがうまく動きません。
なので、インジゲーターをEA化するときには、元となるインジゲーターのファイルを「Indicators」フォルダの中に保存しておきます。
また、今回作成したのはEAになるので、作成したEAのファイルは「Experts」フォルダの中に保存しておきます。
それでは、コンパイルして実行してみます。
参考MQL:
ObjectsTotal()
参考MQL:
ObjectName
参考MQL:
ObjectGet
参考MQL:
Time
参考MQL:
Close
参考MQL:
OrderSend
いかがだったでしょうか?
今回は、オブジェクトで作られたインジゲーターをEA化してみました。
オブジェクトも名前や値、位置が取得できれば、簡単にEA化することができます。
これで、EA化できないものはないんじゃないかなと思います。
今回のやり方は、インジゲーターのロジックもシンプルでわかりやすいものを使って
基本的な方法で、EA化をしてみましたが、もっと違うやり方もいろいろあります。
そのあたりについては、また機会があればご紹介していきたいと思います。
これでようやく、インジゲーターの作成に戻れそうです。
また何か作ったり発見したことがあれば、お知らせしていきたいと思います。
それでは、また。