リピートトレードプログラム(EA)を作ろう(4)買いトレードの部分
メタトレーダーを使ってリピートトレードをするには、それようのプログラム(エキスパートアドバイザー(EA))が必要ですね。
これから数回シリーズで、多段リピートトレードプログラム(EA)を作っていきます。
トレード本体部分
今回は、トレード本体部分を解説します。
全体のフローでは、「今の値(Ask)を取得」から全部です。
買いのトレードと売りのトレードは、発注が買いか売りかの違いと、表を参照していく順番が下から上か、上から下の違いだけです。
とりあえず、今回は、買いの方だけでいきますね。
概略の処理です
やるべきことは簡単です。
現在値が表のどの段になるかを順番に確認していって、表のどの行かを求めます
その場所の注文か建玉があれば何もせず、なければ発注
すぐ下にも表に行があれば、そこにも同じことをする。
さらに2つ下にも行があれば、そこに注文があれば注文取り消し
さらに、表の最後まで注文があれば注文取り消し
こんな感じです。
今の値が表の最下限より下の場合
まずは、今の値が表の最下限より下の場合、このときは何もせずに戻るだけです。
一番上のif文は、買いの処理と売りの処理を分けるためのもの
Askで現在の買値を取得して、これが最低価格(スプレッドマージンを加えたもの)より低ければ、何もすることはないのでそのままリターンです。
現在の値がある行を求める処理
次に、現在の値がある行を求めましょう。
5行目のforループで、表を下から準備にif文に当てて探していきます。
Gyoは、表の総行数です。
条件にあったら、その時のループカウンタiが求めたい行番号なので、変数n
にカウンタiの値をコピーしてbreakでループを抜けます。
現在値のある行の処理
まずは、現在の値ある行の処理をしましょう。
やるべきことは、
「その場所の注文か建玉があれば何もせず、なければ発注」
だけです。
2行目のMyCurrentOrders関数は、参考文献についているライブラリ関数 MyLib.mq4 に膨れるているもので、第1引数にMY_ALLPOSを指定すると、第2引数のMagic番号に合致する注文の発注済み注文と建玉の合計数を返してくれます。ma[n]は処理する行のMagic番号が格納されています。
MyCurrentOrders(MY_ALLPOS, ma[n]) == 0
は、「マジックナンバーma[n]を満たす注文の、発注済み注文と建玉はないよ。」ということ。なので、このときは注文を発注しましょう。MyOrderSend関数は、エラー処理を組み込んだ発注関数です。同じく参考文献のライブラリの関数です。
現在値のある行の1つ下の段の処理
次は、現在値のある行から1つ下の段の処理をしましょう。n-1の段を同じようにすればよいですね。
でも、下に段がなければ変になっちゃうので、n>1のときに限定するのが2行目のif文です。
あとは、nをn-1に変えただけですね。
3段より下の注文を全部取り消す処理
注文の残したままにしているとそれだけで発注証拠金が必要になるので、現在の値から遠くなった注文を取り消しましょう。発注している注文のすぐ下の段で取り消すと、発注-取消を繰り返すので、1段か2段空けて、それより下の段を全て確認して注文を取り消していく処理です。
2行目のif文は、今の値が表の下から4段目以上にあるときだけこの処理をするということ。それより下だと取り消しをする注文自体がないので。
4行目のforループで3段したより、表の一番下(i=1)まで順に確認していきます。
MyCurrentOrders(MY_ALLPOS, ma[i]) != 0
で、発注済みの注文と建玉(ポジション)の合計が0でなければ、(建玉は決済されているはずなので、発注済みの注文が残っているかどうかの判断)
MyOrdersDelete(ma[i])
でMagic番号を指定して注文を取り消します。
参考文献
使用している
MyCurrentOrders
MyOrderSend
MyOrdersDelete
の独自定義関数は、
FXメタトレーダー実践プログラミング (現代の錬金術師シリーズ) (現代の錬金術師シリーズ 83)
に出てくる、MyLib.mq4 というライブラリ関数に出てくるものを利用させて頂いています。
この記事が気に入ったらサポートをしてみませんか?