Bir ticaret robotunu piyasaya sürerken doğrulama hatası. - sayfa 5

 
Bahşiş için teşekkürler, ama bu muhtemelen benim durumum değil. Doğrulayıcım alım satım fonksiyonlarını hiç görmüyor, burada maksimum emir sayısına nereden ulaşabilirim )))
 

İşte şeytan ... Doğrulamayı geçti ve şimdi

ticaret işlemleri yok

artık bir hata değil

Not: Kazara bir atıştı. Sonraki test yine aynı şapka


 
Andrey Kaunov :

Evet bu bir hata değil, nasıl bir oyun anlamadım. Alım satım fonksiyonunun önüne bir koltuk değneği (sıfıra bölerek) koydum :

Ateş ediyor:

Kaldırıyorum, zaten değişmeden veriyor

ticaret işlemleri yok.

Doğrulayıcının bu OrderSend() işlevini yapmasını neyin engellediğini anlamıyorum. Sonuçta, eğer ona ulaşırsa, ayar hataları (hepsini düzeltmiş olmama rağmen) 130, 131, 134, ... olmalı ve " ticaret işlemi yok " değil. Sadece OnInit'e () kaydolmak için kalır, çalışmaması için uzak bir yerde bir tür gecikme ayarlayarak, bununla nasıl başa çıkacağımı bilmiyorum.

Ve bir anlaşma olması gereken koşul kod yürütmeyi içermiyorsa, böyle bir koltuk değneğinin anlamı nedir?

 
Neden dahil değil?! Yakından bak, Alex. OrderSend'den hemen önce koltuk değneğinin de maliyeti vardır.
 
Andrey Kaunov :
Neden dahil değil?! Yakından bak, Alex. OrderSend'den hemen önce koltuk değneğinin de maliyeti vardır.

Doğru şekilde. OrderSend yürütülmezse, kodun yürütülmesi herhangi bir nedenle ona ulaşmaz. Ve en azından blok koşullarında önüne bir şey koyun, giriş yok, yürütme yok, sıfıra bölme bile.

 

Bekle, anlamıyorum. İfade 1 (sıfıra bölme) yürütülürse, sıradaki if ifadesidir. Ve bu, koşullarını kontrol etmek anlamına gelir. Durumu kontrol etmek için OrderSend işlevini çalıştırmanız gerekir, sıfıra böldükten sonra sıradaki olduğu ortaya çıkıyor.

Tanrı onu korusun. Deneyin saflığı için kodu değiştirdim:


Sonuç aynı. Koltuk değneği ile - sıfıra bölme hatası, onsuz yukarıdaki sonucu yayınladım: ticaret işlemi yok.

 
Andrey Kaunov :

Bekle, anlamıyorum. İfade 1 (sıfıra bölme) yürütülürse, sıradaki if ifadesidir. Ve bu, koşullarını kontrol etmek anlamına gelir. Durumu kontrol etmek için OrderSend işlevini çalıştırmanız gerekir, sıfıra böldükten sonra sıradaki olduğu ortaya çıkıyor.

Tanrı onu korusun. Deneyin saflığı için kodu değiştirdim:


Sonuç aynı. Koltuk değneği ile - sıfıra bölme hatası, onsuz yukarıdaki sonucu yayınladım: ticaret işlemi yok.

Kodu boşuna gönderiyorsunuz. Okumak tamamen imkansız. Ve sorun bu kod parçasında değil. Sorun şu ki, bazı giriş parametreleri için bazı koşullar karşılanmıyor ve bununla ilgili bir bildirim yok.

 
Andrey Kaunov :
Neden dahil değil?!

Ve neden piyasaya kendinizden daha kötü yazmaya çalışıyorsunuz?

bu kadar basit - bir sipariş göndermeden önce, "ama hiç gerçekleştirilecek mi?"

limitleri kontrol edin (bu konuda dediler), fonları ve marjı kontrol edin (sizde buna sahip değilsiniz), bir bağlantı olup olmadığına ve ticarete izin verilip verilmediğine bakın.

(isteğe bağlı) ağır hesaplamalar varsa, bu bir günah değildir ve Teklif İsteğini okumadan önce RefreshRates

Burada, kendiniz için tüm bu kontrolleri yapacaksınız. Neden şimdi DEĞİL?

 

Kontrol etmediğimi düşünüyorsun. Parti büyüklüğü ayrı bir fonksiyonda kontrol edilir

 //+------------------------------------------------------------------+
//| Функция нормализации лота                                        |
//+------------------------------------------------------------------+
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();
   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 ; //MathFloor(free/margin/step)*step;
   return (_lot);
}

Burada sınırlara ihtiyaç yoktur, çünkü. Bir ticaret açarken Zarar Durdur ve Kâr Al sıfıra eşittir. RefreshRates(), partiyi hesaplarken verileri günceller. İletişim kontrolleri vb. tabi her girişin önünde değil ama her şeyin anlamı bu değil. OrderSend isteği göndermiş olsaydı, belirli bir hata olurdu: 130, 131, vb. Ama ben buna sahibim

Hiç açık sipariş göndermeye çalışmıyor. Son testte bile OnInit() işlevinden bir kontrol gecikmesi ayarladığımda

 int OnInit () {
  
   int stops_level=( int ) SymbolInfoInteger ( _Symbol , SYMBOL_TRADE_STOPS_LEVEL );
   iTrailStart=inpTrailStart;
   iTrailStart2=inpTrailStart2;
   iTrailStartL=inpTrailStartL;
   //---
   if (stops_level> 0 ) {
       if (inpTrailStart<stops_level+ 3 ) iTrailStart=stops_level+ 3 ;
       if (inpTrailStart2<stops_level+ 3 ) iTrailStart2=stops_level+ 3 ;
       if (inpTrailStartL<stops_level+ 3 ) iTrailStartL=stops_level+ 3 ;
   }
   
   Comment ( "" );
   EventSetMillisecondTimer ( 300 );
   ButtonCreate( "V_5" , 5 , 25 , 50 , 20 , "FLAT" , 9 , clrBlack , C'236,233,235' , clrNONE , false );
   ButtonCreate( "V_7" , 60 , 25 , 50 , 20 , "TREND" , 9 , clrBlack , C'236,233,235' , clrNONE , false );
   ButtonCreate( "Auto" , 115 , 25 , 50 , 20 , "Auto" , 9 , clrBlack , C'236,233,235' , clrNONE , false );
   ObjectCreate ( 0 , "Lot" , OBJ_EDIT , 0 , 0 , 0 );
   ObjectSetInteger ( 0 , "Lot" , OBJPROP_CORNER , CORNER_LEFT_LOWER );
   ObjectSetInteger ( 0 , "Lot" , OBJPROP_XDISTANCE , 115 );
   ObjectSetInteger ( 0 , "Lot" , OBJPROP_YDISTANCE , 50 );
   ObjectSetString ( 0 , "Lot" , OBJPROP_TEXT , "" );
   ObjectSetInteger ( 0 , "Lot" , OBJPROP_ALIGN , ALIGN_RIGHT );
   ObjectSetInteger ( 0 , "Lot" , OBJPROP_FONTSIZE , 9 );
   ObjectSetInteger ( 0 , "Lot" , OBJPROP_COLOR , clrBlack );
   ObjectSetInteger ( 0 , "Lot" , OBJPROP_YSIZE , 20 );
   ButtonCreate( "V_5_buy" , 5 , 50 , 50 , 20 , "BUY" , 9 , clrBlack , C'236,233,235' , clrNONE , false );
   ButtonCreate( "V_5_sell" , 60 , 50 , 50 , 20 , "SELL" , 9 , clrBlack , C'236,233,235' , clrNONE , false ); 
     
   test_ticket= OrderSend ( _Symbol ,OP_BUYLIMIT, SymbolInfoDouble ( _Symbol , SYMBOL_VOLUME_MIN ), _Point , 30 , 0.0 , 0.0 , "NZT-48_test" ,iMagicNumber, 0 , clrNONE );
   
   return ( INIT_SUCCEEDED );
} //-------------------------------------- End OnInit ---------------------------------------- 

Alexey Viktorov :

Kodu boşuna gönderiyorsunuz. Okumak tamamen imkansız. Ve sorun bu kod parçasında değil. Sorun şu ki, bazı giriş parametreleri için bazı koşullar karşılanmıyor ve bununla ilgili bir bildirim yok.

Belki. Ama zaten her şeyi kontrol ettim. Daha nereye kazacağımı bilmiyorum.

 
Andrey Kaunov :

Kontrol etmediğimi düşünüyorsun. Parti büyüklüğü ayrı bir fonksiyonda kontrol edilir

Burada sınırlara ihtiyaç yoktur, çünkü. Bir ticaret açarken Zarar Durdur ve Kâr Al sıfıra eşittir. RefreshRates(), partiyi hesaplarken verileri günceller. İletişim kontrolleri vb. tabi her girişin önünde değil ama her şeyin anlamı bu değil. OrderSend isteği göndermiş olsaydı, belirli bir hata olurdu: 130, 131, vb. Ama ben buna sahibim

Hiç açık sipariş göndermeye çalışmıyor. Son testte bile OnInit() işlevinden bir kontrol gecikmesi ayarladım


Belki. Ama zaten her şeyi kontrol ettim. Daha nereye kazacağımı bilmiyorum.

Danışmanda diğer siparişlerin nasıl yapıldığını görün. Emirleri nerede kapatacak/değiştirecektiniz? Danışmanın sadece ve münhasıran açıldığını düşünmüyorum

açılışta bilet <0 ayarlandı - diğer mantığa bakın, gerçekte buna nasıl tepki verecek

Neden: