EAのマジックナンバーの考え方

EA
スポンサーリンク

EAにマジックナンバーと言うものがありますが、必要性やどういった感じに使って行くのかについて記載します。

マジックナンバーの概要

まずマジックナンバーですが、EAで新規注文をする際にOrderSend()関数で設定する事ができます。マジックナンバーに設定できる数値の最大値は2147483647です。これを超える数値を設定しようとしても、2147483647になってしまいます。

ちなみに、裁量でトレードした際のマジックナンバーは0です。

このマジックナンバー、新規注文する際のOrderSend()関数でマジックナンバーを何番に設定したらいいの?といった疑問について考えていきます。

マジックナンバーって必要?

そもそも、マジックナンバーは必要なのか?

結論としては、殆どの場合は必要です。

ただし、以下の場合のみマジックナンバーは不要です。

1つのFX口座で、1つのEAを稼働させるだけ(裁量トレードもしない)
※複数のEAを稼働させる場合、複数のFX口座を開設する

『裁量トレードもしない』場合も含めているのは、EA稼働中にEAと同じ口座で裁量トレードした場合、マジックナンバーを設定しない・見ないEAは裁量トレードのポジションまで勝手に決済してしまう可能性があるからです。
※裁量トレードしている場合、EAの稼働を停止するのであれば問題ありません

なので、最初はマジックナンバーは不要かもしれませんがだんだんと色んなEAを稼働していく場合、別のEAがそのまた別のEAのポジションを勝手に決済したりするのでマジックナンバーは必要になってきます。

主に使うパターンは2種類

マジックナンバーを使うパターンとしては主に2種類の用途があると思います。大抵はパターン①の用途で使います。

パターン①:1口座に複数のEAを稼働させる場合

1つのFX口座につき1つのEAを稼働させる場合、マジックナンバーは特に意味がないものとなりますが、複数のEAを稼働させる場合はマジックナンバーを用いてどのEAのポジションなのかを判別する必要があります。

例えばこんな感じで、左のEA①と右のEA②別々のEAを1つのFX口座で稼働させており、左のEA①が新規エントリーしてポジションを持っている状態とします。

この場合、左のEA①のポジションなのに右のEA②が決済してしまう・・・なんていう可能性があります。EA①のタイミングで新規エントリーしたのに、EA②のタイミング的には決済だった場合、EA①の新規エントリーでポジションを持った瞬間、EA②によって決済されてしまうという可能性が出てきて困ったりします。

さて、この問題をどうするか・・・といった時に解決してくれるのがマジックナンバーです。

マジックナンバーを使ってEA①のポジションなのかEA②のポジションなのかを管理していきます。

こんな感じで、現在保持しているポジションにマウスカーソルをあてると、一番右側にエキスパートIDが表示されます。この「999」がマジックナンバーです。右側のEA②はマジックナンバー「999」のポジションのみ決済する作りにしていますし、新規エントリーする際はマジックナンバー「999」としてポジションを持つようにしています。

次に、下のポジションのマジックナンバーを見てみると、マジックナンバーは「111」であることがわかります。左側のEA①はマジックナンバー「111」で管理しています。なので先ほど同様、マジックナンバー「111」のポジションのみ決済し、新規エントリーする際はマジックナンバー「111」としてポジションを持ちます。

上記の事からマジックナンバーの使い方としては、どちらのEAのポジションなのかを見分けるために使っている事がわかると思います。

主な使用用途はこのパターンになります。

簡単な使い方

マジックナンバーを設定、見ていくうえでの簡単なサンプルプログラムです。

まず、新規エントリー時にマジックナンバーを設定してあげる必要があります。

OrderSend(   // 新規エントリー注文
            NULL,                     // 通貨ペア
            ea_order_entry_Type,      // オーダータイプ[OP_BUY / OP_SELL]
            Lot,                      // ロット(FXTFは1=10Lot)
            ea_order_entry_price,     // オーダープライスレート
            20,                       // スリップ上限 
            order_stop_price,         // ストップレート
            order_good_price,         // リミットレート
            orderComment,             // オーダーコメント
            999,                      //★マジックナンバー★
            0,                        // オーダーリミット時間
            order_Color               // オーダーアイコンカラー
            );

マジックナンバー「999」を設定したい場合はこんな感じにします。

さあこれで、マジックナンバー対応は「完了」というわけではないですね!

決済時にもマジックナンバーを見て違うEAのマジックナンバーであれば決済しないように作る必要があります。

現在のポジション数分ループして、各ポジションのマジックナンバーを見て、当該EAのポジションがなければ何もしない・当該EAのポジションがあれば決済するという作りにしないといけないので結構めんどくさい感じですね。

      for(int order_cnt = 0; order_cnt < OrdersTotal(); order_cnt++){
         bool OrderKekka = OrderSelect(order_cnt,SELECT_BY_POS,MODE_TRADES);
         if(OrderMagicNumber() == 999 && OrderKekka == true){
            OrderKekka = OrderClose(OrderTicket(),OrderLots(),・・・・);
         }
      }

簡単にマジックナンバーを考慮した決済処理を書くとしたらこんな感じです。

あとは複数のポジションを持たないEAの場合は、新規エントリー時に既にポジションを持っているのあかどうかを確認する必要がありますね。

   int total = OrdersTotal();
   bool hoji=false;

   if(total > 0){
      for(int cnt = 0; cnt < total; cnt++){
         OrderKekka = OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
         if(OrderMagicNumber() == 999){
            //ポジション保持中
            hoji=true;   
         }
      }
   }

   if(hoji==false){
      //新規注文する
      OrderSend(・・・・・
   }

作り方はいくらでもあると思いますが、単純にポジションがある場合は全てのポジションのマジックナンバーを確認したいのでこんな感じでループさせて見てあげればOKです。

パターン②:マジックナンバーをメモのように使う

マジックナンバーのもう一つの使い方として、メモ代わりに使う方法です。

メモといえばEAにはコメントがありますが、私の場合コメントとマジックナンバーを使い分けてポジションの状態を分かりやすくしています。

例えばコメントは、エントリーした際にどういった内容のエントリーだったかに使い、
マジックナンバーはエントリーした際の状態(良い位置でのエントリーなら10、悪ければ3等の10段階評価)として使って決済時にマジックナンバーを見て早めに決済した方がいいのかどうかを確認したりしています。

全部コメントに情報を詰め込んで後で文字列分割して・・・という方法もありますが、私は1口座で複数のEAを使うつもりが無かった(初代EA)のでマジックナンバーの部分にEAで使う情報を入れています。

さいごに

以上が、『EAのマジックナンバーの考え方』となります。

マジックナンバーは

1つのFX口座で複数EAを使ったり(裁量トレードと併用する)場合、マジックナンバーは重要
という事です。
 
マジックナンバーの必要性を理解して、ぜひEAの運用に役立てて頂けたらと思います。
 

 

※ EAのサンプルソースを一覧表にまとめました


※ オススメ記事(EAが使える国内FX業者の一覧)


※ 1からEAの作り方を学びたい人はこちら

コメント

  1. フープ より:

    解説ありがとうございます。EA初心者です。
    マジックナンバーの設定に関して、複数のEAの意味が曖昧で理解できずに困ってましたがようやく少し分かってきました。

    あるEAが複数の通貨に対応しているので、複数のチャートに適用しているのですが、それの場合も複数のEA(つまりマジックナンバーを変える必要がある)に該当するのかという問題。
    多分ですが、同じ通貨に対して複数割り当てる場合に問題になるのかなと理解しました。なので、通貨が異なる場合は同じ番号でもよいという理解で相違ないでしょうか?

    逆に言うと、同じEAでも同じ通貨に割り当てれば(例えば、15分足と1時間足のチャートを立てて同じEAを入れた場合など)干渉して問題になる??んですかね。

    • りょう りょう より:

      はじめまして、フープさん。『同じ通貨に対して複数割り当てる場合に問題になる』という認識でOKです。同様に、『同じEAでも同じ通貨に割り当てれば(例えば、15分足と1時間足のチャートを立てて同じEAを入れた場合など)干渉して問題になる』という認識でOKです。これは、EAが決済する際『どの通貨ペアを決済するか』というのをEA開発者があらかじめ設定できるのですが、『どの時間足でエントリーしたポジションを決済するか』という設定はできないため干渉してしまいます。そういった場合、1時間足でエントリーしたポジションだとわかるようマジックナンバーを11111を設定し、15分足のEAのマジックナンバーを別の55555とかに設定してあげると、EAがちゃんとマジックナンバーを見る作りになっていれば1時間足のEAは11111のマジックナンバーがついているポジションだけ処理し、15分足のEAは55555のマジックナンバーがついているポジションだけ処理するといった感じになります。

タイトルとURLをコピーしました