MetaTrader 5のマルチ通貨OnTickイベントハンドラーの実装

Mike 2011.02.02 03:03 69 0 0
添付ファイル

今回は、MetaTrader 5における新しいマルチ通貨モードの実装についてお話しします。この機能は、拡張されたOnTick(string symbol)関数で実現されています。

この機能のメリット:

  • デモ口座およびリアル口座で本物のマルチ通貨モードを提供します。
  • 設定がシンプルで分かりやすいです。
  • OnTick(string symbol)のイベントリストを設定可能で、NewTickやNewBarを選べます。
  • シンボルのリストも設定でき、Market Watchの全シンボルまたは指定したシンボルを使用できます。
  • Market Watchのシンボルを使用する際、OnTick(string symbol)内でイベントをリアルタイムで管理できます。
  • その動作の詳細を理解する必要はありません。全てのコードはインクルードファイルに含まれています。
  • ストラテジーテスターでも使用可能です。

Expert Advisorのテンプレートは以下のようになります:

//+------------------------------------------------------------------+//|                                        OnTick(string symbol).mq5 |//|                                            Copyright 2010, Lizar |//|                            https://www.mql5.com/ru/users/Lizar |//+------------------------------------------------------------------+#define VERSION       "1.00 Build 1 (01 Fab 2011)"#property copyright   "Copyright 2010, Lizar"#property link        "https://www.mql5.com/ru/users/Lizar"#property version     VERSION#property description "Expert Advisorのテンプレート"#property description "マルチ通貨OnTick(string symbol)イベントハンドラー付き"//+------------------------------------------------------------------+//|                マルチ通貨モード設定                       |//|           OnTick(string symbol)イベントハンドラーの設定                 |//| 1.1 イベント処理に必要なシンボルリスト:             |#define  SYMBOLS_TRADING    "EURUSD","GBPUSD","USDJPY","USDCHF"//| 1.2 Market Watchの全シンボルを使用したい場合は、これを使用:         |//#define  SYMBOLS_TRADING    "MARKET_WATCH"//|     注意: 1.1または1.2のいずれか一方を選択してください。                   |//| 2.  OnTick(string symbol)のイベントタイプ:                        |#define  CHART_EVENT_SYMBOL CHARTEVENT_TICK //|     注意: イベントタイプは                 |//|                 ENUM_CHART_EVENT_SYMBOL列挙体に対応しています。             |//| 3.  インクルードファイル:                                                |#include <OnTick(string symbol).mqh>//+------------------------------------------------------------------+//+------------------------------------------------------------------+//| Expertの初期化関数                                   |//| この関数は宣言する必要があります。たとえ空でも。                |//+------------------------------------------------------------------+intOnInit()
  {
   //--- ここにコードを追加...
   return(0);
  }
  
//+------------------------------------------------------------------+//| Expertのマルチティック関数                                      |//| 標準のOnTick()関数の代わりにこの関数を使用します。      |//+------------------------------------------------------------------+voidOnTick(string symbol)
  {
   //--- ここにコードを追加...
   Print("シンボルの新しいイベント: ",symbol);
  }
  
//+------------------------------------------------------------------+//| ChartEvent関数                                              |//| この関数も宣言する必要があります。たとえ空でも。                |//+------------------------------------------------------------------+voidOnChartEvent(constint id,         // イベントID
                  constlong& lparam,   // long型のイベントパラメータ
                  constdouble& dparam, // double型のイベントパラメータ
                  conststring& sparam) // string型のイベントパラメータ
  {
   //--- ここにコードを追加...
  }
  
//+------------------------------------------------------------------+//| Expertのデイニシャライズ関数                                 |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
  {
   //--- ここにコードを追加...
  }

//+------------------------------ 終了 -------------------------------+

いくつかの機能:

1. 設定

全ての設定は、#defineディレクティブを使って設定できます。OnTick(string symbol)関数の正しい動作には、SYMBOLS_TRADINGとCHART_EVENT_SYMBOLの2つのパラメータを指定する必要があります。最初のSYMBOLS_TRADINGはイベントに使用されるシンボルリストを定義し、次のCHART_EVENT_SYMBOLは全シンボルのイベントタイプを定義します。

SYMBOLS_TRADINGには、例えば以下のようにシンボルリストを設定します:

#define  SYMBOLS_TRADING    "EURUSD","GBPUSD","USDJPY","USDCHF"

リストはカンマで区切られた文字列として準備し、行末で終了します。

SYMBOLS_TRADINGは以下のように定義できます:

#define  SYMBOLS_TRADING    "MARKET_WATCH"

この方法では、Market Watchの全シンボルが使用されます。この方法を使えば、必要なシンボルをMarket Watchに追加したり削除したりすることで、リアルタイムでシンボルのリストを変更できます。

CHART_EVENT_SYMBOLイベントタイプは、ENUM_CHART_EVENT_SYMBOL列挙体からのフラグまたはその組み合わせで定義されます。詳細はこちらをご覧ください(ロシア語)。

以下はイベントタイプの例です:

//--- 例1. OnTickイベント:#define  CHART_EVENT_SYMBOL CHARTEVENT_TICK //--- 例2. NewBar M1とNew Bar H1:#define  CHART_EVENT_SYMBOL CHARTEVENT_NEWBAR_H1|CHARTEVENT_NEWBAR_M1

2.  インクルードファイル。

#include OnTick(string symbol).mqhは必要です。このファイルにはOnTick(string symbol)関数の実装が含まれています。これにより、OnTick(string symbol)関数を簡単に使用できます。標準のいくつかの関数は、たとえ空でもExpert Advisorのコード内で宣言する必要があります。

3. ストラテジーテスター。

ご存知の通り(現在のところ)、OnChartEventはストラテジーテスターではサポートされていません。この問題を解決するために、グローバル変数を使用してイベントを扱います。この方法はストラテジーテスター専用で、他のすべてのケース(リアル/デモ口座)では、OnChartEventを介してイベントが処理されます。

ストラテジーテスターでは、OnTick(string symbol)がストラテジーテスターの設定で指定されたシンボルのティックで動作します。言い換えれば、OnTick()のように動作しますが、選択されたシンボルの新しいティックでも呼び出されます。ストラテジーテスターで動作させるためには、SYMBOLS_TRADINGはシンボルのリストとして指定する必要があります。

4. 「スパイ」。

「スパイ」(エージェントインジケーター)を使用します。「Spy Control panel MCM.ex5」ファイルは、\MQL5\Indicators\フォルダ内に配置する必要があります。

5. アーカイブからのファイルは、\MQL5フォルダに抽出する必要があります。必要なファイルは以下の通りです:

    • /MQL5/Experts/OnTick(string symbol).mq5 - Expert Advisorの例、テンプレートのソースコード;
    • /MQL5/Experts/OnTick(string symbol).ex5 - Expert Advisorのコンパイル済みファイル;
    • /MQL5/Indicators/Spy Control panel MCM.mq5 - エージェントインジケーター、ソースコード;
    • /MQL5/Indicators/Spy Control panel MCM.ex5 - エージェントインジケーター、コンパイル済みファイル;
    • /MQL5/Include/OnTick(string symbol).mqh - OnTick(string symbol)関数の実装に必要な全関数を含むインクルードファイル。
リスト
コメント 0