Minha EA faz uma entrada dupla - página 3

 
doshur:
Omg. Então, dormir não ajuda?

O que podemos fazer para evitar isso?

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:

void SetOrder(ENUM_ORDER_TYPE type, double lot)
{
   int ticket = -1;
   ResetLastError();
   double price = 0;
   double ask, bid;
   ask = SymbolInfoDouble(Symbol(), SYMBOL_ASK);
   bid = SymbolInfoDouble(Symbol(), SYMBOL_BID);
   if (maxSpread != 0 && NormalizeDouble(ask - bid, _Digits) >= NormalizeDouble(maxSpread * point, _Digits)) return; 
   if (type == ORDER_TYPE_BUY) price = ask;
   if (type == ORDER_TYPE_SELL) price = bid;
   trade.PositionOpen(Symbol(), type, lot, price, 0, 0, "");
   Sleep(1000);
   int err = GetLastError();
   if (err > 0) Print(ErrorDescription(err));
}


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 price
         if (StopLoss!=0) mrequest.sl = NormalizeDouble(latest_price.bid + StopLoss*point,Digits()); // Stop Loss
         if (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 order
         OrderSend(mrequest,mresult);
         // get the result code
         if(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.

Com os melhores cumprimentos
 
Então há um problema com a classe ctrade?

Alguém pode confirmar isso antes de eu mudar meu código?
 
doshur:
Então há um problema com a classe ctrade?

Alguém pode confirmar isso antes de eu mudar meu código?

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.

Documentation on MQL5: Common Functions / Sleep
Documentation on MQL5: Common Functions / Sleep
  • www.mql5.com
Common Functions / Sleep - Documentation on MQL5
 
doshur:
Então há um problema com a classe ctrade?

Alguém pode confirmar isso antes de eu mudar meu código?
Por favor, seja paciente, eu lhe responderei o mais rápido possível. Vou tentar reproduzir o problema quando o Mercado estiver aberto.
 
Não sei se o corretor joga à parte aqui, mas parece que nosso corretor é o mesmo. Alpari.

Se necessário, remova o nome do corretor.
 
Klammeraffe:

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.

      
My_Trade.PositionModify(Symbol(), 
                        NormalizeDouble(dPositionStoploss,   Digits()), 
                        NormalizeDouble(dPositionTakeProfit, Digits())
                        ); 


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 afwijking                                                                                                        OrderSend(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.

 
Klammeraffe:

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.

Se você olhar para a classe ctrade. Há alguma diferença em usar esta classe versus a forma de mqltraderequest?
 
snelle_moda:

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.

Snelle_moda você ainda recebe entrada dupla usando mqltraderequest para enviar pedidos?
Documentation on MQL5: Standard Constants, Enumerations and Structures / Data Structures / Trade Request Structure
Documentation on MQL5: Standard Constants, Enumerations and Structures / Data Structures / Trade Request Structure
  • www.mql5.com
Standard Constants, Enumerations and Structures / Data Structures / Trade Request Structure - Documentation on MQL5
 

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?

Documentation on MQL5: Standard Constants, Enumerations and Structures / Data Structures / Trade Request Structure
Documentation on MQL5: Standard Constants, Enumerations and Structures / Data Structures / Trade Request Structure
  • www.mql5.com
Standard Constants, Enumerations and Structures / Data Structures / Trade Request Structure - Documentation on MQL5
 
doshur:
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.