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?
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
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).
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.
- 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.
- 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) ..
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?
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?
şimdi = TimeCurrent(), sn = TimeSeconds(şimdi); int DOW=TimeDayOfWeek(şimdi) ..
Başka bir deyişle...
sn = TimeSeconds(TimeCurrent()); ve DOW = TimeDayOfWeek(TimeCurrent());
"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?
int start(){ // do something return ; // Return from start. }
int start(){ // do something // Fall off the end is a Return from start. }
- 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.
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.
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
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