自動売買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( ①, ②, ③, ④, ⑤, ⑥, ⑦, ⑧, ⑨, ⑩, ⑪);
一覧でザッと見てみます。
番号 | データ型 | 引数名 | 内容 |
① | string | symbol | 通貨ペアを設定(NULLなど) |
② | int | cmd | 注文の種類を設定(OP_BUYなど) |
③ | double | volume | ロット数を設定 |
④ | double | price | 注文の価格を設定 |
⑤ | int | slippage | 許容するスリッページを設定 |
⑥ | double | stoploss | 損切りを設定 |
⑦ | double | takeprofit | 利確を設定 |
⑧ | string | comment | ポジションのコメントを設定 |
⑨ | int | magic | マジックナンバーを設定 |
⑩ | datetime | expiration | ポジションの有効期限を設定 |
⑪ | color | arrow_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関数を実行するときは、しっかりと確認するようにしましょう。