Çok para birimli Uzman Danışmanların test sonuçları

 

Çok para birimli Expert Advisor'ların yapımıyla ilgili makaleleri okuduktan, sorular sorduktan ve topluluğun "büyük adamlarından" cevaplar aldıktan sonra, şu soru benim için kalıyor: "Uzman Danışman, test sonuçları doğru olacak şekilde nasıl kodlanır? ". Konunun amacı sadece bu konuya açıklık getirmektir.

Topluluk üyeleri tarafından önerilen üç farklı yöntem üzerinde testler yapıldı.

·          OnTick() .

·          OnChartEvent() . Bu yöntem Konstantin Gruzdev tarafından " MetaTrader 5'te Çoklu Para Birimi Modunun Uygulanması " makalesinde önerildi.

·          OnTimer() .

Nikolai Kositsin'den " Farklı Enstrümanlar Üzerinde İşlem Yapan Bir Uzman Danışman Yaratmak " başlıklı makalesinde ayrıntılı olarak anlattığı çok para birimli bir Uzman Danışmanın yapı şemasını ödünç aldım.

 

Test için basit bir Uzman Danışman yazdım, çünkü amaç test sonuçlarını karşılaştırmak. “Kıyaslama” EURUSD günlük grafiğinin sonucu olacaktır. 2000 yılından itibaren. Daha sonra aynı parametrelere sahip bu sonuç GBPUSD grafiğinden elde edilen sonuç ile karşılaştırılacaktır. Prensip olarak, testlerde yalnızca bir cihaz yer alır, ancak test için hangi cihazın kullanıldığına bakılmaksızın aynı sonuçların elde edilmesi gerekir.

OnTick ()

 int OnInit ()
{
 return ( 0 );
}

void OnDeinit ()
{
}

void OnTick ()
{  
 // Объявление массивов переменных для торговых сигналов
 static datetime New_Bar[ 1 ];  
 static bool UpSignal[ 1 ], DnSignal[ 1 ];
   
 // Получение торговых сигналов
 TradeSignalCounter( 0 ,Symbol_01,Trade_01,Timeframe_01,UpSignal,DnSignal,New_Bar);

 // Совершение торговых операций
 TradePerformer( 0 ,Symbol_01,Trade_01,Timeframe_01,Stop_Loss_01,Take_Profit_01,Slippage_01,UpSignal,DnSignal,New_Bar);
}

EURUSD enstrümanında test edin   EURUSD grafiğinden:

Etiket: 01_ tik

EURUSD enstrümanında test edin   GBPUSD grafiğinden:

Etiket: 0 2 _ tik

Test sonuçları tutarsız.

