MT sürümlerinin arşivi. - sayfa 4

 
Roman :

Bu bağlamda bir kontrol yapamaz mıyız?

Ne yazık ki, bu testten hiçbir şey çıkmadı...

 
Roman :

IsStopped() ile örnek vererek sadece ilk kısma cevap vermeye çalışıyordum.
Bazen danışman bitmeden olayın işlenmesini tamamlamak gerekir, bazen de sizin durumunuzda olduğu gibi acilen tamamlamanız gerekir.
Belgelerdeki bu IsStopped() işlevinin açıklamasını okuyun, size bazı fikirler verebilir.
Ama sana başka bir operadan gibi geldi. Bir başkasından ise, olası varsayım için üzgünüm.
Ancak olası önerilerde dedikleri gibi, sorun arayışı çözüldü.
Hiç kimse, kodunun tüm mantığını bilmediğinden ve muhtemelen onu incelemeyeceğinden, kesin bir çözüm söylemeyecek.

Roman, burada yine tam olarak alıntı yapmıyorsun. Ama seçilenler arasında tek tek seçti.

Peki, tamam, diyelim ki zorunlu bir kapatma çalışıyor. Ve bu tamamlamanın başlatıldığı ve hesaplamaların karmaşıklığının 3 saniyeyi aştığı olaya ihtiyacım var. Ve programın bitmesini nasıl engelleyebilirim ve sonuna kadar çalışmasına izin verebilirim? Sorun tam olarak bu. Konuşma, nasıl sonlandırılacağıyla ilgili değil, yanlış olarak adlandırılan bir sonlandırmanın nasıl önleneceğiyle ilgiliydi. Veya önlemek için değil, belirli bir ana kadar, özellikle olay işlemenin tamamlanmasına kadar ertelemek.

 
Сергей Таболин :

Sürümünüzü kontrol ettim. Her şey şu mesajla sona erdi:

Genel olarak - bir çıkmaz ...

Yani önerilen seçenek

 bool                  tester_stop = false ;                 // флаг проверки выхода по TesterStop
.......
void OnTick ()
{
//--- пропустить бесполезные проходы оптимизации
   if (!check_init && ( MQLInfoInteger ( MQL_OPTIMIZATION ) || MQLInfoInteger ( MQL_TESTER )))
   {
       if (недопустимый параметр)          tester_stop = TesterStop ();
........
}
double OnTester ()
{
   if (tester_stop) return (- 99999999999.99 );

tamamen aynı şekilde çalışacaktır. Ve yine bir "çıkmaz" alıyorsunuz. Ancak çıkmaz mql'de değil, kafada. Böyle programlama yapamazsınız. Koddan bir şey beklemeden önce, kendinizi bir aptalın yerinde hayal etmeniz ve bir bilgisayarın yaptığı gibi aptalca tüm kodu birkaç kez gözden geçirmeniz gerekir. Bir durumda yürütmenin nereye aktarılacağından emin olun. Bu veya bu durumda hangi parametreler alınmalıdır. Ardından, infazı başlatarak, beklediğimizi alıp almadığımızı kontrol edin? Değilse, hata ayıklama sırasında gördüğümüz şeyi nereden aldığımızı bulmanız gerekir.

Başka türlü olamaz. Ve kod parçalarıyla yürütmede hata ayıklamak kesinlikle imkansızdır.

 
Alexey Viktorov :

Roman, burada yine tam olarak alıntı yapmıyorsun. Ancak seçilenler arasında tek tek seçti.

Peki, tamam, diyelim ki zorunlu bir kapatma çalışıyor. Ve bu tamamlamanın başlatıldığı ve hesaplamaların karmaşıklığının 3 saniyeyi aştığı olaya ihtiyacım var. Ve programın bitmesini nasıl engelleyebilirim ve sonuna kadar çalışmasına izin verebilirim? Sorun bu. Konuşma, nasıl sonlandırılacağıyla ilgili değil, yanlış olarak adlandırılan bir sonlandırmanın nasıl önleneceğiyle ilgiliydi. Veya önlemek için değil, belirli bir ana kadar, özellikle olay işlemenin tamamlanmasına kadar ertelemek.

Hesaplamanın tamamlanmasını bekleyin.

Mql'de ne yazık ki, bekleme tipinin böyle bir işlevi yoktur.
Sleep() ile deneme yapmayı deneyebilirsiniz, ancak uyku açık bir tamamlanma işareti değildir, bu nedenle pek uygun değildir.
Farklı bir şekilde bir koşul oluşturmaya çalışın, eğer (hesaplama tamamlandıysa) zorunlu tamamlamaya başlayın.

 
Alexey Viktorov :

Yani önerilen seçenek

tamamen aynı şekilde çalışacaktır. Ve yine bir "çıkmaz" alıyorsunuz. Ancak çıkmaz mql'de değil, kafada. Böyle programlama yapamazsınız. Koddan bir şey beklemeden önce, kendinizi bir aptalın yerinde hayal etmeniz ve bir bilgisayarın yaptığı gibi aptalca tüm kodu birkaç kez gözden geçirmeniz gerekir. Bir durumda yürütmenin nereye aktarılacağından emin olun. Bu veya bu durumda hangi parametreler alınmalıdır. Ardından, infazı başlatarak, beklediğimizi alıp almadığımızı kontrol edin? Değilse, hata ayıklama sırasında gördüğümüz şeyi nereden aldığımızı bulmanız gerekir.

Başka türlü olamaz. Ve kod parçalarıyla yürütmede hata ayıklamak kesinlikle imkansızdır.

İşin aslı, güncellemeden önce her şey çalışıyordu ve şimdi ne yapacağımı bilmiyorum.

Ayrıca prensip olarak tüm kodlar açıktır.

Ayrıca, OnTester() versiyonumu tartışmak ve geliştirmek için zaten bir başlık açmak istiyordum ve işte burada...

Anlaşıldığı üzere, sorun onun içinde değil, TesterStop() 'ın değiştirilmiş uygulamasında. Prensip olarak, OnTester() ile doğrudan bir ilişkisi olmayan, ancak havayı bozan ...

Şimdi başka bir şey deneyeceğim...

 
Сергей Таболин :

İşin aslı, güncellemeden önce her şey çalışıyordu ve şimdi ne yapacağımı bilmiyorum.

Ayrıca prensip olarak tüm kodlar açıktır.

Ayrıca, OnTester() versiyonumu tartışmak ve geliştirmek için zaten bir başlık açmak istiyordum ve işte burada...

Anlaşıldığı üzere, sorun onun içinde değil, TesterStop()'un değiştirilmiş uygulamasında. Prensip olarak, OnTester() ile doğrudan bir ilişkisi olmayan, ancak havayı bozan ...

Şimdi başka bir şey deneyeceğim...

Sonuçta, önceki yapılara bir bağlantı verdiler. Dosyaları değiştirin ve kontrol edin. O zaman herkese hangi yapıda olduğunu ve şimdi çalıştığını söyleyebilirsiniz. İşe yaramazsa, bu tür parametrelerin çakıştığı ve kodun şu anda sorunların ortaya çıktığı bu bölümüne yol açmadığı anlamına gelir.

 
Alexey Viktorov :

Sonuçta, önceki yapılara bir bağlantı verdiler. Dosyaları değiştirin ve kontrol edin. O zaman herkese hangi yapıda olduğunu ve şimdi çalıştığını söyleyebilirsiniz. İşe yaramazsa, bu tür parametrelerin çakıştığı ve kodun şu anda sorunların ortaya çıktığı bu bölümüne yol açmadığı anlamına gelir.

Ben de denedim. Teslim edilen 2007 yapısı ve orada tüm bu sorunlar mevcut değil. Optimizasyondan sonra tüm günlüğü özellikle inceledim. 4 (sadece 4!) sıfıra bölme hatası bulundu. Bunlar, ticaretin yokluğunda ortaya çıkanlardır. Bu, elbette düzeltilmeliydi, ancak genel optimizasyon sonucu üzerinde hiçbir etkisi olmadı! Ve yeni yapıda, hatalar birikmişti ve optimizasyon imkansız hale geldi.

Şimdi, @Roman'dan gelen ipucu ile ilgili.

Teşekkürler, doğru mesaj olduğu ortaya çıktı. Sadece benim durumumda, TesterStop() için işe yaramaz olduğu ortaya çıktı, çünkü TesterStop() testin bazı_unknown_percentage tarafından geçmiş olmasını gerektiriyor. Ve belgelerde bundan bahsedilmiyor.

Ancak ExsprtRemove() ile işe yaradı. Bu işlev için, orada kaç testin geçtiği önemli değildir. Doğru, tüm çalışma kodunu if içine sarmam gerekiyordu.

   if (! IsStopped ())
   {
      тут рабочий код
   }

Genel olarak, koltuk değneği ile kodun sağlamlığı geri yüklendi. Tekrar teşekkürler.

not Aslına bakarsanız, başka bir koltuk değneği için koltuk değneği yapmak zorunda kaldım. gülümsedi)))

 
Сергей Таболин :

not Aslına bakarsanız, başka bir koltuk değneği için koltuk değneği yapmak zorunda kaldım. gülümsedi)))

Seçeneklerin olmadığına inanmıyorum. Koltuk değneklerini koltuk değneklerine programlamayı seviyorsanız, karışmaya hakkım yok. Slava bunu yanıtladı

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

Hatalar, hatalar, sorular

Slava , 2019.06.16 14:04

Expert Advisor'ın hemen durdurulması, bellek bozulması anlamına gelir. Expert Advisor'ın hemen durdurulmasından sonra, serbest bırakılmamış bellek blokları kalabilir. Bu nedenle Expert Advisor'ın anında durdurulması, yalnızca istemci terminali veya test aracısı sonlandırıldığında ve yalnızca Expert Advisor durdurma bayrağını işlemez ve yürütmeye devam ederse kullanılır.

TesterStop, testi bitirme komutunu verir. Bu, mevcut OnInit, OnTick, OnTimer, OnChartEvent işleyicisinin tamamlanmasından sonra, işleme döngüsü tamamlanacağı için artık hiçbir test cihazı olayının işlenmeyeceği anlamına gelir. Ve OnTester ve OnDeinit çağrılacak

Belki de önceki derlemede geliştiriciler tarafından izin verilen bir söve kullandınız. Ve şimdi bu sorun çözüldü ve doğru çözümü aramamız gerekiyor.
 
Сергей Таболин :

Ben de denedim. Teslim edilen 2007 yapısı ve orada tüm bu sorunlar mevcut değil. Optimizasyondan sonra tüm günlüğü özellikle inceledim. 4 (sadece 4!) sıfıra bölme hatası bulundu. Bunlar, ticaretin yokluğunda ortaya çıkanlardır. Bu, elbette düzeltilmeliydi, ancak genel optimizasyon sonucu üzerinde hiçbir etkisi olmadı! Ve yeni yapıda, hatalar birikmişti ve optimizasyon imkansız hale geldi.

Şimdi, @Roman'dan gelen ipucu ile ilgili.

Teşekkürler, doğru mesaj olduğu ortaya çıktı. Sadece benim durumumda, TesterStop() için işe yaramaz olduğu ortaya çıktı, çünkü TesterStop() testin bazı_unknown_percentage tarafından geçmiş olmasını gerektiriyor. Ve belgelerde bununla ilgili bir kelime yok.

Ancak ExsprtRemove() ile işe yaradı. Bu işlev için, orada kaç testin geçtiği önemli değildir. Doğru, tüm çalışma kodunu if içine sarmam gerekiyordu.

Genel olarak, koltuk değneği ile kodun sağlamlığı geri yüklendi. Tekrar teşekkürler.

not Aslına bakarsanız, başka bir koltuk değneği için koltuk değneği yapmak zorunda kaldım. gülümsedi)))

Bu bir koltuk değneği değil, geliştiriciler tarafından önerilen bir uygulamadır.
Bu işlevi while döngüsünün açıklamasında buldum

 while (! IsStopped ())
{

}

Bu nedenle, bu işlev programın zorla sonlandırılması gerçeğini kontrol ederse, o zaman neden TesterStop () için kullanmıyorsunuz fikrini buldum.
TesterStop() için çalışmaması üzücü, şimdi bunu öğreneceğiz.
Geliştiricilere sormak adil olsa da, TesterStop () işlevi için IsStopped () işlevinin etkinleşmesi mi gerekiyor?
Belki bir hatadır?

Ancak asıl mesele, soruna bir çözüm bulmaktı.

 
Alexey Viktorov :

Seçeneklerin olmadığına inanmıyorum. Koltuk değneklerini koltuk değneklerine programlamayı seviyorsanız, karışmaya hakkım yok. Slava bunu yanıtladı

Belki de önceki derlemede geliştiriciler tarafından izin verilen bir söve kullandınız. Ve şimdi bu sorun çözüldü ve doğru çözümü aramamız gerekiyor.

Her şeyi anlıyorum ve koltuk değneğine ihtiyacım yok. Ve burada bir koltuk değneği aramalıydım, ne için okudum .

Belki. Ama bundan kimsenin şikayet ettiğini hatırlamıyorum.