MetaTrader 5 Strateji Test Cihazı: Hatalar, Hatalar, İyileştirme Önerileri - sayfa 48

 

Pip modunda kar elde etmek için, kârsız pozisyonları tüm pozisyon hacmi için tek bir pazarla ve kârlı olanları 0,01 lotluk bir kalabalıkta kapatın.

Misal.

 #include <MT4Orders.mqh>

#define Ask SymbolInfoDouble ( _Symbol , SYMBOL_ASK )

const bool Init = EventSetTimer ( 100 );

void OnTimer ()
{
   while ( OrdersTotal ())
     if ( OrderSelect ( 0 , SELECT_BY_POS))
      OrderClose(OrderTicket(), (OrderProfit() > 0 ) ? 0.01 : OrderLots() , OrderClosePrice(), 0 );
      
   OrderSend ( _Symbol , OP_BUY, 1 , Ask, 0 , 0 , 0 );
}


Sonuç

 

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

Kitaplıklar: SingleTesterCache

fxsaber , 2020.01.12 23:20

tst formatının mevcut sürümü aşağıdaki verileri içermiyor

  • Milisaniye cinsinden süre.
  • Konum Kimliği.
  • Sihirli sayı.
Bu, kullanım durumlarına kısıtlamalar getirir.
 

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

Kitaplıklar: SingleTesterCache

fxsaber , 2020.01.13 00:01

Birkaç hatanın çoğaltılması. Uzman Danışmanı, bir riskten korunma hesabında Test Cihazında başlatıyoruz.

 #include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

#define Ask SymbolInfoDouble ( _Symbol , SYMBOL_ASK )

#define PAUSE 100000

void OnTick ()
{
   static bool FirstRun = true ;
  
   if (FirstRun)
  {
     OrderSend ( _Symbol , OP_BUY, 1 , Ask, 0 , 0 , 0 );
     Sleep (PAUSE);
    
     OrderSend ( _Symbol , OP_BUY, 2 , Ask, 0 , 0 , 0 );
     Sleep (PAUSE);

     if ( OrderSelect ( 0 , SELECT_BY_POS))
      OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0 );
     Sleep (PAUSE * 2 );
    
     if ( OrderSelect ( 0 , SELECT_BY_POS))
      OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0 );
     Sleep (PAUSE * 2 );

     TesterWithdrawal ( 100 );    
    
    FirstRun = false ;
  }
}

void OnDeinit ( const int )
{
   const int Total = OrdersHistoryTotal();
  
   for ( int i = 0 ; i < Total; i++)
     if ( OrderSelect (i, SELECT_BY_POS, MODE_HISTORY))
    {
      OrderPrint();
      
       Print (OrderTicketID()); // MT5-PositionID
    }
}


bunu anladık

 2020.01 . 08 23 : 59 : 58    # 1 2020.01 . 01 00 : 00 : 00 balance 0.00 0.00000 0.00000 0.00000 2020.01 . 01 00 : 00 : 00 0.00000 0.00 0.00 100000.00 0
2020.01 . 08 23 : 59 : 58    0
2020.01 . 08 23 : 59 : 58    # 4 2020.01 . 02 06 : 00 : 00 buy 1.00 EURUSD 1.12137 0.00000 0.00000 2020.01 . 02 06 : 03 : 20 1.12132 - 3.56 0.00 - 4.46 0
2020.01 . 08 23 : 59 : 58    2
2020.01 . 08 23 : 59 : 58    # 5 2020.01 . 02 06 : 01 : 40 buy 2.00 EURUSD 1.12137 0.00000 0.00000 2020.01 . 02 06 : 06 : 40 1.12129 - 7.14 0.00 - 14.27 0
2020.01 . 08 23 : 59 : 58    3
2020.01 . 08 23 : 59 : 58    # 6 2020.01 . 02 06 : 10 : 00 balance 0.00 0.00000 0.00000 0.00000 2020.01 . 02 06 : 10 : 00 0.00000 0.00 0.00 - 100.00 withdrawal 0
2020.01 . 08 23 : 59 : 58    0


Ardından, ilgili tst dosyasını bir komut dosyasıyla okuruz.

 #include <fxsaber\SingleTesterCache\SingleTesterCache.mqh> // https://www.mql5.com/ru/code/27611
#include <fxsaber\MultiTester\MTTester.mqh> // https://www.mql5.com/ru/code/26132

