English Русский 中文 Español Deutsch Português 한국어 Français Italiano Türkçe
ポジション中心のMetaTrader5の環境での注文追跡管理機能付き注文マネージャー

ポジション中心のMetaTrader5の環境での注文追跡管理機能付き注文マネージャー

MetaTrader 5トレーディング | 6 10月 2015, 11:32
1 557 0
Paul
Paul

1. はじめに

MetaTrader 4 からMetaTrader 5への移行による最大の変化は、ポジションとしてオープンな売買を管理するという点です。各シンボルにオープンなポジションがあり、注文がブローカーに所持されるたびに、このポジションのサイズは調節されます。これは、アメリカで導入されたNFA 2-43(b) FIFO ルールに準拠し、商品先物やCFDなどのエントリーの取引方法に適しています。

明確な違いにおける具体例は、同じシンボルに対して稼働する二つのEAが異なる方向の注文を発行した場合です。 これは、ダフ屋やトレンドフォロワーなどの異なるタイムフレームで動くEAには一般的な状況です。 MetaTrader4では、オープントレードリストは、0のマージンが使用され、買いと売りのオープンオーダーを示します。MetaTrader5では、すべてのポジションがオープンにはなりません。

EAのコードを見ると、MQL4でよく使用されるOpenOrders()などの関数や類似したものは、MQL5に移された際、予想しえいたような動きをしないことがあります。

int OpenOrders()  // MetaTrader 4 code to count total open orders for this EA
{
  int nOpenOrders=0;
  for (int i=OrdersTotal()-1; i>=0; i--)
  {
    OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
    if (OrderMagicNumber()==magic)
      if (OrderType()==OP_BUY || OrderType()==OP_SELL)
        if (OrderSymbol()==Symbol())
          nOpenOrders++;
  }
  return(nOpenOrders);
}

なので、MetaTrader5のポジション注文ベースの環境は、MetaTrader4の注文処理アプローチになれたプログラマーにとって馴染みのない問題なのです。一つのシンボルや複数の注文をEAからトレードするマルチEAなど、複数の注文が一つのポジションに併合される際、MetaTrader4にて簡単な注文管理機能だったものが、MetaTrader5ではより複雑になりました。


2. MetaTraer5のポジションを扱う方法

トレーディング戦略の複雑さに依存しながらMetaTrader5のポジション中心の環境を管理する方法はいくつかあります。

まず、MetaTrader5の未決注文のハンドリングは、MetaTrader4に類似しており、未決注文のために記述されたMQL5のコードは、MQL4の単純な移行版であることに注意しなければなりません。

2.1シンプルなEA: アカウントのシンボル単位のEA

もっともシンプルな方法は、シンボルごとの簡単なEAへの一つのアカウントでのトレーディングの制限というものです。 この場合での「簡単なEA」は、一回につき一つの注文のみを発行し、ただし利乗せや、グリッド取引などのような戦略を除いて一般的な方法の注文を指します。 このシンプルなEAは、MQL4と類似し、\trade\trade.mqh.で提供されるCTraderライブラリラッパーを使用し、MQL5で記述されています。

2.2 複雑なEA:アカウントごとのシンボル一つに付き一つのEA

シンボルごとに一つ以上のオープンオーダーを要するグリッドトレーディングや利乗せなどの戦略を持つ、複雑なEAについて、EAに追加されるいくつかの比較的簡単な注文追跡用コードが戦略を管理する上で必要なものになります。 これは、もしEAが他の同じシンボルをトレードしているEAとポジションを共有しない場合、可能です。

2.3アカウントごとのシンボルに付き一つ以上の様々な種類のEA

これは、もっとも複雑なトレーディング、コーディング要件を提示し、仮想注文管理ライブラリ(VOM)の開発を行う理由でもあります。 このライブラリは、他のEAと協調する堅牢なEAの開発を単純化するよう意図されています。

この記事は、仮想注文管理ライブラリを詳しく紹介していきます。


3. 目標の設計と、仮想注文管理システムの利点と欠点

VOMには、4つの主なゴールがあります。

  1. ソーシャビリティ: EAの行動様式は、VOMのトレーディング関数を用い、その他のEAの活動からは孤立されます。
  2. 堅牢性: クライアントとサーバー間の不全な通信や、不完全な注文、エラーなどの異常なイベントの高貴なハンドリング
  3. 使用の容易性: よく説明された簡単なトレーディングの関数の提供を行います
  4. ストラテジーテスターの使用

これらのゴールは、以下のように実現されます:

  • 仮想オープンオーダー、未決注文、ストップ・ロス、利取りなどの使用 ここでの「仮想」は、ステータスがサーバーのポジションとは独立してクライアントターミナルにて維持されることを意味します。 これらの注文は、ポジションに類似した方法で、ターミナル上で水平線を持ちます。
  • サーバーによる停止は、PCの環境やインターネットの接続失敗、自然災害のため仮想ストップからは距離を開けています。

VOMの手法は、MQL5 EAプログラマーに以下のことを可能にします:

  • 「オーダー中心主義」のEAのコードは、MetaTrader4の手法と類似しています。
  • MetaTraderコミュニティが「ヘッジトレーディング」と呼ぶ、正確には、一つのシンボルの方向とは逆の同時取引を実行してください
  • グリッドトレーディングや、利乗せ、資金管理の手法などの比較的簡単なトレーディング戦略をコーディングしましょう。
  • 最小のストップレベルよりも厳しい未決注文やストップを発行します。

VOMアプローチの副効果は、仮想ストップロス、利取り、未決注文などが「ステルス性」の行動を持つということです。それは、ブローカーサーバーから見ることができないということです。 ストップロスのレベルを隠すことは、ブローカが休猟することを防ぐ上では必要なこととしてみなされています。

VOMは、いくつかの欠点があります。 リスクの量は、拡張されたPCやインターネットの接続不備におけるサーバーのストップに依存する可能性により、増えつつあります。 また、未決注文、ストップロス、利取りを打った際のスリッページは、新しいイベントが発生したときのボラティリティの高い間はサーバーに基づくものよりもはるかに高くなります。 これらの利点の影響は、VOM EAがブローカのサーバーへ短い応答待ち時間の信頼性のあるデスクトップから取引されている場合、最小化されます。


4. 実践でのVOM - シンプルなEA

さらに深く行く前に、VOM EAがどのように記述されているのかを紹介します。 配布パッケージに提供されているテンプレートのEAで始めるシンプルなMAクロスEAを書きます。MAクロス戦略の悪名高い問題である横ばい相場における無駄な取引を生みかねないフラクタル移動平均を使用します。このEAは、簡単な例として提供され、ライブ取引には推奨されません。バックテストは、利益的ですが、取引数の低さは、結果がそれほど大きくないことを意味します。

EAは、experts\Virtual Order Manager\VOM に保管されています。

//+------------------------------------------------------------------+
//|                                           FraMA Cross EA VOM.mq5 |
//+------------------------------------------------------------------+
#property copyright "Paul Hampton-Smith"
#property link      "http://paulsfxrandomwalk.blogspot.com"
#property version   "1.00"

// this is the only include required.  It points to the parent folder
#include "..\VirtualOrderManager.mqh"

input double   Lots=0.1;
input int      Fast_MA_Period=2;
input int      Slow_MA_Period=58;
/* 
Because the broker is 3/5 digit, stoplosses and takeprofits should be x10.  
It seems likely that all brokers offering MetaTrader 5 will be 3/5 digit brokers, 
but if this turns out to be incorrect it will not be a major task to add 
digit size detection. */
input int      Stop_Loss=5000;
input int      Take_Profit=0;
/*
We can also change the level of logging.  LOG_VERBOSE is the most prolific 
log level.  Once an EA has been fully debugged the level can be reduced to 
LOG_MAJOR.  Log files are written under the files\EAlogs folder and are 
automatically deleted after 30 days.  */
input ENUM_LOG_LEVEL Log_Level=LOG_VERBOSE;

// The following global variables will store the handles and values for the MAs 
double g_FastFrAMA[];
double g_SlowFrAMA[];
int g_hFastFrAMA;
int g_hSlowFrAMA;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   LogFile.LogLevel(Log_Level);

