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

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

[Eliminado]  
¡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
[Eliminado]  
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...
[Eliminado]  
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