Precisa de ajuda com o erro #130 de perda de dados inválido

 
Prezado Fórum,

Tenho visto muitos no fórum lutando contra este erro.
Como entendi os outros tópicos, o erro pode ser causado por
a: definição de um valor de stoploss muito próximo do preço atual
b: um número errado de dígitos após 0

Com relação a:
Como eu entendi. MarketInfo(Symbol(), MODE_STOPLEVEL)) deve me dar a distância mínima que o stoploss precisa ter.
Portanto, aqui está um exemplo de um comércio fracassado:

Marekt Info:
Data: 2011/9/15 16:31
Símbolo: #ESU1
Nível de parada: 75.00000000
Ponto: 0.01000000
Tamanho do Tick: 0,25000000
Valor do Tick: 12.50000000
Dígitos: 2.00000000

Assim, a distância mínima deve ser o nível de parada * ponto, certo? então 0,75
Então, aqui está minha ordem falhada:
2011.09.15 16:32:07 '393930': ordem de venda 18.00 #ESU1 abertura às 1201.00 sl: 1202.35 tp: 0.00 falhou [Inválido S/L ou T/P]
O erro é: 130 / paradas inválidas

O stoploss está a 1,35 de distância da abertura. Portanto, deve estar bem. Os dígitos (b) também combinam.
Então, por que eu recebo este erro?

Além disso, este erro é difícil de reproduzir. Às vezes ele aparece. Às vezes, não aparece.
Às vezes ele aparece várias vezes um após o outro.

Alguma idéia?
Obrigado de antemão!

shinobi
 
Qual foi a propagação no momento exato em que este erro ocorreu?
 

u pode fazer um caso de erro no código ur e usar RefreshRates()

Eu não sei como fazer isso de improviso, mas talvez você possa fazer algo assim.

if(Trade===fase)

{

int ErrorCode= GetLastError();

if (ErrorCode=130)

{

RefreshRates();

}

}

novamente este código pode não estar correto, então você deve procurar no Google como fazer isso.

também, se você já não tiver feito a função NormalizeDouble para arredondar os números.

 
35806:

u pode fazer um caso de erro no código ur e usar RefreshRates()

Como isso vai ajudar ?
 
RaptorUK:
Como isso vai ajudar ?

poderia ser uma questão temporária. ele disse que era sensível a casos, portanto, refrescar as tarifas poderia consertá-la.
 
35806:

poderia ser uma questão temporária. ele disse que era sensível a casos, portanto, refrescar as tarifas poderia resolvê-la.
Não vimos nenhum código . . se ele não estiver usando nenhuma variável pré-definida, nenhuma quantidade de RefreshRates vai ajudar.
 

verdade.

 
obrigado por suas idéias.

Raptor, eu não conheço a propagação para o comércio acima. Adicionei uma saída de log no código, na próxima vez que o erro acontecer, serei capaz de lhe dizer o spread.
Mas você pode me dizer, por que o spread é importante? De que forma eu preciso levar em conta a lança, ao determinar a perda de carga?

Eu envio um pedido com, por exemplo:
int ticket = OrderSend(Symbol(), OP_BUY, position_size, Ask, SLIPPAGE, initial_stop, TAKEPROFIT, NULL, EXPERT_ID, 0, Green);

assim, a única variável predefinida que eu utilizo ao enviar pedidos é Ask
SLIPPAGE e TAKEPROFIT são ambas 0.
EXPERT_ID é um número mágico único
position_size é um inteiro, por exemplo, 3
initial_stop é meu stoploss, que é (no caso do exemplo acima) Bid - risco.
O risco é um valor maior que (MODE_STOPLEVEL * Ponto), no caso da troca no primeiro posto. O risco era: 1,35
 
shinobi:
obrigado por seus pensamentos.

Raptor, não conheço a propagação para o comércio acima. Adicionei uma saída de log no código, na próxima vez que o erro acontecer, serei capaz de lhe dizer o spread.
Mas você pode me dizer, por que o spread é importante? De que forma eu preciso levar em conta o spread, ao determinar o stoploss?


Muito bem feito para adicionar a impressão ao log para o futuro:-)

Sempre tenho que pensar muito sobre onde Spread tem que ser considerado e não . . . parece que tenho um bloqueio mental no que diz respeito . . . mas acho que tenho isto correto.

Para uma Buy it shouldn't matter, Buy at Ask, SL acontecerá na Bid, portanto o Spread já está incluído em seu OpenPrice. Para uma Venda é um assunto diferente . . você Vende na Bid e seu SL será tomado pelo preço Ask . . onde está o preço Ask ? bem que depende do spread no momento . . Acho que isto é correto, por favor, pense sobre isso e veja se faz sentido . . Estou mais do que feliz em ser corrigido se estiver errado . . . . :-)

 
int ticket = OrderSend(Symbol(), OP_BUY, position_size, Ask, SLIPPAGE, initial_stop, TAKEPROFIT, NULL, EXPERT_ID, 0, Green);
EAs devem se ajustar para corretores de 4/5 dígitos, TP, SL, AND slippage. Nos corretores ECN, você deve abrir e ENTÃO definir 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:

poderia ser uma questão temporária. ele disse que era sensível a casos, portanto, refrescar as tarifas poderia resolvê-la.
AFAIK RefreshRates() não tem nada a ver com erro 130