OnChartEvent ()

 enum ENUM_CHART_EVENT_SYMBOL
  {
   CHARTEVENT_NO        = 0 ,           // События отключены
   CHARTEVENT_INIT      = 0 ,           // Событие "инициализация" 
   
   CHARTEVENT_NEWBAR_M1 = 0x00000001 , // Событие "новый бар" на 1 -минутном графике
   CHARTEVENT_NEWBAR_M2 = 0x00000002 , // Событие "новый бар" на 2 -минутном графике
   CHARTEVENT_NEWBAR_M3 = 0x00000004 , // Событие "новый бар" на 3 -минутном графике
   CHARTEVENT_NEWBAR_M4 = 0x00000008 , // Событие "новый бар" на 4 -минутном графике
   
   CHARTEVENT_NEWBAR_M5 = 0x00000010 , // Событие "новый бар" на 5 -минутном графике
   CHARTEVENT_NEWBAR_M6 = 0x00000020 , // Событие "новый бар" на 6 -минутном графике
   CHARTEVENT_NEWBAR_M10= 0x00000040 , // Событие "новый бар" на 10-минутном графике
   CHARTEVENT_NEWBAR_M12= 0x00000080 , // Событие "новый бар" на 12-минутном графике
   
   CHARTEVENT_NEWBAR_M15= 0x00000100 , // Событие "новый бар" на 15-минутном графике
   CHARTEVENT_NEWBAR_M20= 0x00000200 , // Событие "новый бар" на 20-минутном графике
   CHARTEVENT_NEWBAR_M30= 0x00000400 , // Событие "новый бар" на 30-минутном графике
   CHARTEVENT_NEWBAR_H1 = 0x00000800 , // Событие "новый бар" на 1 -часовом графике
   
   CHARTEVENT_NEWBAR_H2 = 0x00001000 , // Событие "новый бар" на 2 -часовом графике
   CHARTEVENT_NEWBAR_H3 = 0x00002000 , // Событие "новый бар" на 3 -часовом графике
   CHARTEVENT_NEWBAR_H4 = 0x00004000 , // Событие "новый бар" на 4 -часовом графике
   CHARTEVENT_NEWBAR_H6 = 0x00008000 , // Событие "новый бар" на 6 -часовом графике
   
   CHARTEVENT_NEWBAR_H8 = 0x00010000 , // Событие "новый бар" на 8 -часовом графике
   CHARTEVENT_NEWBAR_H12= 0x00020000 , // Событие "новый бар" на 12-часовом графике
   CHARTEVENT_NEWBAR_D1 = 0x00040000 , // Событие "новый бар" на дневном графике
   CHARTEVENT_NEWBAR_W1 = 0x00080000 , // Событие "новый бар" на недельном графике
     
   CHARTEVENT_NEWBAR_MN1= 0x00100000 , // Событие "новый бар" на месячном графике   
   CHARTEVENT_TICK      = 0x00200000 , // Событие "новый тик"
   
   CHARTEVENT_ALL       = 0xFFFFFFFF , // Все события включены
  };

...

int OnInit ()
{
 if ( iCustom ( "EURUSD" , PERIOD_D1 , "Spy Control panel MCM" , ChartID (), 0 ,CHARTEVENT_TICK) == INVALID_HANDLE )
   { Print ( "Ошибка установки шпиона на EURUSD" ); return ( true );}
   
 if ( iCustom ( "GBPUSD" , PERIOD_D1 , "Spy Control panel MCM" , ChartID (), 1 ,CHARTEVENT_TICK) == INVALID_HANDLE )
   { Print ( "Ошибка установки шпиона на GBPUSD" ); return ( true );}
}

void OnDeinit ()
{
}

void OnChartEvent ( const int id,         // идентификатор события
                   const long &   lparam, // флаг события поступившего от агента панели.
                                         // Флаги соответствуют перечислению ENUM_CHART_EVENT_SYMBOL.
                   const double & dparam, // цена
                   const string & sparam   // инструмент 
                 )
{
 if (id >= CHARTEVENT_CUSTOM )      
   {
     // Объявление массивов переменных для торговых сигналов
     static datetime New_Bar[ 1 ];  
     static bool UpSignal[ 1 ], DnSignal[ 1 ];
      
     // Получение торговых сигналов
    TradeSignalCounter( 0 ,Symbol_01,Trade_01,Timeframe_01,UpSignal,DnSignal,New_Bar);
   
     // Совершение торговых операций
    TradePerformer( 0 ,Symbol_01,Trade_01,Timeframe_01,Stop_Loss_01,Take_Profit_01,Slippage_01,UpSignal,DnSignal,New_Bar);
   }
}

EURUSD enstrümanında test edin   EURUSD grafiğinden:

Etiket: 0 1 _ event == 01_tick

Sonuç, 01_tick olarak işaretlenenle aynıdır.

 

EURUSD enstrümanında test edin   GBPUSD grafiğinden:

Etiket: 0 2 _ event ~= 02_tick

Test sonuçları tutarsız.

Açık Zamanlayıcı ()

 int OnInit ()
{
 EventSetTimer ( 10 );

 return ( 0 );
}

void OnDeinit ()
{
 EventKillTimer ();
}

void OnTimer ()
{
 // Объявление массивов переменных для торговых сигналов
 static datetime New_Bar[ 1 ];  
 static bool UpSignal[ 1 ], DnSignal[ 1 ];
   
 // Получение торговых сигналов
 TradeSignalCounter( 0 ,Symbol_01,Trade_01,Timeframe_01,UpSignal,DnSignal,New_Bar);

 // Совершение торговых операций
 TradePerformer( 0 ,Symbol_01,Trade_01,Timeframe_01,Stop_Loss_01,Take_Profit_01,Slippage_01,UpSignal,DnSignal,New_Bar);
}

Zamanlayıcı 10 saniyelik aralıklarla ayarlanır.

EURUSD enstrümanında test edin   EURUSD grafiğinden:

Etiket : 01_time == 01_tick   &&   01_time == 01_event

EURUSD enstrümanında test edin   GBPUSD grafiğinden:

Etiket : 02_time == 01_tick   &&   02_time == 01_event

Test sonuçları aynıdır. Sadece bir yerde küçük bir yanlışlık gördüm. Ayrıca zamanlayıcıdaki aralık ne kadar küçük olursa sonucun o kadar doğru olduğunu fark ettim. Yani test günlük çubuklarda yapılsa ve test cihazındaki aralık örneğin 1 saate ayarlansa bile test 10 saniyeden çok daha hızlı çalışır, ancak test sonuçları eşleşmeyecektir.

------

Pekala, hepsi bu. Herkesin fikri ilginç ve çözüm yöntemleri daha da ilginç.)))


 

Bence bu seçenekleri ayrı ayrı karşılaştırmak doğru değil.

Şahsen ben çizgi filmdeki zamanlayıcının zorunlu olması gerektiğini ve ona ne ekleneceği (keneler veya olaylar) ayrı bir konu olduğu görüşündeyim.

Fikire göre, mevcut tüm işleyiciler karikatüre dahil edilmelidir, tek soru onların doldurulması ve genel çalışma algoritmasının uygulanmasıdır.

 
tol64 :

"Test sonuçları doğru olacak şekilde Expert Advisor kodu nasıl yazılır?".

İlk başta soruyu anlamadı. "Doğru" test puanları ne anlama gelir ve neden bu puanlara ulaşılmalıdır?
 
Interesting :

Bence bu seçenekleri ayrı ayrı karşılaştırmak doğru değil.

Şahsen ben çizgi filmdeki zamanlayıcının zorunlu olması gerektiğini ve ona ne ekleneceği (keneler veya olaylar) ayrı bir konu olduğu görüşündeyim.

Fikire göre, mevcut tüm işleyiciler karikatüre dahil edilmelidir, tek soru onların doldurulması ve genel çalışma algoritmasının uygulanmasıdır.


Bu seçenekleri karşılaştırmak neden yanlıştır? Yukarıdaki basit Uzman Danışman çerçevesinde, istenen sembol ve istenen TF üzerinde çubuk oluşturulduktan sonra karar verildiğinde, bence oldukça doğrudur.

Aynı tikler için mevcut durumu analiz etmek için daha karmaşık bir algoritma eklersek, daha sonra bahsettiğiniz gibi yanlış olur. Ama ben sadece şekillendirilmiş çubuklarla ilgileniyorum.

 
Yedelkin :
İlk başta soruyu anlamadı. "Doğru" test puanları ne anlama gelir ve neden bu puanlara ulaşılmalıdır?

Yani doğru olanlar. Hangi sembolü test edersek edelim, sonuçlar aynı olmalıdır. Bu durumda, yalnızca OnTimer () işlevi kullanıldığında aynı sonuç elde edildi.

Konstantin Gruzdev'in yöntemiyle çok ilgileniyorum. Belki yanlış bir şey yapıyorum, bu yüzden doğru (güvenilir) sonuçlara ulaşmak işe yaramadı. Bu konudaki yorumlarını da merakla bekliyorum.

 
tol64 :

Bu seçenekleri karşılaştırmak neden yanlıştır? Yukarıdaki basit Uzman Danışman çerçevesinde, istenen sembol ve istenen TF üzerinde çubuk oluşturulduktan sonra karar verildiğinde, bence oldukça doğrudur.

Aynı tikler için mevcut durumu analiz etmek için daha karmaşık bir algoritma eklersek, daha sonra bahsettiğiniz gibi yanlış olur. Ama ben sadece şekillendirilmiş çubuklarla ilgileniyorum.

Teorik olarak doğru tartışmıyorum, ancak pratikte birçok soru ortaya çıkıyor.

Örneğin, bu - Sunucuyla bağlantı kesilirken kene işleyicisinde uygulama. Sistem nasıl çalışacak ve bir şeyin plana göre gitmediğini nasıl belirleyecek?

Yalnızca bir zamanlayıcıda uygulama - Az çok kabul edilebilir bir seçenek, ancak burada dönemin seçiminde makul bir uzlaşmaya ihtiyaç var (ancak o zaman bile bazı zorluklar ortaya çıkacak).

Olaylar - Kendi başlarına da çok etkili değildir. Genel olarak konuşursak, işaretlerin ve olayların işlenmesi, kaynakları en verimli şekilde kullanacak ve EA'nın yeni bir veri parçasını hızlı bir şekilde işlemesine izin verecek şekilde uygulanmalıdır.

Yedelkin :
İlk başta soruyu anlamadı. "Doğru" test puanları ne anlama gelir ve neden bu puanlara ulaşılmalıdır?

Ayrıca %100 özdeş sonuçların elde edilmemesi gerektiğine inanıyorum. Ayrıca, karikatürün olanaklarını yalnızca BİR sembol üzerinde işlem yaparak sınırlamak gariptir.

En azından iki sembolün değiş tokuş edilip edilmediğini varsayalım (bunlardan biri muhtemelen bir grafik sembolü olabilir).

 
tol64 :

Yani doğru olanlar. Hangi sembolü test edersek edelim, sonuçlar aynı olmalıdır.

İnanın bana, %100 kimliksizlik arayışı, kendini kandırma ve bir yanılsamadır. Sürekli çalışan GRAIL ile aynı yanılsama. Her zaman belirli bir hatayı/kimliksizliği hesaba katmak gerekir.

Evet ve bu formda karikatürü test etmek çok açıklayıcı değil. Karikatürler hakkında konuşmak, yalnızca birkaç sembolle işlem yapma veya bir sembol üzerinde birkaç stratejiyle işlem yapma bağlamında yapılmalıdır.

Burada sonuçların BASİT kimliğinin karikatürde önemli olmadığını, ancak uzmanın mevcut pozisyonları ve geçmişi dikkate alarak alım satım kararları vermesine izin veren mekanizmaların önemli olduğu gerçeğini tanıtacağım.

Örneğin, iki sembol EURUSD ve GBPUSD ile işlem yapmayı deneyin, ticaret ise ikinci sembol için riskten korunma ve sinyaller kullanılarak yapılmalıdır.

 
Interesting :

İnanın bana, %100 kimliksizlik arayışı kendini kandırma ve bir yanılsamadır. Sürekli çalışan GRAIL ile aynı yanılsama. Her zaman belirli bir hatayı/kimliksizliği hesaba katmak gerekir.

Evet ve bu formda karikatürü test etmek çok açıklayıcı değil. Karikatürler hakkında konuşmak, yalnızca birkaç sembolle işlem yapma veya bir sembol üzerinde birkaç stratejiyle işlem yapma bağlamında yapılmalıdır.

Burada sonuçların BASİT kimliğinin karikatürde önemli olmadığını, ancak uzmanın mevcut pozisyonları ve geçmişi dikkate alarak alım satım kararları vermesine izin veren mekanizmaların önemli olduğu gerçeğini tanıtacağım.

Örneğin, iki sembol EURUSD ve GBPUSD ile işlem yapmayı deneyin, ticaret ise ikinci sembol için riskten korunma ve sinyaller kullanılarak yapılmalıdır.

Artık bir Uzman Danışmanın nasıl çalışması gerektiğine dair büyük resme bakıyorsunuz. Gerçek ticaret için programın uygulanmasının tüm zorluklarını ve teknik inceliklerini bir kenara bırakalım. Bu konudaki soru "kenar" dır.

1. Basit ticaret sistemi. Oluşturulan çubuklarla.

2. Bir karakter üzerinde, ancak başka bir karakter üzerinde test edin.

Yapıyı kasıtlı olarak minimuma indirdim. Bu, test sonuçlarını analiz etmeyi kolaylaştırmak içindir. En azından tüm sembolleri test edebilirsiniz, sonuçlar bundan aynı olmayacaktır. Sökülmesi daha zor ve daha uzun olacak olan yulaf lapası ortaya çıkacak. EA, tam olarak üzerinde bulunduğu sembol üzerindeki eylemleri gösterecek, ancak geri kalan her şeyde bir karışıklık olacak, sunulan sonuçların gösterdiği şey bu. Test sonuçları aynı olmalıdır, aksi takdirde bir sembol üzerinde olan Expert Advisor'ın doğru eylemleri gerçekleştirdiği, ancak diğerlerinde yapmadığı veya tam olarak sisteme göre gerçekleştirmediği ortaya çıkar. Ve bu tutarsızlık oldukça dikkat çekicidir.

Kimlik, şu ana kadar yalnızca OnTimer () işlevi aracılığıyla elde edilmiştir.

PS GRAIL'e inanmıyorum. Daha doğrusu, diğerlerinden farklı anlıyorum.)))

 

OnTimer () işlevi aracılığıyla aynı anda beş karakterde sonuç:

Hangi sembol test edilirse edilsin sonuç her zaman aynıdır.

Ancak diğer yöntemler ( OnTick () ve OnChartEvent ()) kullanıldığında, Uzman Danışmanın bulunduğu sembol değişirse sonuçlar farklı olurdu. Ve bu sadece Expert Advisor'ın diğer semboller üzerinde yanlış eylemler gerçekleştirdiğini doğrular.

OnTick () ile bunun neden olduğu açıktır. Bu zaten birçok kez tartışıldı. Ancak OnChartEvent () yöntemi hala söz konusu olmaya devam ediyor.

 

tol64 :

OnTick () ile bunun neden olduğu açıktır. Bu zaten birçok kez tartışıldı. Ancak OnChartEvent () yöntemi hala söz konusu olmaya devam ediyor.

Olay işlemedeki olası gecikmeyi, hatta olayın olası KAYBI'nı da hesaba katmak gerekir.
Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
tol64 :

Yani doğru olanlar. Hangi sembolü test edersek edelim, sonuçlar aynı olmalıdır. Bu durumda, yalnızca OnTimer () işlevi kullanıldığında aynı sonuç elde edildi.

Neredeyse anlaşıldı. Aslında, çok para birimli Uzman Danışmanınızı üzerine kuracağınız bir "motor" seçmekten bahsediyorsunuz. Bunu yapmak için, bazı ilkel ticaret stratejisi alır ve önce "sinyal kaynağı ve sinyal işleyici aynı sembol üzerinde" şemasına göre, ardından "sinyal kaynağı ve sinyal işleyici - farklı semboller üzerinde" şemasına göre çalıştırırsınız. Doğru şekilde?

Eğer öyleyse, " EURUSD enstrümanında test edin" gibi ifadeleri gerçekten anlamadım.   GBPUSD tablosundan". Bu durumda hangi sembol bir sinyal kaynağı olarak hizmet eder ve hangi sembolün kendisine bağlı bir sinyal işleyicisi vardır?