注文を入れる時に使うのがOrderSend()です。
OrderSend
C言語に似たものでコードもそれほど長くならないので簡単に注文は、OrderSend() を実行するだけと思っているとハマります。確認することは色々あり、またMT4は古いソフトなのバタバタな作りです。
Definition
1 2 3 4 5 6 7 8 9 10 11 12 13 |
int OrderSend( string symbol, // symbol int cmd, // operation double volume, // volume double price, // price int slippage, // slippage double stoploss, // stop loss double takeprofit, // take profit string comment=NULL, // comment int magic=0, // magic number datetime expiration=0, // pending order expiration color arrow_color=clrNONE // color ); |
Ref: OrderSend – Trade Functions – MQL4 Documentation
Parameters
symbol:
通貨ペア名を入れますが、ここは以下のいずれかにします。
- Symbol()
- NULL
- FX口座に合わせたシンボル名(”USDJPY-b”, “USDJPY.pers”, “USDJPYm”, etc.)
安易に “USDJPY” などとすると失敗します。
例)Forex ExchangeのMT4のケース
1 2 |
string SymbolName = Symbol(); Print("SymbolName: " + SymbolName); |
というコードを流し、「エキスパート」のログを確認すると
1 |
SymbolName: USDJPY.pers |
FX業者によってSumbol()で返ってくる名前が XXX.pers とか XXX-b などのように異なり、その通りのオーダーを入れる必要があります。
業者には複数コースがあり最大注文ロット数の違いやEAが使える口座などがシンボル名で分けているようです。
cmd:
注文タイプを設定します。注文の種類は売り買いそれぞれ、
- 成行
- 指値(limit pending order)
- 逆指値(stop pending order)
ここで設定するIDはこうなります。
ID | Value | Description |
OP_BUY | 0 |
Buy operation |
OP_SELL | 1 |
Sell operation |
OP_BUYLIMIT | 2 |
Buy limit pending order |
OP_SELLLIMIT | 3 |
Sell limit pending order |
OP_BUYSTOP | 4 |
Buy stop pending order |
OP_SELLSTOP | 5 |
Sell stop pending order |
volume:
ロット数です。
1LotがFX業者やその口座、通貨ペアで異なることもあるので事前に確認、1万通貨だったり10万通貨だったりするのです。(1千というのもあったり…)
MarketInfo()のMODE_LOTSIZEで分かります。
1 |
MarketInfo(Symbol(),MODE_LOTSIZE)); |
price:
オーダーする価格です。
指値などの時は、Digitsの確認(小数点以下が2桁か3桁、あるいは4桁か5桁)
またPointとNormalizeDouble()を使います。
例)買値から100Pointに(逆)指値を入れる
1 |
NormalizeDouble(Ask+100*Point,Digits()) |
以下、価格に関連する場合はこれを適用します。
slippage:
許容するスリップページ
単位は Point で指定します。
stoploss:
ECN/STPのFX業者はOrderSend()の注文の時点では受け付けないようなので、こおは0にして直後にOrderModify()を使って改めてstoplossを追加します。
ただし、直後と言ってもサーバー 側で要求過多で拒否される可能性もあるので、多少Waitをかけたり、やり直しができるような記述が必要となります。
ストップレベル:
FX業者によってはスプレッドの他に追加でストップレベルを入れている業者があります(AvaTradeなど)
指値、逆指値にこのストップレベルも追加しないと注文が通らないということがあります。
1 |
MarketInfo(Symbol(),MODE_STOPLEVEL); |
から調べられます。またMT4だと仕様から確認できます。
takeprofit:
stoploss と同様です。
comment=NULL:
これはNULLにして無くてもいいのですが、1つの口座で裁量もやっているユーザーからするとこのトレードがEAのものかどうか分かりやすので入れておく、あるいはパラメータで設定できるようにしておくといいかもしれません
magic=0:
EAのマジックナンバー
expiration=0:
注文の有効期限を秒で設定
期限を指定しない場合は0
取引サーバーによって無効にされている場合もありエラーが返ってくる
arrow_color=clrNONE:
手仕舞いした価格に矢印が残りますがその色の設定
必要ない場合は省略するかclrNONEとする
Tips
既に引数の箇所で説明していますがこのOrderSend()を実行するまでの手順がいろいろあります。必須事項ではありませんが、手を抜くとロジックが成立しているのに注文を出さないとか、とんでもない結果になる可能性があります。
最大ポジション数の確認:
初心者はレバレッジを理解せずに始める人も多いので、レバレッジがギリギリで注文が通り、その後すぐに逆行して口座が溶けてしまわないように(超日本的ですが…)
口座内の他のポジションも計算してレバレッジが高すぎないか確認(トレーダーのポリシーにもよりますが、余計なお世話?)
マジックナンバーの設定確認:
マジックナンバーが自分のEAのマジックナンバーなのか事前に確認
通貨ペアの設定確認:
エントリーをする際に通貨ペアが Symbol() または NULL であること
(固定の場合は、USDJPYm, USDJPY_ など、ブローカーによる文字が考慮されていること)
ストップロスの設定確認:
損切り(利確)の設定がOrderSend()ではサーバー が受け付けないことがあるので、エントリー後にチケット番号が変わらないうちに設定します。
サーバーに注文が通らないケース:
– IsStopped()
外部の何らかの理由でシャットダウンさるので、すぐに注文を止める必要があります。
– IsTradeContextBusy()
他のEAが同じタイミングで注文を入れようとしてビジー状態かどうか確認します。Trueならばある程度待ってから再度やり直す必要があります。
– GetLastError()
注文が通らずにエラーになることがあります。エラーの内容によって繰り返しOrderSend()すべき場合と、Fatalなエラーなので即終了した方がいい場合があります。
References:
OrderSend – Trade Functions – MQL4 Documentation
NormalizeDouble – MQL4 Reference – MQL4 Documentation
Point – Predefined Variables – MQL4 Documentation