İşkence hatası ticaret işlemi yok - sayfa 5

 
Alexey Viktorov :

Yeniden derlendiği için değil, testler farklı bir tarihten başladığı için geçer. Ve böyle bir hata fark ettim, daha önce olanı kaydırırsanız, test gerçekleşmez, ancak önceki test sonucu hemen verilir. Bu yüzden bu tür koltuk değneklerine aldanmayın. Doğru yapmaya çalışın. Bir şey eksikse veya parametreler geçersizse, Yazdır aracılığıyla bildirin, her şey yoluna girecek.

Şimdi, sadece başka bir tarihle ilgili olsaydı, o zaman çeklerim bunu ortaya çıkarırdı (çubuk eksikliği vb.), ama sorun tarih değil. Otomatik doğrulamanın bulduğu hatayı yeniden oluşturmam benim için imkansızsa, o zaman aynı şeyi atlamak ve alıcılardan intikam almanın bir sorun alanı (eğer varsa) bulacağını ummak benim için daha kolay. Bu doğrulama uygulaması, bana hatayı nerede arayacağına dair tam bir anlayış sağlamıyor. Ve Print zaten her yerde bana itildi.

Alexey Viktorov :

Ve böyle bir hata fark ettim, daha önce olanı kaydırırsanız, test gerçekleşmez, ancak önceki test sonucu hemen verilir.

Ve önceki test sonucunu almamak için bir şeyi değiştirmeniz, en azından boş bir satır eklemeniz gerekir (bunu "yeniden derleme" ile kastettim).

 
Roman Gergert :

Sonunda anladım, belki genel olarak baykuşta birisine yardımcı olabilir, MM açıkken sadece minimum lot için bir kontrol yaptım ve hardcore'da lot = 0.01 ayarlandı ve böylece, doğrulayıcıda, depozito 1 dolara eşittir (bu bilgiyi konulardan birinde buldum), sırasıyla ticaret için çok fazla 0.001 (ya da öylesine) kullanıyor ve tek bir yerde her zaman çok fazla 0.01 bulunduğundan, buna göre, o yeterli paraya sahip değildi ve robot ticaret yapmadı)

Aynen, Roman, doğrulayıcı 1 dolarlık depozitoyla test ediyor.

EA'nın çok fazla normalleştirme işlevi vardır. 0 döndürürse, işlem açılmaya bile çalışmaz:

       if ((Auto() && (b== 0 || (b> 0 && BuyPriceMin-Ask>(b== 1 ?iPointOrderStep_1:iPointOrderStep_2)* Point ()))) || buy) {
         BuyLot=buy && LotFromPanel()> 0 ? LotFromPanel() : BuyLot;
         double norm_lot= NormalizeLots( _Symbol ,BuyLot);
         if (norm_lot> 0.0 ) {  
             int ticket= OrderSend ( Symbol (),OP_BUY,norm_lot, NormalizeDouble (Ask, _Digits ), 30 , 0 , 0 ,
                        "NZT- 48 ",iMagicNumber, 0 , clrGreen );
             if (ticket> 0 ) {
                 ObjectSetInteger ( 0 ,"V_5_buy", OBJPROP_STATE , false );
                buy= false ;
            }
             else   
               Print ("Order Send error #", GetLastError ());
         } else Print ("Not enough money for the minimum lot");   
      }

Ancak, lot normalleştirme EA'nın bu fonksiyonunun açılış için lot 0.2'yi nasıl gönderdiği açık değildir:

 //+------------------------------------------------------------------+
//| Функция нормализации лота                                        |
//+------------------------------------------------------------------+
double NormalizeLots( string symbol, double lot, bool is_margin= true ) {
   if (lot<= 0 ) return ( 0.0 );
   RefreshRates();
   double min= SymbolInfoDouble (symbol, SYMBOL_VOLUME_MIN );
   double max= SymbolInfoDouble (symbol, SYMBOL_VOLUME_MAX );
   double step= SymbolInfoDouble (symbol, SYMBOL_VOLUME_STEP ); 
   double free = AccountFreeMargin()* 0.95 ;
   double margin = MarketInfo(symbol,MODE_MARGINREQUIRED);
   double _lot=lot<min?min:(lot>max?max:lot);
          _lot= MathRound (_lot/step)*step;
   if (is_margin && _lot* margin >free)  _lot= 0.0 ;
   return (_lot);
}

Sonuçta, lot 0.2 kontrole gelirse ve günlüklere bakılırsa, marj 645 ise, o zaman ifadenin bu kısmı doğru vermelidir.

 if (is_margin && _lot*margin>free )  _lot= 0.0 ;     // 0.2*645>0.95

Ve işlev 0.0 gönderecek, ancak 0.2 göndermeyecek. 0,2 değeri yalnızca şu durumlarda gönderilebilir:

MarketInfo(symbol,MODE_MARGINREQUIRED);

0 veya ihmal edilebilir bir değer döndürdü. Bu doğrulayıcının nasıl çalıştığını hiç anlamıyorum.

Sevgili MQL geliştiricileri , lütfen kuru üç satırlı doğrulama hata raporları yerine program test günlüklerini gönderin. Biz mütevazi programcılar için kod hatalarını anlamak ve düzeltmek çok daha kolay olacaktır. Postaya bir arşiv gönderebilirsiniz, muhtemelen bir yolunu bulursunuz)))

PS Komik durum. 5. gün, test cihazında ve gerçek hayatta mükemmel çalışan bir danışmanı piyasaya sürmeye çalışıyorum.
 
Andrey Kaunov :

Aynen, Roman, doğrulayıcı 1 dolarlık depozitoyla test ediyor.

EA'nın çok fazla normalleştirme işlevi vardır. 0 döndürürse, işlem açılmaya bile çalışmaz:

Ancak, lot normalleştirme EA'nın bu fonksiyonunun açılış için lot 0.2'yi nasıl gönderdiği açık değildir:

Sonuçta, lot 0.2 kontrole gelirse ve günlüklere bakılırsa, marj 645 ise, o zaman ifadenin bu kısmı doğru vermelidir.

Ve işlev 0.0 gönderecek, ancak 0.2 göndermeyecek. 0,2 değeri yalnızca şu durumlarda gönderilebilir:

0 veya ihmal edilebilir bir değer döndürdü. Bu doğrulayıcının nasıl çalıştığını hiç anlamıyorum.

Sevgili MQL geliştiricileri , lütfen kuru üç satırlı doğrulama hata raporları yerine program test günlüklerini gönderin. Biz mütevazi programcılar için kod hatalarını anlamak ve düzeltmek çok daha kolay olacaktır. Postaya bir arşiv gönderebilirsiniz, muhtemelen bir yolunu bulursunuz)))

PS Komik durum. 5. gün, test cihazında ve gerçek hayatta mükemmel çalışan bir danışmanı piyasaya sürmeye çalışıyorum.

yol boyunca farklı bir kaldıracınız var, piyasadaki gibi değil, belki 1:500

kodda sadece bir satırı değiştirerek lot hesaplamasını 1x100 kaldıraç oranına getirmeye çalışın:

marj = AccountLeverage()*MarketInfo( sembol ,MODE_MARGINREQUIRED)/100.0;

Eh, piyasa için minimum lot bence 0.1....
 

Kendi sınırlı dünyanızda yaşıyorsunuz. Sıradan dünyada, minimum lot 0.01'den çok farklı olabilir.

Tarif: "Hangi kontrollerin geçmesi gerekir ..." makalesini tekrar okuyun ve okuyun

Bir işlem emri göndermeden önce, geçip geçmediğini, yeterli marj olup olmadığını kontrol etmeniz gerekir...


Genel olarak, doğrulayıcı hala ana göreviyle başa çıkıyor: Bitmemiş kodu Market'ten ayıklamak.

 
Renat Akhtyamov :

yol boyunca farklı bir kaldıracınız var, piyasadaki gibi değil, belki 1:500

kodda sadece bir satırı değiştirerek lot hesaplamasını 1x100 kaldıraç oranına getirmeye çalışın:

marj = AccountLeverage()*MarketInfo(symbol,MODE_MARGINREQUIRED)/100.0;

Renat, tavsiyen için teşekkürler, deneyeceğim.

Vladimir Karputov :

Kendi sınırlı dünyanızda yaşıyorsunuz. Sıradan dünyada, minimum lot 0.01'den çok farklı olabilir.

Tarif: "Hangi kontrollerin geçmesi gerekir ..." makalesini tekrar okuyun ve okuyun

İşlem emri göndermeden önce geçip geçmediğini, yeterli marj olup olmadığını kontrol etmeniz gerekir...


Genel olarak, doğrulayıcı hala ana göreviyle başa çıkıyor: Bitmemiş kodu Market'ten ayıklamak.

Vladimir, konuyu yapıcı bir şekilde anlayabiliyor musun?! Partiyi marj ve benzeri şeyler için kontrol etmiyor muyum? "Hangi çekler geçmeli ..." makalesi ile benim için zaten bir İncil gibi. Yukarıda yayınlanan kod parçacıkları. Tam uyumluluk için, makaledeki önerilerinize göre kodu değiştirdim:

 //+------------------------------------------------------------------+
//| Функция нормализации лота                                        |
//+------------------------------------------------------------------+
double NormalizeLots( string symbol, double lot, int direction, bool is_margin= true ) {
   if (lot<= 0 ) return ( 0.0 );
   RefreshRates();
   double min= SymbolInfoDouble (symbol, SYMBOL_VOLUME_MIN );
   double max= SymbolInfoDouble (symbol, SYMBOL_VOLUME_MAX );
   double step= SymbolInfoDouble (symbol, SYMBOL_VOLUME_STEP ); 
   //double free = AccountFreeMargin()*0.95;
   //double margin = MarketInfo(symbol,MODE_MARGINREQUIRED);
   double _lot=lot<min?min:(lot>max?max:lot);
          _lot= MathRound (_lot/step)*step;
   //if(is_margin && _lot*margin>free)  _lot=0.0;
   ResetLastError ();
   if (is_margin && ( AccountFreeMarginCheck( Symbol (),direction,_lot)<= 0 || GetLastError ()== 134 )) _lot= 0.0 ;
   return (_lot);
}

Ama yine de "takas yok" alıyorum:

Eh, işlev her zaman çok fazla 0.0 gönderiyorsa ve böylece anlaşmaların açılmasını engelliyorsa, minimum lotu gönderecek şekilde değiştiririm:

 //+------------------------------------------------------------------+
//| Функция нормализации лота                                        |
//+------------------------------------------------------------------+
double NormalizeLots( string symbol, double lot, int direction, bool is_margin= true ) {
   if (lot<= 0 ) return ( 0.0 );
   RefreshRates();
   double min= SymbolInfoDouble (symbol, SYMBOL_VOLUME_MIN );
   double max= SymbolInfoDouble (symbol, SYMBOL_VOLUME_MAX );
   double step= SymbolInfoDouble (symbol, SYMBOL_VOLUME_STEP ); 
   //double free = AccountFreeMargin()*0.95;
   //double margin = MarketInfo(symbol,MODE_MARGINREQUIRED);
   double _lot=lot<min?min:(lot>max?max:lot);
          _lot= MathRound (_lot/step)*step;
   //if(is_margin && _lot*margin>free)  _lot=0.0;
   ResetLastError ();
   if (is_margin && (AccountFreeMarginCheck( Symbol (),direction,_lot)<= 0 || GetLastError ()== 134 )) _lot= min ;
   return (_lot);
}

Ve işlemlerin devam ettiğine dair bir hikaye alıyorum (aşağıdaki ekran görüntülerine bakın). Ancak minimum lot elbette çok garip, ama gelsin. Ama anlaşmalar var!

Bu durumda, doğrulayıcı çok garip davranır ve 1 $ depozito ile minimum 0,2 lot yapar.


Doğal olarak, bu yaklaşımla anlaşma olmayacak! Ve bu tamamen yeterli kodla. Bu arada, test için göstergeler vb. için tüm koşulları kaldırdım. Danışmanın göreve başlamasından hemen sonra işlemler açılmaya başlar.

Vladimir Karputov :

...

Genel olarak, doğrulayıcı hala ana göreviyle başa çıkıyor: Bitmemiş kodu Market'ten ayıklamak.

Peki bir doğrulayıcı ne yapar?! Şimdiye kadar sadece programcıların beynini patlatmak için görüyorum!

Doğrulayıcıdaki bir şeyi değiştirmenizi istemediğimi unutmayın. Sadece test günlüklerini görebiliriz. Daha sonra testlerin hangi parametrelerle, hangi mevduatlar üzerinde geçtiği netleşecektir. Sonunda, baskılar en azından koddaki hatanın nerede olduğunu izleyebilir ve hızlı bir şekilde düzeltebilir. Parmağınızı bir hafta boyunca gökyüzüne doğrultmak yerine, yalnızca hatayı lokalize etmeye çalışın. Birbirimize karşı çalışmıyoruz! Anlıyorum, birlikte bir şeyler kazanmaya çalışıyoruz.

 
Andrey Kaunov :

... Birbirimize karşı çalışmıyoruz! Anlıyorum, birlikte bir şeyler kazanmaya çalışıyoruz.

Andrey, hafta sonu bir şekilde askıda kalmış bir sunucuyla karşılaştım.

yani, aptalca MarketInfo'yu yemedi (...)

bunu zar zor kazandı

bu nedenle, piyasanın yutamayacağını anlarsanız, geriye doğrulayıcının yemin etmemesini nasıl sağlayacağınızı düşünmek kalır.

Örneğin, soruyorum - hangi omuz?

0(sıfır) diyor

Kodu ekliyorum - 0'a eşitse 100

Mantık açıksa, her şey yoluna girecek ve iyi şanslar!

 

Anlaşıldı, Renat, teşekkürler.

Zaten bir sürü koltuk değneği kurdum, ancak bazı yerlerde açıkçası bir çıkmazdayım. Ve sonuçta, yeterli kodun yeterli kontrolden geçmesi arzu edilir. Ayrıca, test günlüklerinin yokluğunda bir sorun bulmak imkansız değil, son derece emek yoğun.

Doğrulayıcının yükseltme yapması muhtemelen iyi olurdu. Benzer sorunlarla karşılaşan tek kişi ben değilim.

 
Andrey Kaunov :

Anlaşıldı, Renat, teşekkürler.

Zaten bir sürü koltuk değneği kurdum, ancak bazı yerlerde açıkçası bir çıkmazdayım. Ve sonuçta, yeterli kodun yeterli kontrolden geçmesi arzu edilir. Ayrıca, test günlüklerinin yokluğunda bir sorun bulmak imkansız değil, son derece emek yoğun.

Doğrulayıcının yükseltme yapması muhtemelen iyi olurdu. Benzer sorunlarla karşılaşan tek kişi ben değilim.

Evet, bu sorunla karşılaşan tek kişi sen değilsin, sonraki dalda başka biri karşılaştı - zaten ikiniz var.

Ayrıca günde kaç danışmanın sorunsuz bir şekilde piyasaya sürüldüğüne bakın, buna "Profesyonellik Düzeyi" denir.

 

Vitaly, sen ve diğer "profesyoneller" ilk seferde doğrulamayı geçmeyi başarırsanız, sadece alkışlayabilirim. Ancak benzer bir problemde iki daldan çok daha fazlası var. Ayrıca, herkes yazmaz, bazıları sadece okur. Danışman, bu arada, benim değil. Bir müşteri için pazara hazırlıyorum. Ancak bu, yukarıdaki sorunları ortadan kaldırmaz. Yazımı dikkatlice okursanız, belki bir "profesyonel" olarak soruna bir çözüm önerin. "Sen aptalsın, ama ben akıllıyım" gibi bir gönderi düzenleyin - çok fazla bilgiye ihtiyacınız yok.

İşte size başka bir sorun. Doğrulayıcı neden, OnTick()'in başına minimum lot ile 5 dakika içinde 5 işlemin koşulsuz sıralı açılmasını ekleyerek bana şunu da veriyor: " ticaret işlemi yok "

 void OnTick () { 
   static int test_ticket[ 2 ]={ 0 , 0 };
   if (test_ticket[ 1 ]< 5 && test_ticket[ 0 ]== 0 ) {
      test_ticket[ 0 ]= OrderSend ( _Symbol ,OP_BUY, SymbolInfoDouble ( _Symbol , SYMBOL_VOLUME_MIN ), NormalizeDouble (Ask, _Digits ), 30 , 0.0 , 0.0 , "NZT-48_test" , 33333 , 0 , clrNONE );
       if (test_ticket[ 0 ]> 0 ) test_ticket[ 1 ]++;
   }   
   if ( OrderSelect (test_ticket[ 0 ],SELECT_BY_TICKET))
       if (OrderCloseTime()== 0 && OrderOpenTime()+ 300 < TimeCurrent ())
         if (OrderClose(test_ticket[ 0 ], NormalizeDouble (OrderLots(), 2 ), NormalizeDouble (Bid, _Digits ), 30 , clrNONE )) {
             printf ( "Test order closed, ticket #%d" ,test_ticket[ 0 ]);
            test_ticket[ 0 ]= 0 ;
         }   
...
}
 
Andrey Kaunov :

Vitaly, sen ve diğer "profesyoneller" ilk seferde doğrulamayı geçmeyi başarırsanız, sadece alkışlayabilirim. Ancak benzer bir problemde iki daldan çok daha fazlası var. Ayrıca, herkes yazmaz, bazıları sadece okur. Danışman, bu arada, benim değil. Bir müşteri için pazara hazırlıyorum. Ancak bu, yukarıdaki sorunları ortadan kaldırmaz. Yazımı dikkatlice okursanız, belki bir "profesyonel" olarak soruna bir çözüm önerin. "Sen aptalsın, ama ben akıllıyım" gibi bir gönderi düzenleyin - çok fazla bilgiye ihtiyacınız yok.

İşte size başka bir sorun. Doğrulayıcı neden, OnTick()'in başına minimum lot ile 5 dakika içinde 5 işlemin koşulsuz sıralı açılmasını ekleyerek bana şunu da veriyor: " ticaret işlemi yok "

ve önce doğrulayıcının tam yanıtını buraya koyarsınız

ve neden doğrulayıcının biletleri sizin belirlediğiniz prensibe göre tahsis etmesine karar verdiniz?

5 fırsat açmak için açık fırsatları saymanız ve biletler için endişelenmemeniz gerekir.
Neden: