OrderSend関数を使ってオーダーする際にストップレベルを考慮しなければならないのは有名な話だが
注意すべき点が何個もあって、いつも忘れてしまうので備忘録
オーダータイプによって変わるのが面倒くさい
変数名は以下参照(変数名で分かると思うけど、わからない人は関数のヘルプ見て)
OrderSend( symbol, cmd, volume, price, slippage, stoploss, takeprofit )
STOPLEVEL・・・MarketInfo( Symbol(), MODE_STOPLEVEL ) * Point;
【ストップロスに対するストップレベル】
OP_BUY → Bid - stoploss >= STOPLEVEL
OP_BUYLIMIT/OP_BUYSTOP → price - stoploss >= STOPLEVEL
OP_SELL → stoploss - Ask >= STOPLEVEL
OP_SELLLIMIT/OP_SELLSTOP → stoploss - price >= STOPLEVEL
【テイクプロフィットに対するストップレベル】
OP_BUY → takeprofit - Bid >= STOPLEVEL
OP_BUYLIMIT/OP_BUYSTOP → takeprofit - price >= STOPLEVEL
OP_SELL → Ask - takeprofit >= STOPLEVEL
OP_SELLLIMIT/OP_SELLSTOP → price - takeprofit >= STOPLEVEL
【注文価格に対するストップレベル】
OP_BUY/OP_SELL → 成り行きなので特になし
OP_BUYLIMIT → Bid - price >= STOPLEVEL ※有利な取引だからBIDと比較らしい
OP_BUYSTOP → price - Ask >= STOPLEVEL ※不利な取引だからASKと比較らしい
OP_SELLLIMIT → price - Ask >= STOPLEVEL ※有利な取引だからASKと比較らしい
OP_SELLSTOP → Bid - price >= STOPLEVEL ※不利な取引だからBIDと比較らしい
当たり前の話なのか探し方が悪いのかわからないが、ネットで調べても全ての情報がなかなか見つからない。
そのため、確実にあっている保証はないですが、とりあえず私はこれで解決できています。
なので経験則も若干入っています。(エラーコード130 invalid stops出るたびに調べた経験則)