技術辞典

MQL5 Hedging / Netting口座の違い|ポジション管理とEA開発で確認すること

EAファンクラブ

MQL5でEAを開発・検証する時は、Hedging口座とNetting口座の違いを確認しておく必要があります。

同じMT5でも、口座方式によってポジションの持ち方、PositionSelectの挙動、Magic Numberでの管理方法、CTradeやMqlTradeRequestでの決済対象、ナンピンEAやコピーEAの設計が変わるためです。

特に、同じ銘柄で複数ポジションを持つEA、ナンピンEA、マルチロジックEA、コピーEA、複数Magic Numberを使うEAでは、Hedging / Nettingの違いを確認せずに実装すると、ポジションの取り違えや決済対象の誤認につながる場合があります。

このページでは、MQL5のHedging口座とNetting口座の違いを、ACCOUNT_MARGIN_MODE、PositionSelect、Magic Number、CTrade、MqlTradeRequest、コピーEA、ナンピンEA、履歴確認、ログ確認の観点から整理します。

なお、このページはMQL5開発における技術確認を目的とした内容です。特定の口座方式、ブローカー、銘柄、運用方法を推奨するものではありません。売買判断、推奨エントリー、推奨ロット、利益保証、損失回避保証も行いません。

Hedging口座とNetting口座の違い

Hedging口座とNetting口座の大きな違いは、同じ銘柄で複数ポジションを持てるかどうかです。

口座方式ポジションの持ち方EA開発での注意点
Hedging同じ銘柄で複数ポジションを持てる。BUYとSELLの両方を同時に持てる場合がある。position ticket、Magic Number、注文単位、決済対象を明確に分ける必要がある。
Netting同じ銘柄のポジションは原則として1つに集約される。symbol単位のポジション管理になりやすく、複数ロジックや複数Magicの扱いに注意が必要。

Hedging口座では、同じ銘柄で複数のBUYポジション、複数のSELLポジション、またはBUYとSELLの両方を持つ構成があり得ます。そのため、ポジションごとのticket、Magic Number、建値、ロット、コメント、発注元ロジックを分けて管理しやすい一方で、対象外ポジションを誤って決済しないための絞り込みが重要になります。

一方、Netting口座では、同じ銘柄のポジションは1つのネットポジションとして扱われます。追加注文や反対売買は、既存ポジションの数量や方向に影響します。そのため、EA内部では「どのロジックが建てたポジションか」をMagic Numberだけで単純に分けられない場合があり、EA内部の状態管理、履歴確認、約定追跡を組み合わせて設計する必要があります。

MT5で口座方式を確認する理由

EAを導入・検証する前に、対象口座がHedgingなのかNettingなのかを確認してください。

口座方式を確認しないままEAを使うと、複数ポジション、Magic Number、ナンピン、コピー、決済処理、履歴集計で想定と違う動きになることがあります。

確認対象Hedgingで起きやすいことNettingで起きやすいこと
複数ポジション同じ銘柄で複数ticketを管理する必要がある同じ銘柄のポジションが1つに集約される
Magic NumberポジションごとにMagicを確認しやすい同一銘柄で複数Magicを混在させる設計に注意が必要
PositionSelectticket単位の選択や全ポジション走査が重要symbol単位の選択になりやすい
CTradeの決済ticket指定や対象絞り込みが重要symbol単位の決済で意図しない影響が出ないか確認する
ナンピンEA複数ポジションをbasketとして管理しやすい平均建値や追加注文後の統合状態を確認する必要がある
コピーEAコピー元position ticketごとに追いやすいコピー元・コピー先の集約差を確認する必要がある
履歴確認position ticket、order、dealを分けて追跡するdeal履歴とEA内部ロジックの対応付けが重要

Hedging / Nettingの違いは、EAが「注文を出せるか」だけの問題ではありません。EAがどのポジションを自分の管理対象と判断するか、どのポジションを閉じるか、どの履歴を検証するかに関わります。

ACCOUNT_MARGIN_MODEで口座方式を確認する

MQL5では、AccountInfoInteger(ACCOUNT_MARGIN_MODE)を使って口座方式を確認できます。

long margin_mode = AccountInfoInteger(ACCOUNT_MARGIN_MODE);

if(margin_mode == ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)
{
   Print("ACCOUNT_MODE type=HEDGING");
}
else if(margin_mode == ACCOUNT_MARGIN_MODE_RETAIL_NETTING)
{
   Print("ACCOUNT_MODE type=NETTING");
}
else if(margin_mode == ACCOUNT_MARGIN_MODE_EXCHANGE)
{
   Print("ACCOUNT_MODE type=EXCHANGE");
}
else
{
   Print("ACCOUNT_MODE type=UNKNOWN value=", margin_mode);
}

EAでは、OnInit時点で口座方式をログに出しておくと、検証や問い合わせ時に原因を追いやすくなります。

たとえば、EAがHedging前提で複数ポジションをticket単位で管理しているのに、実際の口座がNettingだった場合、同じ銘柄の追加注文や反対売買が想定と違う形でポジションへ反映される可能性があります。逆に、Netting前提のEAをHedging口座で動かす場合、複数ポジションが残ったままEAがsymbol単位で1つだけ見てしまう可能性があります。

ACCOUNT_MARGIN_MODEの主な種類

概要EA開発で確認すること
ACCOUNT_MARGIN_MODE_RETAIL_NETTING同一銘柄のポジションがNetting形式で管理される口座symbol単位のポジション管理、複数ロジックの内部状態、履歴追跡を確認する
ACCOUNT_MARGIN_MODE_EXCHANGE取引所形式の証拠金モード銘柄仕様、約定方式、ポジション管理、注文制約を個別に確認する
ACCOUNT_MARGIN_MODE_RETAIL_HEDGING同一銘柄で複数ポジションを持てるHedging形式の口座position ticket、Magic Number、ポジション本数、決済対象を確認する

ACCOUNT_MARGIN_MODEは、EAの初期化時に確認するだけでなく、ログ、HELP、SELF CHECK、サポート用のSNAP情報に含めると、あとから検証しやすくなります。

販売用EAや複数環境で使うEAでは、Hedging専用、Netting専用、両対応のどれなのかを仕様として明確にしてください。両対応にする場合でも、単にif文を追加するだけでなく、ポジション検索、決済、ナンピン、履歴確認、ログ出力まで分岐する必要があります。

PositionSelectへの影響

Hedging / Nettingの違いは、PositionSelect周辺の実装にも影響します。

Netting口座では、同一銘柄のポジションが1つに集約されるため、PositionSelect(_Symbol)のようなsymbol単位の確認でも状態を取得しやすい場合があります。

一方、Hedging口座では、同じ銘柄で複数ポジションを持てるため、symbolだけで判断すると対象ポジションを取り違える可能性があります。特に、複数EA、複数Magic Number、ナンピンEA、裁量注文が同じ銘柄に混在する場合は、全ポジションを走査し、symbol、Magic Number、ticket、ポジションタイプ、コメントなどを確認する必要があります。

確認方法向いているケース注意点
PositionSelect(symbol)Netting口座や、symbol単位で1ポジションだけを見る設計Hedging口座では複数ポジションを十分に扱えない場合がある
PositionSelectByTicket(ticket)Hedging口座で特定ticketを処理する場合ticketの保存、履歴、再取得ロジックが必要
全ポジション走査複数EA、複数Magic、ナンピン、コピーEAsymbol、magic、type、commentで対象を絞る必要がある
履歴側確認決済済みポジションや約定追跡order、deal、position idの対応関係をログに残す必要がある

PositionSelectだけに頼るのではなく、対象口座、EA仕様、保有ポジションの構造に合わせて、選択方法を分けることが重要です。

Hedging口座でポジションを走査する例

Hedging口座では、同じ銘柄に複数ポジションが存在する可能性があります。そのため、ポジションを1つだけ選択するのではなく、全ポジションを走査し、対象EAの条件に一致するものだけを処理します。

void ScanMyPositions(const string target_symbol, const long expected_magic)
{
   int total = PositionsTotal();

   for(int i = total - 1; i >= 0; i--)
   {
      ulong ticket = PositionGetTicket(i);

      if(!PositionSelectByTicket(ticket))
         continue;

      string symbol = PositionGetString(POSITION_SYMBOL);
      long magic    = PositionGetInteger(POSITION_MAGIC);
      long type     = PositionGetInteger(POSITION_TYPE);
      double volume = PositionGetDouble(POSITION_VOLUME);

      if(symbol != target_symbol)
         continue;

      if(magic != expected_magic)
      {
         Print("POSITION_SKIP reason=MAGIC_MISMATCH",
               " ticket=", ticket,
               " symbol=", symbol,
               " expected_magic=", expected_magic,
               " actual_magic=", magic);
         continue;
      }

      Print("POSITION_MATCH",
            " ticket=", ticket,
            " symbol=", symbol,
            " magic=", magic,
            " type=", type,
            " volume=", DoubleToString(volume, 2));
   }
}

このように、Hedging口座ではticket単位の確認を前提にすると、別EAや裁量注文を誤って処理しにくくなります。

ただし、走査順、決済順、部分決済、同時決済、履歴への反映タイミングには注意が必要です。決済処理を入れる場合は、走査と決済を同じループで雑に行わず、対象リストを作ってから実行するなど、安全な設計にしてください。

Netting口座でのポジション確認例

Netting口座では、同じ銘柄のポジションが1つに集約されるため、symbol単位でポジションを確認する設計になりやすくなります。

void CheckNettingPosition(const string target_symbol)
{
   if(!PositionSelect(target_symbol))
   {
      Print("NETTING_POSITION status=NONE symbol=", target_symbol);
      return;
   }

   long magic = PositionGetInteger(POSITION_MAGIC);
   long type  = PositionGetInteger(POSITION_TYPE);
   double volume = PositionGetDouble(POSITION_VOLUME);
   double price_open = PositionGetDouble(POSITION_PRICE_OPEN);

   Print("NETTING_POSITION",
         " symbol=", target_symbol,
         " magic=", magic,
         " type=", type,
         " volume=", DoubleToString(volume, 2),
         " price_open=", DoubleToString(price_open, _Digits));
}

Netting口座では、同じ銘柄に対する追加注文や反対注文が、既存ポジションの数量や方向を変える形で反映されます。そのため、EA内部では「注文を出したロジック」と「現在のネットポジション」を分けて考える必要があります。

たとえば、Logic1とLogic2が同じ銘柄を扱う場合、Netting口座ではポジション自体は1つに統合される可能性があります。この時、Magic Numberだけを見て「Logic1のポジション」「Logic2のポジション」と単純に分ける設計は危険です。注文履歴、約定履歴、EA内部のロジック状態を合わせて確認する必要があります。

Magic Number管理への影響

Magic Numberは、EAやロジックを識別するために使いますが、Hedging口座とNetting口座では確認の意味が変わります。

観点HedgingNetting
保有中ポジションポジションごとにMagic Numberを確認しやすい統合ポジションのMagicが期待どおりとは限らない場合がある
複数EA運用EAごと・ticketごとの分離を設計しやすい同一symbolに複数EAを混ぜる場合は注意が必要
複数ロジックEAロジック別ポジションを分けやすいロジック別の内部状態と履歴管理が重要
裁量注文Magic 0を除外しやすい裁量注文とEA注文が同じsymbolへ影響する可能性がある
履歴確認position ticketとMagicを合わせて追うorder、deal、position id、commentを合わせて追う

Hedging口座では、ポジション単位のMagic Number確認が比較的分かりやすい一方、ポジション数が増えやすいため、最大ポジション数、basket管理、決済対象の絞り込みが重要です。

Netting口座では、同じ銘柄のポジションが統合されるため、Magic Numberだけでロジック別の保有状態を完全に表現できない場合があります。そのため、注文時のMagic、約定履歴、注文コメント、EA内部の状態管理を合わせて確認してください。

CTrade / MqlTradeRequestでの注意点

CTradeやMqlTradeRequestを使う場合も、口座方式による違いを意識する必要があります。

CTradeでは、PositionClose(symbol)のようなsymbol単位の処理と、ticketを指定する処理を混同しないことが重要です。Hedging口座でsymbol単位の処理を使うと、どのポジションを対象にしているのかが曖昧になる場合があります。

MqlTradeRequestを直接使う場合は、発注内容を細かく制御できますが、Hedging / Nettingの違いを無視すると、注文後のポジション状態が想定と異なる可能性があります。発注前のrequest、発注後のresult、約定後のposition / dealをログでつなげて確認してください。

処理確認することログに残す項目
CTradeで新規注文Magic Number、symbol、lot、deviationMAGIC_SET、ORDER_REQUEST、ResultRetcode
CTradeで決済symbol指定かticket指定かCLOSE_SCOPE、target_ticket、target_magic
MqlTradeRequestで発注request.action、request.type、request.magicrequest内容、retcode、order、deal
Netting口座で反対注文既存ポジションの数量や方向への影響before volume、after volume、deal type
Hedging口座で複数決済対象ticketの一覧ticket、magic、symbol、close result

口座方式に関係する不具合は、「注文は成功しているが、思ったポジション状態ではない」という形で出ることがあります。OrderSendやCTradeの結果だけで判断せず、ポジション一覧と履歴を合わせて確認してください。

コピーEAでの注意点

コピーEAでは、Hedging / Nettingの違いがコピー元とコピー先のポジション構造に影響します。

コピー元がHedging口座で、コピー先もHedging口座であれば、position ticketごとに同期しやすい場合があります。ただし、コピー先で同じticketを使えるわけではないため、コピー元ticketとコピー先ticketの対応表を持つ必要があります。

コピー元がHedging、コピー先がNettingの場合、コピー元では複数ポジションとして存在しているものが、コピー先では1つのネットポジションに集約される場合があります。この場合、コピー元の1本ごとのポジション状態をそのままコピー先へ再現できるとは限りません。

コピー元コピー先注意点
HedgingHedgingポジション単位で対応しやすいが、ticket対応表が必要
HedgingNetting複数ポジションがコピー先で集約される可能性がある
NettingHedgingコピー先で1本として持つのか、分割するのかを決める必要がある
NettingNettingsymbol単位の同期になりやすいが、ロット差や部分決済に注意

コピーEAでは、Magic Numberだけでなく、symbol、volume、position type、entry price、comment、source ticket、destination ticket、コピー方向、ロット倍率、除外条件を合わせて管理します。

また、コピー対象に裁量注文を含めるのか、Magic 0を除外するのか、特定Magicだけをincludeするのかも事前に決めてください。Hedging / Nettingの違いを確認しないままコピー仕様を作ると、コピー元とコピー先でポジション数やロット状態が合わない原因になります。

ナンピンEAでの注意点

ナンピンEAでは、Hedging / Nettingの違いが特に重要です。

Hedging口座では、追加ポジションが個別ticketとして増えるため、ナンピン本数、各ポジションの建値、合計ロット、平均建値、basket単位の損益を管理しやすい構成になります。ただし、ポジション数が増えるため、最大ポジション数、証拠金、決済対象、Magic Numberの分離が重要です。

Netting口座では、追加注文が同じ銘柄のネットポジションに反映されるため、見かけ上のポジション本数が増えない場合があります。そのため、EA内部で「何回追加したか」「どの価格で追加したか」「想定平均建値はどこか」を別途管理しないと、Hedging前提のナンピンロジックをそのまま再現できない場合があります。

確認項目HedgingNetting
追加ポジションticketが増えるネットポジションへ反映される
平均建値EA側でbasket平均を計算しやすい口座上の平均建値とEA内部計算を照合する
最大本数PositionsTotalや対象Magic本数を確認する内部カウンタや履歴で追加回数を管理する
決済複数ticketをまとめて閉じる設計が必要symbol単位の決済が既存ポジション全体に影響する
ログbasket_id、ticket、step、magicを記録するstep、deal、net volume、internal stateを記録する

ナンピンEAをHedging / Netting両対応にする場合は、ポジション本数だけでロジックを組まず、実ロット、平均建値、追加回数、対象Magic、決済範囲を別々に確認できるようにしてください。

複数ロジックEAでの注意点

複数ロジックEAでは、Trend、Reverse、Range、Breakoutなどのロジックが同じ銘柄を扱うことがあります。

Hedging口座であれば、ロジックごとにMagic Numberを分け、ポジションごとに管理できる場合があります。一方、Netting口座では、同じ銘柄のポジションが統合されるため、ロジックごとのポジションを物理的に分けられない場合があります。

設計項目Hedgingでの考え方Nettingでの考え方
Logic別Magicポジションごとに分けやすい発注履歴と内部状態の識別に使う
Logic別決済対象ticketを絞って決済するsymbol全体へ影響するため慎重に設計する
同時保有複数ロジックが同時にポジションを持てる同じsymbolでは統合されるため競合設計が必要
履歴分析Magicやticketで分けて確認するdeal履歴、comment、logic_idで追跡する
リスク管理Logic別と口座全体を分けるsymbol単位の総量管理を重視する

Netting口座で複数ロジックEAを動かす場合、各ロジックが別々にポジションを持っているように見せる内部設計と、実際の口座上のネットポジションを混同しないことが重要です。

特に、片方のロジックがBUY、もう片方がSELLを出す可能性がある場合、Netting口座では既存ポジションの減少、相殺、反転につながる場合があります。ロジックごとのsignalと、口座上のexecution結果を分けてログ化してください。

PositionSelectだけに頼らない

Hedging / Netting対応でよくある失敗は、PositionSelectだけで対象ポジションを判断してしまうことです。

PositionSelectは便利ですが、EAの設計によっては、それだけでは十分ではありません。複数EA、複数Magic、裁量注文、コピーEA、ナンピンEAが関係する場合は、ポジション情報、注文履歴、約定履歴、EA内部状態を合わせて確認する必要があります。

確認層見る項目目的
現在ポジションPOSITION_SYMBOL、POSITION_MAGIC、POSITION_TYPE、POSITION_VOLUME今保有している対象を確認する
注文履歴ORDER_MAGIC、ORDER_TYPE、ORDER_STATEどの注文が出されたか確認する
約定履歴DEAL_MAGIC、DEAL_TYPE、DEAL_ENTRY、DEAL_VOLUME実際に約定した内容を確認する
EA内部状態logic_id、basket_id、step、planned ticketEAがどの管理対象として認識しているか確認する
ログPOSITION_SCAN、POSITION_MATCH、CLOSE_SCOPE対象判定と処理結果を追跡する

ポジション一覧だけでは、すでに決済された注文や、反対売買で統合された履歴を追えない場合があります。そのため、問題が起きた時は現在ポジションだけでなく、履歴側も確認してください。

口座方式別に分岐する設計例

EAをHedging / Netting両対応にする場合は、OnInitで口座方式を確認し、処理ルートを分ける設計にします。

enum EAccountPositionMode
{
   ACCOUNT_POS_UNKNOWN = 0,
   ACCOUNT_POS_HEDGING = 1,
   ACCOUNT_POS_NETTING = 2,
   ACCOUNT_POS_EXCHANGE = 3
};

EAccountPositionMode ResolveAccountPositionMode()
{
   long margin_mode = AccountInfoInteger(ACCOUNT_MARGIN_MODE);

   if(margin_mode == ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)
      return ACCOUNT_POS_HEDGING;

   if(margin_mode == ACCOUNT_MARGIN_MODE_RETAIL_NETTING)
      return ACCOUNT_POS_NETTING;

   if(margin_mode == ACCOUNT_MARGIN_MODE_EXCHANGE)
      return ACCOUNT_POS_EXCHANGE;

   return ACCOUNT_POS_UNKNOWN;
}

このように内部enumへ変換しておくと、EA内の処理分岐やログ出力で扱いやすくなります。

void ManagePositions()
{
   EAccountPositionMode mode = ResolveAccountPositionMode();

   if(mode == ACCOUNT_POS_HEDGING)
   {
      Print("POSITION_ROUTE mode=HEDGING action=SCAN_BY_TICKET");
      // ticket単位、Magic単位、basket単位で確認する
   }
   else if(mode == ACCOUNT_POS_NETTING)
   {
      Print("POSITION_ROUTE mode=NETTING action=CHECK_BY_SYMBOL");
      // symbol単位のネットポジションとして確認する
   }
   else
   {
      Print("POSITION_ROUTE mode=UNKNOWN action=SAFE_STOP");
      // 不明な場合は安全側に停止、または管理処理を制限する
   }
}

不明な口座方式を検出した場合は、何となく処理を続けるのではなく、ログを出して安全側に止める、またはポジション管理機能を制限する設計にしてください。

Hedging専用・Netting専用・両対応を分ける

EAの仕様として、Hedging専用、Netting専用、両対応のどれにするかを最初に決めることも重要です。

対応方針向いているケース注意点
Hedging専用複数ポジション、ナンピン、basket管理、コピーEANetting口座では安全に停止する仕組みが必要
Netting専用symbol単位の単一ポジション管理、シンプルなEAHedging口座で複数ポジションが残るケースを避ける
両対応配布先の口座方式が混在する場合処理分岐、ログ、テストケース、マニュアルが増える
検証中は片方のみ初期開発や仕様確定前対応外口座で使えないことを明示する

両対応に見せていても、実際にはHedging側だけしか十分に検証していないEAは危険です。HedgingとNettingでは、テストケース、ログ、決済対象、履歴確認が異なるため、対応範囲を正確に示してください。

ログ出力項目

Hedging / Nettingに関係する不具合は、口座方式の確認ログがないと原因を追いにくくなります。EAの初期化時、ポジション走査時、決済前、約定履歴確認時に、必要な情報をログへ残してください。

ログ項目出す内容目的
ACCOUNT_MODEACCOUNT_MARGIN_MODEの値と判定結果口座方式を確認する
POSITION_ROUTEHedging用処理かNetting用処理か処理分岐を確認する
POSITION_SCANticket、symbol、magic、type、volume走査対象を確認する
POSITION_MATCH対象EA・対象ロジックとして一致した理由処理対象の根拠を確認する
POSITION_SKIPsymbol不一致、Magic不一致、口座方式不一致など対象外にした理由を確認する
CLOSE_SCOPEsymbol決済かticket決済か、対象Magicは何か誤決済を防ぐ
HISTORY_CHECKorder、deal、position id、magic、comment決済済み履歴を追跡する

ログは多ければよいわけではありません。初期化時には口座方式、処理時には対象ポジション、決済時には決済範囲、履歴確認時にはorder / deal / magicを出すなど、確認したい段階ごとに分けることが重要です。

ログ出力例

Hedging / Netting対応EAでは、OnInit時点で口座方式を出し、ポジション管理時にどのルートを使っているかを出すと確認しやすくなります。

void PrintAccountMode()
{
   long mode = AccountInfoInteger(ACCOUNT_MARGIN_MODE);

   string mode_text = "UNKNOWN";

   if(mode == ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)
      mode_text = "HEDGING";
   else if(mode == ACCOUNT_MARGIN_MODE_RETAIL_NETTING)
      mode_text = "NETTING";
   else if(mode == ACCOUNT_MARGIN_MODE_EXCHANGE)
      mode_text = "EXCHANGE";

   Print("ACCOUNT_MODE",
         " raw=", mode,
         " resolved=", mode_text,
         " account=", AccountInfoInteger(ACCOUNT_LOGIN));
}

口座番号などの情報を公開本文や共有ログに出す場合は、必要に応じて伏せ字にしてください。サポート確認では、口座方式の判定結果だけ分かれば十分な場合もあります。

void PrintPositionDecision(const ulong ticket,
                           const string symbol,
                           const long expected_magic,
                           const long actual_magic,
                           const string action)
{
   Print("POSITION_DECISION",
         " ticket=", ticket,
         " symbol=", symbol,
         " expected_magic=", expected_magic,
         " actual_magic=", actual_magic,
         " action=", action);
}

このように、対象にした理由だけでなく、対象外にした理由もログへ出すと、別EAのポジション、裁量注文、コピー対象外のポジションを誤って処理していないか確認しやすくなります。

バックテストで確認すること

Hedging / Nettingの違いは、バックテストでも確認が必要です。

同じEA、同じ設定、同じ銘柄でテストしても、口座方式が違えば、ポジション本数、平均建値、決済タイミング、履歴の見え方が変わる場合があります。特に、ナンピンEA、複数ロジックEA、コピーEAに近い構造のEAでは、Hedging口座だけで確認してNetting口座でも同じように動くと判断しないでください。

検証項目確認内容見る場所
初期化ログACCOUNT_MARGIN_MODEが想定どおりかExpertsログ
ポジション本数Hedgingで複数本、Nettingで統合されるか取引履歴、ポジション一覧
Magic Number発注時・保有時・履歴側で一致するかExpertsログ、履歴
ナンピン追加回数、平均建値、決済範囲が想定どおりかレポート、CSV、ログ
決済ticket指定かsymbol指定かで誤決済がないかExpertsログ、deal履歴
複数ロジックロジック別の発注と実ポジションが混同していないかlogic_id、comment、deal履歴

バックテスト結果を見る時は、最終損益だけで判断せず、口座方式、ポジション履歴、約定履歴、Expertsログを合わせて確認してください。

よくある失敗パターン

Hedging / Netting口座の違いでよくある失敗は、EAがコンパイルできないというより、動いているように見えて管理対象がズレることです。

失敗パターン起きやすい問題確認方法
Hedging前提のEAをNetting口座で使う複数ポジション前提の管理が崩れるACCOUNT_MARGIN_MODEとポジション履歴を確認する
Netting前提でPositionSelectだけ使うHedging口座で複数ポジションを見落とすPositionsTotalとticket走査を確認する
Magic Numberだけで管理できると思い込むNetting口座でロジック別状態が混ざるorder / deal / comment / logic_idを確認する
symbol単位で決済してしまう意図しないポジションまで決済対象になるCLOSE_SCOPEログを確認する
コピー元とコピー先の口座方式を確認しないポジション数やロットが一致しないコピー元・コピー先のACCOUNT_MARGIN_MODEを確認する
ナンピン本数をPositionsTotalだけで判断するNetting口座で追加回数を誤認する内部step、deal履歴、basket状態を確認する
履歴確認を省略する決済済み注文の原因が追えないHistorySelect、HistoryDealGet、ORDER_MAGICを確認する

これらの失敗は、発注時には気づきにくく、決済、コピー、履歴集計、問い合わせ時に表面化することがあります。そのため、初期設計の段階で口座方式を確認し、ログと検証項目へ組み込んでおくことが重要です。

開発依頼前に整理したい情報

Hedging / Nettingに関係するEA開発や改修を相談する場合は、事前に以下を整理しておくと、仕様の確認がスムーズになります。

整理項目記入例確認理由
対象口座方式Hedging / Netting / 不明ポジション管理の前提が変わるため
対象EA通常EA、ナンピンEA、コピーEA、半裁量EA必要なポジション管理が変わるため
対象銘柄USDJPY、EURUSD、XAUUSDなどsymbol単位の統合や複数ポジション確認に必要
Magic Number10001、11001、Magic 0除外対象EA・対象ロジックを分けるため
ポジション管理方法単ポジ、複数ポジション、basket管理Hedging / Netting対応方針を決めるため
決済対象同一symbol + 同一magicのみ誤決済を防ぐため
コピー対象特定Magicのみ、裁量除外、全コピーコピーEAの同期範囲を決めるため
ナンピン仕様追加条件、最大本数、平均建値、内部step、決済条件ポジション本数と内部状態を分けるため
ログACCOUNT_MODE、POSITION_SCAN、POSITION_MATCH、Deal履歴検証や問い合わせ時に原因を追うため

Hedging / Nettingに関係する不具合を相談する場合は、EAの注文ログだけでなく、口座方式、PositionSelect周辺のログ、Magic Number、ポジション一覧、約定履歴も合わせて確認してください。

また、口座番号、認証情報、個人情報、Webhook URL、APIキーなどは公開チャットや記事本文に載せないでください。ログを共有する場合は、必要な範囲だけを伏せ字にして確認するのが安全です。

実務チェックリスト

  • EAを動かす前に、対象口座がHedgingかNettingか確認した
  • OnInitでACCOUNT_MARGIN_MODEをログに出している
  • Hedging口座では、symbolだけでなくticketとMagic Numberを確認している
  • Netting口座では、symbol単位のネットポジションとEA内部状態を分けている
  • PositionSelectだけで対象ポジションを判断していない
  • CTradeの決済処理がsymbol指定かticket指定かを確認した
  • MqlTradeRequestで発注する場合、request内容とresultをログに残している
  • Magic Number、注文コメント、logic_id、basket_idを必要に応じて分けている
  • コピーEAでは、コピー元とコピー先の口座方式を両方確認している
  • ナンピンEAでは、ポジション本数と内部追加回数を混同していない
  • Hedging / Netting両対応の場合、両方のテストケースを用意している
  • 対応外口座で動かす場合の安全停止や警告ログを用意している

関連ページ

関連テーマ確認ページ確認できること
Magic Number設計MT5 EAのMagic Number設計|複数EA・複数ロジック・コピーEAで分ける考え方複数EA・複数ロジック・コピーEAでMagic Numberを分ける考え方
ポジション・注文・履歴用語MQL5ポジション・注文・約定・履歴用語辞典Order、Position、Deal、Historyの違い
注文・ポジション管理MQL5注文・ポジション・履歴管理完全ガイド注文、ポジション、履歴管理の全体像
CTradeMQL5標準ライブラリ・CTrade完全ガイド|注文・決済・ポジション確認の実務基礎CTradeでの注文・決済・ポジション確認
CTradeとMqlTradeRequestMQL5 CTradeとMqlTradeRequestの違い|標準ライブラリとOrderSend直書きの使い分けCTradeとMqlTradeRequestの使い分け
注文構造MQL5注文関数・取引構造体辞典OrderSend、MqlTradeRequest、MqlTradeResultの整理
OrderCheckMQL5 OrderCheckで証拠金・ロット・StopLevelを確認する方法発注前チェックと証拠金・StopLevel確認
ナンピンEAEAのナンピンとは追加ポジション、平均建値、リスク確認
最大ポジション数EAの最大ポジション数とはポジション数制限とリスク確認
MT4/MT5用語MT4/MT5でよく使うFX用語注文、ポジション、ロットなどの基本用語
コピーEAMT5コピーEA完全ガイドコピー元・コピー先・Magic Number・ロット同期
開発・改修相談MT4/MT5の開発・改修相談はこちらHedging / Netting対応を含むEA開発・改修相談前の整理

まとめ

Hedging口座とNetting口座では、同じ銘柄のポジション管理方法が異なります。

Hedging口座では、同一銘柄に複数ポジションや両方向のポジションを持てるため、position ticket、Magic Number、basket管理、決済対象の特定が重要です。

Netting口座では、同一銘柄のポジションが1つに集約されるため、symbol単位のポジション状態と、EA内部のロジック状態を分けて管理する必要があります。

MQL5 EAでは、OnInitでACCOUNT_MARGIN_MODEをログ化し、Hedging用、Netting用、両対応用の処理ルートを明確にしてください。CTrade、MqlTradeRequest、PositionSelect、Magic Number、履歴確認は、口座方式に合わせて設計する必要があります。

コピーEA、ナンピンEA、複数Magic EA、複数ロジックEAでは、Hedging / Nettingの違いがポジション数、決済範囲、履歴集計、同期状態に直接影響します。EAを導入・開発・改修する前に、対象口座の方式とポジション管理仕様を必ず確認してください。

ABOUT ME
記事URLをコピーしました