MQL5 Hedging / Netting口座の違い|ポジション管理と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口座の違い
- MT5で口座方式を確認する理由
- ACCOUNT_MARGIN_MODEで口座方式を確認する
- ACCOUNT_MARGIN_MODEの主な種類
- PositionSelectへの影響
- Hedging口座でポジションを走査する例
- Netting口座でのポジション確認例
- Magic Number管理への影響
- CTrade / MqlTradeRequestでの注意点
- コピーEAでの注意点
- ナンピンEAでの注意点
- 複数ロジックEAでの注意点
- PositionSelectだけに頼らない
- 口座方式別に分岐する設計例
- Hedging専用・Netting専用・両対応を分ける
- ログ出力項目
- ログ出力例
- バックテストで確認すること
- よくある失敗パターン
- 開発依頼前に整理したい情報
- 実務チェックリスト
- 関連ページ
- まとめ
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を混在させる設計に注意が必要 |
| PositionSelect | ticket単位の選択や全ポジション走査が重要 | 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、ナンピン、コピーEA | symbol、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口座では確認の意味が変わります。
| 観点 | Hedging | Netting |
|---|---|---|
| 保有中ポジション | ポジションごとに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、deviation | MAGIC_SET、ORDER_REQUEST、ResultRetcode |
| CTradeで決済 | symbol指定かticket指定か | CLOSE_SCOPE、target_ticket、target_magic |
| MqlTradeRequestで発注 | request.action、request.type、request.magic | request内容、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本ごとのポジション状態をそのままコピー先へ再現できるとは限りません。
| コピー元 | コピー先 | 注意点 |
|---|---|---|
| Hedging | Hedging | ポジション単位で対応しやすいが、ticket対応表が必要 |
| Hedging | Netting | 複数ポジションがコピー先で集約される可能性がある |
| Netting | Hedging | コピー先で1本として持つのか、分割するのかを決める必要がある |
| Netting | Netting | symbol単位の同期になりやすいが、ロット差や部分決済に注意 |
コピー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前提のナンピンロジックをそのまま再現できない場合があります。
| 確認項目 | Hedging | Netting |
|---|---|---|
| 追加ポジション | 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 ticket | EAがどの管理対象として認識しているか確認する |
| ログ | 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管理、コピーEA | Netting口座では安全に停止する仕組みが必要 |
| Netting専用 | symbol単位の単一ポジション管理、シンプルなEA | Hedging口座で複数ポジションが残るケースを避ける |
| 両対応 | 配布先の口座方式が混在する場合 | 処理分岐、ログ、テストケース、マニュアルが増える |
| 検証中は片方のみ | 初期開発や仕様確定前 | 対応外口座で使えないことを明示する |
両対応に見せていても、実際にはHedging側だけしか十分に検証していないEAは危険です。HedgingとNettingでは、テストケース、ログ、決済対象、履歴確認が異なるため、対応範囲を正確に示してください。
ログ出力項目
Hedging / Nettingに関係する不具合は、口座方式の確認ログがないと原因を追いにくくなります。EAの初期化時、ポジション走査時、決済前、約定履歴確認時に、必要な情報をログへ残してください。
| ログ項目 | 出す内容 | 目的 |
|---|---|---|
ACCOUNT_MODE | ACCOUNT_MARGIN_MODEの値と判定結果 | 口座方式を確認する |
POSITION_ROUTE | Hedging用処理かNetting用処理か | 処理分岐を確認する |
POSITION_SCAN | ticket、symbol、magic、type、volume | 走査対象を確認する |
POSITION_MATCH | 対象EA・対象ロジックとして一致した理由 | 処理対象の根拠を確認する |
POSITION_SKIP | symbol不一致、Magic不一致、口座方式不一致など | 対象外にした理由を確認する |
CLOSE_SCOPE | symbol決済かticket決済か、対象Magicは何か | 誤決済を防ぐ |
HISTORY_CHECK | order、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 Number | 10001、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注文・ポジション・履歴管理完全ガイド | 注文、ポジション、履歴管理の全体像 |
| CTrade | MQL5標準ライブラリ・CTrade完全ガイド|注文・決済・ポジション確認の実務基礎 | CTradeでの注文・決済・ポジション確認 |
| CTradeとMqlTradeRequest | MQL5 CTradeとMqlTradeRequestの違い|標準ライブラリとOrderSend直書きの使い分け | CTradeとMqlTradeRequestの使い分け |
| 注文構造 | MQL5注文関数・取引構造体辞典 | OrderSend、MqlTradeRequest、MqlTradeResultの整理 |
| OrderCheck | MQL5 OrderCheckで証拠金・ロット・StopLevelを確認する方法 | 発注前チェックと証拠金・StopLevel確認 |
| ナンピンEA | EAのナンピンとは | 追加ポジション、平均建値、リスク確認 |
| 最大ポジション数 | EAの最大ポジション数とは | ポジション数制限とリスク確認 |
| MT4/MT5用語 | MT4/MT5でよく使うFX用語 | 注文、ポジション、ロットなどの基本用語 |
| コピーEA | MT5コピー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を導入・開発・改修する前に、対象口座の方式とポジション管理仕様を必ず確認してください。
