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

[Eliminato]  
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()

[Eliminato]  
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
[Eliminato]  
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?
[Eliminato]  
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