Mql5 dilinin özellikleri, incelikleri ve çalışma yöntemleri - sayfa 41

 
Slava :
Örnekleme başlangıcının ilk OnTick'in başında olduğunu belirtmeyi unuttunuz. Ölçümün sonu - OnDeinit'in başında
Veya OnTester'ın başında, çünkü
 // После окончания бэктеста сначала вызывается OnTester, затем OnDeinit

Bu konuya

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

Hatalar, hatalar, sorular

fxsaber , 2016.08.25 11:13

Hayat kesmek
 // Возвращает true, если полностью выполнился OnTick() на последнее событие NewTick в тестере - окончание бэктеста. Иначе - false.
   static bool BACKTEST::IsEnding( void )
     {
       return (:: TesterStatistics ( STAT_BALANCEMIN ) > 0 );
     }
 
fxsaber :
Veya OnTester'ın başında, çünkü


Ve ölçüm sonucunu OnTester'dan bir dönüş kodu olarak döndürün
 
Slava :
Ve ölçüm sonucunu OnTester'dan bir dönüş kodu olarak döndürün

GetTickCount'u henüz test cihazında test etmediniz. Bu işlevin, bazı durumlarda mantıklı olabilecek test cihazı tarafından taklit edileceğini varsaydım.

Bu arada, test cihazındaki geçerli saati ms'ye kadar doğrulukla nasıl anlayabilirim? SymbolInfoTick+Tick.time_msc aracılığıyla, ana sembolün OnTick çağrısının zamanını bulmak için çıkıyor. Ve hatta test cihazı kayma modunun doğru çalışıp çalışmadığını kontrol edin. Ama başka yolu yok gibi.


Doğru, başka bir şey sormak istedim. İlk ve son değerleri atarak optimize edicideki bir sıralamayı otomatikleştirmek için çerçeveler üzerinden mi hareket etmeniz (OnTester sonucunu aktarmak için) yoksa bu sonucu bozar mı?

 
Test cihazındaki GetTickCount , Sleep'in aksine düzgün çalışıyor ve taklit edilmiyor
 
fxsaber :

Doğru, başka bir şey sormak istedim. İlk ve son değerleri atarak optimize edicideki bir sıralamayı otomatikleştirmek için çerçeveler üzerinden mi hareket etmeniz (OnTester sonucunu aktarmak için) yoksa bu sonucu bozar mı?

çarpıtmamalı. Ölçü alındıktan sonra gönderilir. Denemek
 
Slava :
Toplu ölçümler için mikrosaniye zamanlayıcıyı kullanmayın. Normal milisaniye GetTickCount'u kullanın.

GetMicrosecondCount , test cihazını GetTickCount'tan daha fazla yavaşlatıyor mu (veya öykünüyor mu)?

Yoksa EventSetMillisecondTimer'dan vazgeçmek mi istediniz?

 
fxsaber :

GetMicrosecondCount, test cihazını GetTickCount'tan daha fazla yavaşlatıyor mu (veya öykünüyor mu)?

Yoksa EventSetMillisecondTimer'dan vazgeçmek mi istediniz?

GetMicrosecondCount demek istiyorum. Sunucuyu yavaşlatıp yavaşlatmadığını kesin olarak söylemek mümkün değil. Dolaylı bir etkisi olabilir. Bu nedenle, sistem yerel GetTickCount'u kullanmak daha iyidir.

GetMicrosecondCount, kod yürütmenin kısa bölümlerini ölçmek için kullanılır. Büyük bir OnTick setinin yürütülmesini ölçmek için GetTickCount yine de daha iyidir

Kararlı sonuçlar aldıktan sonra GetTickCount yerine GetMicrosecondsCount kullanmayı deneyin. O zaman buradan söyle. Belki boşuna endişeleniyorum

 
Verileri Geçmiş işlevleri aracılığıyla kullanılabilen iki güncel geçmiş tablo vardır - Siparişler tablosu ve Anlaşmalar tablosu.

İçerikleri yalnızca HistorySelect işlevleri aracılığıyla etkilenebilir. Ve böyle olur

  • HistorySelect ve HistorySelectByPosition - her iki tabloyu aynı anda etkiler.
  • HistoryDealSelect YALNIZCA Anlaşmalar tablosunu etkiler (mevcut Siparişler geçmişi tablosunu etkilemez).
  • HistoryOrderSelect YALNIZCA Siparişler tablosunu etkiler (mevcut Anlaşmalar geçmişi tablosunu etkilemez).

 
Siparişler, Request.expiration alanını LONG_MAX + 2 dahil olarak ayarlayabilir. Değeri, sipariş etkinse (geçmiş tabloda değil) ORDER_TIME_EXPIRATION aracılığıyla tamamen kullanılabilir olacaktır.
 
Bakiye işlemlerinin PositionIdentifier değeri sıfıra eşittir. Bu nedenle, örneğin böyle bir işlevi yazmak kolaydır.
 // Возвращает сумму всех балансовых не торговых операций (начисления + списания)
double GetSumBalanceOperations( void )
{
   double Res = 0 ;
  
   if ( HistorySelectByPosition ( 0 ))
     for ( int i = HistoryDealsTotal () - 1 ; i >= 0 ; i--)
      Res += HistoryDealGetDouble ( HistoryDealGetTicket (i), DEAL_PROFIT );
      
   return (Res);
}

Bu tür işlemlerin DEAL_ENTRY'si DEAL_ENTRY_IN (0)'a eşittir.

Neden: