English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
MQL5 Standart Kitaplığını Genişletme ve Kodu Yeniden Kullanma

MQL5 Standart Kitaplığını Genişletme ve Kodu Yeniden Kullanma

MetaTrader 5Örnekler | 13 Ocak 2022, 16:47
64 0
laplacianlab
[Silindi]

Giriş

MQL5 Standart Kitaplığı, bir geliştirici olarak hayatınızı kolaylaştıran, bir dizi hazır sınıftan oluşan bir nesne yönelimli çerçevedir. Ancak, dünya genelindeki bütün geliştiricilerin ihtiyaçlarını karşılamaz, bu yüzden daha özel bir şeye ihtiyacınız olduğunu düşünüyorsanız, bir adım daha ileri gidebilir ve bunu genişletebilirsiniz. Bu makale, size MetaQuotes'un Zig-Zag teknik göstergesini Standart Kitaplığa entegre etme konusunu anlatmaktadır. Amacımıza ulaşmak için MetaQuotes'un tasarım felsefesinden ilham alacağız.

Özetle, MQL5 API kod yeniden kullanımı, güvenilirlik, esneklik ve bakım kolaylığından faydalanmanıza yöneliktir. Teoride bu böyledir, ancak tüm bunların ötesinde MQL5'te gelişmeye devam etme ve çok para birimli Uzman Danışmanlar gibi daha sofistike şeyler tasarlamayı planlıyorsanız, ilk olarak uygulamalarınızın başarılı bir yaşam sürmesinin garanti edileceği şekilde Standart Kitaplıkta kodlama yapabilmeniz gerekir.

EA'larınız ve göstergeleriniz giderek daha karmaşık hale geldikçe, çerçeve geliştirmede yer alan kavramlar konusunda daha fazla uzmanlaşmak gerekir. Gerçek hayattan bir örnek olarak, kişisel bir ihtiyaç olarak, projemin tabanını sıfırdan güçlendirme ihtiyacını belirten karmaşık bir çok para birimli EA geliştirmem gerekiyor.

Şekil 1. Düzenli çok yüzlü cisimler mükemmel nesnelerdir. Bunlar, somut kavramlar üzerine uygulama geliştirme yaklaşımını iyi betimliyor.

Şekil 1. Düzenli çok yüzlü cisimler mükemmel nesnelerdir. Bunlar, somut kavramlar üzerine uygulama geliştirme yaklaşımını iyi betimliyor

1. ZigZag İndirme

MetaTrader 5 Terminalimizden Code Base içinde bulunabilen MetaQuotes ZigZag göstergesi indirerek başlıyoruz. Bu, Indicators\zigzag.mq5 ve Indicators\zigzag.ex5 dosyalarını oluşturacaktır.

Şekil 2. MetaTrader 5 Terminalinden MetaQuotes ZigZag indirerek başlıyoruz

Şekil 2. MetaTrader 5 Terminalinden MetaQuotes ZigZag indirerek başlıyoruz

Göstergenin giriş parametrelerini, global değişkenleri ve OnInit() işleyicisini içeren Indicators\zigzag.mq5 satırlarını buraya ekliyorum. Dosyanın tamamında 298 satır kod olduğu için sadece bu kısmı koydum. Bu sadece kolaylık sağlanması ve aşağıda bahsettiğimiz daha büyük resmin anlaşılmasına yöneliktir.

//+------------------------------------------------------------------+
//|                                                       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. Hızlı Yukarıdan Aşağıya Genel Bakış

Şimdi, MQL5 Standart Kitaplığına entegre etmek istediğimiz yeni nesne yönelimli ZigZag göstergemiz hakkında düşünmek için yukarıdan aşağıya yaklaşımı benimseyelim. Bu, ilk olarak bütün sisteme bakmamız ve ardından bunun daha küçük parçalarını analiz etmemiz gerektiği anlamına gelir. O zaman büyük resmi görmek için neden birkaç sahte EA kodlamıyoruz? Nesneye yönelimli sürümü ile birlikte prosedür tarzında bir Uzman Danışman yazalım.


2.1. Orijinal Haliyle ZigZag

Orta düzeyde MQL5 geliştiricileri EA'larında ZigZag göstergesini muhtemelen şu şekilde kullanırlar:

//+----------------------------------------------------------------------+
//|                                            ExpertOriginalZigZag.mq5  |
//|                   Copyright © 2013, Laplacianlab - Jordi Bassagañas  | 
//+----------------------------------------------------------------------+
//--- EA properties
#property copyright     "Copyright © 2013, Laplacianlab - Jordi Bassagañas"
#property link          "https://www.mql5.com/tr/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. Standart Kitaplığa entegre edilmiş ZigZag

Diğer yandan, üst düzey MQL5 geliştiricileri, ZigZag göstergesiyle, Standart Kitaplık göstergeleriyle yaptıkları gibi çalışmak isteyeceklerdir, şu şekilde:

//+----------------------------------------------------------------------+
//|                                                  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/tr/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. Sonuç

İkinci çözüm, nesne yönelimli olmasından dolayı daha iyidir. OO sınıfları geliştirildikten sonra, bunun prosedür muadiliyle çalışmaya kıyasla, Zig-Zag'ın nesne yönelimli fonksiyonuyla etkileşimde bulunmanın çok daha basit olduğunu gözlemlemek sezgiseldir. Nesne yönelimli bir kitaplık ile çalışırken faydalandığımız avantajları kısaca hatırlayalım:

  • OOP problemleri modellemeyi kolaylaştırır.
  • Kodun yeniden kullanılmasını kolaylaştırır, bu ise maliyet, güvenilirlik, esneklik ve bakıma fayda sağlar.
  • Bu paradigma ADT'lerin (Soyut Veri Türleri) oluşturulmasını sağlar. Bir ADT, tüm programlama dillerinde bulunan klasik veri türü kavramının bir soyutlamasıdır.

Şekil 3. Düzenli yirmi yüzlü cisim. Uygulamalarımızı somut kavramlar üzerinde oluşturmak, tasarımlarımızın zamana karşı koymasını sağlayan bir kalite garantisidir.

Şekil 3. Düzenli yirmi yüzlü cisim. Uygulamalarımızı somut kavramlar üzerinde oluşturmak, tasarımlarımızın zamana karşı koymasını sağlayan bir kalite garantisidir.


3. Yeni OO ZigZag'ımızı MQL5 Standart Kitaplığına Entegre Etme

Bu makalenin giriş kısmında söylediğim gibi, daha önce indirilen ZigZag'ın sarılmasına yönelik yeni sınıf setimizi oluşturmak için MetaQuotes'un nesne yönelimli stilinden ilham alıyoruz. Kolay bir şey, sadece Include\Indicators içindeki dosyalara bakmamız ve MQL5 Standart Kitaplığının arkasında yer alan fikirlerden bazılarını anlamamız gerekiyor. MetaQuotes Trend.mqh içinde ne olduğuna baktığınızda, bunun, bazı teknik göstergeleri temsil eden sınıflarla dolu olduğunu fark edeceksiniz: ADX, Bollinger Bantları, SAR, Hareketli Ortalamalar vb. Tüm bu sınıflar CIndicator'dan devralınır. Öyleyse bu şemayı uygulayalım. Bu arada, bu alıştırmayı uygulamanın bir diğer alternatifi, yeni OO göstergesinin MQL5'in sınıfı CiCustom'dan genişletilmesidir.

Yeni Include\Indicators\Custom klasörünü oluşturarak ve hemen ardından MetaQuotes'un Include\Indicators\Trend.mqh dosyasında yaptığı gibi kendi teknik göstergelerimizi buraya kodlamak için Include\Indicators\Custom\Trend.mqh yeni dosyasını oluşturarak başlayalım. Halihazırda uygulanmış Include\Indicators\Custom\Trend.mqh genişleyen dosyamız buradadır. Bunu kodlamak için gereken bazı teknik hususları aşağıda tartışacağım.

//+------------------------------------------------------------------+
//|                              Include\Indicators\Custom\Trend.mqh |
//|                  Copyright 2013, Laplacianlab - Jordi Bassagañas |
//|                     https://www.mql5.com/en/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. Nesne Yönelimli Kapsülleme

OO kapsülleme, nesnelerin veri üyelerinin yalnızca kendileri için tanımlanan işlemler ile değiştirilebileceği anlamına gelen iyi bir programlama uygulamasıdır. MetaQuotes'un Trend.mqh dosyasında tanımlanan sınıfların tamamı bu fikri uygular, bu yüzden biz de aynısını yapacağız.

Bir yandan CiZigZag'ın özel korunan özellikleri vardır:

protected:
   int               m_depth;
   int               m_deviation;
   int               m_backstep;

Daha sonra, CiZigZag türünde belirli bir nesne dışından yukarıda tanımlanan korunan özelliklere erişim sağlamak için CiZigZag genel arayüzü vardır:

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);   }

Bu, nesnelerin izole edilmesi için bir güvenlik önlemidir. Bu kapsülleme, nesne verilerine erişim izin olmayan biri veya bir şey tarafından gerçekleştirilen keyfi değişikliklere karşı koruma sağlar.


3.2. ZigZag Verilerine Erişim Sağlama

Bu makalenin birinci kısmında görüldüğü gibi zigzag.mq5 adındaki kaynak kodu dosyası üç tampon oluşturur:

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

Nesne yönelimli kapsülleme aracılığıyla, CiZigZag yöntemleri ZigZag(const int index), High(const int index) ve Low(const int index), daha önce başlatma yönteminde oluşturulan gösterge tamponlarını döndürür. CIndicatorBuffer nesne yönelimli sarmalayıcının Include\Indicators\Indicator.mqh MQL5 sınıfında tanımlandığını belirtmek önemlidir. CIndicatorBuffer bu üç yöntemin temel parçasıdır. MQL5 API'ye zaten girmiş durumdayız!

Bir örnek olarak bu, CiZigZag'ın High (yüksek) tamponuna erişim kodudur:

//+------------------------------------------------------------------+
//| 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.
Polimorfizm, yöntem aşırı yüklemesi ve sanal fonksiyonlar

Bir önceki bölümde, nesne yönelimli programlamanın en önemli özelliklerinden biri olan kapsülleme konusunu kısaca tartışmıştık. Include\Indicators\Indicator.mqh ve Include\Indicators\Custom\Trend.mqh dosyasında içerilen sınıflar OOP paradigmasının diğer iki yönü polimorfizm ve yöntem aşırı yüklemesi ile ilgilenir.

Polimorfizm, aynı arayüz aracılığıyla çeşitli yöntemler yelpazesine erişim sağlama yeteneğine sahiptir. Bu şekilde, belirli bir tanımlayıcı, bulunduğu bağlama göre çeşitli biçimler alabilir. Polimorfizm, uygulanabilmesi için devralma mekanizması gerektirir. Diğer yandan, yöntem aşırı yüklemesi, aynı adı paylaşan, ancak farklı parametre bildirimlerine sahip birkaç yöntemin oluşturulmasına olanak sağlayan bir diğer OOP özelliğidir.

Bu çok kısa bir tanıtımdır. Bu makalede, bu konuları tartışmak için yeterli alan yok, bu yüzden bunların incelenmesi size alıştırma olarak bırakılmıştır. Lütfen Polimorfizm ve Aşırı Yükleme MQL5 bölümlerini okuyun. Her durumda, Standart Kitaplığın bütün OOP özelliklerini uyguladığını görüyoruz; bunun sonucunda bunları ne kadar iyi tanırsak API'yi ihtiyaçlarımıza uyacak şekilde o kadar iyi genişletebiliriz.

Bütün bunlar anlatıldığına göre, belirtilmesi gereken bir şey daha var. MQL5, polimorfizmi, Sanal Fonksiyonlar olarak adlandırılan bir mekanizma ile uygular. Bir kez daha, bunun nasıl çalıştığını anlamak için lütfen Sanal Fonksiyonlar MQL5 bölümünü okuyun.

Bu nedenle CiZigZag başlatma yöntemini şu şekilde kodluyoruz:

//+------------------------------------------------------------------+
//| 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. Standart Kitaplıkta halihazırda mevcut olan yeni OO ZigZag'ı test etme

OO geliştirmelerinizde tarafınızdan geliştirilen uzantıları kullanmadan önce, tabi ki beklendiği gibi çalıştıklarından emin olmalısınız. Yeni özel bileşenleriniz üzerinde kapsamlı bir test seti çalıştırmanız tavsiye edilir. Ancak, basitlik nedeniyle, biz şimdi ZigZag(const int index), High(const int index) ve Low(const int index) olmak üzere üç ana CiZigZag yönteminde basit bir test çalıştıracağız.

Bu üç yöntem ile hesaplanan değerleri her EA tikinde yazdıracağız ve daha sonra sahte prosedürel EA olan ExpertOriginalZigZag.ex5 tarafından oluşturulan çıktıyı sahte nesne yönelimli EA olan ExpertOOZigZag.ex5 tarafından oluşturulan çıktı ile karşılaştıracağız. Elde edilen her iki çıktı da aynı olduğunda, yeni uzantının uygun olduğu sonucuna varabiliriz, MQL5 API'sine entegre edilmiş OO ZigZag'ımızı süresiz olarak alabiliriz.

Şekil 4. ExpertOriginalZigZag.ex5 ile oluşturulan çıktıyı ExpertOOZigZag.ex5 ile oluşturulan çıktı ile karşılaştırıyoruz

Şekil 4. ExpertOriginalZigZag.ex5 ile oluşturulan çıktıyı ExpertOOZigZag.ex5 ile oluşturulan çıktı ile karşılaştırıyoruz

Bu yüzden, bu makalenin başında sunulan iki EA olan ExpertOriginalZigZag.ex5 ve ExpertOOZigZag.ex5'in her ikisini de aşağıdaki parametre ayarı ile Strateji Test Cihazında çalıştırıyoruz:

  • Sembol: EURUSD, H1
  • Tarih: Özel dönem, 2013.08.01 ila 2013.08.15
  • Yürütme: Normal, 1 Dakika OHLC
  • Para Yatırma: 10000 USD, 1:100
  • Optimizasyon: Hiçbiri

Her iki robot da aynı sonuçları yazdırdığından, CiZigZag'ımızın iyi uygulandığı sonucuna varıyoruz, bu yüzden bunu sonraki geliştirmelerimizde kullanabiliriz.

ExpertOriginalZigZag.ex5 ile oluşturulan günlük:

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 ile oluşturulan günlük:

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!..

Sonuç

MQL5 Standart Kitaplığı bir geliştirici olarak hayatınızı kolaylaştırır. Ancak, dünya genelindeki bütün geliştiricilerin tüm ihtiyaçlarını karşılayamaz, bu yüzden her zaman özel öğelerinizi oluşturmanızın gerekeceği bir nokta olacaktır. EA'larınız ve göstergeleriniz daha karmaşık hale geldikçe, bir çerçeve geliştirmede yer alan kavramlar konusunda ustalaşmak daha gerekli olacaktır. MQL5 Standart Kitaplığının genişletilmesi, uygulamalarınızın başarılı bir yaşam sürmesi için bir kalite garantisidir.

İlk olarak Code Base'den ZigZag göstergesini indirerek kod yeniden kullanımından faydalanmıştık. MetaTrader 5 Terminalimizde kullanılabilir hale geldikten sonra, yeni nesne yönelimli ZigZag göstergemize kafa yormaya başlamak için yukarıdan aşağıya yaklaşımı benimsedik. Bütün sisteme genel bir bakış attık ve ardından analize devam ettik. Geliştirmenin ilk aşamasında, prosedür tarzındaki ZigZag göstergesini kullanarak sahte bir EA'yı nesne yönelimli muadili ile karşılaştırdık.

ZigZag göstergesini MetaQuotes'un tasarım felsefesine göre tasarlanmış nesne yönelimli bir sınıfa sarmaladık, aynı yaklaşım Standart Kitaplığı oluşturmak için de uygulandı. Ve son olarak, bazı basit testler yaparak halihazırda MQL5 API'ye entegre edilmiş yeni CiZigZag sarmalayıcımızın iyi bir şekilde uygulandığı sonucuna vardık.


MetaQuotes Ltd tarafından İngilizceden çevrilmiştir.
Orijinal makale: https://www.mql5.com/en/articles/741

Ekli dosyalar |
expertoozigzag.mq5 (2.03 KB)
trend.mqh (6.34 KB)
zigzag.mq5 (9.34 KB)
MQL5 Tarif Defteri Uzman Danışmanın Belirlenen Kriterlere Göre Optimizasyon Sonuçlarını Kaydetme MQL5 Tarif Defteri Uzman Danışmanın Belirlenen Kriterlere Göre Optimizasyon Sonuçlarını Kaydetme
MQL5 programlamasına dair makaleler serisine devam ediyoruz. Bu sefer, Uzman Danışman parametre optimizasyonu sırasında her bir optimizasyon doğru geçişinin sonucunun nasıl elde edileceğini göreceğiz. Uygulama, harici parametrelerde belirtilen koşulların sağlanması durumunda ilgili geçiş değerlerinin bir dosyaya yazılmasını sağlayacak şekilde yapılacaktır. Test değerlerine ek olarak, bu sonuçlara neden olan parametreleri de kaydedeceğiz.
Teknik Göstergeler ve Sayısal Filtreler Teknik Göstergeler ve Sayısal Filtreler
Bu makalede, teknik göstergeler sayısal filtreler olarak ele alınmaktadır. Sayısal filtrelerin çalışma ilkeleri ve temel özellikleri açıklanmaktadır. Ayrıca, MetaTrader 5 terminalinde filtre çekirdeği almanın bazı pratik yolları ve "Bir Spektrum Analiz Cihazı Oluşturma" makalesinde önerilen hazır bir spektrum analiz cihazı ile entegrasyon ele alınmaktadır. Tipik sayısal filtrelerin darbe ve spektrum özellikleri örnek olarak kullanılmaktadır.
MQL5 Tarif Defteri MetaTrader 5 Alım Satım Olayları için Sesli Bildirimler MQL5 Tarif Defteri MetaTrader 5 Alım Satım Olayları için Sesli Bildirimler
Bu makalede, Uzman Danışmanın dosyasına ses dosyaları eklenmesi ve böylece alım satım olaylarına sesli bildirimler eklenmesi gibi konuları ele alacağız. Dosyaların eklenmesi, ses dosyalarının Uzman Danışman içine yerleştirileceği anlamına gelir. Bu nedenle, Uzman Danışmanın derlenmiş sürümünü (*.ex5) başka bir kullanıcıya sağlarken, ses dosyalarını da sağlamanız ve nereye kaydedilmeleri gerektiğini açıklamanız gerekmez.
Doğrusal Alım Satım Sistemlerinizi Güçlendirin Doğrusal Alım Satım Sistemlerinizi Güçlendirin
Bugünün makalesi, orta düzeyde MQL5 programcılarının, üstünü alma tekniğinin kolayca uygulanması ile doğrusal alım satım sistemlerinden nasıl daha fazla kâr elde edebileceğini gösterir. Bunun nedeni, elde edilen öz varlık eğrisi büyümesinin geometrik veya üstel olması ve bir parabol şeklini almasıdır. Özellikle, Ralph Vince tarafından geliştirilen Sabit Kesirli pozisyon boyutlandırmasının pratik bir MQL5 varyantını uygulayacağız.