【MQL4関数】OrderSend関数の使い方!エントリー注文の出し方とサンプルプログラム

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

自動売買EAで、トレードさせるにはどうしたらいいの?

OrderSend関数とは

自動売買を作るからには、自動でトレードさせたいですよね!

「ロジックは考えてあるのに、注文を出す方法が分からない」という方は、OrderSend関数を使ってみましょう。

OrderSend関数は、FX会社に注文を出す関数です。

プログラムで実行することで、注文を出すことができます。

 

対応している注文方法は以下の通りです。

・成り行き注文
・指値注文
・逆指値注文

つまり、エントリー注文だけを出すことができる関数です。

指値の変更や決済の関数は、別の関数がありますので、そちらを利用してください。

 

OrderSend関数の書き方

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

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

 

基本的な書き方

OrderSend関数は、引数が非常に多い関数です。

そのため、難しい部分もあるかと思います。

ですが、成り行き注文のプログラムだけ作ってしまえば、あとは簡単に作れてしまうので、まずは成り行き注文のプログラムを作ってみましょう。

 

さて本題です。

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

分かりやすいように、引数は省略しています。

int ticketNum = OrderSend( ①, ②, ③, ④, ⑤, ⑥, ⑦, ⑧, ⑨, ⑩, ⑪);

 

返り値はint型で、引数は11個あります。

まずは返り値から見ていきましょう。

 

OrderSend関数の返り値(戻り値)

OrderSend関数の返り値はint型です。

返り値は配列のような連続した値ではなく、値が1つだけ返って来ます。

OrderSend関数の返り値は、関数の中でも特殊で、返ってきた値を使うことは、ほとんどありません。

返り値の具体的な値は以下の通りです。

・注文が成功すればチケット番号(注文番号)が返ってきます。
・注文が失敗すれば-1が返ってきます。

ポジションの管理方法をチケット番号にしている場合は、重要になるのですが、その方法は難易度が高いので、今は気にしなくて大丈夫です。

このようにOrderSend関数は、あくまで注文を出すだけの関数なので、返り値は重要ではありません。

 

OrderSend関数の引数

ここからはOrderSend関数の引数について解説していきます。

数が多いので、ゆっくりと見ていきましょう。

はじめに、OrderSend関数には11個の引数があります。

int ticketNum = OrderSend( ①, ②, ③, ④, ⑤, ⑥, ⑦, ⑧, ⑨, ⑩, ⑪);

 

一覧でザッと見てみます。

番号データ型引数名内容
stringsymbol通貨ペアを設定(NULLなど)
intcmd注文の種類を設定(OP_BUYなど)
doublevolumeロット数を設定
doubleprice注文の価格を設定
intslippage許容するスリッページを設定
doublestoploss損切りを設定
doubletakeprofit利確を設定
stringcommentポジションのコメントを設定
intmagicマジックナンバーを設定
datetimeexpirationポジションの有効期限を設定
colorarrow_colorチャート上のポジションの色を設定

 

1つずつ詳しく見ていきましょう。

 

①symbol

symbolは、注文を実行する通貨ペアを設定します。

例えばドル円の場合、「USDJPY」という値になります。

ですが、具体的に通貨ペアを設定する必要はありません。

というのもMQLには便利なものがあり、「Symbol」または「NULL」と書くだけで、現在の通貨ペアを設定できます。

そのため通常は、下記のように入力すれば大丈夫です。

int ticketNum = OrderSend( NULL, ②, ③, ④, ⑤, ⑥, ⑦, ⑧, ⑨, ⑩, ⑪);

 

②cmd

cmdには注文の種類を設定します。

注文の種類は6種類ありますが、「成り行き買い注文(OP_BUY)」と「成り行き売り注文(OP_SELL)」だけ覚えれば問題なしです。

ここでは成り行き買い注文を出す場合を考えています。

int ticketNum = OrderSend( NULL, OP_BUY, ③, ④, ⑤, ⑥, ⑦, ⑧, ⑨, ⑩, ⑪);

 

注文の種類は6種類あります。
全ての種類を載せておきますので、OrderSend関数のcmdを書き換えてみてください。