void OnStart ()
{  
   uchar Bytes2[];
  
   if (MTTESTER::GetLastTstCache(Bytes2) != - 1 ) // Если получилось прочитать последнюю кеш-запись одиночного прогона
  {
     const SINGLETESTERCACHE SingleTesterCache(Bytes2); // Загоняем ее в соответствующий объект.

     for ( int i = 0 ; i < ArraySize (SingleTesterCache.Positions); i++)
       Print (SingleTesterCache.Positions[i].ToString());
  }
}


Konum verilerini gösterecek

id = 0
mfe = 0.0
mae = - 8.029999999999999
profit = - 4.46
lifetime = 00 : 03 : 20

id = 0
mfe = 0.0
mae = - 21.4
profit = - 14.27
lifetime = 00 : 05 : 00

id = 0
mfe = 0.0
mae = 0.0
profit = 0.0
lifetime = 00 : 00 : 00


Bu gönderideki her şeyi karşılaştırırsak, aşağıdaki hatalar formüle edilir.

  • Doğru kimlikler yerine sıfır kimlikler.
  • Kâr hesaplanırken komisyon ve takas dikkate alınmaz.
  • Para çekme işlemi, yanlışlıkla kapatılan işlem pozisyonlarının sayısına düşer.

 

Hata ayıklayıcı oldukça işlevsel değil. Azalan eksiklik sırasına göre standart hata ayıklayıcılara kıyasla eksik olan şey.

1. Bellek değişikliği. Değişkenleri görüntüleyebilirsiniz, ancak onları düzenleyemiyorsunuz.

2. Koşullu kesme noktaları. Değişken test=10 ise durdurmak için yazın.

3. Uygulamayı zorlamak için fırsatlar. Onlar. örneğin hangi döngüyü atlayın. Başka bir deyişle, hattı dürt ve söyle, şimdi buradan yap.

4. Halihazırda çalışan bir komut dosyasına/danışmana/göstergeye ekleyin. Ya da en azından bir çarpışma durumunda kolayca analiz edilebilmesi için bir bağlantı olasılığı.

 
traveller00 :

Hata ayıklayıcı oldukça işlevsel değil. Azalan eksiklik sırasına göre standart hata ayıklayıcılara kıyasla eksik olan şey.

2. Koşullu kesme noktaları. Değişken test=10 ise durdurmak için yazın.

 if (smth) {

     int a;

}
 
Evet, katılıyorum, yeniden birleştirme hemen hemen her şeyi başarabilir. Tabii 4. nokta hariç. Ama yine de bunu hata ayıklayıcıda görmek isterim, çünkü bu hata ayıklayıcı için standart bir işlevler kümesidir.
 

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

Kitaplıklar: SingleTesterCache

fxsaber , 2020.01.14 10:49

Artık set dosyaları yerine tst dosyalarını kullanıyorum. Yalnızca giriş parametrelerine değil, aynı zamanda tam geriye dönük testlere sahip olarak bunlar arasında çok hızlı geçiş yapabilirsiniz.

Ne yazık ki, tst'de milisaniyelik veri eksikliği nedeniyle farklı TS'leri bir portföyde tam olarak birleştirmek imkansız.


Umarım mevcut alanların geliştiricileri onları sonuna kadar kullanmaya başlar.

INT64             TradeDeal::time_create;             // время создания записи

INT64             TradeOrder::time_setup;             // время приёма ордера от клиента в систему
INT64             TradeOrder::time_done;               // время снятия завки

oradaki zaman değerini saniye cinsinden değil, milisaniye cinsinden yazmak.


Genel olarak, pratikte, tst kullanmanın tüm serinliğini göstermek, tst'de hiç küçük kusurlar vermez. düzeltecekti .

 


Rapor, TesterWithdrawal ile ilgili verileri içeriyor, ancak eksik - TesterDeposit.

 
Böyle bir resim nasıl anlaşılır. Optimizasyon grafiği 5000 civarında tepe değerleri göstermektedir. Optimizasyon tablosunda ise maksimum değer 4670'dir. En iyi geçişlerin parametreleri nerede?
Dosyalar:
8c97so2_7-1.jpg  184 kb
 
Grozir :
Böyle bir resim nasıl anlaşılır. Optimizasyon grafiği 5000 civarında tepe değerleri göstermektedir. Optimizasyon tablosunda ise maksimum değer 4670'dir. En iyi geçişlerin parametreleri nerede?

"Sonuç" sütununu sıralayın.

Neden: