システムトレード実装入門 プログラム解説編 続

こちらは前回の続きです。
システムトレード実装入門 プログラム解説編


では、前回引き続きプログラムの解説です。
今回tickが動き、以下のプログラムが動いた想定です。

 

前回の復習

tickが動くとstartの中に書かれてある処理が実行されます。

    double ma_fast = iMA(NULL, 0, MA_FAST_PERIOD, 0, 0, 0, 0);
    double ma_slow = iMA(NULL, 0, MA_SLOW_PERIOD, 0, 0, 0, 0);
    
    if (ma_fast >= ma_slow) {

ここでは20MAと50MAの値を算出し、ma_fast、ma_slowに一度計算した結果を入れて、
if()で判定しているんでしたね。

今回は else の方に処理が流れているので、 [ 20MA >= 50MA ] という判定は間違い(false)だったという事です。

 

for文

for文はif文と違って実生活で日常的に考える場面が少ないので少しイメージがつきにくく、
説明も難しく、理解も難しいでしょう。

飛ばすわけにも行かないので、以下見ていきましょう。

for (int i=0; i<=OrdersTotal(); i++) {

この書き方は覚えるしかありませんが、
これは、「ポジション一覧にある文だけ処理を繰り返せ」という命令です。

ここで出てくる OrdersTotal() はポジション一覧の数を返します。
例えば以下で言えば2です。

iというのは、今回で言えば,0から1ずつ増える数値で
初回であれば、 iの値は0,
2回目であれば、iの値は1
となります。
※ プログラムでは0,1,2,3,・・・と数えますので注意して下さい。もちろん書き方を変えて、1,2,3,・・・ともできます。

難しいことは抜きにして、次に進みます。

まず、一回目に以下の処理が走ります。(このとき、i = 0)

bool selected = OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if (OrderMagicNumber() != MAGIC) {
    continue;
}
bool closed = OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0);
if (closed) {
    Ticket_L = 0;
}

 

では、まず2行目の OrderMagicNumber() ですが、
これは今見ているポジションのマジックナンバーを取得する関数です。

この先の処理はよくある条件式です。
マジックナンバーが外部パラメータと定義されたものと異なっていれば、{}の処理しろというものです。

if (OrderMagicNumber() != MAGIC) {
    continue;
}

ちなみにcontinueは、「この回の処理は終了し、次の回にいけ」
従って、0番目の処理はここで終わり、という事です。

ここで定義されたマジックナンバーでない、つまり、他のEAでとったポジションなら
以下に続くポジションを決済する処理をしないという事です。

closed = OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0);

ここで疑問が生じました。
今見ているポジションのマジックナンバー
これはどのポジションのマジックナンバーでしょうか

 

それを解決するのが、1行目のOrderSelect()関数です。

bool selected = OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

ここでOrderSelect()することで、以下使用されるOrder関数、
例えば、 OrderMagicNumber() や OrderTicket() は
OrderSelect()で選択された、i番目のものの値になります。

 

ちょっとまとめると

for (int i=0; i<=OrdersTotal(); i++) {

この段階では、

bool selected = OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

上記の処理で、以下の青のポジションが選択された。

そのポジションのOrderMagicNumberを確認して、定義されたものと異なれば次にいけ!

if (OrderMagicNumber() != MAGIC) {
    continue;
}

ということです。

 

2回目も同様に

bool selected = OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if (OrderMagicNumber() != MAGIC) {
    continue;
}
bool closed = OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0);
if (closed) {
    Ticket_L = 0;
}

2回目であれば、OrderSelect()で以下のポジションが選択されます。

以下同様に、この選択されたマジックナンバーが定義したものと等しいのであれば、ポジションは決済され、
成功すれば、次回の買いポジションを構築できるように、
Ticket_L = 0 を代入します。

後はtickが動くたびにstart関数が呼び続けられます。

 

独自のEAつくる

少し長くなってしまいましたが、基本はこれだけです。
話を簡潔にするため、大雑把に解説した部分もありますが、
詳しくはまた別途参照頂ければと思います。

ちなみにですが、プログラミング初心者の方であれば、以下とか勉強しやすいですね。

 

僕が初めて買ったプログラミングの本もこれだった気がします笑
アフィリリンク置いてますが、ここから買ってもいいよって方はここから買って下さい。

そうじゃない方は以下のキーワードでhitするんじゃないですかね〜

amazon FXメタトレーダー4 MQLプログラミング

長々とご覧頂きましてありがとうございました。