入力値内容
OP_BUY買いの成行注文
OP_BUYLIMIT買いの指値注文
OP_BUYSTOP買いの逆指値注文
入力値内容
OP_SELL売りの成行注文
OP_SELLLIMIT売りの指値注文
OP_SELLSTOP売りの逆指値注文

詳しくはMQLリファレンスで確認してみてください。

 

③volume

volumeには、注文したいロット数を入力します。

例えば、0.1Lotで注文を出したい場合、そのまま「0.1」を入力します。

ちなみにロット数を、自動で計算するプログラムも作ることが可能ですが、プログラムを間違えてしまうと、大変なことになるので、固定値で設定することをおすすめします。

もし、想定よりも大きいロット数を入力してしまうと、損失になる可能性があるので、しっかり確認しながら入力しましょう。

int ticketNum = OrderSend( NULL, OP_BUY, 0.1, ④, ⑤, ⑥, ⑦, ⑧, ⑨, ⑩, ⑪);

 

④price

priceには注文価格を入力します。

通常は「Ask(現在の買い値)」もしくは「Bid(現在の売り値)」のどちらかを入力します。

ここでは、買い注文を出す場合を想定しているので、Askを入力します。

ちなみに、売り注文を出したいときは、Bidを入力してください。

int ticketNum = OrderSend( NULL, OP_BUY, 0.1, Ask, ⑤, ⑥, ⑦, ⑧, ⑨, ⑩, ⑪);

 

指値・逆指値注文を出す場合は、Ask・Bidを使うことはできません。
注文を出したい価格を入力しましょう。

例えば、ドル円105.000円で指値を設定したい場合、volumeには105.000を入力します。
その状態でOrderSend関数を実行すれば、105.000円に指値が設定されます。

 

⑤slippage

slippageにはスリッページの値を入力します。

スリッページとは、注文するときに価格がズレることがあるのですが、そのときに許容する誤差の値です。

単位は0.1pipsなので、許容する誤差が2pipsの場合は、20を入力しましょう。

int ticketNum = OrderSend( NULL, OP_BUY, 0.1, Ask, 20, ⑥, ⑦, ⑧, ⑨, ⑩, ⑪);

 

⑥stoploss

stoplossには損切りする価格を設定します。

例えば、ドル円105.000円に損切りを設定したい場合は、105.000と入力します。

FXでは損切りがとても重要なので、設定するようにしましょう。

もし、損切りを設定しない場合は「0」を入力してください。

int ticketNum = OrderSend( NULL, OP_BUY, 0.1, Ask, 20, 105.000, ⑦, ⑧, ⑨, ⑩, ⑪);

 

⑦takeprofit

takeprofitは利確する価格を設定します。

例えば、ドル円110.000円で利確したい場合、110.000と入力します。

もし、利確を設定しない場合は、「0」を入力してください。

int ticketNum = OrderSend( NULL, OP_BUY, 0.1, Ask, 20, 105.000, 110.000, ⑧, ⑨, ⑩, ⑪);

 

⑧comment

注文にコメントをつけたい場合、この comment に入力します。

comment は string型なので、“自動売買の注文” のようにダブルクオテーションで囲みます。

もし、コメントをつけない場合は、”” で問題ありません。

int ticketNum = OrderSend( NULL, OP_BUY, 0.1, Ask, 20, 105.000, 110.000, "自動売買の注文", ⑨, ⑩, ⑪);

 

⑨magic

magic はマジックナンバーを設定します。

マジックナンバーは整数値であれば、どの数値でも大丈夫です。

好きな数値に設定すると良いでしょう。

int ticketNum = OrderSend( NULL, OP_BUY, 0.1, Ask, 20, 105.000, 110.000, "自動売買の注文", 777, ⑩, ⑪);

 

マジックナンバーとは、「自動売買が注文したポジション」に付けることができる管理用の番号です。

例えば、自動売買を複数動かす場合、自動売買ごとに、それぞれのポジションを区別しなければなりません。

そのときにマジックナンバーを使ってください。

具体的には、自動売買①のポジションは「10」で管理し、自動売買②のポジションは「20」で管理するという使い方です。

マジックナンバーは複数の自動売買を使うときに、とても便利な機能です。

自動売買システムごとに異なったマジックナンバーを付けておくと、トラブルが起きにくいでしょう。

 

⑩expiration

expiration には、ポジションの有効期限を設定できます。

