Ajudou para mim. Usei a gorjeta snelle_modas mais o sono. Isso funcionou.
Mas, desde então, eu reformulei a forma como os negócios são abertos. Agora eu não preciso de nenhuma dessas soluções. Aqui está o que escrevi ontem ao angevoyageur. Espero que ajude:
Hi,
bem da última vez que resolvi, estava usando a função sono após o comércio. Mas com meu novo bot, isso não é mais necessário. Talvez isso se deva ao fato de que a abertura de uma troca é agora tratada de maneira diferente. Este primeiro bot com o qual eu tive este problema (talvez outros EAs também tivessem esta forma de abrir uma troca e por isso o problema também (por exemplo, metaquant)) usou este método:
Agora estou abrindo ordens como se tivesse aprendido com a documentação e não tenho mais este problema:
void open_sell(double xlot, int xTP)
{
MqlTradeRequest mrequest;
MqlTick latest_price;
MqlTradeResult mresult;
if(!SymbolInfoTick(Symbol(),latest_price))
{
Alert("Error getting the latest price quote - error:",GetLastError(),"!!");
return;
}
ZeroMemory(mrequest);
mrequest.action=TRADE_ACTION_DEAL; // immediate order execution
mrequest.price = NormalizeDouble(latest_price.bid,Digits()); // latest Bid priceif (StopLoss!=0) mrequest.sl = NormalizeDouble(latest_price.bid + StopLoss*point,Digits()); // Stop Lossif (xTP!=0) mrequest.tp = NormalizeDouble(latest_price.bid - xTP*point,Digits()); // Take Profit
mrequest.symbol = Symbol(); // currency pair
mrequest.volume = xlot; // number of lots to trade
mrequest.magic = EA_Magic; // Order Magic Number
mrequest.type= ORDER_TYPE_SELL; // Sell Order
mrequest.type_filling = ORDER_FILLING_FOK; // Order execution type
mrequest.deviation=100; // Deviation from current price//--- send orderOrderSend(mrequest,mresult);
// get the result codeif(mresult.retcode==10009 || mresult.retcode==10008) //Request is completed or order placed
{
// Print("A Sell order has been successfully placed with Ticket#:",mresult.order,"!!");
}
else
{
Print("The Sell order request could not be completed -error:",GetLastError());
ResetLastError();
return;
}
}
Talvez isto ajude. Vejo que o doshur usa uma maneira semelhante de abrir ordens como eu fiz quando causou este comportamento.
A abertura da posição em si é feita usando o modo "antiquado".
mrequest.action = TRADE_ACTION_DEAL; // immediate order execution stoploss en takeprofit worden aangepast
mrequest.price = NormalizeDouble(Latest_Price.ask, Digits()); // latest ask price
mrequest.symbol = Symbol(); // currency pair
mrequest.volume = dTradePosition_Size; // number of lots to trade
mrequest.magic = EA_Magic_Number; // Order Magic Number
mrequest.type = ORDER_TYPE_BUY; // Buy Order
mrequest.type_filling = ORDER_FILLING_RETURN; // Order execution type
mrequest.deviation = 1000; // Max prijs afwijkingOrderSend(mrequest,mresult); //--- send order
É possível que a classe ctrade esteja enviando uma nova ordem dupla quando eu estou ajustando a ordem de perda de estoque? Parece estranho.
posso perguntar se PositionSelect() verifica o lado do cliente ou o lado da corte?
Tenho a forte sensação de que o problema é causado pelo atraso onde o servidor (lado do corretor) está processando a solicitação e não atualizou o lado do cliente, por isso PositionSelect() é executado novamente.
Eu sinto fortemente que não há diferença quando usamos o modo cTrade vs MqlTradeRequest e a função Sleep deve ajudar a atrasar tudo para que nosso lado cliente seja "atualizado" antes que o PositionSelect() seja executado novamente, causando uma entrada dupla. Verificando na minha guia de diário, >2013.12.20 08:35:00Negociações'800****': compra de câmbio 0.01 EURUSD no mercado colocado para execução em 313 ms <
Omg. Então, dormir não ajuda?
Ajudou para mim. Usei a gorjeta snelle_modas mais o sono. Isso funcionou.
Mas, desde então, eu reformulei a forma como os negócios são abertos. Agora eu não preciso de nenhuma dessas soluções. Aqui está o que escrevi ontem ao angevoyageur. Espero que ajude:
Hi,
bem da última vez que resolvi, estava usando a função sono após o comércio. Mas com meu novo bot, isso não é mais necessário. Talvez isso se deva ao fato de que a abertura de uma troca é agora tratada de maneira diferente. Este primeiro bot com o qual eu tive este problema (talvez outros EAs também tivessem esta forma de abrir uma troca e por isso o problema também (por exemplo, metaquant)) usou este método:
Agora estou abrindo ordens como se tivesse aprendido com a documentação e não tenho mais este problema:
Talvez isto ajude. Vejo que o doshur usa uma maneira semelhante de abrir ordens como eu fiz quando causou este comportamento.
Com os melhores cumprimentosEntão há um problema com a classe ctrade?
Posso apenas dizer que não tenho mais este problema depois de remover a classe ctrade.
Você pode querer criar uma segunda versão da EA que usa a maneira "antiquada" de abrir uma profissão e ver se ela ajuda.
Por outro lado, a função do sono também resolveu o problema para mim.
Então há um problema com a classe ctrade?
Posso apenas dizer que não tenho mais este problema depois de remover a classe ctrade.
Você pode querer criar uma segunda versão da EA que usa a maneira "antiquada" de abrir uma profissão e ver se ela ajuda.
Por outro lado, a função do sono também resolveu o problema para mim.
Este é um ponto interessante.
Eu uso a classe ctrade para ajustar o valor de stoploss.
A abertura da posição em si é feita usando o modo "antiquado".
É possível que a classe ctrade esteja enviando uma nova ordem dupla quando eu estou ajustando a ordem de perda de estoque? Parece estranho.
Posso apenas dizer que não tenho mais este problema depois de remover a classe ctrade.
Você pode querer criar uma segunda versão da EA que usa a maneira "antiquada" de abrir uma profissão e ver se ela ajuda.
Por outro lado, a função do sono também resolveu o problema para mim.
Esse é um bom ponto de vista. Talvez eu devesse usar apenas a mudança no preço BID.
Um BAR no gráfico também é baseado no preço BID?
Para o sinal de ativação do meu EA, estou interessado apenas na mudança do preço no qual o BAR de 1 minuto se baseia.
posso perguntar se PositionSelect() verifica o lado do cliente ou o lado da corte?
Tenho a forte sensação de que o problema é causado pelo atraso onde o servidor (lado do corretor) está processando a solicitação e não atualizou o lado do cliente, por isso PositionSelect() é executado novamente.
Eu sinto fortemente que não há diferença quando usamos o modo cTrade vs MqlTradeRequest e a função Sleep deve ajudar a atrasar tudo para que nosso lado cliente seja "atualizado" antes que o PositionSelect() seja executado novamente, causando uma entrada dupla. Verificando na minha guia de diário, >2013.12.20 08:35:00 Negociações '800****': compra de câmbio 0.01 EURUSD no mercado colocado para execução em 313 ms <
colocar o sono mais de 400 deve ser seguro????
O que você acha?
Snelle_moda você ainda recebe entrada dupla usando mqltraderequest para enviar pedidos?
Tive mais 1 entrada dupla desde 03-10-2013. Eu utilizo os dois métodos para enviar meu pedido. Veja meu post anterior.