fonksiyon uyku alternatifi

 

Merhaba MQL4 topluluğu,

Strateji test cihazında Sleep() işlevini içeren bir EA çalıştırırken bir sorunla karşılaştım. Görünüşe göre test cihazı, koda gömülü Sleep() işlevinin dahil edilmesiyle EA'yı düzgün şekilde çalıştırmayacak.

Mevcut herhangi bir kodlayıcı, EA test cihazında çalıştırılırken belirli bir süre "beklemek" için bir EA'yı kodlamak için Sleep() işlevinden alternatif bir yöntem keşfetti mi?


Teşekkür ederim

 
WhooDoo22 :

Merhaba MQL4 topluluğu,

Strateji test cihazında Sleep() işlevini içeren bir EA çalıştırırken bir sorunla karşılaştım. Görünüşe göre test cihazı, koda gömülü Sleep() işlevinin dahil edilmesiyle EA'yı düzgün şekilde çalıştırmayacak.

Mevcut herhangi bir kodlayıcı, EA test cihazında çalıştırılırken belirli bir süre "beklemek" için bir EA'yı kodlamak için Sleep() işlevinden alternatif bir yöntem keşfetti mi?

Sleep()'in Strategy Tester'da çalışması için mantıklı bir neden yoktur. . . ne yapmaya çalışıyorsun ? bir olayı zamanlamaya çalışıyorsanız, zamanı kullanın ve sadece gerekli süre için duraklamaya çalışmayın, uyku() bunun için değildir.
 

Simon,

'Sleep()' işlevini kullanmayı seçmemin bir nedeni, Seconds() öğesinin bilinen son sunucu zamanından değerler döndürmesiydi (bilinen son sunucu zamanından veri almak, saniyelerin atlamasına ve/veya duraklamasına neden olur). Genellik değil, güvenilirlik istiyorum.

Buna ne dersin?


Teşekkür ederim

 
WhooDoo22 :

Simon,

'Sleep()' işlevini kullanmayı seçmemin bir nedeni, Seconds()'ın bilinen son sunucu zamanından değerler döndürmesiydi (bilinen son sunucu zamanından veri almak, saniyelerin atlamasına ve/veya duraklamasına neden olur).

Buna deliliniz nedir? sadece tiklerin olduğu zamanlar için süreyi "görebilirsin", 30 saniye boyunca tik olmazsa 30 saniyelik bir atlama göreceksin. . . bu konuda yapacak bir şey yok, durum bu. Tıklamalar gerçek değil, sentezlenmiş olduğundan, Strateji Test Cihazındaki keneler için süreler makul ölçüde tek tip olmalıdır.
 

Simon,

Yani siz yazıyorsunuz, bu "atlamalar" ve/veya "duraklamalar" olarak adlandırmamın bir nedeni, [saniye x] ve [saniye y] arasında hiçbir onay işaretinin oluşmamasıdır. Layman'ın terimleriyle, bir onay işareti oluşturulur, şimdi 'saniye x' kaydedilir. Üç saniye boyunca hiçbir onay işareti oluşturulmaz, ardından bir onay işareti oluşturulur. Şimdi 'saniye y' kaydedildi. ('saniye y' = (saniye x +üç saniye)) olarak ('saniye x' = (saniye y-üç saniye)).

Buna ne dersin?


Şu an için seçeneklerimi değerlendireceğim.

Cevaplarınız için çok teşekkürler.

 
  1. Baştan dönene kadar. Test cihazında HİÇBİR kene oluşturulmaz. TimeCurrent() öğesini bir statik/ortak(global) değişkene kaydedin. Sonraki tik int deltaSec = TimeCurrent() - önceki.
  2. https://www.mql5.com/en/forum/127483 , DayOfWeek() öğesinin test cihazında her zaman 5 döndürdüğünü bildirdi (göstergelerde Ask ve Bid ile kesinlikle aynı değil). Hiçbir zaman Seconds(), DayOfWeek() vb. öğelerini kullanmam çünkü mevcut sunucu saatini istemezsiniz, test cihazının tik saatini istersiniz. şimdi = TimeCurrent(), sn = TimeSeconds(şimdi); int DOW=TimeDayOfWeek(şimdi) ..
 
WhooDoo22 :

Simon,

