English Русский 中文 Español Deutsch Português 한국어 Français Italiano Türkçe
MQL5 標準ライブラリの拡張とコードの再利用

MQL5 標準ライブラリの拡張とコードの再利用

MetaTrader 5 | 24 11月 2015, 15:28
1 551 0
laplacianlab
削除済み

はじめに

MQL5 標準ライブラリは開発者のみなさんの生活を楽にする一式の既製クラスで構成されるオブジェクト指向フレームワークです。しかしながらそれは世界中の開発者全員のすべてのニーズを実装するわけではありません。よってみなさんがカスタム的なものをもっと必要とするなら一歩先へすすんで拡張することができます。本稿は MetaQuotesの Zig-Zag テクニカルインディケータを標準ライブラリに統合する方法をご紹介します。私達はMetaQuotes の設計哲学により自分自身の目標を達成しようという気持ちになります。

一言で言えばMQL5 API はみなさんがコード再利用、信頼性、柔軟性、管理のしやすさを享受できるようにするためのものです。これはセオリーが言うことですが、それをすべて越えて、 MQL5 で前進し続け、マルチ通貨 Experts Advisorsのようなより洗練されたものを開発しようとしているなら、まず標準ライブラリでコードをすることができます。それでみなさんのアプリケーションは成功した人生を保証されるのです。

みなさんの EAs やインディケータが複雑になればなるほど、フレームワーク開発に関連するコンセプトを使いこなることが必要になります。実生活の例として、私は個人的に一から私のプロジェクトの基盤を強化するニーズを示す複雑なマルチ通貨 EA を開発する必要があります。

図1 正多面体は完璧なオブジェクトです。それらは堅牢なコンセプトに基づくアプリを構築する方法をよく表しています。

図1 正多面体は完璧なオブジェクトです。それらは堅牢なコンセプトに基づくアプリを構築する方法をよく表しています。

1. ZigZag のダウンロード

MetaQuotesの ZigZag インディケータをダウンロードすることから始めます。それは MetaTrader 5 ターミナルのコードベースから入手可能です。これはファイルIndicators\zigzag.mq5 および Indicators\zigzag.ex5を作成します。

図2 MetaTrader 5 ターミナルから MetaQuotesの ZigZag インディケータをダウンロードし始めます。

図2  MetaTrader 5 ターミナル
からMetaQuotesの ZigZag インディケータをダウンロードし始めます。

インディケータの入力パラメータ、グローバル変数、OnInit() ハンドラを持つ Indicators\zigzag.mq5 の行をここにアタッチしています。以下に記載の部分のみとしました。というのもファイル全体ではコード 298 におよぶためです。これは単に 便宜上および下でお話することについての全体像を理解するためです。

//+------------------------------------------------------------------+
//|                                                       ZigZag.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots   1
//---- plot Zigzag
#property indicator_label1  "Zigzag"
#property indicator_type1   DRAW_SECTION
#property indicator_color1  Red
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int      ExtDepth=12;
input int      ExtDeviation=5;
input int      ExtBackstep=3;
//--- indicator buffers
double         ZigzagBuffer[];      // main buffer
double         HighMapBuffer[];     // highs
double         LowMapBuffer[];      // lows
int            level=3;             // recounting depth
double         deviation;           // deviation in points
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ZigzagBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,HighMapBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(2,LowMapBuffer,INDICATOR_CALCULATIONS);

//--- set short name and digits   
   PlotIndexSetString(0,PLOT_LABEL,"ZigZag("+(string)ExtDepth+","+(string)ExtDeviation+","+(string)ExtBackstep+")");
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//--- set empty value
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
//--- to use in cycle
   deviation=ExtDeviation*_Point;
//---
   return(INIT_SUCCEEDED);
  }


2. トップダウンの概要

MQL5 標準ライブラリに統合したいと思っている新しいオブジェクト指向のZigZag インディケータ を考えるためにトップダウンアプローチを取り入れます。これはまずシステム全体をイ、それからその小さい部分の分析を行うということです。全体像を見るためにダミー EA を数個コード化してはいかがでしょうか?オブジェクト指向バージョンと共にプロシージャスタイルの Expert Advisorを描きます。


