Necesito ayuda con el error #130 stoploss inválido

 
Estimado Foro,

He visto que muchos en el foro están luchando con este error.
Según he entendido en otros hilos, el error puede ser causado por
a: establecer un valor de stoploss demasiado cercano al precio actual
b: un número incorrecto de dígitos después de 0

Con respecto a a:
Según he entendido. MarketInfo(Symbol(), MODE_STOPLEVEL)) debería darme la distancia mínima que debe tener el stoploss.
Así que aquí hay un ejemplo de una operación fallida:

Marekt Info:
Fecha: 2011/9/15 16:31
Símbolo: #ESU1
Nivel de Stop: 75.00000000
Punto: 0.01000000
Tamaño del tick: 0.25000000
Valor del tick: 12.50000000
Dígitos: 2.00000000

Por lo tanto, la distancia mínima debe ser el nivel de parada * punto, ¿verdad? por lo que 0.75
Así que aquí está mi orden fallida:
2011.09.15 16:32:07 '393930': orden de venta 18.00 #ESU1 apertura a 1201.00 sl: 1202.35 tp: 0.00 falló [S/L o T/P inválidos].
El error es: 130 / stops inválidos

El stoploss está a 1,35 de la apertura. Así que debería estar bien. Los dígitos (b) también coinciden.
Entonces, ¿por qué recibo este error?

Además, este error es difícil de reproducir. A veces aparece. A veces no lo hace.
A veces aparece varias veces seguidas.

¿Alguna idea?
¡Gracias de antemano!

shinobi
 
¿Cuál era el diferencial en el momento exacto en que se produjo este error?
 

puedes hacer un caso de error en tu código y usar RefreshRates()

No sé cómo hacerlo a mano, pero tal vez usted puede hacer algo como esto.

if(Comercio==fase)

{

int ErrorCode= GetLastError();

if (ErrorCode=130)

{

RefreshRates();

}

}

de nuevo este código podría no ser correcto por lo que debe googlear cómo hacerlo.

Además, si no lo has hecho, utiliza la función NormalizeDouble para redondear los números.

 
35806:

puedes hacer un caso de error en tu código y usar RefreshRates()

¿Cómo ayudará eso?
 
RaptorUK:
¿Cómo va a ayudar eso?

Podría ser un problema temporal. Dijo que era sensible a las mayúsculas y minúsculas, por lo que refrescar las tarifas podría solucionarlo.
 
35806:

podría ser un problema temporal. dijo que era sensible a las mayúsculas y minúsculas, por lo que refrescar las tarifas podría solucionarlo.
No hemos visto ningún código. . si él no está usando ninguna variable predefinida ninguna cantidad de RefreshRates va a ayudar.
 

Es cierto.

 
Gracias por sus opiniones.

Raptor, no sé el spread para la operación anterior. He añadido una salida de registro en el código, la próxima vez que ocurra el error, podré decirte el spread.
Pero, ¿puede decirme por qué es importante el diferencial? ¿De qué manera tengo que tener en cuenta el spread, al determinar el stoploss?

Envío una orden con, por ejemplo:
int ticket = OrderSend(Symbol(), OP_BUY, position_size, Ask, SLIPPAGE, initial_stop, TAKEPROFIT, NULL, EXPERT_ID, 0, Green);

por lo tanto la única variable predefinida que utilizo al enviar las órdenes es: Ask
SLIPPAGE y TAKEPROFIT son ambos 0.
EXPERT_ID es algún número mágico único
position_size es un entero, por ejemplo 3
initial_stop es mi stoploss, que es (en el caso del ejemplo anterior) Bid - risk.
El riesgo es un valor mayor que (MODE_STOPLEVEL * Punto), en el caso de la operación del primer post. El riesgo era: 1,35
 
shinobi:
Gracias por tus pensamientos.

Raptor, no conozco el spread de la operación anterior. He añadido una salida de registro en el código, la próxima vez que ocurra el error, podré decirte el spread.
Pero, ¿puede decirme por qué es importante el diferencial? ¿De qué manera tengo que tener en cuenta el spread, al determinar el stoploss?


Bien hecho por añadir la impresión al registro para el futuro:-)

Siempre tengo que pensar mucho sobre dónde hay que tener en cuenta el Spread y no... parece que tengo un bloqueo mental en lo que respecta a esto... pero creo que tengo esto correcto.

Para una compra no debería importar, la compra en el Ask, el SL ocurrirá en el Bid, por lo que el Spread ya se tiene en cuenta en su OpenPrice. Para una venta es un asunto diferente... usted vende a la oferta y su SL será tomado por el precio de la demanda... ¿dónde está el precio de la demanda? bueno, eso depende de la propagación en el momento... Creo que esto es correcto, por favor piénsalo y mira si tiene sentido. . . Estoy más que feliz de ser corregido si estoy equivocado... :-)

 
int ticket = OrderSend(Symbol(), OP_BUY, position_size, Ask, SLIPPAGE, initial_stop, TAKEPROFIT, NULL, EXPERT_ID, 0, Green);
Los EAs deben ajustarse para brokers de 4/5 dígitos, TP, SL, Y deslizamiento. En los corredores ECN debe abrir y luego establecer las paradas.
//++++ These are adjusted for 5 digit brokers.
int     pips2points;    // slippage  3 pips    3=points    30=points
double  pips2dbl;       // Stoploss 15 pips    0.0015      0.00150
int     Digits.pips;    // DoubleToStr(dbl/pips2dbl, Digits.pips)
int     init(){
     if (Digits % 2 == 1){      // DE30=1/JPY=3/EURUSD=5 forum.mql4.com/43064#515262
                pips2dbl    = Point*10; pips2points = 10;   Digits.pips = 1;
    } else {    pips2dbl    = Point;    pips2points =  1;   Digits.pips = 0; }
    // OrderSend(... Slippage.Pips * pips2points, Bid - StopLossPips * pips2dbl
//---- These are adjusted for 5 digit brokers.
    /* On ECN brokers you must open first and THEN set stops
    int ticket = OrderSend(...)
    if (ticket < 0)
       Alert("OrderSend failed: ", GetLastError());
    else if (!OrderSelect(ticket, SELECT_BY_POS))
       Alert("OrderSelect failed: ", GetLastError());
    else if (!OrderModify(OrderTicket()...)
       Alert("OrderModify failed: ", GetLastError());
     */
 
35806:

podría ser un problema temporal. dijo que era sensible a las mayúsculas y minúsculas, por lo que refrescar las tarifas podría solucionarlo.
AFAIK RefreshRates() no tiene nada que ver con el error 130