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

Mike 2011.02.02 03:03 19 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の初期化関数                                   |
//| この関数は宣言する必要があります。たとえ空でも。                |
//+------------------------------------------------------------------+
int OnInit()
  {
   //--- ここにコードを追加...
   return(0);
  }
  
//+------------------------------------------------------------------+
//| Expertのマルチティック関数                                      |
//| 標準のOnTick()関数の代わりにこの関数を使用します。      |
//+------------------------------------------------------------------+
void OnTick(string symbol)
  {
   //--- ここにコードを追加...
   Print("シンボルの新しいイベント: ",symbol);
  }
  
//+------------------------------------------------------------------+
//| ChartEvent関数                                              |
//| この関数も宣言する必要があります。たとえ空でも。                |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,         // イベントID
                  const long& lparam,   // long型のイベントパラメータ
                  const double& dparam, // double型のイベントパラメータ
                  const string& sparam) // string型のイベントパラメータ
  {
   //--- ここにコードを追加...
  }
  
//+------------------------------------------------------------------+
//| Expertのデイニシャライズ関数                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int 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