2.1. 独創的ZigZag

中級 MQL5 開発者はおそらく EAでZigZagを以下のように遣うことでしょう。

//+----------------------------------------------------------------------+
//|                                            ExpertOriginalZigZag.mq5  |
//|                   Copyright © 2013, Laplacianlab - Jordi Bassagañas  | 
//+----------------------------------------------------------------------+
//--- EA properties
#property copyright     "Copyright © 2013, Laplacianlab - Jordi Bassagañas"
#property link          "https://www.mql5.com/ja/articles"
#property version       "1.00"
#property description   "This dummy Expert Advisor is just for showing how to use the original MetaQuotes' ZigZag indicator."
//--- EA inputs
input ENUM_TIMEFRAMES   EAPeriod=PERIOD_H1;
input string            CurrencyPair="EURUSD";
//--- global variables
int      zigZagHandle;
double   zigZagBuffer[];
double   zigZagHigh[];
double   zigZagLow[];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   zigZagHandle=iCustom(CurrencyPair,EAPeriod,"zigzag",12,5,3);
   ArraySetAsSeries(zigZagBuffer,true);
   ArraySetAsSeries(zigZagHigh,true);
   ArraySetAsSeries(zigZagLow,true);  
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   IndicatorRelease(zigZagHandle);
   ArrayFree(zigZagBuffer);
   ArrayFree(zigZagHigh);
   ArrayFree(zigZagLow);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   //--- refresh data   
   if(CopyBuffer(zigZagHandle,0,0,2,zigZagBuffer)<0)
   {
      Print("Can't copy ZigZag buffer 0!");
      return;
   }
   if(CopyBuffer(zigZagHandle,1,0,2,zigZagHigh)<0)
   {
      Print("Can't copy ZigZag buffer 1!");
      return;
   }
   if(CopyBuffer(zigZagHandle,2,0,2,zigZagLow)<0)
   {
      Print("Can't copy ZigZag buffer 2!");
      return;
   }
   //--- print values
   if(zigZagBuffer[0]!=0) Print("zigZagBuffer[0]: ", zigZagBuffer[0]);
   if(zigZagHigh[0]!=0) Print("zigZagHigh[0]: ", zigZagHigh[0]);
   if(zigZagLow[0]!=0) Print("zigZagLow[0]: ", zigZagLow[0]);
  }
//+------------------------------------------------------------------+


2.2. 標準ライブラリに統合されたZigZag

一方で上級の MQL5 開発者は ZigZag をすでに標準ライブラリと同じように処理したいと思うでしょう。以下のようにです。

//+----------------------------------------------------------------------+
//|                                                  ExpertOOZigZag.mq5  |
//|                   Copyright © 2013, Laplacianlab - Jordi Bassagañas  | 
//+----------------------------------------------------------------------+
#include <..\Include\Indicators\Custom\Trend.mqh>
//--- EA properties
#property copyright     "Copyright © 2013, Laplacianlab - Jordi Bassagañas"
#property link          "https://www.mql5.com/ja/articles"
#property version       "1.00"
#property description   "This dummy Expert Advisor is just for showing how to use the object-oriented version of MetaQuotes' ZigZag indicator."
//--- EA inputs
input ENUM_TIMEFRAMES   EAPeriod=PERIOD_H1;
input string            CurrencyPair="EURUSD";
//--- global variables
CiZigZag *ciZigZag;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   ciZigZag=new CiZigZag;
   ciZigZag.Create(CurrencyPair,EAPeriod,12,5,3);
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   delete(ciZigZag);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {   
   //--- refresh data
   ciZigZag.Refresh();
   //--- print values
   if(ciZigZag.ZigZag(0)!=0) Print("OO ZigZag buffer: ", ciZigZag.ZigZag(0));
   if(ciZigZag.High(0)!=0) Print("OO ZigZag high: ", ciZigZag.High(0));
   if(ciZigZag.Low(0)!=0) Print("OO ZigZag low: ",ciZigZag.Low(0));
  }
//+------------------------------------------------------------------+


2.3. おわりに

二番目のソリューションはより良いものです。なぜならそれはオブジェクト指向だからです。OO クラスが作成されると、Zig-Zagのオブジェクト指向機能で処理する方がプロシージャ機能よりもずっと相互交流しやすいことに直観的に気づくものです。オブジェクト指向ライブラリでの作業から得られるメリットを簡単に思い出しましょう。

  • OOP は簡単に課題をモデル化します。
  • OOP はコードの再利用が簡単になります。それは今度はコスト、信頼性、柔軟性、管理面でのメリットです。
  • パラダイムは ADT(抽象的なデータタイプ)作成を可能にします。ADT はデータタイプの従来コンセプトの抽象化で、それはあらゆるプログラム言語に存在するものです。

図3 正20面体堅牢なコンセプトを基にアプリを構築することはわれわれの設計を時間内にやりとげる品質保証です。

図3 正20面体堅牢なコンセプトを基にアプリを構築することはわれわれの設計を時間内にやりとげる品質保証です。


3. 新しい OO ZigZag の MQL5 の標準ライブラリへの統合

本稿の序章で述べたとおり、MetaQuotesのオブジェクト指向スタイルにより前にダウンロードされた ZigZagをラップする新しいクラスセットを構築しようという気になります。これはたやすいことで、Include\Indicators の中のファイルを見、調査し、MQL5 標準ライブラリの背後にある考えを理解するだけです。MetaQuotesの Trend.mqh 内に何があるか見ると、すぐに ADX、ボリンジャーバンド、SAR、 移動平均などのテクニカルインディケータをいくつか代表するクラスで埋め尽くされていることに気づきます。こういったクラスはすべて CIndicatorから派生しています。そこでこのスキームを実装します。ところでMQL5のクラスCiCustom から新しい OO インディケータを拡張することはこの演習を実施することの代替でした。

新しいフォルダ Include\Indicators\Custom の作成から始め、そのすぐあとに、新しいファイル Include\Indicators\Custom\Trend.mqh を作成してわれわれのテクニカルインディケータをそこにコード化することができるようにします。ちょうど MetaQuotes がその Include\Indicators\Trend.mqh内で行うのと同じようにです。ここにすでに実装済みのわれわれの拡張ファイル Include\Indicators\Custom\Trend.mqh があります。これをコード化するために必要ないくつかの技術的側面について下に述べます。

//+------------------------------------------------------------------+
//|                              Include\Indicators\Custom\Trend.mqh |
//|                  Copyright 2013, Laplacianlab - Jordi Bassagañas |
//|                     https://www.mql5.com/ja/users/laplacianlab |
//+------------------------------------------------------------------+
#include <..\Include\Indicators\Indicator.mqh>
//+------------------------------------------------------------------+
//| Class CiZigZag.                                                  |
//| Purpose: Class of the "ZigZag" indicator.                        |
//|          Derives from class CIndicator.                          |
//+------------------------------------------------------------------+
class CiZigZag : public CIndicator
  {
protected:
   int               m_depth;
   int               m_deviation;
   int               m_backstep;

public:
                     CiZigZag(void);
                    ~CiZigZag(void);
   //--- methods of access to protected data
   int               Depth(void)          const { return(m_depth);      }
   int               Deviation(void)      const { return(m_deviation);  }
   int               Backstep(void)       const { return(m_backstep);   }
   //--- method of creation
   bool              Create(const string symbol,const ENUM_TIMEFRAMES period,
                            const int depth,const int deviation_create,const int backstep);
   //--- methods of access to indicator data
   double            ZigZag(const int index) const;
   double            High(const int index) const;
   double            Low(const int index) const;
   //--- method of identifying
   virtual int       Type(void) const { return(IND_CUSTOM); }

protected:
   //--- methods of tuning
   virtual bool      Initialize(const string symbol,const ENUM_TIMEFRAMES period,const int num_params,const MqlParam &params[]);
   bool              Initialize(const string symbol,const ENUM_TIMEFRAMES period,
                                const int depth,const int deviation_init,const int backstep);
  };
//+------------------------------------------------------------------+
//| Constructor                                                      |
//+------------------------------------------------------------------+
CiZigZag::CiZigZag(void) : m_depth(-1),
                         m_deviation(-1),
                         m_backstep(-1)
  {
  }
//+------------------------------------------------------------------+
//| Destructor                                                       |
//+------------------------------------------------------------------+
CiZigZag::~CiZigZag(void)
  {
  }
//+------------------------------------------------------------------+
//| Create indicator "Zig Zag"                                       |
//+------------------------------------------------------------------+
bool CiZigZag::Create(const string symbol,const ENUM_TIMEFRAMES period,
                      const int depth,const int deviation_create,const int backstep)
  {
//--- check history
   if(!SetSymbolPeriod(symbol,period))
      return(false);
//--- create
   m_handle=iCustom(symbol,period,"zigzag",depth,deviation_create,backstep);
//--- check result
   if(m_handle==INVALID_HANDLE)
      return(false);
//--- indicator successfully created
   if(!Initialize(symbol,period,depth,deviation_create,backstep))
     {
      //--- initialization failed
      IndicatorRelease(m_handle);
      m_handle=INVALID_HANDLE;
      return(false);
     }
//--- ok
   return(true);
  }
//+------------------------------------------------------------------+
//| Initialize the indicator with universal parameters               |
//+------------------------------------------------------------------+
bool CiZigZag::Initialize(const string symbol,const ENUM_TIMEFRAMES period,const int num_params,const MqlParam &params[])
  {
   return(Initialize(symbol,period,(int)params[0].integer_value,(int)params[1].integer_value,(int)params[2].integer_value));
  }
//+------------------------------------------------------------------+
//| Initialize indicator with the special parameters                 |
//+------------------------------------------------------------------+
bool CiZigZag::Initialize(const string symbol,const ENUM_TIMEFRAMES period,
                        const int depth,const int deviation_init,const int backstep)
  {
   if(CreateBuffers(symbol,period,3))
     {
      //--- string of status of drawing
      m_name  ="ZigZag";
      m_status="("+symbol+","+PeriodDescription()+","+
               IntegerToString(depth)+","+IntegerToString(deviation_init)+","+
               IntegerToString(backstep)+") H="+IntegerToString(m_handle);
      //--- save settings
      m_depth=depth;
      m_deviation=deviation_init;
      m_backstep=backstep;       
      //--- create buffers
      ((CIndicatorBuffer*)At(0)).Name("ZIGZAG");
      ((CIndicatorBuffer*)At(1)).Name("HIGH");
      ((CIndicatorBuffer*)At(2)).Name("LOW");
      //--- ok
      return(true);
     }
//--- error
   return(false);
  }
//+------------------------------------------------------------------+
//| Access to ZigZag buffer of "Zig Zag"                             |
//+------------------------------------------------------------------+
double CiZigZag::ZigZag(const int index) const
  {
   CIndicatorBuffer *buffer=At(0);
//--- check
   if(buffer==NULL)
      return(EMPTY_VALUE);
//---
   return(buffer.At(index));
  }
//+------------------------------------------------------------------+
//| Access to High buffer of "Zig Zag"                               |
//+------------------------------------------------------------------+
double CiZigZag::High(const int index) const
  {
   CIndicatorBuffer *buffer=At(1);
//--- check
   if(buffer==NULL)
      return(EMPTY_VALUE);
//---
   return(buffer.At(index));
  }
//+------------------------------------------------------------------+
//| Access to Low buffer of "Zig Zag"                                |
//+------------------------------------------------------------------+
double CiZigZag::Low(const int index) const
  {
   CIndicatorBuffer *buffer=At(2);
//--- check
   if(buffer==NULL)
      return(EMPTY_VALUE);
//---
   return(buffer.At(index));
  }
//+------------------------------------------------------------------+


3.1. オブジェクト指向カプセル化

OO カプセル化はオブジェクトのデータメンバーがそれに対して定義された処理によってのみ変更されることを意味する優れたプログラミング練習です。MetaQuotesの Trend.mqh で定義されるクラスはすべてこの考えを取り入れるので、われわれも同様に行っています。

一方、CiZigZagの特定の保護されたプロパティがあります。

protected:
   int               m_depth;
   int               m_deviation;
   int               m_backstep;

その後外部からアクセスするための CiZigZagのパブリックなインターフェースがあります。上で定義される保護されたプロパティのCiZigZag タイプです。

public:
   //--- methods of access to protected data
   int               Depth(void)          const { return(m_depth);      }
   int               Deviation(void)      const { return(m_deviation);  }
   int               Backstep(void)       const { return(m_backstep);   }

これはオブジェクトを孤立化するためのセキュリティ対策です。このカプセル化はオブジェクトデータへのアクセスを許可されていないだれかまたは何かが任意に変更を行うことに対して保護します。


3.2. ZigZagデータへのアクセス

本稿の第一節にあるように、d zigzag.mq5 という名前のソースコードファイルはバッファを3個作成します。

//--- indicator buffers mapping
   SetIndexBuffer(0,ZigzagBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,HighMapBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(2,LowMapBuffer,INDICATOR_CALCULATIONS);

オブジェクト指向のカプセル化にもかかわらず、CiZigZagの手法ZigZag(const int index)High(const int index)Low(const int index) は前に初期化メソッドで作成されたインディケータバッファを返します。オブジェクト指向のラッパー CIndicatorBuffer はMQL5のクラス Include\Indicators\Indicator.mqhで定義されることに留意することが重要です。CIndicatorBuffer はこれら3個のメソッドの中核です。われわれはすでに MQL5 APIに浸っています。

ここの例のようにそれはCiZigZagのハイバッファにアクセスするためのコードです。

//+------------------------------------------------------------------+
//| Access to High buffer of "Zig Zag"                               |
//+------------------------------------------------------------------+
double CiZigZag::High(const int index) const
  {
   CIndicatorBuffer *buffer=At(1);
//--- check
   if(buffer==NULL)
      return(EMPTY_VALUE);
//---
   return(buffer.At(index));
  }


3.3.
Polymorphismメソッドのオーバーロードと仮想関数

前節でオブジェクト指向プログラミングのもっとも重要な特徴の一つであるカプセル化について簡単に述べました。Include\Indicators\Indicator.mqh にあるクラスとファイル Include\Indicators\Custom\Trend.mqh は OOP パラダイムの別の2つの側面に対処します。それは多相性とメソッドのオーバーロードです。

多相性は同じインターフェースによって多様なメソッド範囲にアクセスする機能を持ちます。この方法で既定の識別子はそれが位置するコンテキストによって複数の形式をとることができます。多相性には実装できるように派生メカニズムが必要です。一方、メソッドオーバーロードはもう一つ別の OOP 特性で、それにより同じ名前を共有しつつ複数のメソッドを作成することができます。ただしパラメータ宣言は異なる必要があります。

これはひじょうに短い紹介です。本稿には十分な誌面がなくこのテーマをお話することができないので、これを掘り下げるのはみなさんの練習として残しておきます。MQL5 セクションの 多相性 および オーバーロードをご一読ください。いずれにしても標準ライブラリがOOP 機能をすべて実装するのを確認します。それをよく知れば、ニーズに合わせて API をよりよく拡張することができるものです。

これまで述べたすべての中で、もうひとつだけ注意することがあります。MQL5 は Virtual Functionsと呼ばれるメカニズムにより多相性を実装します。もう一度、 MQL5 の仮想関数 節を読んでそれがどのように役立つか理解してください。

以下はなぜこのようにCiZigZagの初期化メソッドをコードするかという理由です。

//+------------------------------------------------------------------+
//| Initialize the indicator with universal parameters               |
//+------------------------------------------------------------------+
bool CiZigZag::Initialize(const string symbol,const ENUM_TIMEFRAMES period,const int num_params,const MqlParam &params[])
  {
   return(Initialize(symbol,period,(int)params[0].integer_value,(int)params[1].integer_value,(int)params[2].integer_value));
  }
//+------------------------------------------------------------------+
//| Initialize indicator with the special parameters                 |
//+------------------------------------------------------------------+
bool CiZigZag::Initialize(const string symbol,const ENUM_TIMEFRAMES period,
                        const int depth,const int deviation_init,const int backstep)
  {
   if(CreateBuffers(symbol,period,3))
     {
      //--- string of status of drawing
      m_name  ="ZigZag";
      m_status="("+symbol+","+PeriodDescription()+","+
               IntegerToString(depth)+","+IntegerToString(deviation_init)+","+
               IntegerToString(backstep)+") H="+IntegerToString(m_handle);
      //--- save settings
      m_depth=depth;
      m_deviation=deviation_init;
      m_backstep=backstep;       
      //--- create buffers
      ((CIndicatorBuffer*)At(0)).Name("ZIGZAG");
      ((CIndicatorBuffer*)At(1)).Name("HIGH");
      ((CIndicatorBuffer*)At(2)).Name("LOW");
      //--- ok
      return(true);
     }
//--- error
   return(false);
  }

4. すでに標準ライブラリで利用可能な新しい OO ZigZagの検証

もしhろんみなさんによってOO開発に作成された拡張を使用する前にまずそれが期待通りに動作するか確認する必要があります。みなさんの新しいカスタムコンポーネント上で総合テストセットを実行することをお薦めします。ただし単純化の問題について、ここで CiZigZagの主要3メソッドについてシンプルな検証を実装します。そのメソッドというのは ZigZag(const int index)High(const int index)Low(const int index)です。

EAのティック毎にこれら3メソッドによって計算される値をプリントし、ExpertOriginalZigZag.ex5によって作成されるアウトプットであるダミーのプロシージャEAをExpertOOZigZag.ex5によって作成されるアウトプットであるオブジェクト指向 EAと比較します。取得されるどちらのアウトプットの同一の場合はいつも、新規拡張は OK、MQL5 APIに統合されたわれわれの OO ZigZag は優れている、と結論することができます。

図4 われわれは ExpertOriginalZigZag.ex5 によって作成されるアウトプットと ExpertOOZigZag.ex5によるアウトプットを比較しています。

図4 われわれは ExpertOriginalZigZag.ex5 によって作成されるアウトプットと ExpertOOZigZag.ex5によるアウトプットを比較しています。

そのため本稿の冒頭で提供した2つの EA ExpertOriginalZigZag.ex5 および ExpertOOZigZag.ex5を両方ストラテジーテスタ内で以下のパラメータ設定にて実行します。

  • シンボル;EURUSD、H1
  • 日付:カスタム期間、2013.08.01 ~ 2013.08.15
  • 実行:通常、1 分 OHLC
  • デポジット:10000 USD、1:100
  • 最適化:なし

両ロボットが同じ結果をプリントするため、われわれの CiZigZag はうまく実装されていると結論します。よって今から開発にそれを利用することができるのです。

ExpertOriginalZigZag.ex5によって作成されるログ

DE      0       18:45:39        ExpertOriginalZigZag (EURUSD,H1)        2013.08.01 08:50:40   zigZagBuffer[0]: 1.32657
ML      0       18:45:39        ExpertOriginalZigZag (EURUSD,H1)        2013.08.01 08:50:40   zigZagLow[0]: 1.32657
FL      0       18:45:39        ExpertOriginalZigZag (EURUSD,H1)        2013.08.01 08:50:59   zigZagBuffer[0]: 1.32657
GE      0       18:45:39        ExpertOriginalZigZag (EURUSD,H1)        2013.08.01 08:50:59   zigZagLow[0]: 1.32657
KS      0       18:45:39        ExpertOriginalZigZag (EURUSD,H1)        2013.08.01 08:51:00   zigZagBuffer[0]: 1.32657
FR      0       18:45:39        ExpertOriginalZigZag (EURUSD,H1)        2013.08.01 08:51:00   zigZagLow[0]: 1.32657
GK      0       18:45:39        ExpertOriginalZigZag (EURUSD,H1)        2013.08.01 08:51:20   zigZagBuffer[0]: 1.32653
RJ      0       18:45:39        ExpertOriginalZigZag (EURUSD,H1)        2013.08.01 08:51:20   zigZagLow[0]: 1.32653
OR      0       18:45:39        ExpertOriginalZigZag (EURUSD,H1)        2013.08.01 08:51:40   zigZagBuffer[0]: 1.32653
FS      0       18:45:39        ExpertOriginalZigZag (EURUSD,H1)        2013.08.01 08:51:40   zigZagLow[0]: 1.32653
QJ      0       18:45:39        ExpertOriginalZigZag (EURUSD,H1)        2013.08.01 08:51:59   zigZagBuffer[0]: 1.32653
PH      0       18:45:39        ExpertOriginalZigZag (EURUSD,H1)        2013.08.01 08:51:59   zigZagLow[0]: 1.32653
JQ      0       18:45:39        ExpertOriginalZigZag (EURUSD,H1)        2013.08.01 08:52:00   zigZagBuffer[0]: 1.32653
KP      0       18:45:39        ExpertOriginalZigZag (EURUSD,H1)        2013.08.01 08:52:00   zigZagLow[0]: 1.32653
RH      0       18:45:39        ExpertOriginalZigZag (EURUSD,H1)        2013.08.01 08:52:20   zigZagBuffer[0]: 1.32653
GI      0       18:45:39        ExpertOriginalZigZag (EURUSD,H1)        2013.08.01 08:52:20   zigZagLow[0]: 1.32653
GP      0       18:45:39        ExpertOriginalZigZag (EURUSD,H1)        2013.08.01 08:52:40   zigZagBuffer[0]: 1.32614
// More data here!..

ExpertOOZigZag.ex5によって作成されるログ

RP      0       18:48:02        ExpertOOZigZag (EURUSD,H1)      2013.08.01 08:50:40   OO ZigZag buffer(0): 1.32657
HQ      0       18:48:02        ExpertOOZigZag (EURUSD,H1)      2013.08.01 08:50:40   OO ZigZag low(0): 1.32657
DI      0       18:48:02        ExpertOOZigZag (EURUSD,H1)      2013.08.01 08:50:59   OO ZigZag buffer(0): 1.32657
RH      0       18:48:02        ExpertOOZigZag (EURUSD,H1)      2013.08.01 08:50:59   OO ZigZag low(0): 1.32657
QR      0       18:48:02        ExpertOOZigZag (EURUSD,H1)      2013.08.01 08:51:00   OO ZigZag buffer(0): 1.32657
GS      0       18:48:02        ExpertOOZigZag (EURUSD,H1)      2013.08.01 08:51:00   OO ZigZag low(0): 1.32657
IK      0       18:48:02        ExpertOOZigZag (EURUSD,H1)      2013.08.01 08:51:20   OO ZigZag buffer(0): 1.32653
GJ      0       18:48:02        ExpertOOZigZag (EURUSD,H1)      2013.08.01 08:51:20   OO ZigZag low(0): 1.32653
EL      0       18:48:02        ExpertOOZigZag (EURUSD,H1)      2013.08.01 08:51:40   OO ZigZag buffer(0): 1.32653
OD      0       18:48:02        ExpertOOZigZag (EURUSD,H1)      2013.08.01 08:51:40   OO ZigZag low(0): 1.32653
OE      0       18:48:02        ExpertOOZigZag (EURUSD,H1)      2013.08.01 08:51:59   OO ZigZag buffer(0): 1.32653
IO      0       18:48:02        ExpertOOZigZag (EURUSD,H1)      2013.08.01 08:51:59   OO ZigZag low(0): 1.32653
DN      0       18:48:02        ExpertOOZigZag (EURUSD,H1)      2013.08.01 08:52:00   OO ZigZag buffer(0): 1.32653
RF      0       18:48:02        ExpertOOZigZag (EURUSD,H1)      2013.08.01 08:52:00   OO ZigZag low(0): 1.32653
PP      0       18:48:02        ExpertOOZigZag (EURUSD,H1)      2013.08.01 08:52:20   OO ZigZag buffer(0): 1.32653
RQ      0       18:48:02        ExpertOOZigZag (EURUSD,H1)      2013.08.01 08:52:20   OO ZigZag low(0): 1.32653
MI      0       18:48:02        ExpertOOZigZag (EURUSD,H1)      2013.08.01 08:52:40   OO ZigZag buffer(0): 1.32614
// More data here!..

おわりに

MQL5 標準ライブラリy によってみなさんの開発者としての生活は楽になります。しかしながらそれは世界中の開発者全員のすべてのニーズを実装するわけではありません。よってつねにみなさんがカスタム的なものを作成する必要のある点があります。みなさんの EAs やインディケータが複雑になればなるほど、フレームワーク開発に関連するコンセプトを使いこなることが必要になります。MQL5 標準ライブラリはみなさんのアプリケーションが成功した人生を送る品質保証です。

コードベースから最初に the ZigZag indicator をダウンロードすることでコードを再利用するメリットを生かしてきました。ひとたび MetaTrader 5 ターミナルで利用できるようになると、新しいオブジェクト指向 ZigZag インディケータを考え始めるために トップダウン手法を取り入れました。大まかにシステム全体を見、分析を続けました。開発の最初のフェーズでは、プロシージャスタイルの ZigZag インディケータを用いたダミー EA をオブジェクト指向 EA と比較しました。

ZigZag インディケータをMetaQuotesの設計哲学に従って設計したオブジェクト指向クラスにラップし、同じことを標準ライブラリの構築に適用しました。そして最終的にシンプルは検証をいくつか実行し、すでにMQL5 APIに統合されているわれわれの新しいCiZigZag ラッパーはうまく実装されていると結論しました。


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

添付されたファイル |
expertoozigzag.mq5 (2.03 KB)
trend.mqh (6.34 KB)
zigzag.mq5 (9.34 KB)
テクニカルインディケータとデジタルフィルター テクニカルインディケータとデジタルフィルター
本稿ではデジタルフィルターとしてテクニカルインディケータを取り上げます。デジタルフィルターの処理原則と基本特性が説明されます。また、MetaTrader 5 ターミナルでフィルターカーネルを受け取る実用的な方法と記事 "Building a Spectrum Analyzer" で提案されている既製のスペクトル解析機能との統合について考察します。例として典型的デジタルフィルターのパルスとスペクトル特性を使用します。
MQL5 Cookbook:指定の基準に基づく Expert Advisor 最適化結果の保存方法 MQL5 Cookbook:指定の基準に基づく Expert Advisor 最適化結果の保存方法
MQL5 プログラミングに関するシリーズを続けます。今回、われわれは Expert Advisor のパラメータ最適化の最中に各最適化パスの結果を取得する方法を見ていきます。外部パラメータに指定された条件が満たされれば対応するパス値がファイルに書き込まれることを確認できるよう実装が行われます。検証値以外にもそのような結果をもたらしたパラメータも保存します。
リニアなトレーディングシステムを指数に高める リニアなトレーディングシステムを指数に高める
本稿では MQL5 プログラマーの中級者にリニアなトレーディングシステム(固定ロット)からいわゆる指数の技術を簡単に実装することでより収益を上げる方法をお伝えします。これは結果として生じる資金曲線の成長が幾何学的または指数関数で放物線の形を取ります。特にラルフ・ビンス氏によって開発された実用的な「固定比率」のポジションサイジングの MQL5 のバリアントを実装します。
MQL5 クックブック:MetaTrader 5トレードイベントへの音声通知 MQL5 クックブック:MetaTrader 5トレードイベントへの音声通知
本稿では Expert Advisor のファイルに音声ファイルをインクルードすること、それによりトレードイベントに音声通知を追加するなどの問題を考察します。事実、ファイルのインクルードが意味するところは Expert Advisor内に音声ファイルを入れるということです。よってコンパイルされた Expert Advisor (*.ex5) バージョンを他のユーザーに提供する際、音声ファイルは提供せずそれがどこの保存されるか説明する必要があるのです。