FX

MQL4のOrderCloseの使い方とFX自動売買の決済確認

チャートとプログラムを確認する画面のイメージ

FX自動売買のEAをMQL4で作るとき、保有中の注文を決済する関数がOrderCloseです。引数には注文番号や数量、決済価格などを渡し、成功・失敗は戻り値で確認します。決済の対象を誤らないよう、呼び出す前に注文の状態と種類を確かめることが大切です。

OrderCloseは、まだ約定していない待機注文を取り消す関数ではありません。また、EAを止めることと保有注文を決済することも別の操作です。この記事ではMQL4とMT4を対象に、引数の意味から決済後の照合まで順番に整理します。

実際の決済は口座の取引状態を変えます。掲載する数値や手順は説明用で、特定のEAの動作や利益を保証するものではありません。実装はまず発注しない確認から始め、取引条件に合うかデモ環境で確かめてください。

この記事のポイント
  • 決済する注文と待機注文を区別する
  • 注文番号・数量・価格・許容差の意味を理解する
  • 対象を発注しない形で先に確認する
  • 結果が不明なときは注文状態を照合する

MQL4のOrderCloseでFX自動売買の注文を決済する基本

注文を閉じる流れを鍵のアイコンで表すイメージ
説明用の生成イメージです。実際の画面や検証結果ではありません。

OrderCloseが扱う注文と扱わない注文

MQL4のOrderCloseは、保有中の成行注文を閉じるための関数です。指定した数量が有効であれば、全数量だけでなく一部を決済することもできます。実際に指定できる数量や残せる数量は、銘柄と取引業者の条件を確認してください。

まだ約定していない指値注文や逆指値注文を取り消す操作は、OrderDeleteが担当します。保有中の注文を決済するのか、待機注文を取り消すのかを、画面表示だけでなく注文種別から分けます。両建ての反対方向の注文を使って相殺するOrderCloseByも別の関数です。

MQL4公式リファレンスのOrderCloseでは、注文番号、ロット数、決済価格、許容スリッページ、矢印の色を引数とし、成功時にtrue、失敗時にfalseを返すと説明しています。戻り値は注文番号ではありません。新規注文を出すOrderSendと取り違えないようにしましょう。

五つの引数を役割で分ける

書式はOrderClose(ticket, lots, price, slippage, arrow_color)です。ticketには決済したい注文の一意の番号、lotsには決済する数量、priceには要求する決済価格を渡します。slippageは許容する価格のずれをポイントで指定し、arrow_colorはチャート上の矢印の表示に使います。

最初の四つは決済要求の内容に関わります。矢印の色を省略するかCLR_NONEにした場合は矢印を表示しない仕様です。色は見た目の指定であり、決済の成否を証明するものではありません。成否は戻り値と、その後の注文状態から確認します。

例えば、数字の並びだけをコピーしても、自分の口座の注文番号や数量にはなりません。対象注文から取得した番号と数量を使う設計にし、売買方向に合う価格を選びます。決済する条件が成立したからといって、一覧にあるすべての注文を閉じるとは限らない点にも注意してください。

カードを虫眼鏡で選ぶ注文確認のイメージ
説明用の生成イメージです。実際の画面や検証結果ではありません。

ticketは一覧の位置ではなく注文番号

ticketは取引サーバー上で注文を識別する番号です。注文一覧の何番目に表示されているかを表す位置とは意味が違います。一覧の位置をそのままticketとして渡すと、対象を選べなかったり、意図しない注文を参照したりする原因になります。

注文の情報を読むときはOrderSelectで対象を選び、選択の成功を確かめます。続いてOrderTicket、OrderSymbol、OrderMagicNumber、OrderType、OrderLotsなどを読み、今回の決済対象かを確認します。OrderSelectで注文を選ぶ手順では、位置とチケットの違いや選択後の状態確認を整理しています。

選択できたことと、対象として正しいことは別です。銘柄、EAが管理する番号、売買種別、注文が現在も保有中かを組み合わせて判断します。手動注文や別EAの注文が同じ口座にある場合は、対象外の注文を誤って決済しない設計が必要です。マジックナンバーの一致だけで、どのEAでも安全に分離できると保証されるわけではありません。

lotsは決済量と残量の両方を見る

lotsは決済したい数量です。保有量を全て指定すれば全決済、一部を指定すれば部分決済の要求になります。ただし、指定量が保有量を超えていないか、銘柄の最小数量や数量刻みに合うかを先に調べてください。

部分決済では、決済する側だけでなく残る側の数量も重要です。例えば保有量から半分を引いた値が取引条件に合わなければ、単純に半分を指定しても要求が受け付けられるとは限りません。端数の扱いや許容される残量は業者の仕様に従い、デモで確認します。

決済後に保有量が期待どおりかを再取得することも必要です。部分決済後の注文の扱いは環境によって差があり得るため、古いチケットや保存していた数量だけに頼らず、現在の注文一覧と履歴を照合します。MT4画面から手動で行う手順はMT4の部分決済と残量確認を参考にしてください。

数量の分割を二つの硬貨の山で表すイメージ
説明用の生成イメージです。実際の画面や検証結果ではありません。

priceとslippageの単位を取り違えない

決済価格は保有している方向によって確認する側が異なります。一般に買いの決済はBid、売りの決済はAskを使います。異なる銘柄の注文を処理する場合は、チャート上の銘柄だけで判断せず、決済対象の銘柄に対応する価格を確認してください。

価格は時間とともに変わります。かなり前に取得した値を使うと、その時点の価格と合わず要求が失敗することがあります。最新価格の取得と処理の順序を確認し、価格更新や接続の状態を調べましょう。ただし、価格を更新しただけですべての失敗を解決できるわけではありません。

slippageは価格の許容差をポイントで表す引数です。ポイントとpipsを同一視すると、想定より大きいまたは小さい値を指定するおそれがあります。銘柄の桁数と取引条件を確認し、数値の意味を理解したうえで設定します。数値を大きくすれば必ず希望どおりに決済できる、というものでもありません。

価格の差を二本の線で示すイメージ
説明用の生成イメージです。実際の画面や検証結果ではありません。

戻り値と注文の現在状態を分けて確認する

OrderCloseの戻り値がtrueなら関数は成功を示し、falseなら失敗を示します。falseの場合は、他の処理でエラー情報が変わる前にGetLastErrorで番号を取得し、時刻、対象注文、処理内容と合わせて記録します。MQL4の公式チュートリアルも、戻り値とエラーを確認する流れを説明しています。

結果が確認できないときに、同じ注文へ無条件で要求を連続送信するのは避けます。接続や処理の途中で状況が変わる可能性があるため、現在の保有注文と履歴を先に再確認し、何が残っているかを確かめます。再試行の条件や回数はEAの設計と取引環境に依存します。

MQL4のOrderCloseを安全に確認する手順

画面上の警告と確認用ノートのイメージ
説明用の生成イメージです。実際の画面や検証結果ではありません。

決済前に対象と範囲を決める

最初に「何を閉じるのか」を明確にします。特定の注文一件なのか、あるEAの同一銘柄の注文なのか、買いと売りのどちらか、全数量か一部かによって、必要な確認は変わります。決済対象の定義が曖昧なまま、一覧の全件を処理するコードを実行しないでください。

例えば同じ口座でEA-AとEA-Bが同じ通貨ペアを使っているなら、通貨ペアだけでは二つを区別できません。注文に付けた番号、注文種別、対象の口座、保有状態を併せて確認します。手動注文も含めるかどうかは、EAの目的と実装に合わせて決めます。

同じEAを複数のチャートや端末で動かす場合も、対象が重複しないかを点検します。端末を分けても同じ口座なら注文や証拠金が共有されるためです。複数EAの注文干渉を防ぐ確認点も合わせて見てください。

まず決済しない確認から始める

初心者が最初に作る確認では、注文を実際に閉じず、対象として選ばれた番号、銘柄、種別、数量、判定理由を表示する方法が役立ちます。意図した注文だけが対象になっていることを、画面の注文一覧と一件ずつ照らし合わせます。

対象外の手動注文、別EAの注文、待機注文を用意したデモ環境で、想定どおり除外されるか確認します。対象がゼロのケースと複数あるケースも用意すると、一覧が空の場合や処理途中に件数が変化する場合の見落としを減らせます。

これはロジックの一部を観察する段階です。表示が正しいことだけで、注文送信、価格更新、失敗処理、実際の約定まで正しいと保証されません。次の段階でも、テストの目的と期待する結果を先に決めてから進みます。

デモで全決済と部分決済を分けて試す

デモ口座で試す場合は、他の注文に影響しない専用の条件を用意します。決済前の注文番号、方向、数量を控え、全決済と部分決済を別々に確認しましょう。一回のテストで両方の条件を同時に変更すると、期待と違ったときに原因を切り分けにくくなります。

全決済のテストでは、対象の保有注文が残っていないことと、履歴に結果が記録されていることを確認します。部分決済では、決済した量だけでなく、残量が想定どおりか、以後の管理対象をEAが正しく識別できるかを確認します。指定した数字と実際に口座側へ反映された状態を照合してください。

待機注文が別に存在するなら、成行注文を閉じた後も残る場合があります。OrderCloseだけで待機注文が取り消されたと考えず、注文の種類ごとに状態を確認します。MT4の一括決済と待機注文の確認も、操作範囲を整理するときに役立ちます。

決済できない場合はログと入力を照合する

失敗したときは、まず戻り値とエラー番号を控えます。そのうえで、注文がまだ存在するか、既に決済されていないか、指定した番号、数量、銘柄、価格、取引許可が適切かを順に調べます。エラーの番号だけで原因が一つに決まるとは限りません。

価格が古い、銘柄に合わない数量を指定した、取引が許可されていない、通信が不安定といった状況では、確認すべき場所が異なります。価格に関係するエラーを見ても、すぐ許容差を広げるのではなく、正しい銘柄のBidまたはAskを使っているか、更新時刻と接続を見てください。

注文の選択結果と現在の状態も大切です。すでに閉じた注文を対象としていないか、待機注文を成行注文として扱っていないか、対象を再選択して確かめます。ログには必要な情報を残しつつ、問い合わせ先へ渡す際は口座番号など不要な個人情報を伏せましょう。

二つの検証用画面とノートのイメージ
説明用の生成イメージです。実際の画面や検証結果ではありません。

結果不明のときは再送前に状態を調べる

通信障害やタイムアウトなどで、EAが期待した結果を確認できない場合があります。そのときは「失敗したはず」と決めて再送する前に、保有注文、待機注文、取引履歴を確認し、対象注文が現在どうなっているかを照合します。

部分決済では、元の注文の残量や識別方法が変わる場合も考えます。以前の数量をそのまま再送すれば、意図した以上の数量を対象にするおそれがあります。新しい状態を確認できない場合は処理を止め、取引業者やEAの提供元に相談してください。

決済後に同じEAの新規注文条件が成立すると、再び建玉が発生する場合があります。決済操作の成功と、新規発注の停止は別の確認です。どちらを行うかを事前に決め、必要ならEAの提供元の手順に従って停止の範囲を確認しましょう。

確認用の具体例で処理の順序を整理する

仮に、デモ口座に同じ銘柄の買い注文が二件あり、一件は対象EA、もう一件は別のEAが管理しているとします。対象EAの注文だけを全決済したいなら、銘柄が同じという条件だけでは不足します。対象の識別番号や注文種別を照合し、決済前に表示する一覧で一件だけ選ばれることを確かめます。

その一件について、現在の数量を取得し、買いの決済に使う価格を確認します。要求後は戻り値と現在の注文状態を見て、対象注文が閉じ、対象外の注文が残っているかを照合します。これは確認順を説明する仮定であり、同じ設定がすべての業者やEAで動くことを示す実績ではありません。

別のケースとして、保有量の一部を決済するなら、先に決済量と残量を計算し、銘柄の最小数量と刻みに合うか確認します。実行後は履歴の決済量と現在の残量の両方を比較します。片方だけ確認して成功と判断すると、次回の管理で注文を見失う可能性があります。

複数の注文を順番に確認する場合の注意

一覧から複数の注文を確認するときは、操作によって一覧の件数や並びが変わることを考慮します。一件閉じた直後に、さっきと同じ位置をそのまま使うと、別の注文を指しているかもしれません。位置で選んだ注文のチケット番号を確認し、処理後には現在の一覧を改めて照合します。処理の順序だけで対象の正しさが保証されるわけではありません。

別のEAや手動操作が同時に注文を変更する可能性もあります。ある瞬間に読み取った情報が、決済要求を送る時点でも同じとは限りません。特に、自分以外が管理している注文を対象としない設計と、状態が変わったときに処理を止める判断を用意します。

価格を更新するときに確認する範囲

現在のチャートのBidやAskだけで、別銘柄の注文を正しく閉じられるとは限りません。EAが複数銘柄を扱う場合は、選択した注文の銘柄に対応する価格と桁数を確認します。価格を更新した直後でも、市場が動けば要求時に差が生じることはあります。

要求する価格とスリッページの値は別の意味です。前者は決済の希望価格、後者は許容する価格差の指定です。銘柄のポイント単位を確認せずに他人の例の数字をコピーすると、意図した許容幅にならないことがあります。判断できないときは提供元や業者の仕様を確認してください。

MQL5への移植と実運用の注意

OrderCloseはMQL4の関数です。MQL5では注文、約定、ポジションの扱いが異なり、同じ関数をそのまま使うことはできません。移植時は口座のヘッジ方式やネットティング方式、使用する取引クラス、要求結果を確認し、別の設計として検証します。

デモで期待どおりに動いても、実口座での価格や約定、接続の状態が同じとは限りません。FXには価格変動やシステム障害などのリスクがあります。金融庁のFX取引に関する説明も確認し、許容できる損失と停止方法を事前に整理してください。

MQL4のOrderCloseを使う前のまとめ

OrderCloseでは、対象の注文番号、決済量、対象銘柄の価格、ポイント単位の許容差を正しく渡します。注文選択の成功だけで対象を決めず、銘柄、番号、種別、保有状態を確かめましょう。待機注文の取消やEAの新規発注停止は別の操作です。

実装後は発注しない確認から始め、デモで全決済と部分決済を分けて試します。戻り値、エラー番号、実際の注文と履歴を照合し、結果が不明なら再送する前に状態を確認することが、誤った決済を避けるための基本です。

EA作成ツールの検証範囲を確認する

生成コードの動作テスト・コンパイル結果と、その限界 →記事内の戦略や個別のEAの収益性を検証した結果ではありません。

学んだルールを、形にしてみよう。

EA作成ツールを開く ↗