Yani siz yazıyorsunuz, bu "atlamalar" ve/veya "duraklamalar" olarak adlandırmamın bir nedeni, [saniye x] ve [saniye y] arasında hiçbir onay işaretinin oluşmamasıdır. Layman'ın terimleriyle, bir onay işareti oluşturulur, şimdi 'saniye x' kaydedilir. Üç saniye boyunca hiçbir onay işareti oluşturulmaz, ardından bir onay işareti oluşturulur. Şimdi 'saniye y' kaydedildi. ('saniye y' = (saniye x +üç saniye)) olarak ('saniye x' = (saniye y-üç saniye)).

Buna ne dersin?

Evet, tikler arasında kolayca 3 saniye olabilir, tıpkı gerçek dünyada olduğu gibi, Midnight GMT'deki herhangi bir döviz çiftine bakın, tikler arasında çok sayıda büyük çoklu saniye göreceksiniz. . . hatta bir dakikadan fazla bir süre boyunca kene alamayabilirsiniz ve M1 çubuklarını kaçırabilirsiniz. . . bu nadir bir şey değil.
 

William,

Cevabınız için çok teşekkürler.

1. Baştan dönene kadar. Test cihazında HİÇBİR kene oluşturulmaz. TimeCurrent() öğesini bir statik/ortak(global) değişkene kaydedin. Sonraki tik int deltaSec = TimeCurrent() - önceki.

"Baştan dönene kadar" derken ne demek istediğini anlamıyorum. Lütfen açıklar mısınız?


"Test cihazında HİÇBİR kene oluşturulmaz"

Demek istediğiniz, test cihazında HİÇBİR ZAMAN gerçek keneler oluşturulmamıştır. Test cihazında yapay keneler oluşturulduğuna katılmıyor musunuz?


"TimeCurrent() öğesini bir statik/ortak(global) değişkene kaydedin. Sonraki onay işareti int deltaSec = TimeCurrent() - önceki."

TimeCurrent() öğesini bir değişkene kaydedin . Bir sonraki onay işareti geldiğinde, int deltaSec =TimeCurrent() - önceki.

"Önceki" değişken, TimeCurrent() değişkenine kaydedilmez mi?

deltaSec = TimeCurrent() - ( TimeCurrent() önceden bir değişkene kaydedilmiş )

Lütfen William'ı açıklığa kavuşturun.


https://www.mql5.com/en/forum/127483 , DayOfWeek() öğesinin test cihazında her zaman 5 döndürdüğünü bildirdi. Hiçbir zaman Seconds(), DayOfWeek() vb. öğelerini kullanmam çünkü şimdi mevcut sunucu saatini istiyorsunuz, test cihazının tik saatini istiyorsunuz. şimdi = TimeCurrent(), sn = TimeSeconds(şimdi); int DOW=TimeDayOfWeek(şimdi) ..


"Test edenin tik saatini istiyorsun."

Evet, Simon'ın saniyelerin neden atladığını ve/veya durakladığının ardındaki mantığı açıklayan yazısı nedeniyle strateji test cihazında bir EA'yı test ederken tam olarak istediğim şeyin bu olduğuna İNANIYORUM.


şimdi = TimeCurrent(), sn = TimeSeconds(şimdi); int DOW=TimeDayOfWeek(şimdi) ..

Başka bir deyişle...

sn = TimeSeconds(TimeCurrent()); ve DOW = TimeDayOfWeek(TimeCurrent());

Buna ne dersin?


Teşekkür ederim
 
WhooDoo22 :

şimdi = TimeCurrent(), sn = TimeSeconds(şimdi); int DOW=TimeDayOfWeek(şimdi) ..

Başka bir deyişle...

sn = TimeSeconds(TimeCurrent()); ve DOW = TimeDayOfWeek(TimeCurrent());

TimeSeconds()'ın size ne verdiğine bir bakın, ardından TimeCurrent()'in size ne verdiğini düşünün. . . hangisine ihtiyacınız var ve neden?
 
WhooDoo22 :

"Baştan dönene kadar" derken ne demek istediğini anlamıyorum. Lütfen açıklar mısınız?"

Test cihazında HİÇBİR kene oluşturulmaz" Yani, test cihazında HİÇBİR ZAMAN gerçek kene oluşturulmamıştır. Test cihazında yapay keneler oluşturulduğuna katılmıyor musunuz?

  1.  int start(){
       // do something
       return ; // Return from start.
    }
     int start(){
       // do something
       // Fall off the end is a Return from start.
    }

  2. Siz dönene kadar hiçbir tik oluşturulmaz ve bir sonrakini oluşturur ve start()'ınızı çağırır. 5 dakika hesaplar ve geri dönerseniz, bir sonraki aramadaki ses seviyesi (tik sayısı) +1 olur. Canlı bir grafikte, 5 dakika hesaplarsanız, 5 dakikalık keneleri kaçırırsınız ve M1'de birkaç yeni çubuk oluşmuş olur.
 
RaptorUK :
Uyku() öğesinin Strateji Test Cihazında çalışması için mantıklı bir neden yoktur ...

böyle bir açıklamada dikkatli olun. sleep() işlevini çalıştırmak için her zaman mantıklı bir neden vardır. Test Cihazında ve hatta göstergelerde. doğru, OP'nin kullanım durumu için uyku ile oynamamalısınız, ancak bunu tüm MQL için genelleştiremezsiniz.

Tester'da ne zaman uyumamız gerekiyor? örneğin, test edilen bir EA ile etkileşime giren bir komut dosyasını test edersem, durumu senkronize etmem gerekebilir. mutekslerden bahsediyorum. bir mutex'i temiz bir şekilde elde etmek için her iki parçanın da bekleme yeteneğine ihtiyacı vardır, yani. uyku kullanmak için.

aynısı göstergeler için de geçerlidir. göstergenin UI iş parçacığında çalışması önemli değildir. iki iş parçacığının senkronize edilmesi gerekiyorsa, her ikisinin de "uyku" yeteneğine ihtiyacı vardır. ve uyku(), belirli bir miktarda CPU döngüsü için beklemeniz gerekiyorsa, tek temiz çözümdür, "for" yapıları sadece bilgi eksikliğini gösterir.

tamam, pratik bir örnek verelim: EA'larım sipariş durumunu görüntüleyebilir (kendinden çizilen oklar vb.). bunu, grafik nesnelerinin metin açıklamaları aracılığıyla "gönderilen" harici komutlara yanıt vererek yaparlar (1-bekleyen emirler, 2-açık pozisyonlar, 3-kapalı işlemler, 4-hepsi birlikte), bu yüzden ben ona grafik komutları diyorum. veya diğer komutlara ("başlat", "durdur", "devam ettir") yanıt vererek işlem dizilerini başlatabilir/durdurabilir/devam ettirebilirler. komutları okumak için bu grafik nesnelerine erişimi senkronize etmeleri gerekir (grafik nesnesi oluştur + metin özelliğini ayarla özelliği tek bir atomik işlem değildir). ve tabii ki bu davranışı Tester'da test etmek istiyorum, bu yüzden beklemek için uykuya () ihtiyacım var.

Tester'da veya çevrimiçi olarak çalışan göstergeler için aynıdır. benzer bir şey yaparlarsa, temiz bir durum elde etmek için UI iş parçacığını "durdurmalıyım", 10 milisaniyenin önemi yok. btw: temiz bir muteks uygulaması, zaten beklediği zamanı kontrol eder, döngüden çıkar ve diyelim ki birkaç saniye sonra bir senkronizasyon kilidi alamazsa bir hata sinyali verir.

 int seconds;

// run until the lock is aquired
while ( true ) {
   ...
   // warn every second and cancel after 10 seconds
   duration = GetTickCount () - startTime;
   if (duration >= seconds* 1000 ) {
       if (seconds >= 10 )
         return (_false(catch( "AquireLock(5)   failed to get lock for mutex \"" + mutexName + "\" after " + DoubleToStr(duration/ 1000.0 , 3 ) + " sec., giving up" , ERR_RUNTIME_ERROR)));
      warn( StringConcatenate ( "AquireLock(6)   couldn't get lock for mutex \"" , mutexName, "\" after " , DoubleToStr(duration/ 1000.0 , 3 ), " sec., retrying..." ));
      seconds++;
   }
   //debug("AquireLock()   couldn't get lock for mutex \""+ mutexName +"\", retrying...");

   if (IsTesting() || IsIndicator()) SleepEx( 100 , true );           // expert or indicator under test
   else                                Sleep ( 100 );
}

bu komutları bir komut dosyası yazıp ona bir kısayol tuşu atayarak kullanıyorum. o zaman, bir uzmanı/göstergeyi kontrol etmek istersem, örneğin bir tuşa basmam yeterlidir. Tüm olası değerler arasında sipariş görüntüleme modunu değiştirmek için ALT-O. veya favorilerde bir "başlat" ve bir "durdur" komut dosyası var ve bir fare tıklamasıyla bir tanesini başlat/durdur/devam ettir.

örneğin test cihazında. VisualMode=On ile tam hızda bir adet, düzgün bir şekilde senkronize edilmezse neredeyse anında çökecektir.

Neden: