コンテンツにスキップ

【移植#110】仮想建玉をネット建玉へ対応づける — 反対売買の相殺を合成値で確認

仮想戦略ごとの建玉とMT5の純建玉の関係を合成値で表示する画面

この記事の3行まとめ

  • MT5は口座によってネットティングまたはヘッジの建玉方式を使います。
  • ネットティングでは同じ銘柄の反対売買が既存の純建玉を減らし、同量なら閉じます。
  • サンプルは注文を出さず、仮想戦略の買い0.10と売り0.06から、純買い0.04になる計算だけを確認します。

元記事と今回の題材

2010年6月17日の「仮想ポジション管理VOM」は、MT5では同じ銘柄の買いと売りが相殺されるため、MT4用EAをそのまま移すと問題になる場合がある、という話題です。記事では、MT5のポジション集約と仮想ポジションを区別する考え方が紹介されています。

MT5にはネットティングとヘッジという二つの建玉方式があります。どちらを使うかは口座側で決まり、ネットティングでは銘柄ごとに一つの純建玉を持ちます。反対方向の取引は、その建玉を減らす、閉じる、または反転させます。ヘッジ方式では同じ銘柄に反対方向の建玉を同時に持てます。MetaTrader 5公式ヘルプ

今回は仮想ポジション管理システムそのものは作らず、二つの仮想戦略を一つのネット建玉へ写すときの算術をMQL5上に表示します。サンプルは口座モードの読み取りと画面表示だけを行い、注文、決済、実口座ポジションの変更はしません。

合成値で相殺の流れを追う

サンプルでは、戦略Aが買い0.10ロット、戦略Bが売り0.06ロットを持つ場面を置きます。

段階 仮想戦略ごとの建玉 ネット建玉
AとBが建てた後 A: 買い0.10 / B: 売り0.06 買い0.04
Bが売りを閉じる A: 買い0.10 / B: なし 買い0.10

Bの仮想売り0.06だけを閉じたいとき、ネット口座上では買い0.06を足すと純買いが0.10へ戻ります。純建玉だけを見ても、それぞれの戦略がどれだけ建玉を保有しているかは分かりません。仮想側の建玉量と、MT5へ出す実際の取引量を別に記録して対応づける必要があります。

この例の計算は0.10 - 0.06 = 0.04、続いて0.04 + 0.06 = 0.10です。表示中のAccount modeは実行端末の口座方式ですが、AとBの数量は合成値です。画像の端末はヘッジ方式でした。画像はネットティング口座の実取引を撮影したものではありません。

MQL5サンプル

110_Virtual_Position_Netting_Lab_v1_00.mq5 をダウンロード

EAはACCOUNT_MARGIN_MODEから口座方式を読み、固定した二つの合成数量を計算します。計算値が期待値と一致すればARITHMETIC CHECK: PASSとログに表示します。口座の方式を読む方法はMQL5公式のAccountInfoIntegerに記載されています。

チャートのSYNTHETIC VALUES - NO ORDERSは、この表示が実注文や口座ポジションを表していないことを示します。サンプルには注文関数がなく、価格履歴やポジション一覧にもアクセスしません。

実運用のVOMには追加の設計が必要

このデモは仮想数量をネット数量へ変換する最小の算術例です。複数EAや複数の戦略が同じ銘柄を取引する仕組みとして使うには不十分です。実運用では少なくとも次を別に設計し、取引結果と照合する必要があります。

  • 実際に約定した数量と部分約定を受け取って、仮想台帳を更新する
  • EAの再起動後に仮想建玉を復元する
  • 手動取引や別EAの取引が同じ銘柄に入った場合の扱いを決める
  • 逆指値・指値・損益・手数料・スワップを仮想戦略へどう配賦するか決める
  • 決済や反転に失敗した場合、仮想台帳と実建玉のずれを検出して停止する

約定後の取引を監視するMQL5イベントはOnTradeTransactionで受け取れますが、このサンプルでは実装していません。仮想建玉の記録だけを更新し、実際の約定と一致しているか確認しない管理EAは、表示数量と口座リスクが食い違うおそれがあります。

実機確認

専用MT5 Build 6230でコンパイルし、0 errors・0 warningsでした。チャート上の口座方式はHEDGING、ログはsynthetic_a_buy=0.10、synthetic_b_sell=0.06、net_after_both=0.04、net_after_b_close=0.10、verified=trueを記録しました。これは合成値の算術確認であり、ネットティング口座の実取引検証ではありません。

参考資料

前: 【移植#108】MQL5からDLL関数を呼び出す — .NETの静的メソッドを小さく試す

— SPONSORED —