
MT4 MT4 取引エラー
129
- 定数名
ERR_INVALID_PRICE- メッセージ
invalid price- 意味
- 注文価格が不正
MT4エラー129とは
OrderSend() や OrderClose() に渡した価格が、現在のレートとして受け付けられないときのエラーです。買いと売りで使う価格(Ask / Bid)の取り違えと、古い価格のまま注文することが主な原因です。
ログの表示例
OrderSend error 129
「エキスパート」タブまたは「操作履歴」タブに表示されます。数値や表記の細部は、ビルド・ブローカー・EAの作りによって異なります。
MT4エラー129の主な原因
- 買い注文に Bid、売り注文に Ask を渡している(成行の買いは Ask、売りは Bid)
- 決済で価格を取り違えている(買いポジションの決済は Bid、売りポジションの決済は Ask)
- 処理に時間がかかり、Ask / Bid が古い値のまま注文している
- 価格を NormalizeDouble() で丸めておらず、桁数が合っていない
- 別の通貨ペアの注文に、チャートの Ask / Bid を使っている
MT4エラー129の対処法
- 注文直前に RefreshRates() を呼び、最新の Ask / Bid を使う
- 別通貨ペアの価格は MarketInfo(通貨ペア, MODE_ASK) / MODE_BID で取得する
- 価格は NormalizeDouble(価格, Digits) で丸める
- 決済は OrderClosePrice() を渡すと、買い・売りどちらでも正しい価格になる
コード例(MQL4)
// 価格を更新しながら、回数と間隔を決めて再送する(MQL4)
int SendWithRetry(int type, double lots, int magic)
{
for(int attempt = 0; attempt < 3; attempt++)
{
// ほかのEAの注文処理が終わるまで最大5秒待つ(エラー146対策)
uint start = GetTickCount();
while(IsTradeContextBusy() && GetTickCount() - start < 5000) Sleep(100);
RefreshRates(); // 最新の Ask / Bid を取得
double price = (type == OP_BUY) ? Ask : Bid; // 買いは Ask、売りは Bid
int ticket = OrderSend(Symbol(), type, lots, NormalizeDouble(price, Digits),
30, 0, 0, "", magic, 0, clrNONE); // 30ポイント=3pips(5桁口座)
if(ticket >= 0) return ticket;
int err = GetLastError();
Print("OrderSend error ", err, "(", attempt + 1, "回目)");
// 再送して意味があるエラーだけ再試行する
if(err != 4 && err != 129 && err != 135 && err != 136 && err != 138 && err != 146)
break;
Sleep(1000);
}
return -1;
}MetaEditor(MT4)でコンパイルできることを確認済みです。自分のEAに組み込むときは、変数名や設定値を合わせてください。












