Ho bisogno di aiuto con l'errore #130 stoploss non valido - pagina 3

 
stesso problema. L'ordine si apre bene con stoploss = 0 e takeprofit = 0.
Ma poi OrderModify fallisce.

Il codice qui sotto viene eseguito dopo il codice sopra dell'ultimo post.

   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);
   }

Il Log ist:

#ESZ1,M5: Posizione di apertura
#ESZ1,M5: tickvalue: 12.50000000
#ESZ1,M5: dimensione pos: 1.00000000
#ESZ1,M5: Ask/Bid 1242.00000000/1241.75000000
#ESZ1,M5: Spread 0.25000000
#ESZ1,M5: aprire #13679252 comprare 1.00 #ESZ1 a 1242.00 ok
#ESZ1,M5: ordine 13679252 aperto con successo
#ESZ1,M5: SL: 1241.25000000
#ESZ1,M5: TP: 1242.25000000
#ESZ1,M5: errore=130

Quindi anche la prima apertura e poi l'impostazione dello stoploss non sembra funzionare :-/
 

Lo spread è 0,25

#ESZ1,M5: Spread 0.25000000

OK, si apre un BUY a . . 1242.00 (Ask)

#ESZ1,M5: aperto #13679252 compra 1.00 #ESZ1 a 1242.00 ok

#ESZ1,M5: ordine 13679252 aperto con successo

Poi provi a modificare con un TP al prezzo Bid + 2 * Spread e SL al prezzo Bid - 2 * Spread

#ESZ1,M5: SL: 1241.25000000

#ESZ1,M5: TP: 1242.25000000

Se il tuo FreezeLevel è 0.50 allora questo è il tuo problema . . qual è il tuo FreezeLevel ?

 
shinobi:
stesso problema. L'ordine si apre bene con stoploss = 0 e takeprofit = 0.
Ma poi OrderModify fallisce.

Non regolando per broker a 4/5 cifre. Non aprendo prima e poi impostando gli stop.

Come già risposto in precedenza

 

Sì, probabilmente stai facendo trading con un broker ECN, devi aprire ordini con zero stop e poi modificare l'ordine dopo che è stato aperto, quindi c'è un problema con 50 pips SL e TP, quindi fai come ha detto Raptor, controlla anche il freezelevel e lo stoplevel, per sicurezza

Controlla anche il tuo codice OrderModify() .... forse funziona così, ma credo che dovresti selezionare l'ordine usando OrderSelect() prima di poter fare OrderOpenPrice()

 
Grazie ancora per il vostro aiuto!
Ahimè il #130 mi perseguita ancora di notte ;)

Ecco il mio prossimo tentativo:

   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");

Come potete vedere, ho semplificato l'esempio non usando il takeprofit. L'errore si verifica sicuramente a causa dello stoploss, quindi non abbiamo bisogno del takeprofit.
Prima apro l'ordine con 0 stoploss (e takeprofit) e poi provo a impostare lo stoploss usando OrderModify.
Prima di questo controllo Mode_Stoplevel e Mode_Freezelevel e regolo lo stoploss, se necessario. (Un aggiustamento avviene qui sotto nel log, perché lo stoploss è inizialmente 50, ma Mode_Stoplevel è 75, quindi ho impostato lo stoploss a Mode_Stoplevel + 1, quindi 76)

RaptorUK e SDC:
MarketInfo(MODE_FREEZELEVEL) restituisce 0. Non credo che Freezelevel sia il problema.
Ho incluso l'output nel file di log.

SDC:
Ho anche inserito un OrderSelect, prima di chiamare OrderOpenPrice solo per essere sicuro. Nel log si può vedere che OrderSelect ha funzionato, altrimenti il codice non sarebbe andato avanti (exit -1).

WHRoeder:
Ho seguito il semplice esempio di SDC. Ma ora l'ho esteso usando la regolazione pips 4/5 Digit quando si imposta lo stoploss, come potete vedere sopra. Puoi anche vedere che l'ordine viene prima aperto con stoploss e takeprofit impostati a zero e poi lo stoploss viene impostato con OrderModify. Come potete vedere nel log qui sotto con S/L e T/P impostati a zero, l'ordine si apre con successo, ma non sono ancora in grado di impostare il S/L nel passo successivo con OrderModify.

Ecco il log completo:

#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

Vi sono davvero grato per il vostro continuo aiuto e penso che stiamo restringendo il problema :)
Cos'altro potrebbe essere il problema? C'è qualcos'altro che potrei provare?

shinobi
 
RaptorUK:

Lo spread è 0,25

#ESZ1,M5: Spread 0.25000000

OK, si apre un BUY a . . 1242.00 (Ask)

#ESZ1,M5: aperto #13679252 compra 1.00 #ESZ1 a 1242.00 ok

#ESZ1,M5: ordine 13679252 aperto con successo

Poi provi a modificare con un TP al prezzo Bid + 2 * Spread e SL al prezzo Bid - 2 * Spread

Il tuo STOP_LEVEL non è 3 * Spread? Il tuo Stop è troppo vicino...

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

Sì, è per questo che controllo lo stoplevel qui (dal codice sopra):

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

Quindi nell'ultimo esempio lo stoploss è stato impostato a 76, che è 3*Spread +1.
Dovrebbe essere abbastanza lontano, giusto?
 
shinobi:
Ciao Raptor,

Sì, è per questo che controllo lo stoplevel qui (dal codice sopra):


Quindi nell'ultimo esempio lo stoploss è stato impostato a 76, che è 3*Spread +1.
Dovrebbe essere abbastanza lontano, giusto?
Sì, dovrebbe. . . ma mi chiedo se hai un problema di arrotondamento qui e se hai bisogno di arrotondare allo 0,25 più vicino (S&P500 si muove in passi di 0,25) in modo che il tuo SL sia lontano da STOP_LEVEL di 0,25 o più. . . se capisci cosa intendo?
 
Buona idea, ma ahimè neanche questo è servito.
Ecco cosa ho fatto.

Per prima cosa ho scritto una funzione personalizzata per arrotondare i doppi al doppio più vicino:
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);
}

Fa quello che vi aspettate. Se la chiamate con DoubleRound(1237.687360000), restituisce 1237.50.

Poi l'ho usato sul mio S/L appena prima di chiamare OrderModify. E ho usato MODE_TICKVALUE, che è 0,25 per #ESZ1.
Quindi:

   //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);
   }

Nel log si può vedere che l'arrotondamento ha funzionato bene. Tuttavia lo stoploss è stato respinto :/

#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

Non riesco a immaginare quale altro problema possa essere! Questo #130 è davvero persistente!
 

Hai aperto una vendita

#ESZ1,M5: aprire #13708089 vendere 1.00 #ESZ1 a 1239.75 ok

e hai cercato di impostare uno SL al di sotto di esso . . .

#ESZ1,M5: SL: 1237.50000000

#ESZ1,M5: errore=130