1. ResetLastError関数の概要と実務での活用法
ResetLastErrorは、MQL5のシステム変数である「最後に発生したエラーコード(_LastError)」を0にリセット(初期化)するための関数です。
MQL5での開発において、初心者が最も陥りやすい罠の一つが「エラーハンドリングの放置」です。MQL5の仕様上、一度発生したエラーコードは、次に別のエラーが発生して上書きされるか、明示的にリセットしない限り、古いコードが残り続けてしまいます。
実務では、以下のような流れで活用します。
1. 重要な処理(注文送信やファイル操作など)の直前でResetLastError()を呼ぶ。
2. 処理を実行する。
3. 処理が失敗した場合にのみGetLastError()でエラー内容を確認する。
このステップを踏まない場合、「今回の注文は成功したのに、前回の処理で残っていたエラーコードを拾ってしまい、プログラムが誤作動する」といった、原因特定が困難なバグを引き起こす原因となります。プロの現場では、正確なデバッグと堅牢なロジック構築のために必須の関数です。
2. 構文と戻り値
ResetLastError関数の仕様は非常にシンプルです。
void ResetLastError();
- パラメーター: なし
- 戻り値: なし(void型)
- 動作: 定義済み変数
_LastError(またはGetLastError()で取得できる値)を0(ERR_SUCCESS)に設定します。
3. 具体的な使い方・実践サンプルコード
以下は、成行注文を出す際にResetLastErrorを使用して、エラー発生時のみ正確なログを出力する実践的なコード例です。
//+------------------------------------------------------------------+
//| 注文実行時のエラーチェックサンプル |
//+------------------------------------------------------------------+
void PlaceMarketOrder(ENUM_ORDER_TYPE type, double volume)
{
MqlTradeRequest request = {};
MqlTradeResult result = {};
// 1. 処理の実行前に必ずエラー状態をリセットする
ResetLastError();
// 2. 注文リクエストの構築
request.action = TRADE_ACTION_DEAL;
request.symbol = _Symbol;
request.volume = volume;
request.type = type;
request.price = SymbolInfoDouble(_Symbol, (type == ORDER_TYPE_BUY) ? SYMBOL_ASK : SYMBOL_BID);
request.magic = 123456;
request.deviation = 10;
request.type_filling = ORDER_FILLING_IOC;
// 3. 注文の送信
if(!OrderSend(request, result))
{
// 注文が失敗した場合のみ、GetLastError()で原因を特定する
int errorCode = GetLastError();
PrintFormat("【エラー発生】注文に失敗しました。シンボル: %s, エラーコード: %d", _Symbol, errorCode);
// エラーコードに応じた個別処理(例:再試行、パラメータ修正など)
if(errorCode == ERR_TRADE_EXPERT_HANDLE_DISABLED)
Print("アドバイザーによる取引が許可されていません。設定を確認してください。");
}
else
{
Print("注文が正常に送信されました。");
}
}
4. 使用上の注意点とよくあるエラー
開発者が特によくやるミスは、「エラーが起きた後」にResetLastErrorを呼んでしまうことです。
- ミスの例:
OrderSendに失敗し、GetLastErrorでコードを取得する前にResetLastErrorを呼ぶと、せっかくのエラー情報が消えてしまい、原因が分からなくなります。 - 正しい順序:
ResetLastError(掃除)→ 実行 →GetLastError(確認)。
また、すべてのMQL5組み込み関数がエラーコードを更新するわけではないという点にも注意が必要です。エラーコードを生成する関数(OrderSend, FileOpen, CopyRatesなど)を扱う場合のみセットで使用するのが一般的です。
不必要な場所で乱用するとコードの可読性を下げますが、ここぞという「失敗が許されない処理」の前には必ず置く癖をつけてください。
5. 【重要】自動売買における約定スピードと環境の罠
どれほど完璧にResetLastErrorを使いこなし、エラーハンドリングを徹底したとしても、プログラムの実行環境そのものに欠陥があれば、安定した収益は望めません。特に自宅のPCや一般的な光回線を利用した自動売買は、ネットワークの物理的な距離に起因する「レイテンシ(遅延)」という致命的な問題を抱えています。FXの価格はミリ秒単位で変動しており、自宅から海外にある証券会社のサーバーへ注文が届くまでのわずかな遅延が、スリッページや約定拒否(リクオート)を招き、バックテストの結果とは乖離した損失を生み出します。
プロのクオンツエンジニアが極限まで約定スピードを追求するのは、それが期待値に直結することを知っているからです。取引サーバーに極めて近い場所に位置する専用のVPS(仮想専用サーバー)を利用することは、もはやオプションではなく、自動売買における「必須インフラ」です。24時間安定した稼働を維持し、ネットワーク遅延を最小限に抑えることで初めて、あなたが書いたコードの真のパフォーマンスが発揮されます。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント