EA'nın Modlarını Nesne Yönelimli Yaklaşım Kullanarak Programlama
Giriş
Bu makalede bir MQL5 EA'nın çalışabileceği programlama modlarını tartışacağız. Bu makalenin amacı, "her modun kendi yöntemiyle uygulandığı" fikrini açıklamaktır. Yazar bu yaklaşımın, bir EA gelişiminin farklı aşamalarında görevlerin daha verimli bir şekilde tamamlanmasına izin verdiğine inanmaktadır.
İlk olarak, bir EA gelişiminin hangi aşamalardan oluştuğunu ele alıyoruz. Ardından EA'nın çalışabileceği modlar ve yardımcı uygulamalar MetaTrader 5 adresinde araştırılır. Yukarıdaki fikri uygulamak için sınıf hiyerarşisinin geliştirilmesi bu makaleyi tamamlamaktadır.
1. Geliştirme Aşamaları
Bir alım satım robotunun (EA) geliştirilmesi çok yönlü bir süreçtir. Buradaki kilit bloklar, fikrin algoritmalaştırılması ve test edilmesidir. Açıkça, hem EA'nın alım satım mantığı hem de kod algoritması test edilir.
Bu sürecin aşamaları şema olarak aşağıdaki gibi gösterilebilir (Şekil 1).
Şek.1. EA geliştirme aşamaları ve uygulanması
Beşinci aşama "Algoritmik Alım Satım", ilgili geliştiricilerin, programcıların, analistlerin ve diğer uzmanların çalışmalarını sergiler. Bu genellikle tüm bu rollerin bir kişi tarafından yerine getirilmesiyle gerçekleşir. Bir yatırımcı-programcı olduğunu varsayalım.
Bu şema güncellenebilir ve genişletilebilir. Benim düşünceme göre, bir EA'nın geliştirilmesindeki en önemli noktaları göstermektedir. Bu şemanın döngüsel formasyonu, EA kodunun ömrü boyunca geliştirilmesine ve değiştirilmesine olanak tanır.
Unutulmamalıdır ki her aşama belirli araçlar, bilgi ve beceriler gerektirir.
Benim düşünceme göre, geliştirici aşağıdaki basit değişken matrisiyle karşılaşıyor (Şekil 2).
Şek.2. Varyant matrisi
Açıkçası, yalnızca yüksek kalite kod ile kazanan bir alım satım stratejisi uygulayan robot, onu beşinci aşama "Algoritmik Alım Satım İşlemlerine"ulaştırabilir.
2. MQL5'teki Expert Advisor Modları
MQL5 ortamı, EA ile farklı modlarda çalışmayı sağlar. Bunlardan 7 tane vardır. Her birini daha aşağıda ele alacağız.
Program dosya tipi açısından 2 grupta ayırt edilebilir:
- Kaynak kod dosyası ve yürütülebilir dosya gerektiren modlar;
- Yalnızca yürütülebilir dosya gerektiren modlar.
Hata ayıklama ve profil oluşturma modları ilk gruba aittir.
Mod sınıflandırmasının bir başka kriteri, bir EA'nın gerçek veya geçmişe dönük alıntılar akışında çalışmasıdır. Tüm test modları geçmiş alıntılarla bağlantılıdır.
6 mod programlama ile tanımlanır. Bir EA'nın standart (serbest) modda çalışıp çalışmadığıyla ilgili çıkarım, sonuçlar baz alınarak yapılabilir. Finansal piyasalarda çalışmak için kodlanmış hazır bir programın (*.ex5 uzantılı dosya) tam da bu modda çalışması gereklidir. Aynı zamanda hazır bir program, Strateji Test Cihazındaki diğer modların da kullanılmasını sağlar.
ENUM_MQL_MODE adlı MQL programının operasyonel modlarının bir listesini oluşturalım:
//+------------------------------------------------------------------+ //| MQL Mode | //+------------------------------------------------------------------+ enum ENUM_MQL_MODE { MQL_MODE_RELEASE=0, // Release MQL_MODE_DEBUG=1, // Debugging MQL_MODE_PROFILER=2, // Profiling MQL_MODE_TESTER=3, // Testing MQL_MODE_OPTIMIZATION=4, // Optimization MQL_MODE_VISUAL=5, // Visual testing MQL_MODE_FRAME=6, // Gathering frames };
Daha sonra, bir EA'nın çalıştığı mod türünü tanımak için bu gerekli olacaktır.
2.1. Mod Tanımlama ve Kontrol Etme İşlevi
Tüm modları yineleyecek ve günlükteki bilgileri yazdıracak basit bir işlev yazın.
//+------------------------------------------------------------------+ //| Checking all MQL modes | //+------------------------------------------------------------------+ void CheckMqlModes(void) { //--- if it is debug mode if(MQLInfoInteger(MQL_DEBUG)) Print("Debug mode: yes"); else Print("Debug mode: no"); //--- if it is code profiling mode if(MQLInfoInteger(MQL_PROFILER)) Print("Profile mode: yes"); else Print("Profile mode: no"); //--- if it is test mode if(MQLInfoInteger(MQL_TESTER)) Print("Tester mode: yes"); else Print("Tester mode: no"); //--- if it is optimization mode if(MQLInfoInteger(MQL_OPTIMIZATION)) Print("Optimization mode: yes"); else Print("Optimization mode: no"); //--- if it is visual test mode if(MQLInfoInteger(MQL_VISUAL_MODE)) Print("Visual mode: yes"); else Print("Visual mode: no"); //--- if it is frame gathering optimization result mode if(MQLInfoInteger(MQL_FRAME_MODE)) Print("Frame mode: yes"); else Print("Frame mode: no"); }
Bu fonksiyonun her modda çalışıp çalışmadığı kontrol edilecektir. OnInit() olay işleyicisinde çağrılabilir.
Test amacıyla, Test1_Modes_EA.mq5 adlı bir EA şablonu oluşturalım.
Giriş parametrelerinde EA çalışma modu belirleme seçeneği etkinleştirilir. Doğru modun adlandırıldığına emin olmak önemlidir, aksi takdirde bilgiler yanlış olacaktır. İşte olan buydu.
Serbest bırakma modu aşağıdadır.
CL 0 17:20:38.932 Test1_Modes_EA (EURUSD.e,H1) Current mode: MQL_MODE_RELEASE QD 0 17:20:38.932 Test1_Modes_EA (EURUSD.e,H1) Debug mode: no KM 0 17:20:38.932 Test1_Modes_EA (EURUSD.e,H1) Profile mode: no EK 0 17:20:38.932 Test1_Modes_EA (EURUSD.e,H1) Tester mode: no CS 0 17:20:38.932 Test1_Modes_EA (EURUSD.e,H1) Optimization mode: no RJ 0 17:20:38.932 Test1_Modes_EA (EURUSD.e,H1) Visual mode: no GL 0 17:20:38.932 Test1_Modes_EA (EURUSD.e,H1) Frame mode: no
Serbest bırakma modu için diğer tüm modların bayrakları sıfırlandı. Böylece işlev, ne hata ayıklama modu (Hata ayıklama modu: yok), ne de profil oluşturma modu (Profil modu: yok) vb. olmadığını tanımladı. Olumsuzlama yöntemini kullanarak, serbest bırakma modunda çalıştığımız sonucuna vardık.
Şimdi hata ayıklama modunun nasıl tanımlandığını göreceğiz.
HG 0 17:27:47.709 Test1_Modes_EA (EURUSD.e,H1) Current mode: MQL_MODE_DEBUG LD 0 17:27:47.710 Test1_Modes_EA (EURUSD.e,H1) Debug mode: yes RS 0 17:27:47.710 Test1_Modes_EA (EURUSD.e,H1) Profile mode: no HE 0 17:27:47.710 Test1_Modes_EA (EURUSD.e,H1) Tester mode: no NJ 0 17:27:47.710 Test1_Modes_EA (EURUSD.e,H1) Optimization mode: no KD 0 17:27:47.710 Test1_Modes_EA (EURUSD.e,H1) Visual mode: no RR 0 17:27:47.710 Test1_Modes_EA (EURUSD.e,H1) Frame mode: no
Hata ayıklama modu doğru bir şekilde tanındı.
Programlamayla ilgili her el kitapçığı, hata ayıklamayı arama ve kodda hata yerelleştirmesini kolaylaştıran bilgiler içerir. Ayrıca programın özelliklerini vurgulamaktadır. MQL5 ortamında hata ayıklama hakkında daha fazla ayrıntı "MQL5 Programlarında Hata Ayıklama" makalesinde bulunabilir.
Bu mod yaygın olarak alım satım fikrinin algoritmasını resmileştirme ve oluşturma aşamalarında kullanılır.
Programlamada hata ayıklama, ya IS_DEBUG_MODE makroları ya da MQL_DEBUG tanımlayıcısı ile MQLInfoInteger() işlevi kullanılarak etkinleştirilir.
Profilleme moduna geçiyoruz.
GS 0 17:30:53.879 Test1_Modes_EA (EURUSD.e,H1) Current mode: MQL_MODE_PROFILER OR 0 17:30:53.879 Test1_Modes_EA (EURUSD.e,H1) Debug mode: no GE 0 17:30:53.879 Test1_Modes_EA (EURUSD.e,H1) Profile mode: yes QM 0 17:30:53.879 Test1_Modes_EA (EURUSD.e,H1) Tester mode: no CE 0 17:30:53.879 Test1_Modes_EA (EURUSD.e,H1) Optimization mode: no FM 0 17:30:53.879 Test1_Modes_EA (EURUSD.e,H1) Visual mode: no GJ 0 17:30:53.879 Test1_Modes_EA (EURUSD.e,H1) Frame mode: no
İşlev, Profil içerdiğini doğru bir şekilde tahmin etti.
Bu modda programın ne kadar hızlı çalıştığı kontrol edilebilir. Profil oluşturucusu, zaman harcama hakkındaki bilgileri program bloklarına iletir. Bu enstrümanın algoritmanın darboğazlarına işaret etmesi gerekiyor. Onlardan kurtulmak her zaman mümkün değildir, ancak yine de bu bilgiler faydalı olabilir.
Profil oluşturma, IS_PROFILE_MODE makroları veya MQL_PROFILER tanımlayıcısı ile MQLInfoInteger() işlevi aracılığıyla etkinleştirilebilir.
Şimdi test moduna bir göz atalım. Bu bilgi, Strateji Test Cihazının "Günlük" sekmesinde görünecektir.
EG 0 17:35:25.397 Core 1 2014.11.03 00:00:00 Current mode: MQL_MODE_TESTER OS 0 17:35:25.397 Core 1 2014.11.03 00:00:00 Debug mode: no GJ 0 17:35:25.397 Core 1 2014.11.03 00:00:00 Profile mode: no ER 0 17:35:25.397 Core 1 2014.11.03 00:00:00 Tester mode: yes ED 0 17:35:25.397 Core 1 2014.11.03 00:00:00 Optimization mode: no NL 0 17:35:25.397 Core 1 2014.11.03 00:00:00 Visual mode: no EJ 0 17:35:25.397 Core 1 2014.11.03 00:00:00 Frame mode: no
Test modu doğru tanımlandı.
Bu, Strateji Test Cihazı açıldığında EA'nın varsayılan modudur.
Bu mod için makro yoktur ve bu nedenle MQL5'te bunu yalnızca MQL_TESTER tanımlayıcısıyla MQLInfoInteger() işlevi kullanarak belirleyebiliriz.
Şimdi optimizasyona geçiyoruz. Kayıtları olan günlük, temsilcinin klasöründe saklanacaktır. Benim durumumda yol şu şekildedir: %Program Files\MetaTrader5\tester\Agent-127.0.0.1-3000\logs
OH 0 17:48:14.010 Test1_Modes_EA (EURUSD.e,H1) 2014.11.03 00:00:00 Current mode: MQL_MODE_OPTIMIZATION KJ 0 17:48:14.010 Test1_Modes_EA (EURUSD.e,H1) 2014.11.03 00:00:00 Debug mode: no NO 0 17:48:14.010 Test1_Modes_EA (EURUSD.e,H1) 2014.11.03 00:00:00 Profile mode: no FI 0 17:48:14.010 Test1_Modes_EA (EURUSD.e,H1) 2014.11.03 00:00:00 Tester mode: yes KE 0 17:48:14.010 Test1_Modes_EA (EURUSD.e,H1) 2014.11.03 00:00:00 Optimization mode: yes LS 0 17:48:14.010 Test1_Modes_EA (EURUSD.e,H1) 2014.11.03 00:00:00 Visual mode: no QE 0 17:48:14.010 Test1_Modes_EA (EURUSD.e,H1) 2014.11.03 00:00:00 Frame mode: no
Optimizasyon modu etkinse, varsayılan olarak test modu etkindir.
"Ayarlar" sekmesinde "Optimizasyon" alanı devre dışı bırakılmamışsa, Strateji Test Cihazında optimizasyon modu aktiftir.
EA'nın MQL5'te optimizasyon modunda test edilip edilmediğini öğrenmek için, MQL_OPTIMIZATION tanımlayıcısıyla MQLInfoInteger() işlevi isteyin.
Görselleştirme moduna geçiyoruz.
JQ 0 17:53:51.485 Test1_Modes_EA (EURUSD.e,H1) 2014.11.03 00:00:00 Current mode: MQL_MODE_VISUAL JK 0 17:53:51.485 Test1_Modes_EA (EURUSD.e,H1) 2014.11.03 00:00:00 Debug mode: no KF 0 17:53:51.485 Test1_Modes_EA (EURUSD.e,H1) 2014.11.03 00:00:00 Profile mode: no CP 0 17:53:51.485 Test1_Modes_EA (EURUSD.e,H1) 2014.11.03 00:00:00 Tester mode: yes HJ 0 17:53:51.485 Test1_Modes_EA (EURUSD.e,H1) 2014.11.03 00:00:00 Optimization mode: no LK 0 17:53:51.485 Test1_Modes_EA (EURUSD.e,H1) 2014.11.03 00:00:00 Visual mode: yes KS 0 17:53:51.485 Test1_Modes_EA (EURUSD.e,H1) 2014.11.03 00:00:00 Frame mode: no
Burada görsel test modunun ve standart test modunun dahil olduğunu görebiliriz.
"Ayarlar" sekmesindeki "Görselleştirme" alanına bayrak eklendiyse, EA Strateji Test Cihazında bu modda çalışır.
MQL5 programının görsel test modunda test edilme olgusunun saptanması, MQL_VISUAL_MODE tanımlayıcısı ile MQLInfoInteger() işlevi kullanılarak yapılabilir.
Son mod, çerçeve modunun işlenmesidir.
HI 0 17:59:10.177 Test1_Modes_EA (EURUSD.e,H1) 2014.11.03 00:00:00 Current mode: MQL_MODE_FRAME GR 0 17:59:10.177 Test1_Modes_EA (EURUSD.e,H1) 2014.11.03 00:00:00 Debug mode: no JR 0 17:59:10.177 Test1_Modes_EA (EURUSD.e,H1) 2014.11.03 00:00:00 Profile mode: no JG 0 17:59:10.177 Test1_Modes_EA (EURUSD.e,H1) 2014.11.03 00:00:00 Tester mode: yes GM 0 17:59:10.177 Test1_Modes_EA (EURUSD.e,H1) 2014.11.03 00:00:00 Optimization mode: yes HR 0 17:59:10.177 Test1_Modes_EA (EURUSD.e,H1) 2014.11.03 00:00:00 Visual mode: no MI 0 17:59:10.177 Test1_Modes_EA (EURUSD.e,H1) 2014.11.03 00:00:00 Frame mode: no
İlginç bir şekilde işlev, test ve optimizasyon modlarını yalnızca çerçevelerin bayrağı sıfırlandığında tanır. İşlev çağrısı OnTesterInit() işleyicisine aktarılırsa, "Experts" günlüğü aşağıdaki girişleri içerecektir:
IO 0 18:04:27.663 Test1_Modes_EA (EURUSD.e,H1) Current mode: MQL_MODE_FRAME GE 0 18:04:27.663 Test1_Modes_EA (EURUSD.e,H1) Debug mode: no ML 0 18:04:27.663 Test1_Modes_EA (EURUSD.e,H1) Profile mode: no CJ 0 18:04:27.663 Test1_Modes_EA (EURUSD.e,H1) Tester mode: no QR 0 18:04:27.663 Test1_Modes_EA (EURUSD.e,H1) Optimization mode: no PL 0 18:04:27.663 Test1_Modes_EA (EURUSD.e,H1) Visual mode: no GS 0 18:04:27.663 Test1_Modes_EA (EURUSD.e,H1) Frame mode: yes
Etkili olarak, artık yalnızca çerçeve toplama modu algılandı.
Bu mod Strateji Test Cihazında, "Ayarlar" sekmesindeki "Optimizasyon" alanı devre dışı bırakılmamışsa kullanılır. Deneyimin gösterdiği gibi, bu mod OnTesterInit(), OnTesterPass() ve OnTesterDeinit() işleyicilerinin gövdesinde tanımlanır.
MQL_FRAME_MODE tanımlayıcılı MQLInfoInteger() işlevi, EA test edilme olgusunun çerçeve toplama modunda tanımlanmasını kolaylaştırabilir.
Aşağıda, EA'nın çalıştığı modu otomatik olarak belirten MqlMode() hizmet işlevinin kodu yer almaktadır.
//+------------------------------------------------------------------+ //| Identify the current MQL mode | //+------------------------------------------------------------------+ ENUM_MQL_MODE MqlMode(void) { ENUM_MQL_MODE curr_mode=WRONG_VALUE; //--- if it is debug mode if(MQLInfoInteger(MQL_DEBUG)) curr_mode=MQL_MODE_DEBUG; //--- if it is code profiling mode else if(MQLInfoInteger(MQL_PROFILER)) curr_mode=MQL_MODE_PROFILER; //--- if it is visual test mode else if(MQLInfoInteger(MQL_VISUAL_MODE)) curr_mode=MQL_MODE_VISUAL; //--- if it is optimization mode else if(MQLInfoInteger(MQL_OPTIMIZATION)) curr_mode=MQL_MODE_OPTIMIZATION; //--- if it is test mode else if(MQLInfoInteger(MQL_TESTER)) curr_mode=MQL_MODE_TESTER; //--- if it is frame gathering optimization result mode else if(MQLInfoInteger(MQL_FRAME_MODE)) curr_mode=MQL_MODE_FRAME; //--- if it is release mode else curr_mode=MQL_MODE_RELEASE; //--- return curr_mode; }
Optimizasyon ve görsel test modunda standart test tanımlandığı için, optimizasyon ve görselleştirme modundan sonraki standart test modu kontrol edilmelidir.
Test2_Modes_EA.mq5 EA'nın ikinci şablonundaki işlevin çalışmasına bakarsak, şablon başlatıldığında günlükte yeni bir girişin ortaya çıktığını görebiliriz. Mesela, profil oluşturma modu için aşağıdaki giriş yapılır:
HG 0 11:23:52.992 Test2_Modes_EA (EURUSD.e,H1) Current mode: MQL_MODE_PROFILER
Belirli bir moda karşılık gelen sınıf modelleri oluşturmak için MQL5 Expert çalışma modlarının ayrıntılarını tartıştık. Bunu makalenin bir sonraki bölümünde uygulayacağız.
3. Farklı Modlarda Çalışmak İçin Tasarlanan EA Şablonu
EA'nın geliştirme aşamalarını tekrar gözden geçirmeyi öneriyorum.
Algoritma aşamasında, programcı çoğunlukla hata ayıklama ve profil oluşturma yapar. Geçmişe dönük verileri test etmek için tüm Strateji Test Cihazı modlarını denerler. Son mod (serbest bırakma modu) çevrimiçi alım satımda kullanılır.
Bana göre EA, geliştirme ve test aşamaları gerekliliklerinin koduna yansıtılması anlamında çok yönlü olmalıdır.
Bu durumda ana algoritma korunacak ve onu takip eden EA, farklı modlarda farklı hareketlere sahip olacaktır. nesne yönelimli programlama araç kümesi, bu fikri uygulamak için mükemmel şekilde uygundur.
Şek.3. Farklı modlarda çalışmak üzere tasarlanmış EA için sınıf hiyerarşisi
Farklı modların uygulanmasıyla sınıf hiyerarşisi Şekil 3'te temsil edilmektedir.
Tüm genel şeyleri kapsayan temel CModeBase sınıfının iki doğrudan alt öğesi olacaktır: CModeRelease ve CModeTester sınıfları. Birincisi hata ayıklama sınıflarının ebeveyni olacaktır ve ikincisi, EA'nın geçmişe dönük veriler üzerinde test edilmesiyle bağlantılı sınıflar içindir.
Modlar bağlamında sınıf yöntemleri geliştirirken prosedürel ve modüler bir yaklaşımı birleştirme fikrini geliştirelim. Örnek olarak aşağıdaki alım satım mantığını ele alalım:
- Açık pozisyon yoksa bir sinyal ile açma;
- Açık pozisyon varsa sinyal ile kapatma;
- Açık pozisyon varsa Takip Eden Durdurma.
Alım satım sinyali, yeni bir çubuk göründüğünde standart gösterge MACD tarafından algılanır.
Ana çizgi yukarı doğru giderken ve MACD göstergesinin negatif bölgesindeki sinyali geçtiğinde bir satın alma sinyali ortaya çıkar (Şekil 4).
Şek.4. Satın alma sinyali
Ana çizgi aşağı doğru inerken ve göstergenin pozitif bölgesindeki sinyali geçtiğinde satış sinyali ortaya çıkar (Şekil 5).
Şek.5. Satış sinyali
Pozisyon, ya karşıt sinyal ortaya çıktığında ya da pozisyon desteği modunun etkinleştirilmesi durumunda yerleştirilen Zarar Durdurma tarafından kapatılır.
O halde CModeBase temel sınıfının tanımı aşağıdaki gibidir:
//+------------------------------------------------------------------+ //| Class CModeBase | //| Purpose: a base class for MQL-modes | //+------------------------------------------------------------------+ class CModeBase { //--- === Data members === --- private: //--- a macd object & values CiMACD m_macd_obj; double m_macd_main_vals[2]; double m_macd_sig_vals[2]; protected: long m_pos_id; bool m_is_new_bar; uint m_trailing_stop; uint m_trail_step; //--- trade objects CSymbolInfo m_symbol_info; CTrade m_trade; CPositionInfo m_pos_info; CDealInfo m_deal_info; //--- mql mode ENUM_MQL_MODE m_mql_mode; //--- a new bar object CisNewBar m_new_bar; //--- current tick signal flag bool m_is_curr_tick_signal; //--- close order type ENUM_ORDER_TYPE m_close_ord_type; //--- === Methods === --- public: //--- constructor/destructor void CModeBase(); void ~CModeBase(void){}; //--- initialization virtual bool Init(int _fast_ema,int slow_ema,int _sig,ENUM_APPLIED_PRICE _app_price); virtual void Deinit(void){}; //--- Modules virtual void Main(void){}; //--- Procedures virtual void Open(void){}; virtual void Close(void){}; virtual void Trail(void){}; //--- Service static ENUM_MQL_MODE CheckMqlMode(void); ENUM_MQL_MODE GetMqlMode(void); void SetMqlMode(const ENUM_MQL_MODE _mode); void SetTrailing(const uint _trailing,const uint _trail_step); protected: //--- Functions ENUM_ORDER_TYPE CheckOpenSignal(const ENUM_ORDER_TYPE _open_sig); ENUM_ORDER_TYPE CheckCloseSignal(const ENUM_ORDER_TYPE _close_sig); ENUM_ORDER_TYPE CheckTrailSignal(const ENUM_ORDER_TYPE _trail_sig,double &_sl_pr); //--- double GetMacdVal(const int _idx,const bool _is_main=true); private: //--- Macros bool RefreshIndicatorData(void); //--- Normalization double NormalPrice(double d); double NormalDbl(double d,int n=-1); double NormalSL(const ENUM_ORDER_TYPE _ord_type,double op,double pr, uint SL,double stop); double NormalTP(const ENUM_ORDER_TYPE _ord_type,double op,double pr, uint _TP,double stop); double NormalLot(const double _lot); };
Devrelan sınıflarda kullanılacağı sürece her şey bir temel sınıfa dahil edilebilir.
MACD verileri, özel üyeler tarafından temsil edildikleri için alt öğelerde kullanılamayacaktır.
Bu yöntemler arasında sanal olanlar da olduğuna dikkat edilmelidir: Main(), Open(), Close(), Trail(). Bunların uygulanması, büyük ölçüde EA'nın şu anda çalıştığı moda bağlı olacaktır. Bu yöntemler temel sınıf için yetersiz kalacaktır.
Ayrıca temel sınıf, tüm MQL modları için aynı işlem mantığına sahip yöntemleri içerir. Tüm sinyal yöntemleri bunlara aittir:
- CModeBase::CheckOpenSignal(),
- CModeBase::CheckCloseSignal(),
- CModeBase::CheckTrailSignal().
Unutulmamalıdır ki bu makale bütün MQL mod türleri için kod yazmayı hedeflememektedir. Standart ve görsel testler örnek teşkil edecektir.
3.1. Test Modu
Algoritma kodlanıp derlendikten sonra genellikle, stratejinin tasarlandığı gibi çalışıp çalışmadığını kontrol etmek için Strateji Test Cihazındaki geçmiş veriler üzerinde denerim.
Çoğu zaman sistemin alım satım sinyallerini ne kadar doğru uyguladığını kontrol etmek gerekir. Her durumda bu aşamada EA için temel amaç, piyasaya sürmek ve alım satım yapmaktır.
Düzenli test etme için CModeTester sınıfı aşağıdaki gibi uygulanabilir:
//+------------------------------------------------------------------+ //| Class CModeTester | //| Purpose: a class for the tester mode | //| Derives from class CModeBase. | //+------------------------------------------------------------------+ class CModeTester : public CModeBase { //--- === Methods === --- public: //--- constructor/destructor void CModeTester(void){}; void ~CModeTester(void){}; //--- Modules virtual void Main(void); //--- Procedures virtual void Open(void); virtual void Close(void); virtual void Trail(void); };
Ana modül şu şekilde uygulanır:
//+------------------------------------------------------------------+ //| Main module | //+------------------------------------------------------------------+ void CModeTester::Main(void) { //--- 1) closure this.Close(); //--- 2) opening this.Open(); //--- 3) trailing stop this.Trail(); }
Düzenli test etme modu için, Günlükte alım satım sinyalleri hakkında bilgi basılmasına fırsat oluşturun.
İşlem sinyalinin kaynağı olarak kabul edilen gösterge değerlerini içeren dizelerdize ekleyin.
Aşağıda, pozisyon açma sinyali, ardından da kapatma sinyali hakkında Günlükten alıntı bulunmaktadır.
HE 0 13:34:04.118 Core 1 2014.11.14 22:15:00 ---=== Signal to open: SELL===--- FI 0 13:34:04.118 Core 1 2014.11.14 22:15:00 A bar before the last one, main: 0.002117; signal: 0.002109 DL 0 13:34:04.118 Core 1 2014.11.14 22:15:00 The last bar, main: 0.002001; signal: 0.002118 LO 0 13:34:04.118 Core 1 2014.11.14 22:15:00 market sell 0.03 EURUSD.e (1.25242 / 1.25251 / 1.25242) KH 0 13:34:04.118 Core 1 2014.11.14 22:15:00 deal #660 sell 0.03 EURUSD.e at 1.25242 done (based on order #660) GE 0 13:34:04.118 Core 1 2014.11.14 22:15:00 deal performed [#660 sell 0.03 EURUSD.e at 1.25242] OD 0 13:34:04.118 Core 1 2014.11.14 22:15:00 order performed sell 0.03 at 1.25242 [#660 sell 0.03 EURUSD.e at 1.25242] IK 0 13:34:04.118 Core 1 2014.11.14 22:15:00 CTrade::OrderSend: market sell 0.03 EURUSD.e [done at 1.25242] IL 0 13:34:04.118 Core 1 2014.11.17 13:30:20 CJ 0 13:34:04.118 Core 1 2014.11.17 13:30:20 ---=== Signal to close: SELL===--- GN 0 13:34:04.118 Core 1 2014.11.17 13:30:20 A bar before the last one, main: -0.001218; signal: -0.001148 QL 0 13:34:04.118 Core 1 2014.11.17 13:30:20 The last bar, main: -0.001123; signal: -0.001189 EP 0 13:34:04.118 Core 1 2014.11.17 13:30:20 market buy 0.03 EURUSD.e (1.25039 / 1.25047 / 1.25039) FG 0 13:34:04.118 Core 1 2014.11.17 13:30:20 deal #661 buy 0.03 EURUSD.e at 1.25047 done (based on order #661) OJ 0 13:34:04.118 Core 1 2014.11.17 13:30:20 deal performed [#661 buy 0.03 EURUSD.e at 1.25047] PD 0 13:34:04.118 Core 1 2014.11.17 13:30:20 order performed buy 0.03 at 1.25047 [#661 buy 0.03 EURUSD.e at 1.25047] HE 0 13:34:04.118 Core 1 2014.11.17 13:30:20 CTrade::OrderSend: market buy 0.03 EURUSD.e [done at 1.25047]
Lütfen Strateji Test Cihazında tanıdık bir "Experts" günlüğü olmadığını unutmayın. Test ve optimizasyon sırasında Strateji Test Cihazı tarafından gerçekleştirilen eylemlerle ilgili kayıtları içeren tüm bilgiler "Günlük" sekmesinde bulunabilir.
Bu nedenle, gerekli dizeleri aramak gerekir. Giriş bilgilerinin ayırılması gerekli ise dosyaya kaydedilebilir.
Standart test stratejisi, TestMode_tester.mq5 EA kodunda uygulanır.
3.2. Görsel Test Modu
Bazen canlı bir grafiğe başvurmak ve bir EA'nın mevcut durumu nasıl ele aldığını görmek gerekli olur.
Basit görselleştirme yalnızca alım satım sisteminin tick'lere nasıl tepki verdiğini görmekle kalmaz, aynı zamanda test sonunda benzer fiyat modellerini karşılaştırma olanağı da sağlar.
Görsel test için CModeVisual sınıfının tanımı aşağıdaki gibi olabilir:
//+------------------------------------------------------------------+ //| Class CModeVisual | //| Purpose: a class for the tester mode | //| Derived from class CModeBase. | //+------------------------------------------------------------------+ class CModeVisual : public CModeTester { //--- === Data members === --- private: CArrayObj m_objects_arr; double m_subwindow_max; double m_subwindow_min; //--- === Methods === --- public: //--- constructor/destructor void CModeVisual(void); void ~CModeVisual(void); //--- Procedures virtual void Open(void); virtual void Close(void); private: bool CreateSignalLine(const bool _is_open_sig,const bool _is_new_bar=true); bool CreateRectangle(const ENUM_ORDER_TYPE _signal); void RefreshRectangles(void); };
Sınıf gizli üyeler içerir. m_objects_arr sınıfının üyesi, CArrayObj türünde dinamik dizi uygular. Çizgi ve dikdörtgen gibi grafik nesneler buraya aittir. Diğer iki sınıf üyesi olan (m_subwindow_max, m_subwindow_min) göstergenin alt penceresinin maksimum ve minimum boyutlarını kontrol eder.
Özel yöntemler, grafik nesnelerle çalışmak için sorumludur.
Bu sınıf, Main() ve Trail() yöntemlerini içermez. Ana analoglar CModeTester::Main() ve CModeTester::Trail() sırasıyla çağrılacaktır.
Grafik nesneler görsel test etme modunda oluşturulabilir. Bu, Strateji Test Cihazının diğer modlarında yapılamaz.
Grafikte giriş sinyali ortaya çıktığında, kırmızı dikey ve çıkış sinyali alındığında mavi bir dikey çizilir. Giriş ve çıkış noktaları arasındaki boşluğu, göstergenin alt penceresine uygun renkte bir dikdörtgenle doldurun.
Uzun bir pozisyon ise, dikdörtgen açık mavi olur. Kısa pozisyon ise, dikdörtgen pembe olur (Şekil 6).
Şek.6. Görsel test etme modundaki grafik nesneler
Dikdörtgenin yüksekliği, grafik alt penceresinin oluşturma sırasındaki maksimum ve minimum değerlerine bağlıdır. Tüm dikdörtgenleri boyut olarak eşit yapmak için, grafik alt penceresinin koordinatlarının değişmesi durumundaki kod için değişen bir dikdörtgen koordinatları bloğu eklenmelidir.
Dolayısıyla MACD göstergesinin alt penceresinde şu alanları alıyoruz: renklendirilmemiş (pozisyon yok), pembe (kısa pozisyon), açık mavi (uzun pozisyon).
Görsel test etme modu stratejisi, TestMode_visual_tester.mq5 EA kodunda uygulanır.
Sonuç
Bu makalede MetaTrader 5 terminali ve MQL5 dilinin mod imkanlarını göstermeye çalıştım. Alım satım algoritmasının programlanmasına yönelik çoklu modlu bir yaklaşımın bir yandan daha fazla maliyet içerdiği ve diğer yandan her bir geliştirme aşamasını birbiri ardına değerlendirme fırsatının olduğu söylenmelidir. Bu durumda nesne yönelimli programlama bir programcı için her işi beceren bir yardımcıdır.
Optimizasyon ve çerçeve toplama modları, gelecekteki alım satım sisteminin istatistik özellikleriyle ilgili makalelerde vurgulanacaktır.
MetaQuotes Ltd tarafından Rusçadan çevrilmiştir.
Orijinal makale: https://www.mql5.com/ru/articles/1246
- Ü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