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

 
aynı sorun. Emir, stoploss = 0 ve takeprofit = 0 ile iyi açılır.
Ama sonra OrderModify başarısız olur.

Aşağıdaki kod, son gönderiden yukarıdaki koddan sonra yürütülür.

   bool modify = false;
   entry_price = OrderOpenPrice ();
   if ( long ) {  
      SL = MarketInfo ( Symbol (), MODE_BID) - stoploss * MarketInfo ( Symbol (), MODE_POINT);
      TP = MarketInfo ( Symbol (), MODE_BID) + takeprofit * MarketInfo ( Symbol (), MODE_POINT);
      modify = OrderModify (result_ticket, entry_price, SL, TP, Red );  
   } else {    
      SL = MarketInfo ( Symbol (), MODE_ASK) + stoploss * MarketInfo ( Symbol (), MODE_POINT);
      TP = MarketInfo ( Symbol (), MODE_ASK) - takeprofit * MarketInfo ( Symbol (), MODE_POINT);
      modify = OrderModify (result_ticket, entry_price, SL, TP, Green ); 
   }
   Log( "[5] SL: " + SL);
   Log( "[5] TP: " + TP);
   
   if (!modify) {
      Log( "error=" + GetLastError ());
       return (- 1 );
   }

Günlük:

#ESZ1,M5: Açılış Pozisyonu
#ESZ1,M5: işaret değeri: 12.5000000
#ESZ1,M5: konum boyutu: 10000000000
#ESZ1,M5: Sor/Teklif 1242.00000000/1241.75000000
#ESZ1,M5: Yayılma 0.25000000
#ESZ1,M5: açık #13679252 1.00 satın al #ESZ1 1242.00 tamam
#ESZ1,M5: Sipariş 13679252 Başarıyla Açıldı
#ESZ1,M5: SL: 1241.25000000
#ESZ1,M5: TP: 1242.25000000
#ESZ1,M5: hata=130

Yani önce açma ve sonra stoploss ayarlamak bile işe yaramıyor :-/
 

Yayılma 0.25

#ESZ1,M5: Yayılma 0.25000000

Tamam, adresinde bir SATIN AL açarsınız. . 1242.00 (Sor)

#ESZ1,M5: açık #13679252 1.00 satın al #ESZ1 1242.00 tamam

#ESZ1,M5: Sipariş 13679252 Başarıyla Açıldı

Ardından, Teklif fiyatı + 2 * Spread ve SL'de bir TP ile değiştirmeye çalışırsınız. Teklif fiyatı - 2 * Fark

#ESZ1,M5: SL: 1241.25000000

#ESZ1,M5: TP: 1242.25000000

FreezeLevel'iniz 0,50 ise bu sizin sorununuzdur. . FreezeLevel'iniz nedir?

 
shinobi :
aynı sorun. Emir stoploss = 0 ve takeprofit = 0 ile iyi açılır.
Ama sonra OrderModify başarısız olur.

4/5 basamaklı brokerler için ayar yapmıyor. Önce açılmıyor sonra ayar duruyor.

Daha önce cevaplandığı gibi

 

evet muhtemelen bir ECN komisyoncusu ile işlem yapıyorsunuz, sıfır stoplu emirler açmanız ve açıldıktan sonra emri değiştirmeniz gerekiyor, bu yüzden 50 pip SL ve TP ile ilgili bir sorun var, bu yüzden Raptor'un dediği gibi donma seviyesini ve durma seviyesini de kontrol edin. durum

Ayrıca OrderModify() kodunuzu da kontrol edin .... belki bu şekilde çalışır, ancak OrderOpenPrice() yapmadan önce OrderSelect() kullanarak siparişi seçmeniz gerektiğini düşünüyorum.

 
Yardımın için tekrar teşekkürler!
Ne yazık ki #130 hala geceleri beni rahatsız ediyor ;)

