仮想ポジション管理VOM

既にご存知の通り、MT5 ではポジションが合算されます。買い1ロット保有中に、売り1ロットを注文すると、相殺されてポジションが消えます。
個人的には、この処理は合理的だと思うのですが、MT4の自作EAをそのまま移植して運用しようとすると若干問題があります。あるEAが、EURUSD を買い持ちしている時に、別のEAがEURSUDを売ってしまったら…どうなるか分かりますよね。^^;


この問題への1つの回避策として考案されているのが、仮想ポジション管理 VOM (Virtual Order Manager) です。MT5のシステムとしてはポジションが消えていても、EA側からは仮想的なポジションを保有しているとカウントさせるようなエミュレーションライブラリです。最新版は、ここから入手できます。同梱のヘルプファイルを見れば使い方も分かると思います。(本家記事からも入手できますが、少し古いようです。)


実際にVOMを試したのが下図で、左のEAは青ラインの買い、右のEAは青ラインの売りポジションを持ったつもり..になっています。黄色が仮想TP,オレンジが仮想SLです。

↑コメント部に保有中のポジションが出ていますが、最下部のウィンドウ内ではポジションがありません。
コメント部から、仮想的な売りポジションに利益が出ていることが分かります。


VOMの導入方法は、同梱のサンプルコードをみれば分かりますが、
1. #include "..\VirtualOrderManager.mqh" を書く。
2. OnInit 内で、VOM.Initialise(MagicNumber); を呼ぶ。
3. OnTick 内の冒頭で、VOM.OnTick();を呼ぶ。
だけで完了です。


実際の使い方は、MQL4の注文関係の関数の先頭に VOM. を追加するだけで、ほぼMQL4と同じ"感覚"で使えます。

↑敢えてMQL4的に書いていますが、VOMの他の関数を使うともっと簡単に書けます。
VOMでは、EAの名前別にポジションを分別管理するので、MagicNumber だけはMT4と異なる扱いなので要注意です。
VOM.OrderSend には、MagicNumber が無く、注文タイプが VIRTUAL_ORDER_TYPE_BUY に変わっています。



VOMでどんな関数が使えるのか?は、ヘルプの CVirtualOrderManager のPublic Member Functions を見ると分かります。

VOM自体にもデメリットや欠点があるかもしれませんが、ポジション管理に悩むぐらいなら、VOMをそのまま使ってみて、後からじっくり考えた方が良いかなと思います..。