
MQL5 標準ライブラリの拡張とコードの再利用
はじめに
MQL5 標準ライブラリは開発者のみなさんの生活を楽にする一式の既製クラスで構成されるオブジェクト指向フレームワークです。しかしながらそれは世界中の開発者全員のすべてのニーズを実装するわけではありません。よってみなさんがカスタム的なものをもっと必要とするなら一歩先へすすんで拡張することができます。本稿は MetaQuotesの Zig-Zag テクニカルインディケータを標準ライブラリに統合する方法をご紹介します。私達はMetaQuotes の設計哲学により自分自身の目標を達成しようという気持ちになります。
一言で言えばMQL5 API はみなさんがコード再利用、信頼性、柔軟性、管理のしやすさを享受できるようにするためのものです。これはセオリーが言うことですが、それをすべて越えて、 MQL5 で前進し続け、マルチ通貨 Experts Advisorsのようなより洗練されたものを開発しようとしているなら、まず標準ライブラリでコードをすることができます。それでみなさんのアプリケーションは成功した人生を保証されるのです。
みなさんの EAs やインディケータが複雑になればなるほど、フレームワーク開発に関連するコンセプトを使いこなることが必要になります。実生活の例として、私は個人的に一から私のプロジェクトの基盤を強化するニーズを示す複雑なマルチ通貨 EA を開発する必要があります。
図1 正多面体は完璧なオブジェクトです。それらは堅牢なコンセプトに基づくアプリを構築する方法をよく表しています。
1. ZigZag のダウンロード
MetaQuotesの ZigZag インディケータをダウンロードすることから始めます。それは MetaTrader 5 ターミナルのコードベースから入手可能です。これはファイルIndicators\zigzag.mq5 および Indicators\zigzag.ex5を作成します。図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. 新しい 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 ¶ms[]); 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 ¶ms[]) { 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 ¶ms[]) { 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によるアウトプットを比較しています。
そのため本稿の冒頭で提供した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





- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索