İşte bir sonraki denemem:

   double stoploss = 50 ;
   double SL = 0.0 ;
   
   //open position
   if ( long )  //take long position
      result_ticket = OrderSend ( Symbol (), 0 , 1 , MarketInfo ( Symbol (), MODE_ASK), 2 , 0 , 0 , "" , 12345 );  
   else      //take short position
      result_ticket = OrderSend ( Symbol (), 1 , 1 , MarketInfo ( Symbol (), MODE_BID), 2 , 0 , 0 , "" , 12345 ); 
   //check for errors
   if (result_ticket == - 1 ) {
      Log( "error=" + GetLastError ());
       return (- 1 );
   }
   Log( "Order " +result_ticket+ " Successfully Opened" );

   //select order
   if (! OrderSelect (result_ticket, SELECT_BY_TICKET)) {
      Log( "error=" + GetLastError ());
       return (- 1 );
   }    
   entry_price = OrderOpenPrice ();
   
   //check stoplevel
   double stoplevel = MarketInfo ( Symbol (), MODE_STOPLEVEL);
   Log( "Stoplevel: " + stoplevel);
   Log( "stoploss: " + stoploss);
   if (stoploss < stoplevel)
      stoploss = stoplevel + 1 ;

   //checl freezelevel
   double freezelevel = MarketInfo ( Symbol (), MODE_FREEZELEVEL);
   Log( "Freezelevel: " + freezelevel);
   Log( "stoploss: " + stoploss);
   if (stoploss < freezelevel)
      stoploss = freezelevel + 1 ;
   
   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*pips2dbl);
   if (! OrderModify (result_ticket, entry_price, SL* pips2dbl, 0 , Red )) {
      Log( "error=" + GetLastError ());
       return (- 1 );
   }
   Log( "Stoploss successfully set" );

Gördüğünüz gibi, örneği basitleştirdim, takeprofit kullanmadım. Hata kesinlikle stoploss nedeniyle oluşur, bu yüzden kar alma ihtiyacımız yok.
Önce 0 stoploss (ve kar al) ile emri açarım ve daha sonra OrderModify kullanarak stoploss ayarlamaya çalışırım.
Ondan önce Mode_Stoplevel ve Mode_Freezelevel'i kontrol ediyorum ve gerekirse stoploss'u ayarlıyorum. (Logda aşağıda bir ayarlama yapılıyor, çünkü stoploss başlangıçta 50, ama Mode_Stoplevel 75, daha sonra stoploss'u Mode_Stoplevel + 1 olarak ayarladım, yani 76)

RaptorUK ve SDC:
MarketInfo(MODE_FREEZELEVEL) 0 döndürür. Sorunun Freezelevel olduğunu düşünmüyorum.
Çıktıyı günlük dosyasına dahil ettim.

SDC:
Ayrıca emin olmak için OrderOpenPrice'ı çağırmadan önce bir OrderSelect ekledim. Günlükte OrderSelect'in çalıştığını görebilirsiniz, aksi takdirde kod ilerleyemezdi (çıkış -1).

WHRoeder:
SDC'nin basit örneğini takip ettim. Ama şimdi stoploss ayarlarken yukarıda gördüğünüz gibi pip 4/5 Digit ayarını kullanarak genişlettim. Ayrıca OrderModify ile önce stoploss ve Takeprofit ile emrin açıldığını ve ardından stoploss'un ayarlandığını görebilirsiniz. Aşağıdaki günlükte görebileceğiniz gibi S/L ve T/P sıfıra ayarlıyken sipariş başarıyla açılıyor, ancak OrderModify ile bir sonraki adımda S/L'yi hala ayarlayamıyorum.

İşte tam günlük:

 #ESZ1,M5: loaded successfully 
#ESZ1,M5: Date: 2011/11/15 9:24
#ESZ1,M5: Symbol: #ESZ1
#ESZ1,M5: Depot: 56489.95000000
#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: Init successfully completed.
#ESZ1,M5: initialized

#ESZ1,M5: Opening Position
#ESZ1,M5: tickvalue: 12.50000000
#ESZ1,M5: Ask/Bid 1250.50000000/1250.25000000
#ESZ1,M5: Spread 0.25000000
#ESZ1,M5: pos size: 1
#ESZ1,M5: open #13697436 sell 1.00 #ESZ1 at 1250.25 ok 
#ESZ1,M5: Order 13697436 Successfully Opened
#ESZ1,M5: Stoplevel: 75.00000000
#ESZ1,M5: stoploss: 50.00000000
#ESZ1,M5: Freezelevel: 0.00000000
#ESZ1,M5: stoploss: 76.00000000
#ESZ1,M5: SL: 12.51260000
#ESZ1,M5: error=130

Devam eden yardımınız için gerçekten minnettarım ve sanırım sorunu daraltıyoruz :)
Peki sorun başka ne olabilir? Deneyebileceğim başka bir şey var mı?

şinobi
 
RaptorUK :

Yayılma 0.25

#ESZ1,M5: Yayılma 0.25000000

Tamam, adresinde bir SATIN AL açarsınız. . 1242.00 (Sor)

#ESZ1,M5: açık #13679252 1.00 satın al #ESZ1 1242.00 tamam

#ESZ1,M5: Sipariş 13679252 Başarıyla Açıldı

Ardından, Teklif fiyatı + 2 * Spread ve SL'de bir TP ile değiştirmeye çalışırsınız. Teklif fiyatı - 2 * Fark

STOP_LEVEL 3 * Spread'iniz değil mi? Durağınız çok yakın. . .

 #ESZ1,M5: Stoplevel: 75.00000000
#ESZ1,M5: stoploss: 50.00000000
 
Hey Raptor,

Evet, bu yüzden burada durma seviyesini kontrol ediyorum (yukarıdaki koddan):

   double stoplevel = MarketInfo ( Symbol (), MODE_STOPLEVEL);
   Log( "Stoplevel: " + stoplevel);
   Log( "stoploss: " + stoploss);
   if (stoploss < stoplevel)
      stoploss = stoplevel + 1 ;

Yani son örnekte stoploss, 3*Spread +1 olan 76'ya ayarlandı.
Yeterince uzak olmalı, değil mi?
 
shinobi :
Hey Raptor,

Evet, bu yüzden burada durma seviyesini kontrol ediyorum (yukarıdaki koddan):


Yani son örnekte stoploss, 3*Spread +1 olan 76'ya ayarlandı.
Yeterince uzak olmalı, değil mi?
Evet olmalı. . . ama burada bir yuvarlama sorununuz olup olmadığını ve SL'nizin STOP_LEVEL'den 0,25 veya daha fazla temiz olması için en yakın 0,25'e (S&P500 0,25 adımda hareket eder) yuvarlamanız gerekip gerekmediğini merak ediyorum. . . ne demek istediğimi anladıysan?
 
İyi Fikir, ama ne yazık ki bu da yardımcı olmadı.
İşte yaptığım şey.

Önce çiftleri en yakın çifte yuvarlamak için özel bir işlev yazdım:
 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);
}

Beklediğiniz şeyi yapar. DoubleRound(1237.687360000) ile çağırırsanız, 1237.50 döndürür.

Sonra onu OrderModify'ı çağırmadan hemen önce S/L'mde kullandım. Ve #ESZ1 için 0.25 olan MODE_TICKVALUE kullandım.
Böyle:

   //round to nearest Tickvalue   
   SL = DoubleRound(SL, MarketInfo ( Symbol (), MODE_TICKVALUE));

 
  Log( "SL: " + SL);
   if (! OrderModify (result_ticket, entry_price, SL* pips2dbl, 0 , Red )) {
      Log( "error=" + GetLastError ());
       return (- 1 );
   }

Günlükte, yuvarlamanın iyi çalıştığını görebilirsiniz. Ancak stoploss yine de reddedildi :/

 #ESZ1,M5: loaded successfully 
#ESZ1,M5: Date: 2011/11/16 7:44
#ESZ1,M5: Symbol: #ESZ1
#ESZ1,M5: Depot: 56364.95000000
#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: Opening Position
#ESZ1,M5: Ask/Bid 1240.00000000/1239.75000000
#ESZ1,M5: Spread 0.25000000
#ESZ1,M5: open #13708089 sell 1.00 #ESZ1 at 1239.75 ok 
#ESZ1,M5: Order 13708089 Successfully Opened
#ESZ1,M5: Stoplevel: 75.00000000
#ESZ1,M5: Freezelevel: 0.00000000
#ESZ1,M5: stoploss: 76.00000000
#ESZ1,M5: SL: 1237.50000000
#ESZ1,M5: error=130

Sorunun başka ne olabileceğini hayal bile edemiyorum! Bu #130 gerçekten kalıcı!!!
 

Satış açtınız

#ESZ1,M5: açık #13708089 1.00 sat #ESZ1 1239.75'te tamam

ve altına bir SL koymaya çalıştım. . .

#ESZ1,M5: SL: 1237.50000000

#ESZ1,M5: hata=130