Precisa de ajuda com o erro #130 de perda de dados inválido - página 2

 

A melhor maneira de corrigir o prejuízo é pensar corretamente sobre o spread. O spread é a distância entre o Ask e o Bid. Assim, quando você adiciona um stoploss a uma ordem de compra usando Bid - SL inclui automaticamente o spread e você não precisará codificar para ele e poderá efetivamente ignorar totalmente o spread. Para um comércio de venda usando Ask + SL tem o mesmo efeito. Entretanto, BEWARE --- em momentos de baixo volume de negociação o spread fica maior e você pode muito bem acabar com um SL bem longe do lugar que você espera que ele esteja --- portanto você pode querer adicionar algum código para evitar a adição do SL acima de um tamanho de spread definido.

Agora a questão do Spread está fora do caminho, a próxima causa principal de erro 130s é que os preços mudaram enquanto sua EA ainda está em execução. Isto pode ser causado por uma EA que leva muito tempo para ser executada ou o servidor está muito ocupado com a manutenção das operações que atrasam a execução de sua EA. O resultado é que um tick fez com que sua EA começasse a executar, mas outro tick veio antes que a execução tivesse terminado e os preços agora são inválidos.

Em ambos os casos, você precisa atualizar os preços usando RefreshRates: while (RefrshRates() == 1) Sleep(5); ------ ou o que você quiser como tempo de espera.

 
BigAl:


Em ambos os casos você precisa atualizar os preços usando RefreshRates: while (RefrshRates() == 1) Sleep(5); ------ ou o que você quiser como tempo de espera.

Isso só é correto se o código usar variáveis pré-definidas https://docs.mql4.com/predefined/variables se o código usar MarketInfo para Bid and Ask então RefreshRates não terá nenhuma relação . . .
 
qjol:
AFAIK RefreshRates() não tem nada a ver com erro 130

Tomando como ponto de vista o RaptorUK e eu concordamos que o uso de MODE_ASK etc. eliminaria a necessidade de RefreshRates() mas eu assumi que, como no exemplo de código do shinobi ....

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

a variável pré-definida ASK está sendo usada e, portanto, o ask/bid, bem como o valor do spread podem ter mudado, dando o erro 130. Neste caso, então RefreshRates() poderia ser usado imediatamente antes do pedido de envio.

 
BigAl:

Ponto tomado RaptorUK e eu concordamos que usar MODE_ASK etc eliminaria a necessidade de RefreshRates() mas eu assumi que, como no exemplo de código do shinobi ....

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

a variável pré-definida ASK está sendo usada e, portanto, o ask/bid, bem como o valor do spread podem ter mudado, dando o erro 130. Neste caso, então RefreshRates() poderia ser usado imediatamente antes do pedido de envio.

Obrigado a todos por seus grandes conselhos!
Estou um pouco ocupado no momento, mas quando tiver a oportunidade, tentarei todas as suas sugestões e depois escreverei um post resumido para qualquer um que possa tropeçar neste tópico com o mesmo problema.

Obrigado, e tome cuidado!

shinobi
 
BigAl: 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);

não diz tudo. Como você está calculando o initial_stop - usando Bid?

Como você está calculando SLIPPAGE - ajustando para corretores de 4/5 dígitos?

 
Ei, pessoal!

Tive que fazer uma pausa por um tempo (mudança para uma nova cidade, novo emprego).
Mas agora eu gostaria de retomar este tópico, e finalmente encontrar uma solução para este maldito erro de paralisação #130.

Sou grato por todos os seus conselhos e tentei incorporar tudo isso:

1: Espalhe-se.
Para eliminar o spread como possível causa do erro, defini o stoploss como
Bid-stoploss (Long)
Ask+stoploss (Short)

2: Mudando as taxas de mercado
para eliminar a possível causa da mudança das taxas de mercado antes do envio do pedido,
mudei meu código e substituí todas as ocorrências de Ask e Bid por
MarketInfo(Symbol(), MODE_ASK) e MarketInfo(Symbol(), MODE_BID)

3: 4-5 Digits-Broker
para eliminar a possível causa do número inválido de dígitos, arredondei o stoploss de acordo com o código WHRoeders:
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)

//init digit adjustment
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(Symbol(), OP_BUY, position_size, MarketInfo(Symbol(), MODE_ASK), SLIPPAGE, (MarketInfo(Symbol(), MODE_BID) - stoploss) * pips2dbl, TAKEPROFIT, NULL, EXPERT_ID, 0, Green);
Como mencionado anteriormente, as variáveis SLIPPAGE e TAKEPROFIT no meu caso são sempre 0. Portanto, elas também não devem causar problemas.


Portanto, incorporei todas as sugestões, mas o erro ainda persiste. Tanto quanto posso dizer, ocorre com a mesma freqüência que antes, portanto, tem que haver outra causa para isso.
Aqui está um registro recente:

tickvalue: 12.50000000
pos size: 37.00000000
Ask/Bid 1262.00000000/1261.75000000
stoploss:12.59610000
position_size: 37
Spread 0.25000000

Error could not take long position. O erro é: #130 paradas inválidas

A linha de código OrderSend acima foi usada com os valores registrados para tentar tomar uma posição longa.
Você tem mais alguma idéia, qual poderia ser a causa?

Obrigado!
shinobi
 

Este é um corretor ECN?

WHRoeder 2011.09.15 20:36

Nos corretores de ECN você deve abrir e ENTÃO definir paradas.

 
shinobi:
para eliminar a possível causa do número de dígitos inválidos, arredondei o código WHRoeders:
  1. Não houve arredondamento no código que afixei
  2. Nos corretores ECN você deve abrir e ENTÃO definir paradas.
  3. Em metais (onde TICKSIZE != Ponto) o preço de abertura para pedidos pendentes deve ser arredondado
    double TS=MarketInfo(pair, MODE_TICKSIZE);
    OOP = MathRound(OOP/TS)*TS;
    Eu não sei sobre paradas.

  4. Pare de nos dizer quais são os valores e o que você acha que fez. Escreva o código.
 

Basta fazer

StopLoss duplo externo = 50;

TakeProfit duplo externo = 50;

então para compras:

duplo SL=Bid - PontoStopLoss*;

double TP=Bid + TakeProfit* Point;

int Ticket=OrderSend(Symbol(),0,1,Ask,2,SL,TP,",12345);

if( Ticket<0) print("error="GetLastError());

para venda:

duplo SL=Ask + PontoStopLoss*;

duplo TP=Ask - TakeProfit*Point;

int Ticket=OrderSend(Symbol(),1,1,Bid,2,SL,TP,",12345);

if( Ticket<0) print("error="GetLastError());

então poste o arquivo de log se ele não funcionar.

 
Obrigado Raptor, WHRoeder e SDC por suas respostas.

SDC:
Eu tentei seu código desta forma:
   int result_ticket = -1;
   double stoploss            = 50;
   double takeprofit          = 50;
   double SL = 0.0;
   double TP = 0.0;
   if(long) {   //take long position
      SL = MarketInfo(Symbol(), MODE_BID) - stoploss * MarketInfo(Symbol(), MODE_POINT));
      TP = MarketInfo(Symbol(), MODE_BID) + takeprofit * MarketInfo(Symbol(), MODE_POINT));
      result_ticket = OrderSend(Symbol(), 0, 1, MarketInfo(Symbol(), MODE_ASK), 2, SL, TP, "", 12345);
   } else {     //take short position
      SL = MarketInfo(Symbol(), MODE_ASK) + stoploss * MarketInfo(Symbol(), MODE_POINT));
      TP = MarketInfo(Symbol(), MODE_ASK) - takeprofit * MarketInfo(Symbol(), MODE_POINT));
      result_ticket = OrderSend(Symbol(), 1, 1, MarketInfo(Symbol(), MODE_BID), 2, SL, TP, "", 12345);
   }

   //check for errors
   if(result_ticket == -1) {
      Log("error="+GetLastError());
      return(-1);
   }
A única diferença é que eu substituí Point, Ask and Bid por MarketInfo para evitar o problema de RefreshRates mencionado por Raptor e BigAI.
O problema persiste com este simples exemplo. Eu ainda recebo

#ESZ1,M5: Posição de Abertura
#ESZ1,M5: valor do tick: 12.50000000
#ESZ1,M5: tamanho pos: 1.00000000
#ESZ1,M5: Ask/Bid 1244.50000000/1244.25000000
#ESZ1,M5: Espalhamento 0,25000000
#ESZ1,M5: SL: 1244.00000000
#ESZ1,M5: TP: 1245.00000000
#ESZ1,M5: erro=130

Raptor:
Atualmente uso a UWC-Trader com uma conta demo para testes.
Como mencionado anteriormente, eu estou negociando Futuros. Por exemplo, ESZ1 e FDXZ1.

WHRoeder:
Desculpe, eu também não arredondo. Substitua "arredondar" por "ajustar para corretores de 4/5 dígitos". I.E. Eu acabei de aplicar seu código.
Também coloquei o OrderSend exatamente como o utilizo em minha resposta anterior. E os valores de todas as variáveis envolvidas. Não tenho certeza de qual outra parte do código seria interessante.
Como o mini-exemplo, sugerido pela SDC, mostrou, o erro pode ser decomposto a este código simples. Portanto, ele deve ser mais fundamental.

Não estou comercializando Metais, portanto, o arredondamento não deve ser importante.

Vou tentar a seguir:
abrindo (sem perda de carga) e depois modificando (estabelecendo perda de carga) mais tarde.

Obrigado novamente por suas idéias,

shinobi