
MT4 MT4 実行時エラー
4108
- 定数名
ERR_INVALID_TICKET- メッセージ
invalid ticket- 意味
- チケット番号が不正
MT4エラー4108とは
OrderClose()・OrderModify()・OrderDelete() に、存在しない(すでに決済された)チケット番号を渡したときのエラーです。
ログの表示例
OrderClose error 4108
「エキスパート」タブまたは「操作履歴」タブに表示されます。数値や表記の細部は、ビルド・ブローカー・EAの作りによって異なります。
MT4エラー4108の主な原因
- すでに決済・削除されたチケットを操作しようとした
- SL・TPで決済されたことに気づかず、保存していたチケットで決済しようとした
- OrderSend() が失敗して -1 が返ったのに、そのまま -1 をチケットとして使った
MT4エラー4108の対処法
- 操作の前に OrderSelect(チケット, SELECT_BY_TICKET) で選択し、OrderCloseTime() が 0(未決済)か確認する
- OrderSend() の戻り値が 0 より大きいときだけチケットを保存する
- チケットを保存するより、毎回マジックナンバーでポジションを探すほうが確実
コード例(MQL4)
// 自分のポジションを安全に決済する(エラー4105・4108 対策)(MQL4)
void CloseAll(int magic)
{
// 決済すると番号が詰まるので、後ろから回す
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue; // 選択できたときだけ読む
if(OrderSymbol() != Symbol() || OrderMagicNumber() != magic) continue;
bool ok = true;
if(OrderType() == OP_BUY || OrderType() == OP_SELL)
ok = OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 30, clrNONE); // 決済価格は OrderClosePrice()
else
ok = OrderDelete(OrderTicket()); // 待機注文は OrderDelete()
if(!ok) Print("決済エラー ", GetLastError(), " ticket=", OrderTicket());
}
}MetaEditor(MT4)でコンパイルできることを確認済みです。自分のEAに組み込むときは、変数名や設定値を合わせてください。