// Need to include this line in all EAs using CVirtualOrderManager  
   VOM.Initialise();
   Comment(VOM.m_OpenOrders.SummaryList());

   g_hFastFrAMA = iFrAMA(_Symbol,_Period,Fast_MA_Period,0,PRICE_CLOSE);
   g_hSlowFrAMA = iFrAMA(_Symbol,_Period,Slow_MA_Period,0,PRICE_CLOSE);
   ArraySetAsSeries(g_FastFrAMA,true);
   ArraySetAsSeries(g_SlowFrAMA,true);

   return(0);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
// Need to include this line in all EAs using CVirtualOrderManager  
   VOM.OnTick();
   Comment(VOM.m_OpenOrders.SummaryList());

// We now obtain copies of the most recent two FrAMA values in the 
// g_FastFrAMA and  g_SlowFrAMA arrays.  
   if(CopyBuffer(g_hFastFrAMA,0,Shift,2,g_FastFrAMA)!=2) || 
      CopyBuffer(g_hSlowFrAMA,0,Shift,2,g_SlowFrAMA)!=2)
     {
      Print("Not enough history loaded");
      return;
     }

// And now we detect a cross of the fast FrAMA over the slow FrAMA,
// close any opposite orders and Buy a single new one
   if(g_FastFrAMA[0]>g_SlowFrAMA[0] && g_FastFrAMA[1]<=g_SlowFrAMA[1])
     {
      VOM.CloseAllOrders(_Symbol,VIRTUAL_ORDER_TYPE_SELL);
      if(VOM.OpenedOrdersInSameBar()<1 && VOM.OpenOrders()==0)
        {
         VOM.Buy(_Symbol,Lots,Stop_Loss,Take_Profit);
        }
     }

// Opposite for Sell
   if(g_FastFrAMA[0]<g_SlowFrAMA[0] && g_FastFrAMA[1]>=g_SlowFrAMA[1])
     {
      VOM.CloseAllOrders(_Symbol,VIRTUAL_ORDER_TYPE_BUY);
      if(VOM.OpenedOrdersInSameBar()<1 && VOM.OpenOrders()==0)
        {
         VOM.Sell(_Symbol,Lots,Stop_Loss,Take_Profit);
        }
     }
  }
//+------------------------------------------------------------------+

ストラテジーテスターの解放とともに、それはバックテストが行われます。以下図1をご覧ください。

図1. FrAMAクロスEAバックテスト

図1. FrAMAクロスEAバックテスト

ログセクションは、図2で参照してください:

図2. ストラテジーテストのログ

図2. ストラテジーテストのログ


5. VOMストラクチャー

図4. 以下は、複数のVOM EAが設定される方法を示しています。

図3. マルチVOM EAs

図3. マルチVOM EAs

VOMの中を見ると、主要コンポーネントは以下図4にて見られます:

図4. VOM内部ストラクチャー

図4VOM内部ストラクチャー

図4の要素の説明:

  • Configuration(設定) - VOMはCConfigを使用し、すべての設定項目を一箇所にConfingグローバル変数に保管します。アクセスを簡単にするために、メンバー変数は、パブリックにし、get/set関数が提供されています。
  • Global variable(グローバル変数) - これらの変数はMQL5内にて、GlobalVariableGet()関数を使用しアクセスされます。VOMはグローバル変数を使用し
    • CGlobalVariableを用いた、仮想注文チケット数の記録、増加を行います。
    • すべての仮想ストップロスのリストを維持することで、災害からの保護的サーバー停止が保たれます。
  • オープントレードと履歴ファイル -これらはCVirtualOrderArrays により格納された永久ディスクファイルです。 これらのファイルのペアは、作成され、VOMを使用するEAに保存されます。 CVirtualOrderは、VOM.m_OpenOrders配列の中でサイクルを始め、VOM.m_OrderHistory配列に移動し終了します。
  • アクティビティとデバッグログ - 複雑な大半のコードは、ログアクテビティの能力を必要とし、この機能は、CLogクラスによりカプセル化されています。これは、ログを4つの異なるレベル、詳細さや重要性などで分けて記録し、自動的な古いログファイルを消し、ディスクスペースを管理します。

以下の図5からわかる通り、エキスパートアドバイザーは、VOMのライブラリとの連携を使用しています。

図5VOMライブラリとのEAの連携

図5VOMライブラリとのEAの連携