ただし、成り行き注文には設定することができないので、指値や逆指値の注文のみ設定することができます。

datetime型なので、単位は「秒」です。

例えば、OrderSend関数を実行した時間から、1時間後に決済したい場合、以下のように入力します。

TimeCurrent() + 3600

 

TimeCurrent関数は、現在の時刻を返すMQL関数です。

datetime型の返り値なので、3600秒を足すと、1時間後の時刻になります。

その値を入力することで、1時間後に指値・逆指値注文をキャンセルすることができます。

今回は成り行き注文を出したいので、0を入力します。

int ticketNum = OrderSend( NULL, OP_BUY, 0.1, Ask, 20, 105.000, 110.000, "自動売買の注文", 777, 0, ⑪);

 

⑪arrow_color

arrow_color には、チャート上に表示されるポジションの色を設定します。

トレードに直接関係ないので、空欄でも問題ありません。

自動売買ごとに色を付けたい場合は、入力すると良いでしょう。

もし、色を付けたい場合は「clr○○」という書き方をします。

例えば、赤色を付けたい場合、clrRedと入力します。

黒色を付けたい場合は「clrBlack」と入力します。

注意点は、色を付けすぎるとチャートが見にくくなるので、必要最低限にしましょう。

int ticketNum = OrderSend( NULL, OP_BUY, 0.1, Ask, 20, 105.000, 110.000, "自動売買の注文", 777, 0, clrRed);

 

OrderSend関数の引数まとめ

ここまで、成り行き注文の書き方を解説しました。

指値や逆指値注文は、②cmd の値を変えてください。

ロット数の設定には注意してくださいね。

以上でOrderSend関数の引数の解説を終わります。

成り行き注文の完成例
int ticketNum = OrderSend( NULL, OP_BUY, 0.1, Ask, 20, 105.000, 110.000, "自動売買の注文", 777, 0, clrRed);

 

OrderSend関数の具体的な使い方(サンプルあり)

OrderSend関数は注文を出すだけの関数です。

プログラムにOrderSend関数だけを書いてしまうと、連続で注文を出してしまうため、資金が足りなくなってしまいます。

ロスカットを防ぐために、必ずif文で条件を付けてください。

例えば、「ドル円が105.000円になったら、成り行き買い注文を出す」などの条件をつけると良いでしょう。

具体的にOrderSend関数を使ったプログラムを見てみましょう。

void OnTick()
   {
    if(Ask == 105.000)
       {
        int ticketNum = OrderSend(NULL, OP_BUY, 0.1, Ask, 20, 105.000, 110.000, "自動売買の注文", 777, 0, clrRed);
       }
   }

 

EA の OnTick関数の中に、条件とOrderSend関数を書きました。

このプログラムを実行することで、105.000円になったら成り行き買い注文を出してくれます。

しかし上記のプログラムだと、105円付近でレンジになった場合、連続でトレードしてしまうため、さらに条件を追加する必要があります。

そのほかにも注意しなければならないことがありますので、あらゆる場合を考えてみてください。

 

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

 

プログラム全体を見ると以下のようになります。

//+------------------------------------------------------------------+
//|                                          SampleMQL_OrderSend.mq4 |
//|                                    Copyright 2021, 朝日奈りさFXchannel |
//|                                      https://mql-programing.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, 朝日奈りさFXchannel"
#property link      "https://mql-programing.com/"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
   {
//---

//---
    return(INIT_SUCCEEDED);
   }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
   {
//---

   }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
   {

//条件を追加
    if(Ask == 105.000)
       {

        //注文をだす
        //このままだとダメなので、コメントアウトしています。
        //int ticketNum = OrderSend(NULL, OP_BUY, 0.1, Ask, 20, 105.000, 110.000, "自動売買の注文", 777, 0, clrRed);

       }
   }
//+------------------------------------------------------------------+

 

 

まとめ

今回は OrderSend関数を解説しました。

OrderSend関数は注文を出す関数です。注文を出す以外の機能はありません。

そのため、if文で必ず条件を付けてください。

プログラムが完成したと思っても、何かエラーが起こる可能性があります。

そのためリアル口座で動かす前に、デモ口座で動かしてみてください。

実際に損失になる可能性もありますので、OrderSend関数を実行するときは、しっかりと確認するようにしましょう。