MT4'ten MT5'e aktarma sorunu. Veya daha doğrusu, MT5'te bazı algoritmaların hatasız yürütülmesinin imkansızlığı. - sayfa 9

 
Vict :

Evet, istisnalar dışında, kod çok daha basit ve temizdir, sürekli hata kontrolü onu bir ayak örtüsüne dönüştürür. Ancak mikrolitrede ve istisnasız olarak şaft sorunları. Geliştiriciler haçları çekmedi.

Ve bence, hiçbir fark yok.

Dönüş kodlarıyla - RETURN_IF_BAD_RESULT () gibi bir makro yazmanız ve sonuç döndüren tüm işlevlere sokmanız gerekir.

İstisnalar dışında - TRY-CACTH bölümleri yazmanız gerekir. Artı - hangi işlevlerin bir istisna attığını, hangilerinin atmadığını hatırlayın, koda yorum ekleyin // istisna

Bir şey - bir ayak örtüsü, bir şey ...

 
Vict :

Evet, istisnalar dışında, kod çok daha basit ve temizdir, sürekli hata kontrolü onu bir ayak örtüsüne dönüştürür. Ancak mikrolitrelerde ve istisnasız olarak şaft sorunları. Geliştiriciler haçları çekmedi.

hayır, istisnalar hakkında kekeme bile değilim ... bir seçenek olarak, dizinin ötesindeki tüm çıkışları istisnalara saracak bir “kötü pinokyo” var)))

IMHO, sadece işletim sistemine bir çıkışla tüm geri dönüşü kesme yeteneğine ihtiyacınız var ... tüm işlev çağrılarını sürekli olarak sarmak mantıklı değil

 void OnStart ()
{
if (!MyFuncReadOHLC_1()) return ;
if (!MyFuncReadOHLC_2()) return ;
....
}
 
Georgiy Merts :

Ve bence, hiçbir fark yok.

Dönüş kodlarıyla - RETURN_IF_BAD_RESULT () gibi bir makro yazmanız ve sonuç döndüren tüm işlevlere sokmanız gerekir.

İstisnalar dışında - TRY-CACTH bölümleri yazmanız gerekir. Artı - hangi işlevlerin bir istisna attığını, hangilerinin atmadığını hatırlayın, koda yorum ekleyin // istisna

Bir şey - bir ayak örtüsü, bir şey ...

İstisnalar dışında hiçbir şeyi hatırlamama gerek yok, çoğu zaman TRY-CACTH'ye bile ihtiyacım yok (program anormal bir şekilde bitecek), bu İSTİSNAİ bir durum ve normalde olmuyor, dönmene gerek yok if-else bloklarına dönüştürün. Örneğin - burada kendim için bir vektörün bir benzerini (acıklı bir görünüş) yazdım, başarısız tahsisler için bir istisna atmak yerine, bir operatörü vidalamak zorunda kaldım! ve her ekleme ile seğirmesi (bunun umurumda olmamasına rağmen) şüpheli bir faydadır.

 
Igor Makanu :

IMHO, sadece işletim sistemine bir çıkışla tüm geri dönüşü kesme yeteneğine ihtiyacınız var ...

Evet, ayrıca hiçbir şey, bunun olmaması garip ...

 
Vict :

Evet, ayrıca hiçbir şey, bunun olmaması garip ...

Okunabilir kodlu kısa programları bir tür canavara dönüştürmek benim için uygun değil, işte MQL4 için tipik bir şablon - "yeni çubuğu" kontrol ettik, göstergeleri kontrol ettik - siparişlerle çalışıyoruz veya çalışmıyoruz:

 void OnTick ()
  {
   int takeprofit,stoploss; 
   double lot;
   ENUM_CMD CMD1,CMD2,CMD3;
   CMD1 = ind1();
   CMD2 = ind2();
   CMD3 = ind3();
   if (NewBar())
     {
      DeleteOrdersLimits(Magic);
       if (CMD1==CMD_BUY && CMD2==CMD_BUY && CMD3==CMD_BUY)
        {
         CalcTakeProfitStopLoss(takeprofit,stoploss);
         lot=CalcLot(stoploss);
         if (ReversSignal)SELL_STOP_PR(Low[ 1 ],lot,Magic,stoploss,takeprofit); else BUY_STOP_PR(High[ 1 ],lot,Magic,stoploss,takeprofit);
        }
       if (CMD1==CMD_SELL && CMD2==CMD_SELL && CMD3==CMD_SELL)
        {
         CalcTakeProfitStopLoss(takeprofit,stoploss);
         lot=CalcLot(stoploss);
         if (ReversSignal)BUY_STOP_PR(High[ 1 ],lot,Magic,stoploss,takeprofit); else SELL_STOP_PR(Low[ 1 ],lot,Magic,stoploss,takeprofit);
        }
     }
  }
//+------------------------------------------------------------------+

bu örnekte, göstergeler "her keneyi çek" çünkü. farklı TF'ler üzerinde çalışıyorlar ... genel olarak, önemli değil

OHLC verilerini ind1(), ind2(), ind3() ve NewBar() içinde kullanıyorum

birişlev çağrısında bir zaman serisi erişim hatası alırsam, bu kodu yürütmeye devam etmenin anlamı nedir? - işletim sistemine çıkmanız ve yeni bir onay işareti beklemeniz gerekir, yani. herhangi bir ind1(), ind2(), ind3() ve NewBar() içinde GetLastError()'u kontrol ediyorum ve EA günlüğüne yazarken işletim sisteminde hemen Exit() hatası alıyorum

 
Vict :

İstisnalar dışında hiçbir şeyi hatırlamama gerek yok, çoğu zaman TRY-CACTH'ye bile ihtiyacım yok (program anormal bir şekilde bitecek), bu İSTİSNAİ bir durum ve normalde olmuyor, onları dönüştürmeye gerek yok if-else blokları. Örneğin - burada kendim için bir vektörün bir benzerini (acıklı bir görünüş) yazdım, başarısız tahsisler için bir istisna atmak yerine, bir operatörü vidalamak zorunda kaldım! ve her ekleme ile seğirmesi (bunun umurumda olmamasına rağmen) şüpheli bir faydadır.

Hadi dostum...

"Hiçbir şeyi hatırlamana gerek yok" dersin ve DERHAL devam edersin - SIKLIKLA DENEYİN-YAKALAMA bile gerekli değildir. Aynı "sıklıkla", bir yerde bir bloğa ihtiyaç duyulduğu, ancak bir yerde buna gerek olmadığı ve bunu hatırlamanız gerektiği anlamına gelir. Durum, dönüş kodlarıyla tamamen aynıdır - bir kaynak istendiyse ve bir istisna oluştuysa (bir hata döndürüldü), kaynaklar atılmalıdır. Yani, her durumda, hangi işlevin bir istisna attığını ve hangilerinin atmadığını hatırlamanız gerekir.

Evet ve "istisnai durum" hakkında ... Peki, nasıl desek ... Alıntıların olmaması - bir istisna atmak için tamamen makul bir neden gibi görünüyor, ama gerçekten "istisnai bir durum" mu?

 
Igor Makanu :

Okunabilir kodlu kısa programları bir tür canavara dönüştürmek benim için uygun değil, işte MQL4 için tipik bir şablon - "yeni çubuğu" kontrol ettik, göstergeleri kontrol ettik - siparişlerle çalışıyoruz veya çalışmıyoruz:

bu örnekte, göstergeler "her keneyi çek" çünkü. farklı TF'ler üzerinde çalışıyorlar ... genel olarak, önemli değil

OHLC verilerini ind1(), ind2(), ind3() ve NewBar() içinde kullanıyorum

birişlev çağrısında bir zaman serisi erişim hatası alırsam, bu kodu yürütmeye devam etmenin anlamı nedir? - işletim sistemine çıkmanız ve yeni bir onay işareti beklemeniz gerekir, yani. herhangi bir ind1(), ind2(), ind3() ve NewBar() içinde GetLastError()'u kontrol ediyorum ve EA günlüğüne yazarken işletim sisteminde hemen Exit() hatası alıyorum

return(iErrrCode) çağrısının sorunu nedir?

 
Georgiy Merts :

return(iErrrCode) çağrısının sorunu nedir?

hmm, kodda göstermeye çalışacağım, OHLC verilerinin yanlış işlenmesi durumunda kodu çıktı ile yeniden yazdım, şöyle bir şey olacak:

 void OnTick ()
  {
   int takeprofit,stoploss; 
   double lot;
   bool nb;
   ENUM_CMD CMD1,CMD2,CMD3;
   if (!ind1( CMD1 )) return ;
   if (!ind2( CMD2 )) return ;
   if (!ind3( CMD3 )) return ;
   if (!NewBar( nb )) return ;
   
   if ( nb )
     {
      DeleteOrdersLimits(Magic);
       if (CMD1==CMD_BUY && CMD2==CMD_BUY && CMD3==CMD_BUY)
        {
         CalcTakeProfitStopLoss(takeprofit,stoploss);
         lot=CalcLot(stoploss);
         if (ReversSignal)SELL_STOP_PR(Low[ 1 ],lot,Magic,stoploss,takeprofit); else BUY_STOP_PR(High[ 1 ],lot,Magic,stoploss,takeprofit);
        }
       if (CMD1==CMD_SELL && CMD2==CMD_SELL && CMD3==CMD_SELL)
        {
         CalcTakeProfitStopLoss(takeprofit,stoploss);
         lot=CalcLot(stoploss);
         if (ReversSignal)BUY_STOP_PR(High[ 1 ],lot,Magic,stoploss,takeprofit); else SELL_STOP_PR(Low[ 1 ],lot,Magic,stoploss,takeprofit);
        }
     }
  }

şimdi fonksiyon değerlerini bağlantıdan alıyorum ve fonksiyon yanlış işlenmişse çıkıyorum (tartışma bağlamında - terminal zaman dilimlerinde geçmiş verileri hazırlamadı)

 
Georgiy Merts :

Hadi dostum...

"Hiçbir şeyi hatırlamana gerek yok" dersin ve DERHAL devam edersin - SIKLIKLA DENEYİN-YAKALAMA bile gerekli değildir. Aynı "sıklıkla", bir yerde bir bloğa ihtiyaç duyulduğu, ancak bir yerde buna gerek olmadığı ve bunu hatırlamanız gerektiği anlamına gelir. Durum, dönüş kodlarıyla tamamen aynıdır - bir kaynak istendiyse ve bir istisna oluştuysa (bir hata döndürüldü), kaynaklar atılmalıdır. Yani, her durumda, hangi işlevin bir istisna attığını ve hangilerinin atmadığını hatırlamanız gerekir.

Evet ve "istisnai durum" hakkında ... Peki, nasıl desek ... Alıntıların olmaması - bir istisna atmak için tamamen makul bir neden gibi görünüyor, ama gerçekten "istisnai bir durum" mu?

İstisnaları bir şekilde kendi yolunda kullandın, yanlış, görünüşe göre. Genel olarak, bu işlevin bir istisna atıp atmadığı konusunda endişelenmenize gerek yok mu? TRY-CATCH'in varlığı isteğe bağlıdır. Ve kaynaklarla ilgili sorunlardan kaçınmak için, ana RAII https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%BB%BB%D1%83%D1%87%D0%B5%D0%BD% D0%B8%D0%B5_%D1%80%D0%B5%D1%81%D1%83%D1%80%D1%81%D0%B0_%D0%B5%D1%81%D1%82%D1% 8C_%D0%B8%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8% D1%8F , yığın çözme her şeyi kendi kendine temizleyecektir.

Evet ve "istisnai durum" hakkında ... Peki, nasıl desek ... Alıntıların olmaması - bir istisna atmak için tamamen makul bir neden gibi görünüyor, ama gerçekten "istisnai bir durum" mu?
İstisnailik, kod yazarının takdirindedir, ancak bir istisna, elbette, if-else'nin bir analogu haline gelmemelidir.
 

Garip, ama daha önce yapmayı düşünmedim:

 // Немедленное завершение, деструкторы не вызываются
void abort() { Alert ( 1 /( uint ) MathAbs ( 0 ));}

Bellek ayırma gibi birçok hata kontrolünden kurtulur.

Neden: