MQL5 Standart Kitaplığını Genişletme ve Kodu Yeniden Kullanma
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
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
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.
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 ¶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. 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 ¶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. 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
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
- Ücretsiz ticaret uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz