English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
EA'nın Modlarını Nesne Yönelimli Yaklaşım Kullanarak Programlama

EA'nın Modlarını Nesne Yönelimli Yaklaşım Kullanarak Programlama

MetaTrader 5Örnekler | 14 Ocak 2022, 13:29
114 0
Denis Kirichenko
Denis Kirichenko

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ı

Ş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

Ş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:

  1. Kaynak kod dosyası ve yürütülebilir dosya gerektiren modlar;
  2. 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.2 Farklı modlarda çalışmak üzere tasarlanmış EA için sınıf hiyerarşisi

Ş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:

  1. Açık pozisyon yoksa bir sinyal ile açma;
  2. Açık pozisyon varsa sinyal ile kapatma;
  3. 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

Ş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

Ş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

Ş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

Ekli dosyalar |
cisnewbar.mqh (13.74 KB)
modes.mqh (62.77 KB)
test1_modes_ea.mq5 (9.43 KB)
test2_modes_ea.mq5 (10.01 KB)
Moskova Borsası Vadeli İşlemler Piyasası Örneği ile Değişim Fiyatlandırma Esasları Moskova Borsası Vadeli İşlemler Piyasası Örneği ile Değişim Fiyatlandırma Esasları
Bu makale, Moskova Borsası Vadeli İşlemler Piyasasının değişim fiyatlandırması teorisini ve takas özelliklerini açıklamaktadır. Bu, türev alım satım işlemlerinde ilk takas deneyimini edinmek isteyen yeni başlayanlar ve merkezi bir takas platformunda alım satım yapmayı düşünen deneyimli forex yatırımcıları için kapsamlı bir makaledir.
Yatırımcının İstatistiksel Yemek Kitabı: Hipotezler Yatırımcının İstatistiksel Yemek Kitabı: Hipotezler
Bu makale, matematiksel istatistiklerin temel fikirlerinden biri olan hipotezi ele almaktadır. Çeşitli hipotezler, matematiksel istatistik yöntemleri kullanılarak örneklerle incelenir ve doğrulanır. Gerçek veriler parametrik olmayan yöntemler kullanılarak genelleştirilir. Verileri işlemek için, Statistica paketi ve taşınan ALGLIB MQL5 sayısal analiz kitaplığı kullanılır.
MetaTrader 5'te HedgeTerminal Panelini Kullanarak İki Yönlü Alım Satım ve Pozisyonların Korunması, Bölüm 1 MetaTrader 5'te HedgeTerminal Panelini Kullanarak İki Yönlü Alım Satım ve Pozisyonların Korunması, Bölüm 1
Bu makale, pozisyonların korunmasına yönelik yeni bir yaklaşım açıklar ve MetaTrader 4 ile MetaTrader 5 kullanıcıları arasında gerçekleşen konu hakkındaki tartışmalarda çizgiyi çizer. Bu gibi korunmayı güvenilir kılan algoritmalar, herkesin anlayabileceği şekilde açıklanmış ve basit grafiklerle ve diyagramlarla gösterilmiştir. Bu makale esasen, MetaTrader 5 içinde tam özellikli yeni bir alım satım terminali olan panel HedgeTerminal'e ayrılmıştır. HedgeTerminal'in ve sunduğu alım satım işleminin sanallaştırılması kullanılarak, pozisyonlar MetaTrader 4'e benzer şekilde yönetilebilir.
MQL5 Programlama Temelleri: Terminalin Global Değişkenleri MQL5 Programlama Temelleri: Terminalin Global Değişkenleri
Bu makale, terminal global değişkenleriyle çalışmayı kolaylaştıran nesneler oluşturmak için MQL5 dilinin nesne yönelimli imkanlarını vurgulamaktadır. Pratik bir örnek olarak, genel değişkenlerin program aşamalarının uygulanması için kontrol noktaları olarak kullanıldığı bir durumu ele alıyorum.