1. TerminalClose関数の概要と実務での活用法
TerminalCloseは、動作中のMetaTrader 5(MT5)端末をプログラムコードからコマンドで終了させるための関数です。一見すると「ただ閉じるだけ」のシンプルな関数に思えますが、アルゴリズムトレードの実務においては、「システムの最終防衛ライン」としての重要な役割を担います。
実務での主な活用シーンは以下の通りです。
– 致命的なエラーの回避: サーバー接続が長時間復旧しない、あるいはデータ整合性に致命的な不整合が発生した場合に、誤発注を防ぐために強制終了する。
– リスク管理(ドローダウン対策): 1日の許容損失額を超えた場合に、それ以上のトレードを物理的に遮断するために端末を閉じる。
– 定期メンテナンス: 週末や特定の時間帯に端末を再起動させる運用フローの一部として組み込む。
初心者の方は「ポジションを決済してから閉じてくれる」と誤解しがちですが、この関数はあくまで端末というアプリケーションを終了させるだけです。注文の管理とは切り離して考える必要がある点が、実務における最大の注意点です。
2. 構文と戻り値
TerminalClose関数の仕様は非常にシンプルです。
bool TerminalClose(
int ret_code // 終了コード
);
パラメーター
- ret_code: MT5が終了する際にオペレーティングシステム(Windows等)に渡すコードを指定します。通常、正常終了を示す場合は「0」を指定します。特定の異常終了をログに残したい場合は、独自の数値を指定することも可能です。
戻り値
- true: 終了コマンドの送信に成功した場合。
- false: コマンドの送信に失敗した場合。
※この関数が実行されても、即座にプロセスが消えるわけではありません。終了命令がキューに入れられ、現在の処理が一段落した後にシャットダウンプロセスが始まります。
3. 具体的な使い方・実践サンプルコード
以下の例は、1日の最大許容損失額(ストップロス・リミット)に達した際に、安全のために全ポジションを決済し、MT5端末を自動的に閉じる「セーフティ・スイッチ」の実装例です。
//+------------------------------------------------------------------+
//| 1日の損失限度額に達したら端末を閉じるサンプルコード |
//+------------------------------------------------------------------+
#include <Trade\Trade.mqh>
input double MaxDailyLoss = 500.0; // 許容する最大損失額 (USD/JPY等)
void OnTick()
{
// 現在の口座の未実現損益(含み損)を取得
double currentProfit = AccountInfoDouble(ACCOUNT_PROFIT);
// 許容損失額を超えているかチェック
if (currentProfit <= -MaxDailyLoss)
{
Print("【警告】最大許容損失に達しました。安全のため全ポジションを決済し端末を終了します。");
// 1. 全ポジションの決済処理(CTradeクラスを使用)
CTrade trade;
for(int i = PositionsTotal() - 1; i >= 0; i--)
{
ulong ticket = PositionGetTicket(i);
if(PositionSelectByTicket(ticket))
{
trade.PositionClose(ticket);
}
}
// 2. 端末を終了させる
// 戻り値を確認してログに出力
if(TerminalClose(0))
{
Print("TerminalCloseコマンドの送信に成功。");
}
else
{
Print("TerminalCloseコマンドの送信に失敗。");
}
}
}
4. 使用上の注意点とよくあるエラー
開発において陥りやすい罠がいくつか存在します。
- ポジションの放置: 前述の通り、
TerminalCloseを実行してもポジションは自動で決済されません。決済コードを書かずにこの関数を呼ぶと、MT5が閉じた後もポジションが市場に残り続け、意図しない大損害を招く恐れがあります。必ず「決済処理」とセットで運用してください。 - ストラテジーテスターでの挙動: バックテスト中にこの関数が呼ばれても、PC自体のMT5が閉じることはありません。あくまで「テストの終了」として扱われます。
- 無限ループの罠:
OnInit()(初期化時)で条件判定なしにTerminalCloseを呼び出すと、MT5を起動した瞬間に閉じてしまい、コードの修正すら困難になることがあります。条件分岐は慎重に設計してください。 - 終了までのタイムラグ:
TerminalCloseを呼び出した後も、そのティック内の残りのコードは実行され続ける可能性があります。呼び出し後はすぐにreturn;で処理を抜けるのがベストプラクティスです。
5. 【重要】自動売買における約定スピードと環境の罠
アルゴリズムトレードの世界では、TerminalCloseのようなリスク回避ロジックを組むことと同じくらい、「実行環境」の選定が勝敗を分けます。自宅のデスクトップPCやノートPCでEAを稼働させているエンジニアは多いですが、これはプロの視点から見ると極めてリスクが高い行為です。家庭用インターネット回線は数ミリ秒〜数十ミリ秒のネットワーク遅延(レイテンシ)が発生し、一瞬の価格変動で利益が消失したり、滑り(スリッページ)によって想定外の損失を生んだりします。
約定スピードを極限まで高め、物理的な障害(停電やWindowsアップデートによる勝手な再起動)からシステムを守るには、FX業者のデータセンターに近い場所に設置された「専用のVPS(仮想専用サーバー)」の導入が不可欠です。プロのクオンツエンジニアがコンマ数秒の遅延を削るために数千万円を投資するように、シストレ開発者にとってVPSは「コスト」ではなく、利益を守り、最大化するための「必須設備」であることを忘れないでください。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント