Necesito ayuda con el error #130 stoploss inválido - página 3

 
El mismo problema. La orden se abre bien con stoploss = 0 y takeprofit = 0.
Pero luego OrderModify falla.

El código de abajo se ejecuta después del código anterior del último 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);
   }

El Log ist:

#ESZ1,M5: Posición de apertura
#ESZ1,M5: tickvalue: 12.50000000
#ESZ1,M5: tamaño de la posición: 1.00000000
#ESZ1,M5: Oferta 1242.00000000/1241.75000000
#ESZ1,M5: Spread 0.25000000
#ESZ1,M5: abrir #13679252 comprar 1.00 #ESZ1 a 1242.00 ok
#ESZ1,M5: Orden 13679252 abierta con éxito
#ESZ1,M5: SL: 1241.25000000
#ESZ1,M5: TP: 1242.25000000
#ESZ1,M5: error=130

Así que incluso la primera apertura y luego el establecimiento de stoploss no parece funcionar :-/
 

El margen es de 0,25

#ESZ1,M5: Spread 0.25000000

OK, se abre una COMPRA a . . 1242.00 (Ask)

#ESZ1,M5: abrir #13679252 comprar 1.00 #ESZ1 a 1242.00 ok

#ESZ1,M5: Orden 13679252 abierta con éxito

A continuación, intente modificar con un TP al precio de compra + 2 * Spread y un SL al precio de compra - 2 * Spread

#ESZ1,M5: SL: 1241.25000000

#ESZ1,M5: TP: 1242.25000000

Si su FreezeLevel es 0.50 entonces ese es su problema... ¿cuál es su FreezeLevel?

 
shinobi:
El mismo problema. La orden se abre bien con stoploss = 0 y takeprofit = 0.
Pero luego OrderModify falla.

No ajustar para corredores de 4/5 dígitos. No abrir primero y luego ajustar los stops.

Como se respondió anteriormente

 

Sí, probablemente usted está operando con un corredor ECN tiene que abrir órdenes con cero paradas a continuación, modificar la orden después de que se abre lo que hay un problema con 50 pips SL y TP, así que como Raptor dijo comprobar el freezelevel y stoplevel también por si acaso

También revisa tu código OrderModify() .... tal vez funcione así, pero creo que deberías seleccionar la orden usando OrderSelect() antes de poder hacer OrderOpenPrice()

 
¡Gracias de nuevo por tu ayuda!
Por desgracia, el nº 130 sigue persiguiéndome por las noches ;)

Aquí está mi siguiente intento:

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

Como puedes ver, he simplificado el ejemplo al no usar takeprofit. El error se produce definitivamente por el stoploss, así que no necesitamos el takeprofit.
Primero abro la orden con 0 stoploss (y takeprofit) y más tarde intento establecer el stoploss usando OrderModify.
Antes de eso compruebo Mode_Stoplevel y Mode_Freezelevel y ajusto el stoploss, si es necesario. (Un ajuste ocurre abajo en el registro, porque el stoploss es inicialmente 50, pero Mode_Stoplevel es 75, entonces pongo el stoploss a Mode_Stoplevel + 1, entonces 76)

RaptorUK y SDC:
MarketInfo(MODE_FREEZELEVEL) devuelve 0. No creo que Freezelevel sea el problema.
He incluido la salida en el archivo de registro.

SDC:
También inserté un OrderSelect, antes de llamar a OrderOpenPrice sólo para asegurarme. En el registro se puede ver que OrderSelect funcionó, de lo contrario el código no habría llegado tan lejos (salida -1).

WHRoeder:
He seguido el sencillo ejemplo de SDC. Pero ahora lo he ampliado utilizando el ajuste de pips 4/5 Digit al establecer el stoploss, como puedes ver arriba. También puedes ver que la orden se abre primero con stoploss y takeprofit puestos a cero y luego el stoploss se pone con OrderModify. Como puedes ver en el log de abajo con S/L y T/P puestos a cero, la orden se abre con éxito, pero sigo sin poder poner el S/L en el siguiente paso con OrderModify.

Aquí está el registro 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

Estoy muy agradecido por su ayuda continua y creo que estamos reduciendo el problema :)
¿Qué otra cosa podría ser el problema? ¿Algo más que pueda probar?

shinobi
 
RaptorUK:

El margen es de 0,25

#ESZ1,M5: Spread 0.25000000

OK, se abre una COMPRA a . . 1242.00 (Ask)

#ESZ1,M5: abrir #13679252 comprar 1.00 #ESZ1 a 1242.00 ok

#ESZ1,M5: Orden 13679252 abierta con éxito

A continuación, intenta modificar con un TP al precio de oferta + 2 * Spread y SL al precio de oferta - 2 * Spread

¿No es su STOP_LEVEL 3 * Spread? su Stop está demasiado cerca....

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

Sí, por eso compruebo el stoplevel aquí (desde el código anterior):

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

Así que en el último ejemplo el stoploss se puso en 76, que es 3*Spread +1.
Eso debería ser lo suficientemente lejos, ¿verdad?
 
shinobi:
Hola Raptor,

Sí, por eso compruebo el stoplevel aquí (desde el código anterior):


Así que en el último ejemplo stoploss se fijó en 76, que es 3*Spread +1.
Eso debería ser lo suficientemente lejos, ¿verdad?
Sí, debería... pero me pregunto si tienes un problema de redondeo aquí y si necesitas redondear al 0,25 más cercano (el S&P500 se mueve en pasos de 0,25) para que tu SL esté libre de STOP_LEVEL por 0,25 o más... si entiendes lo que quiero decir...
 
Buena idea, pero por desgracia eso tampoco ayudó.
Esto es lo que hice.

Primero escribí una función personalizada para redondear los dobles al doble más cercano:
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);
}

Hace lo que esperas. Si la llamas con DoubleRound(1237.687360000), devuelve 1237.50.

Entonces lo usé en mi S/L justo antes de llamar a OrderModify. Y usé MODE_TICKVALUE, que es 0.25 para #ESZ1.
Así que:

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

En el registro se puede ver, que el redondeo funcionó bien. Sin embargo el stoploss fue rechazado :/

#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

¡No puedo imaginar qué otro problema podría ser! ¡Este #130 es realmente persistente!
 

Has abierto una venta

#ESZ1,M5: abrir #13708089 vender 1.00 #ESZ1 a 1239.75 ok

y trató de establecer un SL por debajo de él...

#ESZ1,M5: SL: 1237.50000000

#ESZ1,M5: error=130