SQ 3.8.0 Erro 129: preço inválido em negociações reais
14 respostas
mikeyc
9 anos atrás #113353
Olá Mark,
Criei, testei e exportei o MQL4 para uma estratégia que parece promissora no período de tempo EURUSD H1. Ela usa a opção de posição de mercado inversa, mas falha ao testar em uma conta real:
2015.02.16 17:59:59.599 Estratégia 9.7 EURUSD,H1: 2015.02.16 20:00:09 Erro ao abrir a ordem: 129 : preço inválido
2015.02.16 17:59:59.599 Estratégia 9.7 EURUSD,H1: 2015.02.16 20:00:09 Ordem de abertura, direção: 0, preço: 1.13572, Ask: 1.13572, Bid: 1.13548
2015.02.16 17:59:55.489 Estratégia 9.7 EURUSD,H1: 2015.02.16 20:00:05 Erro ao abrir a ordem: 129 : preço inválido
2015.02.16 17:59:55.489 Estratégia 9.7 EURUSD,H1: 2015.02.16 20:00:05 Ordem de abertura, direção: 0, preço: 1.13572, Ask: 1.13572, Bid: 1.13548
2015.02.16 17:59:52.067 Estratégia 9.7 EURUSD,H1: 2015.02.16 20:00:01 Erro ao abrir a ordem: 129 : preço inválido
2015.02.16 17:59:52.067 Estratégia 9.7 EURUSD,H1: 2015.02.16 20:00:01 Ordem de abertura, direção: 0, preço: 1.13572, Ask: 1.13572, Bid: 1.13548
2015.02.16 17:59:52.052 Estratégia 9.7 EURUSD,H1: fechar #164716296 vender 0,10 EURUSD a 1,14383 ao preço de 1,13572
Alguma ideia de por que o EA não parece ser capaz de abrir a direção de negociação oposta depois de fechar uma negociação?
Obrigado,
Mike
mikeyc
9 anos atrás #128868
Marca,
Observando a lógica de negociação no EA gerado, parece-me que ele tenta novamente, independentemente da causa do erro e, no caso do erro 129, ele deve atualizar a oferta de compra/venda, pois o preço se moveu além da derrapagem.
Ver http://forum.mql4.com/61528
Para meus próprios EAs, uso uma biblioteca chamada OrderReliable para lidar com o complicado tratamento de erros necessário.
https://github.com/keyguy/TradersTech/blob/master/OrderReliable_2011.01.07.mqh
Talvez isso possa ser incluído na próxima versão do modelo SQ para o MQ4?
Cumprimentos,
Mike
Marca Fric
9 anos atrás #128890
Obrigado por me informar sobre esse erro e a biblioteca, vou dar uma olhada.
Marcar
EstratégiaQuant arquiteto
mikeyc
9 anos atrás #129627
Estou vendo muito o erro de slippage em certas corretoras (olá FXDD :angry: ). Acho que a melhor solução é evitar essas corretoras com slippage ruim.
geektrader
9 anos atrás #129666
Esse erro é típico de corretores formadores de mercado, pois eles se recusam a aceitar sua ordem pelo preço que mostram no MT4. Isso é chamado de requotes e serve para que a corretora ganhe mais com suas perdas:) Isso nunca acontecerá em uma corretora ECN boa e honesta. Há muitas delas, e minha recomendação é a Global Prime, na Austrália.
Matusiak Adrian
9 anos atrás #129687
Isso nunca acontecerá em uma corretora ECN boa e honesta.
Você está enganado... Há muitas outras coisas que causam requotes. Simplesmente, tente fazer uma negociação sem requotes com ping para o servidor de negociação > 300ms. Mesmo com um corretor honesto, você nunca obterá o preço que está vendo, porque esse preço já não existe.
geektrader
9 anos atrás #129701
Claro, mas isso não é uma recotação, é uma derrapagem e não gera um erro para o EA, como acontece com uma recotação - a negociação será aberta de qualquer forma, apenas com um preço derrapado. Ainda prefiro isso em comparação com os requotes. A propósito, está claro que você não deve ter um ping de 300 ms para o servidor da corretora. A propósito, estou trabalhando para uma corretora ECN e, mesmo para contas pequenas, você deve alugar um VPS para executar suas estratégias.
Matusiak Adrian
9 anos atrás #129704
Mesmo para contas pequenas, você deve alugar um VPS para executar suas estratégias.
Concordo plenamente.
Dan
8 anos atrás #133511
Olá Mark,
Estou recebendo o mesmo erro que MickeyC, em que algumas vezes, quando meu AE vai fazer uma negociação, recebo a mensagem "Erro ao abrir a ordem 129: preço inválido". Existe algum código para atualizar o preço quando ele tenta substituir a ordem que eu possa inserir e isso é algo que o SQ4 resolverá?
Obrigado por sua ajuda
tomas262
8 anos atrás #133524
Dan
8 anos atrás #133528
Olá, Thomas,
Prefiro não compartilhar meu AE e solucionar o problema do ponto de vista de que se trata de um problema de lógica do SQ, em que ele deveria atualizar o preço quando ultrapassa o valor da derrapagem. MIckeyC apontou esse problema neste tópico anteriormente e Mark iria dar uma olhada nele. Por favor, veja acima. Mark fez alguma alteração para corrigir esse erro na próxima edição do SQ? Segui o link fornecido por MickeyC para o site MQL4 http://forum.mql4.com/61528 e diz que, para corrigir o código de erro 129 de preço inválido, é necessário colocar RefreshRates(); antes de enviar o pedido. Como não sou programador, tentei inserir isso no AE. Em negrito, na parte inferior, foi onde adicionei o código da taxa de atualização. Não tenho certeza se isso funcionará, e é aqui que preciso de sua experiência. Devo dizer que o erro só ocorreu duas vezes e ele tenta novamente fazer o pedido três vezes depois, sempre sem sucesso, com o erro de preço inválido 129. Espero que a inclusão do código RefreshRate corrija esse problema.
Obrigado por sua ajuda
// abrir ordem com tratamento de erros e novas tentativas
int ticket = 0;
int retries = 3;
while(true) {
tentativas-;
if(retries < 0) return;
if(getMarketPosition() != 0) return;
se (sqIsTradeAllowed() == 1) {
ticket = openOrderWithErrorHandling(orderType, orderLots, openPrice, stopLoss, profitTarget, comment, MagicNumber);
se (ticket > 0) {
se (tradeDirection > 0) {
ObjectSetText("lines", "Last Signal: Long, ticket: "+ticket, 8, "Tahoma", LabelColor);
{} else {
ObjectSetText("lines", "Last Signal: Short, ticket: "+ticket, 8, "Tahoma", LabelColor);
}
retorno;
}
}
if(ticket == -130 || ticket == -129) {
// stops ou volume inválidos, não podemos abrir a negociação
retorno;
}
Dormir(1000);
}
retorno;
}
//+——————————————————————+
int openOrderWithErrorHandling(int orderType, double orderLots, double openPrice, double stopLoss, double profitTarget, string comment, int magicNumber) {
//—————————————
// enviar pedido
int error, ticket;
Log("Opening order, direction: ", orderType,", price: ", openPrice, ", Ask: ", Ask, ", Bid: ", Bid);
ticket = OrderSend(Symbol(), orderType, orderLots, openPrice, MaxSlippage, 0, 0, comment, magicNumber, 0, Green);
if(ticket < 0) {
// o pedido falhou, escreva o erro no registro
error = GetLastError();
Log("Error opening order: ",error, " : ", ErrorDescription(error));
return(-error);
Dormir(1000);
//atualizar dados de preço
RefreshRates();
}
rettmp = OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES);
Log("Order opened: ", OrderTicket(), " at price:", OrderOpenPrice());
stopLoss = getSpecialSL(stopLoss);
profitTarget = getSpecialPT(profitTarget);
if(EmailNotificationOnTrade) {
SendMail("GB Strategy - Order opened", getNotificationText());
}
Dan
8 anos atrás #133543
Oi Tomas, preciso de seu intelecto e orientação sobre o problema que tenho acima.
Dan
8 anos atrás #133561
Thomas, não vou receber uma resposta? ????
Marca Fric
8 anos atrás #133566
Desculpe-me pela resposta tardia. Infelizmente, não é tão simples assim, porque o preço de uma negociação é definido algum tempo antes de essa função ser chamada, inclusive para ordens de mercado.
Mas você pode adicionar o seguinte trecho de código logo após a chamada de sqIsTradeAllowed().
Ele atualizará o preço de mercado imediatamente antes de a ordem ser enviada.
Se (orderType == OP_BUY || orderType == OP_SELL) {
Marcar
EstratégiaQuant arquiteto
Dan
8 anos atrás #133576
Olá Mark,
Obrigado por responder, adicionarei o trecho de código e verei se funciona........ Mais uma vez, obrigado
Visualizando 14 respostas - 1 até 14 (de um total de 14)