Hata #130 geçersiz stoploss ile ilgili Yardıma ihtiyacınız var - sayfa 4

 
Raptor'u fark ettiğiniz için teşekkürler.
DoubleRound işlevimi MODE_TICKSIZE (0,25) yerine MODE_TICKVALUE (12.50 olan) ile çağırdım.

Düzelttim ama 130 numaranın kaybolmasına neden olmadı

   if ( long )
      SL = MarketInfo ( Symbol (), MODE_BID) - (stoploss * MarketInfo ( Symbol (), MODE_POINT));
   else
      SL = MarketInfo ( Symbol (), MODE_ASK) + (stoploss * MarketInfo ( Symbol (), MODE_POINT));
   Log( "SL: " + SL);   
   //round to nearest Tickvalue   
   SL = DoubleRound(SL, MarketInfo ( Symbol (), MODE_TICKSIZE));
   Log( "SL rounded: " + SL);

Güncellenmiş DoubleRound satırındaki hatanın günlüğü:

 #ESZ1,M5: loaded successfully 
#ESZ1,M5: Date: 2011/11/16 21:54
#ESZ1,M5: Symbol: #ESZ1
#ESZ1,M5: Depot: 56127.45000000
#ESZ1,M5: Stop Level [Points]: 75.00000000
#ESZ1,M5: Freeze Level [Points]: 0.00000000
#ESZ1,M5: Spread [Points]: 25.00000000
#ESZ1,M5: Min/Max Lot: 0.01000000/1000.00000000
#ESZ1,M5: Point: 0.01000000
#ESZ1,M5: Tick Size: 0.25000000
#ESZ1,M5: Tick Value: 12.50000000
#ESZ1,M5: Digits: 2.00000000
#ESZ1,M5: Contract: 2011.09.14 00:00-2011.12.16 23:59
#ESZ1,M5: Expert ID: 35698390 
#ESZ1,M5: Init successfully completed.
#ESZ1,M5: initialized

#ESZ1,M5: Opening Position: Short
#ESZ1,M5: pos size: 1.00000000
#ESZ1,M5: Ask/Bid 1251.00000000/1250.75000000
#ESZ1,M5: Spread 0.25000000
#ESZ1,M5: open #13719226 sell 1.00 #ESZ1 at 1250.75 ok
#ESZ1,M5: Order 13719226 Successfully Opened
#ESZ1,M5: Stoplevel: 75.00000000
#ESZ1,M5: Freezelevel: 0.00000000
#ESZ1,M5: stoploss: 100.00000000
#ESZ1,M5: SL: 1252.00000000
#ESZ1,M5: SL rounded: 1252.00000000
#ESZ1,M5: error=130

karşılaştırma için, çalıştığı yerde bir günlük:

 #ESZ1,M5: Opening Position: Long
#ESZ1,M5: pos size: 1.00000000
#ESZ1,M5: Ask/Bid 1249.25000000/1249.00000000
#ESZ1,M5: Spread 0.25000000
#ESZ1,M5: open #13719321 buy 1.00 #ESZ1 at 1249.25 ok 
#ESZ1,M5: Order 13719321 Successfully Opened 
#ESZ1,M5: Stoplevel: 75.00000000
#ESZ1,M5: Freezelevel: 0.00000000
#ESZ1,M5: stoploss: 100.00000000
#ESZ1,M5: SL: 1248.00000000
#ESZ1,M5: SL rounded: 1248.00000000
#ESZ1,M5: modify #13719321 buy 1.00 #ESZ1 at 1249.25 sl: 1248.00 tp: 0.00 ok 
#ESZ1,M5: Stoploss successfully set

her durumda, artık daha sık işe yarayacak gibi görünüyor, kesinlikle yaklaşıyoruz. :)
 
shinobi :

her durumda, artık daha sık işe yarayacak gibi görünüyor, kesinlikle yaklaşıyoruz. :)

Bu Modify'ın neden başarısız olduğunu anlayamıyorum. . . OrderSend ve OrderModify arasında yeni bir Teklif/Soruşturma alıyor musunuz?

Şimdi önerebileceğim tek şey, 130 hatası aldığınızda. . . her şeyi yeniden yazdırın, Teklif Ver, Sor (MarketInfo kullanarak), OOP, StopLevel, ayarlamaya çalıştığınız SL, vb.

 
shinobi :
DoubleRound işlevimi MODE_TICKSIZE (0,25) yerine MODE_TICKVALUE (12.50 olan) ile çağırdım.
Tik değeri kesinlikle yanlıştır. Bunun yerine ticksize ile deneyin:
 double DoubleRound( double number, double step){
   return ( MathRound (number/step)*step );
}
 
Sevgili Raptor, WHRoeder ve SDC,

#130 stoploss hatası artık görünmüyor. Son adımlar sorunu nihayet çözmüş gibi görünüyordu.
Bundan sonra atılan tüm adımları özetleyen başka bir gönderi yayınlayacağım. Bu yüzden forumda Hata #130 ile mücadele eden diğerleri bu konuyu referans olarak kullanabilir.


Devam eden yardımlarınız için teşekkürler :).

şinobi
 
shinobi :

Devam eden yardımlarınız için teşekkürler :).

şinobi
Buna bağlı kalman iyi oldu. . her zaman bir açıklama vardır, sadece bazen onu bulmak zor olabilir.
 
Hata #130'un olası nedenleri için referans: geçersiz stoploss.
  1. Genel ipuçları
  2. ECN Aracısı
  3. 4/5 Haneli Broker
  4. Değişen Piyasa Oranları
  5. Yayılmış
  6. Seviyeyi Durdur
  7. Donma Seviyesi
  8. işaret boyutu
  9. Tam Örnek
  10. Teşekkür
  1. Genel ipuçları
    Hatalarla mücadele için en önemli teknik aşırı günlük kaydıdır. Hataya uzaktan bağlanabilecek her şey için çıktı alın. Açıp kapatabileceğiniz bir log fonksiyonu tanımlarsanız, sorunu çözdükten sonra kodu saklayabilirsiniz.
    Uzman danışmanınızı başlatırken MarketInfo'nun size söyleyebileceği tüm bilgileri günlüğe kaydetmelisiniz: https://docs.mql4.com/constants/marketinfo
    Ayrıca her zaman fonksiyonların dönüş değerlerini kontrol ettiğinizden emin olun, örneğin OrderModify için:
     if (! OrderSelect (ticket, SELECT_BY_TICKET)) {
           int error_code = GetLastError ();
           Print ( "Error: " + ErrorDescription(error_code));
           return (- 1 );
    }  


  2. ECN Aracısı
    ECN Broker, alım/satım ve stoploss/takeprofit için ayrı siparişler vermenizi gerektirir. Bu nedenle, kodunuzu aşağıdaki gibi iki sıraya ayırmanız gerekir:
     int ticket = OrderSend ( Symbol (), OP_BUY, 1 , MarketInfo ( Symbol (), MODE_ASK), 2 , 0 , 0 , "" , 12345 );
    OrderSelect (ticket, SELECT_BY_TICKET);
    entry_price = OrderOpenPrice ();
    OrderModify (ticket, entry_price, stoploss, takeprofit, 0 );
    
    Satış emirleri için OP_BUY'u OP_SELL ile değiştirmeniz gerekir. Ayrıca OrderSelect ve OrderModify'ın dönüş değerlerini de kontrol etmelisiniz (yukarıdaki Genel İpuçlarına bakın).

  3. 4/5 Haneli Broker
    Bazı Brokerler stoploss, takeprofit ve slipajın 4/5 haneye ayarlanmasını talep eder. Bunu, aşağıdaki kodu init() işlevinize (thx WHRoeder) koyarak yapabilirsiniz:
     int      pips2points;     // slippage  3 pips    3=points    30=points
    double   pips2dbl;       // Stoploss 15 pips    0.0015      0.00150
    int      Digits .pips;     // DoubleToStr(dbl/pips2dbl, Digits.pips)
    
    //init digit adjustment
    if ( Digits % 2 == 1 ) {       // DE30=1/JPY=3/EURUSD=5 forum.mql4.com/43064#515262
        pips2dbl    = Point * 10 ; pips2points = 10 ;   Digits .pips = 1 ;
    } else {
        pips2dbl    = Point ;    pips2points =   1 ;   Digits .pips = 0 ; 
    }
    Ardından, Broker'a göndermeden önce stoploss, takeprofit ve slippage'i pips2db1 ile çarpmanız gerekir.
     OrderModify ( ticket , entry_price, stoploss * pips2points, takeprofit * pips2points, 0);

  4. Değişen Piyasa Oranları
    Diğer bir olası neden ise, Uzman Danışman (EA) tarafından etkinleştirilen onay işareti ile EA OrderSend() veya OrderModify()'ın çalıştırılması arasında piyasa oranlarının değişmesidir. Bu sorunu önlemek için iki olası çözüm vardır:
    İlki, Sor ve Bid gibi önceden tanımlanmış piyasa değişkenlerini kullanmadan önce RefreshRates() işlevini kullanmaktır. (tık EA'yı etkinleştirdiğinde bu değişkenler değerlerini alır)
    İkincisi, önceden tanımlanmış piyasa değişkenlerini hiç kullanmamaktır. Bunun yerine MarketInfo() ile mevcut piyasa değerlerini kullanabilirsiniz. Sor, Bid ve Point kullanımı yerine
     MarketInfo ( Symbol (), MODE_ASK)
    MarketInfo ( Symbol (), MODE_BID)
    MarketInfo ( Symbol (), MODE_POINT)
    

  5. Yayılmış
    Stoploss veya kar al giriş fiyatına çok yakınsa, emir reddedilecektir. Bu sorunu yaşamamak için Ask ve Bid arasındaki mevcut farkı hesaba katmalısınız. Yine iki çözüm var:
    Birincisi, spread'i hesaplamak ve onu stoploss/takeprofit'inize eklemek/çıkarmaktır.
     double spread = MarketInfo ( Symbol (), MODE_ASK) - MarketInfo ( Symbol (), MODE_BID);
    //buy
    stoploss = stoploss - spread;
    takeprofit = takeprofit + spread;
    //sell
    stoploss = stoploss + spread;
    takeprofit = takeprofit - spread;
    Stoploss veya kar alma hesaplanırken Ask ve Bid kullanarak spread'i dolaylı olarak hesaba katan ikinci çözüm:
     stoploss = 50
    takeprofit = 50
    //buy
    SL = MarketInfo ( Symbol (), MODE_BID) - (stoploss * MarketInfo(Symbol(), MODE_POINT))
    TP = MarketInfo ( Symbol (), MODE_ASK) + (takeprofit * MarketInfo(Symbol(), MODE_POINT))
    //sell
    SL = MarketInfo ( Symbol (), MODE_ASK) + (stoploss * MarketInfo(Symbol(), MODE_POINT))
    TP = MarketInfo ( Symbol (), MODE_BID) -  (takeprofit * MarketInfo(Symbol(), MODE_POINT))

  6. Seviyeyi Durdur
    Brokerların belirli bir durma seviyesi vardır. Stoploss'unuz bu seviyenin altındaysa siparişiniz reddedilecektir. MarketInfo(Symbol(), MODE_STOPLEVEL) ile durma seviyesini kontrol edebilirsiniz.
    Bunu önlemek için stoploss'unuzu aracının durma düzeyine göre kontrol edin ve gerekirse ayarlayın:
     double stoplevel = MarketInfo ( Symbol (), MODE_STOPLEVEL);
    if (stoploss < stoplevel)
       stoploss = stoplevel + 1 ;

  7. Donma Seviyesi
    Donma Seviyesi benzer bir kavramdır. Stoploss'unuzun ayrıca aracının donma seviyesinden daha büyük olması gerekir. Dondurma seviyesini MarketInfo(Symbol(), MODE_FREEZELEVEL) ile kontrol edebilirsiniz.
    Bunu önlemek için, stoploss'unuzu aracının donma düzeyine göre tekrar kontrol edin:
     double freezelevel = MarketInfo ( Symbol (), MODE_FREEZELEVEL);
    if (stoploss < freezelevel)
       stoploss = freezelevel + 1 ;

  8. işaret boyutu
    Son olarak, Stoploss veya Takeprofit'iniz reddedilebilir, çünkü Sembol yalnızca, tık boyutuyla eşleşen stoploss/getprofit'i destekler. Tik boyutu, sembolün ödülünün yukarı ve aşağı gidebileceği minimum mesafedir. Örneğin, fiyat 1000 ise ve işaret boyutu 0,25 ise, fiyat yalnızca 0,25'in katı kadar artabilir veya azalabilir (0,25 * n, burada n bir doğal sayıdır). Yani fiyat 0,25'ten 1000,25'e yükselebilir veya 1,75'ten 998,25'e düşebilir.
    Ticksize'ı hesaba katmak için, çift değerleri belirli bir adım değerine (örneğin en yakın 0.25'e) yuvarlayacak bir fonksiyona ihtiyacınız vardır. İşte böyle bir işlev:
     double DoubleRound( double number, double step)
    {
         double mod = MathMod (number, step);
         if (mod < step/ 2.0 )
          step = 0 ;
         double rounded = number - mod + step;
         return (rounded);
    }
    Örneğin, DoubleRound'u sayı = 1023.81234 ve adım = 0.25 ile çağırmak 1023.75 döndürür. 1023.967834 ile çağırmak 1024.00 döndürür
    Şimdi stoploss veya kar alma göndermeden önce, aşağıdakilerle Sembolün işaret boyutuna yuvarlayın:
    stoploss = (stoploss, MarketInfo ( Symbol (), MODE_TICKSIZE));
    takeprofit = (takeprofit, MarketInfo ( Symbol (), MODE_TICKSIZE));

  9. Tam Örnek
    Yukarıdaki tüm karşı önlemleri dikkate alan eksiksiz bir küçük örnek:
     int init()
    {
         //for 4/5 Digits-Broker adjustment
         int      pips2points;     // slippage  3 pips    3=points    30=points
         double   pips2dbl;       // Stoploss 15 pips    0.0015      0.00150
         int      Digits .pips;     // DoubleToStr(dbl/pips2dbl, Digits.pips)
    
       //init digit adjustment
       if ( Digits % 2 == 1 ) {       // DE30=1/JPY=3/EURUSD=5 forum.mql4.com/43064#515262
                   pips2dbl    = Point * 10 ; pips2points = 10 ;   Digits .pips = 1 ;
       } else {
                   pips2dbl    = Point ;    pips2points =   1 ;   Digits .pips = 0 ; 
       }
    
       Print ( "Date: " + Year () + "/" + Month () + "/" + Day() + " " + Hour () + ":" + Minute ());
       Print ( "Symbol: " + Symbol ());
       Print ( "Depot: " + AccountBalance ());
       Print ( "Stop Level [Points]: " + MarketInfo ( Symbol (), MODE_STOPLEVEL));
       Print ( "Freeze Level [Points]: " + MarketInfo ( Symbol (), MODE_FREEZELEVEL));
       Print ( "Spread [Points]: " + MarketInfo ( Symbol (), MODE_SPREAD));
       Print ( "Min/Max Lot: " + MarketInfo ( Symbol (), MODE_MINLOT) + "/" + MarketInfo ( Symbol (), MODE_MAXLOT));
       Print ( "Point: " + MarketInfo ( Symbol (), MODE_POINT));
       Print ( "Tick Size: " + MarketInfo ( Symbol (), MODE_TICKSIZE));
       Print ( "Tick Value: " + MarketInfo ( Symbol (), MODE_TICKVALUE));
       Print ( "Digits: " + MarketInfo ( Symbol (), MODE_DIGITS));
       Print ( "Contract: " + TimeToStr ( MarketInfo ( Symbol (), MODE_STARTING)) + "-" + TimeToStr ( MarketInfo ( Symbol (), MODE_EXPIRATION)));
    }
    
    //long = true: buy; long = false: sell
    int take_position( bool long )
    {
       int stoploss = 50 ;
       double SL = 0.0 ;
       int ticket = - 1 ;
       
       //send order
       if ( long )   //buy
          ticket = OrderSend ( Symbol (), OP_BUY, 1 , MarketInfo ( Symbol (), MODE_ASK), 2 , 0 , 0 , "" , 1234 );  
       else        //sell
          ticket = OrderSend ( Symbol (), OP_SELL, 1 , MarketInfo ( Symbol (), MODE_BID), 2 , 0 , 0 , "" , 1234 ); 
    
       //check for errors
       if (result_ticket == - 1 ) {
           int error_code = GetLastError ();
           Print ( "Error: " + ErrorDescription(error_code));
           return (- 1 );
       }
       Print ( "order " +ticket+ " successfully opened" );
    
       //select order
       if (! OrderSelect (result_ticket, SELECT_BY_TICKET)) {
           int error_code = GetLastError ();
           Print ( "Error: " + ErrorDescription(error_code));
           return (- 1 );
       }    
       double entry_price = OrderOpenPrice ();
       
       //check stoplevel
       double stoplevel = MarketInfo ( Symbol (), MODE_STOPLEVEL);
       Print( "Stoplevel: " + stoplevel);
       if (stoploss < stoplevel)
          stoploss = stoplevel + 1 ;
    
       //check freezelevel
       double freezelevel = MarketInfo ( Symbol (), MODE_FREEZELEVEL);
       Print( "Freezelevel: " + freezelevel);
       if (stoploss < freezelevel)
          stoploss = freezelevel + 1 ;
    
       Print( "adjusted stoploss: " + stoploss);
       
       //account for spread AND account for 4/5-Digit Brokers
       if ( long )
          SL = MarketInfo ( Symbol (), MODE_BID) - (stoploss * pips2dbl);
       else
          SL = MarketInfo ( Symbol (), MODE_ASK) + (stoploss * pips2dbl);
       Print( "SL: " + SL);
       
       //round to nearest Tickvalue   
       SL = DoubleRound(SL, MarketInfo ( Symbol (), MODE_TICKSIZE));
       Print( "SL rounded: " + SL);
       
       //set stoploss
       if (! OrderModify (result_ticket, entry_price, SL, 0 , Red )) {
           int error_code = GetLastError ();
           Print ( "Error: " + ErrorDescription(error_code));
           return (- 1 );
       }
    
       Print( "Stoploss successfully set" );
       return ( 0 );
    }
    Umarım bu #130'dan kurtulmaya yardımcı olur. Kodunuzu değiştirmek işe yaramazsa, önce yukarıdaki gibi minimal bir örnek kullanın. Ve sonra, hata kaybolduğunda, değiştirilenleri kodunuza alın.

    İyi şanslar,
    şinobi

  10. Teşekkür
    Raptor, WHRoeder, SDC, BigAl, gjol ve 35806'ya hatadan kurtulmama yardım ettikleri ve bu referansı bir araya getirdikleri için teşekkür ederim.