
MT5 MT5 取引サーバーのリターンコード
10016
- 定数名
TRADE_RETCODE_INVALID_STOPS- メッセージ
invalid stops- 意味
- 損切り・利確(ストップ)の価格が不正
MT5エラー10016とは
注文や変更で指定した損切り(SL)・利確(TP)が、現在値に近すぎるか向きが逆のときのリターンコードです。MT5 のEAで最もよく出るエラーのひとつで、MT4 のエラー130にあたります。
ログの表示例
CTrade::OrderSend: market buy 0.10 USDJPY sl: 150.120 tp: 150.130 [invalid stops]
「エキスパート」タブまたは「操作履歴」タブに表示されます。数値や表記の細部は、ビルド・ブローカー・EAの作りによって異なります。
MT5エラー10016の主な原因
- SL・TPが現在値から SYMBOL_TRADE_STOPS_LEVEL(ストップレベル)以内にある
- SL・TPの向きが逆(買いで SL が bid より上など)
- pips とポイントの換算ミスで距離が 1/10 になっている
- SL・TPを NormalizeDouble() で丸めていない
- SYMBOL_TRADE_FREEZE_LEVEL(フリーズレベル)内でポジションを変更しようとした
MT5エラー10016の対処法
- SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL) * _Point を最小距離とし、それより離す
- 買いは SL < bid < TP、売りは TP < ask < SL の関係を守る
- 5桁・3桁の銘柄では 1pips = 10ポイント として計算する
- SL・TPは NormalizeDouble(値, _Digits) で丸める
コード例(MQL5)
// 損切り・利確をストップレベルより外側に置く(10016 invalid stops 対策)(MQL5)
#include <Trade\Trade.mqh>
CTrade trade;
input double InpSlPips = 20;
input double InpTpPips = 40;
bool BuyWithStops(double lots)
{
MqlTick tick;
if(!SymbolInfoTick(_Symbol, tick)) return false;
double pip = (_Digits == 3 || _Digits == 5) ? _Point * 10 : _Point;
double minDist = (double)SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL) * _Point;
double spread = tick.ask - tick.bid;
double slDist = MathMax(InpSlPips * pip, minDist + spread);
double tpDist = MathMax(InpTpPips * pip, minDist + spread);
double sl = NormalizeDouble(tick.bid - slDist, _Digits); // 買いは SL < bid
double tp = NormalizeDouble(tick.bid + tpDist, _Digits); // 買いは TP > bid
if(!trade.Buy(lots, _Symbol, tick.ask, sl, tp))
{
Print("retcode=", trade.ResultRetcode(), " ", trade.ResultRetcodeDescription());
return false;
}
return true;
}MetaEditor(MT5)でコンパイルできることを確認済みです。自分のEAに組み込むときは、変数名や設定値を合わせてください。












