【MQL4関数】OrderMagicNumber関数の使い方!マジックナンバーとは?ポジション管理のやり方

【中級編】MQLプログラムの読み方・書き方
おすすめEA
朝日奈りさ
朝日奈りさ

マジックナンバーって何?裁量のときは聞いたことがないけど、自動売買では重要なの?

マジックナンバーとは

裁量のときは、「自分がエントリーしたポジションは、自分で決済」していたと思います。

自動売買を使うからには、「自動売買がエントリーしたポジションは、自動売買で決済」して欲しいですよね!

そこで、マジックナンバーを使ってみましょう!

 

マジックナンバーとは、自動売買がポジションを管理するための番号です。

具体的には、「10」とか「20」とか、好きな数字を設定することができます。

設定することで、自動売買がエントリーしたポジションに、マジックナンバーが付きます。

マジックナンバーが付いていると、その自動売買がエントリーしたポジションなのかを、自動売買が判別することができるようになります。

判別できるようになると、別の自動売買が決済してしまうことや、裁量のポジションを決済してしまうことを防ぐことができるようになるのです。

 

例えば、自動売買①と自動売買②を同時に動かしている場合を考えてみましょう。

  • マジックナンバーが付いていない場合
自動売買は、どちらの自動売買でエントリーしたポジションなのか判別できません。
そのため、自動売買①でエントリーしたのに、自動売買②が決済してしまうことが起こる可能性があります。
  • マジックナンバーが付いている場合
自動売買は、どちらの自動売買でエントリーしたポジションなのか判別できます。
そのため、自動売買①でエントリーしたのに、自動売買②が決済してしまうことは起こりません。

 

このように、マジックナンバーを設定しておくことで、別の自動売買が決済してしまうことを防ぐことができます。

 

ちなみにマジックナンバーは、エントリーするときに設定します。

OrderSend関数の9番目の引数(⑨magic)でマジックナンバーを設定できます。

 

マジックナンバーを設定する方法

「マジックナンバーを設定したいけどどうしたらいいの?」という方が多いと思います。

マジックナンバーは、自動売買プログラムに直接書いてしまうと良いでしょう。

例えば、以下のように書きます。

//大域変数にマジックナンバーの数値を書く
int magicNumber = 10;

//エントリーするときに、マジックナンバーを設定する
//OrderSend関数の9番目の引数に設定
int ticketNum = OrderSend( NULL, OP_BUY, 0.1, Ask, 20, 105.000, 110.000, "自動売買の注文", magicNumber, 0, clrRed);

 

プログラムを省略していますが、上記のようにマジックナンバーを設定します。

大域変数にマジックナンバー用の変数を準備し、好きな数値を代入します。

そして、エントリーするときにマジックナンバーを設定します。

このような流れで、マジックナンバーを設定すると良いでしょう。

 

ちなみに裁量でエントリーしたポジションには、マジックナンバーを付けることができませんので、ご注意ください。

 

ここまでは、マジックナンバーを設定する方法を解説しました。

ここからはマジックナンバーを使う方法を見ていきましょう。

 

マジックナンバーを使う方法(OrderMagicNumber関数)

マジックナンバーを設定するだけではなく、使うことで力を発揮します。

マジックナンバーを使うには、OrderMagicNumber関数を使います。

 

OrderMagicNumber関数は、ポジションに付いているマジックナンバーを取得する関数です。

マジックナンバーを取得することで、自動売買に設定しているマジックナンバーと、ポジションのマジックナンバーが同じかどうか、判別できます。

例えば、ポジションのマジックナンバーが「10」で、自動売買のマジックナンバーが「10」の時、数値が同じなので、自動売買が決済することができます。

マジックナンバーが異なっている場合は、自動売買は決済することができません。

このように、マジックナンバーとOrderMagicNumber関数を使うことで、想定外のポジションを決済してしまうことを防ぐことができます。

 

OrderMagicNumber関数の書き方

OrderMagicNumber関数の使い方は、基本的な関数と同じです。

関数をマスターしていない方はこちらの記事が参考になります。

 

基本的な書き方

OrderMagicNumber関数の基本的な書き方は以下の通りです。

int orderMagicNumber = OrderMagicNumber();

 

返り値は int型で、引数はありません。

ポジションのマジックナンバーは、返り値として取得することができます。

具体的には「10」や「20」など、エントリーするときに設定した数値が返ってきます。

 

事前にポジションを選択しておく

OrderMagicNumber関数は、引数が無いため、どのポジションのマジックナンバーを取得すれば良いのか、判断することができません。

そのため、事前にポジションを選択しておく必要があります。

ポジションを選択するには、OrderSelect関数を使います。

 

必ず OrderSelect関数 → OrderMagicNumber関数 の順にプログラムするので、以下のようなプログラムになります。

//大域変数にマジックナンバーの数値を書く
int magicNumber = 10;

//保有ポジションを一つ選択
if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
   {

   //選択したポジションのマジックナンバーが
   //自動売買のマジックナンバーと同じかどうかチェック
   if(OrderMagicNumber() == magicNumber)
      {

         //ここにポジションを決済するプログラムを書く

      }
   }

 

OrderMagicNumber関数を実行する前に、OrderSelect関数でポジションを選択しておきましょう。

 

もう少し詳しく解説します。

上記のプログラムの 10行目を見てください。

  • 「OrderMagicNumber( )」はポジションのマジックナンバーです
  • 「magicNumber」は自動売買のマジックナンバーです

ふたつとも必ず一緒じゃないの? と思うかもしれませんが、別物です。

自動売買を複数起動している場合、両者は異なります。

というより、異なるようにマジックナンバーを設定してください。

異なるマジックナンバーを設定することで、別のポジションを決済してしまうことを防いでいます。

 

OrderMagicNumber関数の具体的な使い方

マジックナンバーを設定する方法と、マジックナンバーを使う方法を解説しました。

ここからは、エントリーしてからマジックナンバーを使うところまで、具体的にプログラムを見てみましょう。

早速ですが、プログラムは以下の通りです。

//大域変数にマジックナンバーの数値を書く
int magicNumber = 10;

void OnTick()
   {
   //---

   //エントリーするときに、マジックナンバーを設定する
   //OrderSend関数の9番目の引数に設定
   int ticketNum = OrderSend(NULL, OP_BUY, 0.1, Ask, 20, 105.000, 110.000, "自動売買の注文", magicNumber, 0, clrRed);


   //保有ポジションを一つずつチェックしていく
    for(int i = OrdersTotal() - 1; i >= 0; i--)
       {

        //保有ポジションを一つ選択
        if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
           {

            //選択したポジションが、実行されている通貨ペアと同じかどうかチェック
            if(OrderSymbol() == Symbol())
               {

                //選択したポジションが、この自動売買のマジックナンバーと同じかチェック
                if(OrderMagicNumber() == magicNumber)
                   {

                    //ここにポジションを決済するプログラムを書く

                    //わかりやすいようにprintしておきます。
                    Print("OrderSymbol : " + OrderSymbol());
                    Print("Symbol : " + Symbol());
                    Print("OrderMagicNumber : " + IntegerToString(OrderMagicNumber()));

                   }
               }
           }
       }

   }

 

 

注文関係の関数をたくさん使用しています。

簡単に解説すると、以下の通りです。

  • 2行目で、マジックナンバーを決めています。
  • 10行目で、マジックナンバーが付いたポジションをエントリーしています。
  • 26行目で、ポジションのマジックナンバーをチェックしています。

 

このように書くことで、全てのポジションをチェックし、その中から自動売買のマジックナンバーと同じポジションだけを、決済することができます。

この書き方は、自動売買を作るときによく使う書き方なので、どこかにコピーしておくと良いでしょう。

 

まとめ

OrderMagicNumber関数は、ポジションのマジックナンバーを取得する関数です。

マジックナンバーは、エントリーするとき(OrderSend関数)に設定することができます。

そして、自動売買とポジションのマジックナンバーを一致させることで、別のポジションを決済してしまうことを防いでいます。

使い方としては、OrderSelect関数でポジションを事前に選択しておく必要があるので、注意しましょう。

また、上記で紹介したサンプルプログラムは、どの自動売買でも基本となる書き方なので、コピーしておくと良いでしょう。