MetaTrader 5 Strateji Test Cihazında Test Sonuçlarının Analizi ve Optimizasyon - sayfa 2

 
Anatoli Kazharski :

Uzun parametre (lparam) kontrol edilir. Kene olay kimliği içinde bulunur.

Kullanıcı olay kimliği (int kimliği) sıfırdır.

Daha açık hale getirmek için şu şekilde yapabilirsiniz:

Doğru çalışması için her şeyin yeniden yazılması gerektiğini anladım. Şimdi atıyorum.

 
fxsaber :

Doğru çalışması için her şeyin yeniden yazılması gerektiğini anladım. Şimdi atıyorum.

Yapamam çünkü bu bok oluyor.

 2018.01 . 28 12 : 37 : 23.692 Tester  EURUSD: preliminary downloading of history ticks started, it may take quite a long time
2018.01 . 28 12 : 37 : 24.692 Tester  EURUSD: preliminary downloading of history ticks completed, 89 bytes in 0 : 00.998 ( 0.09 Kb/sec)
2018.01 . 28 12 : 37 : 24.692 Tester  EURUSD: ticks data begins from 2017.09 . 01 00 : 00
2018.01 . 28 12 : 37 : 24.692 Core 1   agent process started
2018.01 . 28 12 : 37 : 33.425 Core 1   connecting to 127.0 . 0.1 : 3000
2018.01 . 28 12 : 37 : 50.450 Core 1   tester agent authorization error
2018.01 . 28 12 : 37 : 50.456 Core 1   connection closed
ve Tester'ı başlatmayın.
 

Gösterge

 #property indicator_chart_window
#property indicator_plots 0

input long Chart = 0 ; // идентификатор графика-получателя события
input int Index = 0 ;

int OnCalculate ( const int rates_total, const int prev_calculated, const int , const double &[] )
{
   if (prev_calculated)
     EventChartCustom (Chart, 0 , Index, 0 , NULL );
  
   return (rates_total);
}


danışman

 #include <TesterBenchmark.mqh> // https://www.mql5.com/ru/code/18804

input int AmountSymbols = 1 ;

const string Symbols[] = { "EURUSD" , "GBPUSD" , "AUDUSD" , "USDJPY" , "USDCAD" };

double Sum2 = 0 ;

double GetBid( const string &Symb )
{
   static MqlTick Tick;

   return ( SymbolInfoTick (Symb, Tick)? Tick.bid : 0 );
}

void OnInit ()
{
   for ( int i = 0 ; i < AmountSymbols; i++)
     iCustom (Symbols[i], PERIOD_W1 , "Spy.ex5" , ChartID (), i); // MQL5\Indicators\Spy.ex5
}

void OnDeinit ( const int )
{
   Print (Sum2);
}

void OnTick ()
{
}

void OnChartEvent ( const int id, const long &lparam, const double &, const string & )
{
   if (id == CHARTEVENT_CUSTOM )
    Sum2 += GetBid(Symbols[( int )lparam]);
}

EURUSD M1 MetaQuotes-Demo, Hedge, USD, gecikme yok, yalnızca Core1 aracısı, gerçek keneler 09/01/2017 - 01/28/2018.


bir karakter

i = 0 Pass = 0 OnTester = 7.053 s.: Count = 9986677 , 1415947.4 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent- 127.0 . 0.1 - 3000 build = 1755
i = 1 Pass = 1 OnTester = 6.930 s .: Count = 9986677 , 1441078.9 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent- 127.0 . 0.1 - 3000 build = 1755


iki karakter

i = 0 Pass = 0 OnTester = 25.747 s .: Count = 9986677 , 387877.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent- 127.0 . 0.1 - 3000 build = 1755
i = 1 Pass = 1 OnTester = 26.118 s.: Count = 9986677 , 382367.6 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent- 127.0 . 0.1 - 3000 build = 1755


üç karakter

i = 0 Pass = 0 OnTester = 47.448 s.: Count = 9986677 , 210476.2 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent- 127.0 . 0.1 - 3000 build = 1755
i = 1 Pass = 1 OnTester = 46.994 s .: Count = 9986677 , 212509.6 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent- 127.0 . 0.1 - 3000 build = 1755


  1. Tek sembol modunda, "casus", saf OnTick'ten 2,5 kat daha yavaş çalışır. Onlar. boş gösterge (çubuk geçmişinin minimum olması için PERIOD_W1'e dayalıdır) Test Cihazında büyük bir ek yüke sahiptir!
  2. İki sembol, bir sembolden 3,5 kat daha yavaştır.
  3. Ancak üç karakter, iki karakterden yalnızca 1.8 daha yavaştır. Onlar. ikiden üçe geçiş, 2. paragrafın aksine ölçeklenebilirlik ile açıklanır.
 

Anatoly, konuyu Forex Uzmanları, Ticaret Robotları ve Uzman Danışmanlar bölümüne taşımayı ve oraya sabitlemeyi öneriyorum.

Böylece her zaman göz önünde olacak. Burada zaten sabit olan çok fazla konu var.

 
Rashid Umarov :

Anatoly, konuyu Forex Uzmanları, Ticaret Robotları ve Uzman Danışmanlar bölümüne taşımayı ve oraya sabitlemeyi öneriyorum.

Böylece her zaman göz önünde olacak. Burada zaten sabit olan çok fazla konu var.

Karşı değil tabii ki konu faydalı olabilirse.
 
fxsaber :

...

  1. Tek sembol modunda, "casus", saf OnTick'ten 2,5 kat daha yavaş çalışır. Onlar. boş gösterge (çubuk geçmişinin minimum olması için PERIOD_W1'e dayalıdır) Test Cihazında büyük bir ek yüke sahiptir!
  2. İki sembol, bir sembolden 3,5 kat daha yavaştır.
  3. Ancak üç karakter, iki karakterden yalnızca 1.8 daha yavaştır. Onlar. ikiden üçe geçiş, 2. paragrafın aksine ölçeklenebilirlik ile açıklanır.

Sonucun 6, 25, 46. Neden 6, 12 ve 18 olmasın?

Yavaşlamaya bir sembole göre bakılmalıdır. O zaman üç sembol, beklendiği gibi 3 değil, bir taneden neredeyse 8 kat daha yavaştır.

Soru sadece bu. Ölçeklenebilirlik ile neden böyle bir sonuç elde edilir? Ve sonuç iyileştirilemezse, yeni bir test modu için bir varyant önerildi . Bu, birden çok karakter kullanıldığında uzun testler sorununu çözecektir.

sırayla karakter karakter test edebileceğiniz başka bir mod eklemektir. Bu, sonuç olarak beklenen test süresini verecektir. Mesele şu ki, çok sembollü Uzman Danışmanlar çok sık olarak sadece şu durumlarda kullanılır:

  1. Daha fazla test verisi gerekli.
  2. Alım satım algoritmasını aynı parametrelerle çok çeşitli fiyat hareketleri, koşullar (spread, stop/limit seviyeleri) vb. üzerinde test edin.

Bu gibi durumlarda, testlerin süresini ve parametrelerin optimizasyonunu önemli ölçüde azaltacak yeni bir moda ihtiyaç vardır. Ve son test için tüm sembolleri aynı anda test edin.


 
Anatoli Kazharski :

Sonucun 6, 25, 46. Neden 6, 12 ve 18 olmasın?

Yavaşlamaya bir karaktere göre bakılmalıdır.

Casuslu iki sembol - test cihazının bir sembolden çok farklı bir çalışma modu. Bu nedenle, ölçeklenebilirliğe ikiye göre bakmak mantıklıdır.

Ayrıca, gösterge yükü o kadar vahşi ki, casuslar arasında çalışmak bir koltuk değneği. Ölçeklenebilirliğin tek bir karaktere göre mükemmele yakın olması gereken Servisleri bekliyoruz. Zamanlayıcı ile nasıl çalışır. Sadece kene boşlukları olmayacak.

 
önemli ölçüde hızlandırılmış
 #include <TesterBenchmark.mqh> // https://www.mql5.com/ru/code/18804

input int AmountSymbols = 1 ;

const string Symbols[] = { "EURUSD" , "GBPUSD" , "AUDUSD" , "USDJPY" , "USDCAD" };

double Sum2 = 0 ;

double GetBid( const string &Symb )
{
   static MqlTick Tick;

   return ( SymbolInfoTick (Symb, Tick)? Tick.bid : 0 );
}

void OnInit ()
{
   for ( int i = 0 ; i < AmountSymbols; i++)
     if (Symbols[i] != _Symbol )
       iCustom (Symbols[i], PERIOD_W1 , "Spy.ex5" , ChartID (), i); // MQL5\Indicators\Spy.ex5
}

void OnDeinit ( const int )
{
   Print (Sum2);
}

void OnTick ()
{
   OnTick ( _Symbol ); 
}

void OnTick ( const string &Symb )
{
  Sum2 += GetBid(Symb);
}

void OnChartEvent ( const int id, const long &lparam, const double &, const string & )
{
   if (id == CHARTEVENT_CUSTOM )
     OnTick (Symbols[( int )lparam]);
}


bir karakter

i = 0 Pass = 0 OnTester = 2.697 s.: Count = 9986677 , 3702883.6 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent- 127.0 . 0.1 - 3000 build = 1755
i = 1 Pass = 1 OnTester = 2.657 s .: Count = 9986677 , 3758628.9 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent- 127.0 . 0.1 - 3000 build = 1755


iki karakter

i = 0 Pass = 0 OnTester = 17.632 s.: Count = 9986677 , 566395.0 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent- 127.0 . 0.1 - 3000 build = 1755
i = 1 Pass = 1 OnTester = 17.539 s .: Count = 9986677 , 569398.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent- 127.0 . 0.1 - 3000 build = 1755


üç karakter

i = 0 Pass = 0 OnTester = 35.639 s.: Count = 9986677 , 280217.7 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent- 127.0 . 0.1 - 3000 build = 1755
i = 1 Pass = 1 OnTester = 35.462 s .: Count = 9986677 , 281616.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent- 127.0 . 0.1 - 3000 build = 1755


dört karakter

i = 0 Pass = 0 OnTester = 68.459 s .: Count = 9986677 , 145878.2 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent- 127.0 . 0.1 - 3000 build = 1755
i = 1 Pass = 1 OnTester = 69.429 s.: Count = 9986677 , 143840.1 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent- 127.0 . 0.1 - 3000 build = 1755
 
fxsaber :

Casuslu iki sembol - test cihazının bir sembolden çok farklı bir çalışma modu. Bu nedenle, ölçeklenebilirliğe ikiye göre bakmak mantıklıdır.

Üstelik, gösterge yükü o kadar vahşi ki, casuslar arasında çalışmak bir koltuk değneği. Ölçeklenebilirliğin tek bir karaktere göre mükemmele yakın olması gereken Servisleri bekliyoruz. Zamanlayıcı ile nasıl çalışır. Sadece kene boşlukları olmayacak.

fxsaber :
önemli ölçüde hızlandırılmış

bir karakter

iki karakter

üç karakter

dört karakter

İki karakterin sonuçlarına bakarsanız, iki karakterin sonucu ikiye bölünür: 17 / 2 = 8.5

Ardından, karakter eklerken, beklenen test süresini elde etmek için bu değeri karakter sayısıyla çarpıyoruz.

  • üç karakter: 8.5 * 3 = 25 , ama aslında 35.462 s .
  • dört karakter: 8.5 * 4 = 34 , ancak aslında 68.459 s .

Ancak her durumda, bu şimdiye kadarki en iyi sonuçtur. Geçerli sembolü OnTick'te ve gerisini özel etkinliklerde kullanmak için ilginç bir seçenek ortaya çıktı.

Hizmet yokken, kullanabilirsiniz.

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Init() ve DeInit() yürütme sırası

Slava , 2017.04.14 10:18

Hizmetler, diğer şeylerin yanı sıra, ticaret işlevlerine ve nesneleri yönetme yeteneğine sahip olacaktır. Ve grafikler.

Bir piyasa veri sağlayıcısı, olasılıklardan sadece bir tanesidir.

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Init() ve DeInit() yürütme sırası

Slava , 2017.04.14 10:21

Hizmetlerde OnTick(string sembolü) bulunur. Ancak belirli bir sembolden gelen kenelere abone olmanız gerekecek

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Init() ve DeInit() yürütme sırası

fxsaber , 2017.04.14 10:46

Hizmetlerin hemen hemen tüm Açık işlevlerine sahip olacağı ortaya çıktı: OnInit, OnDeinit, OnTick(string), zamanlayıcı, OnTicaret, OnTradeTransaction, OnTester, OnTesterInit, OnTesterPass, OnTesterDeinit , OnBookEvent, OnChartEvent(uzun ChartID, ...), OnCalculate , ...

Gösterge arabelleklerine ihtiyacınız yoksa ve göstergelerin/EA'ların koltuk değnekleriyle uğraşmak istemiyorsanız, sınırlamalardan muzdarip olmayan (MT'nin önceki sürümlerinden alınmış) yeni bir tür program yazın - Hizmetler.

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Init() ve DeInit() yürütme sırası

Slava , 2017.04.14 10:56

Aynen öyle.

OnCalculate olmaz.

OnChartEvent ile henüz çözüm yok