6. 災害保護のストップロスについて

仮想ストップは、MetaTrader4のEAに関しては一般的なものです。 もし、クライアント側でのみストップロスが維持されれば、トレードにおけるエグジットレベルはブローカには見えず、戦略はブローカーが休猟をしていると信じ戦略を実行していきます。 ブローカーとクライアントの接続は、常にストップが実行される状態である必要があるため、仮想ストップは、大いにトレードのリスクを拡大します。

VOMは、このリスクを厳しい仮想ストップから距離を空けたサーバーに基づくストップを維持することで、管理しています。 もしインターネットの接続が停止したりPCの故障という状況下にて、ブローカーとクライアント間の接続が故障してしまうと実行されてしまうため、これは災害保護ストップロス(DPSL)と呼ばれています。 仮想注文が開閉され、サーバーのポジションに移行されると、DPSLの正確なレベルでの維持は、少し複雑になります。以下に示されています。

仮想注文
アクション
オープン
価格
仮想 SL ポジション
サーバー
ストップロス
サーバー
コメント
0.1ロットBUY #1 2.00000 1.99000 0.1ロットBUY 1.98500 DPSLは50pips仮想SL #1よりも下です
0.1ロットBUY #2 2.00000 1.99500 0.2 ロット BUY 1.99000 仮想注文#2よりきついSLを持つので、DPSL
は50 pips、仮想SL #2より絞られています
クローズ#2 0.1ロットBUY 1.98500 ゆるい DPSLへの逆戻り
0.1 ロット SELL #3 2.00000 2.00500 none none 仮想注文 #1と#3それぞれが
互いにサーバーでキャンセルしあいました。
クローズ #1 0.1ロット SELL 2.01000 仮想注文#3は開かれたまあmであり- DPSLは
仮想SLより50pipc上になります。 #3


7. VOMのテスト

この大きさのプロジェクトは、時間を要するため、EA VirtualOrderManagerTester.mq5を書くことで、仮想注文を作成、修正、削除を簡単なチャート上のコマンドボタンにて行うことができます。

図6 M5ウィンドウの0.1ロットの仮想買い注文を示し、0.2ロットのポジションを示すサーバーの状態にて、EURUSD(コメントをご覧ください)に対してH4ウィンドウにて0.1ロットの仮想注文を示します。すべてのポジションはロングであるため、災害保護ストップロスを以下の20.0pipストップにて見られます。

図6方向で合致する二つのEA

図6方向で合致する二つのEA

図7は、異なる仮想注文の二つのEAを示し、そのブローカーではすべてのポジションがオープンではありません。

図7異なる仮想注文の二つのEAを示し、そのプローカーではすべてのポジションがオープンではありません。

図7異なる仮想注文の二つのEAを示し、そのプローカーではすべてのポジションがオープンではありません。


8. VOMのオープンオーダーのとても簡単な表示

VOM EAは注文を見ることができるので、VOMからオープン注文を付き合わせるシンプルなEAを書きました。その表示はとても簡単であり、時間が許せば、より良いバージョンを書くことができ、おそらく互いに必要なアクションを実行、修正、削除を行うコマンドボタンをつけることができます。EAは、VOM_OrderDisplay.mq5.の配布パックに含まれています。


9. 結論

この記事を書いた時期、VOMのコードはMetaTrader5と同様ベータバージョンであり、VOMのコンセプトが人気になるのか、MQL5プログラミングのおもしろい部分の一つとしてみなされるに終わるのかは、時のみぞ知るというような状況でした。

セクション3の設計したゴールに立ち戻り、いまの到着地点を見てみましょう。

  1. ソーシャビリティ: EAの行動様式は、VOMのトレーディング関数を用い、その他のEAの活動からは孤立されます。
    • Result - yes, the VOM approach achieved this goal
  2. 堅牢性: クライアントとサーバー間の不全な通信や、不完全な注文、エラーなどの異常なイベントの高貴なハンドリング
    • Result - some robustness is evident but there could be improvement as real trading situations occur and can be analysed
  3. 使用の容易性: よく説明された簡単なトレーディングの関数の提供を行います
    • Result - As will be seen in the distribution pack of files, a .chm help file is included
  4. ストラテジーテスターの使用
    • 結果 -ストラテジーテスターにおける初期のテストでは、VOMはバックテストを正しく行うも、VOMアプローチはテストを遅くさせるというような状況でした。スループットにおいて向上すべき部分がいくつかあります。

いくつかの将来の変化が望まれています。

  • 複雑なソフトウェア開発と同様、コードに残るバグはあります。
  • MetaTrader5のベータバージョンは、適合性を維持するためにVOMの変化が要請されています。
  • VomGetLastError()とVomErrorDescription()関数
  • ファイルからの設定を読む能力
  • 様々なトレーリングストップ


10. 圧縮された配布パックのファイル

VOMパッケージには、多くの.mqhファイルがあり、Experts\Virtual Order Managerフォルダーというところにインストールされています。

  • ChartObjectsTradeLines.mqh - CEntryPriceLine, CStopLossLine, CTakeProfitLine
  • StringUtilities.mqh - ErrorDescription()などのグローバルenum記述子
  • Log.mqh - CLog
  • GlobalVirtualStopList.mqh - CGlobalVirtualStopList
  • SimpleChartObject.mqh - CButton, CLabelとCEdit
  • VirtualOrder.mqh - CVirtualOrder
  • GlobalVariable.mqh - CGlobalVariable
  • VirtualOrderArray.mqh - CVirtualOrderArray
  • VirtualOrderManager.mqh - CVirtualOrderManager
  • VirtualOrderManagerConfig.mqh - CConfig
  • VirtualOrderManagerEnums.mqh - VOMのために定義された様々なenums
  • VOM_manual.mqh - 取り扱い説明書のページ
  • VOM_doc.chm***

5つのEA mq5のファイルが、Experts\Virtual Order Manager\VOM EAsに保存されています:

  • VOM_template_EA.mq5 - これをコピーし、ご自身のEAを作成、Experts\Virtual Order Manage\VOM EAsに保存してください。
  • VirtualOrderManagerTester.mq5
  • Support_Resistance_EA_VOM.mq5
  • FrAMA_Cross_EA_VOM.mq5
  • VOM_OrderDisplay.mq5

***VOM_doc.chmファイルのロックは解除されている必要があります:

MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/88

添付されたファイル |
vom-doc.zip (727.63 KB)
vom2_0.zip (608.43 KB)
vom-sources.zip (40.33 KB)
平均足インジケーターに基づくトレーディングシステムの例 平均足インジケーターに基づくトレーディングシステムの例
この記事は、トレーディングにおける平均足インジケーターの使用についての疑問を詳しく見ていきます。このインジケーターに基づき、簡単な取引システムが検討され、MQL55アドバイザーが記述されました。取引処理は、Standardクラスライブラリに基づき実行されます。トレーディング戦略のテスト結果は、履歴に基づき、内蔵MetaTrader5ストラテジーテスター使用し、取得されます。
数多くのインジケーターバッファーを使った複数通貨対応インジケーターの作成 数多くのインジケーターバッファーを使った複数通貨対応インジケーターの作成
FOREX市場のクラスター分析への関心が近年高まりつつあります。MQL5は、通貨ペアの動きの傾向を調査する新しい可能性を開きました。MQL4とは異なる、重要な特徴の一つとしてMQL5が持つのは、インジケーターバッファーを無限に使用することができる点です。この記事にて、複数通貨インジケーターの作成方法を紹介します。
DelphiでDLLをMQL5向けに書くためのガイド DelphiでDLLをMQL5向けに書くためのガイド
本稿は、人気のプログラム言語ObjectPascalを使用しDelphiプログラム環境でDLLモジュールの作成メカニズムを検証します。本稿で使用している資料は、まずは問題を抱えたプログラム初心者用に考えられでおります。外部DLLに接続することでMQL5プログラム言語に埋め込まれた境界を破ります。
MQL4からMQL5への移植 MQL4からMQL5への移植
本稿はMQL4言語関数の簡単なガイドです。MQL4からMQL5へプログラムを移植するのに役立つことでしょう。MQL4関数(トレーディング関数以外)にはそれぞれ記述とMQL5実装が存在します。そのため移行時間が大幅に削減されます。利便性を考え、MQL4関数はグループ分けされておりMQL4参照に似た形になっています。