Il mio EA fa una doppia entrata - pagina 3

 
doshur:
Omg. Quindi il sonno non aiuta?

Cosa possiamo fare per evitare questo?

A me è servito. Ho usato il consiglio di snelle_modas più il sonno. Questo ha funzionato.

Ma da allora ho rinnovato il modo di aprire i trade. Ora non ho bisogno di nessuna di queste soluzioni. Ecco cosa ho scritto ieri a angevoyageur. Spero che sia d'aiuto:

Ciao,

beh, l'ultima volta che l'ho risolto, stava usando la funzione sleep dopo il trade. Ma con il mio nuovo bot questo non è più necessario. Forse perché l'apertura di un trade è ora gestita in modo diverso. Il primo bot con cui ho avuto questo problema (forse anche altri EAs avevano questo modo di aprire un trade e per questo avevano il problema (per esempio metaquant)) usava questo metodo:

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


Ora sto aprendo gli ordini come ho imparato dalla documentazione e non ho più questo 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;
           }
}


Forse questo aiuta. Vedo che doshur usa un modo simile top open trades come ho fatto io quando ha causato questo comportamento.

Cordiali saluti
 
Quindi c'è un problema con la classe ctrade?

Qualcuno può confermare questo prima che io cambi il mio codice?
 
doshur:
Quindi c'è un problema con la classe ctrade?

Qualcuno può confermarlo prima che io cambi il mio codice?

Posso solo dire che non ho più questo problema dopo aver rimosso la classe ctrade.

Potresti creare una seconda versione dell'EA che usa il modo "vecchio stile" di aprire un trade e vedere se aiuta.


D'altra parte, la funzione sleep ha risolto il problema anche per me.

Documentation on MQL5: Common Functions / Sleep
Documentation on MQL5: Common Functions / Sleep
  • www.mql5.com
Common Functions / Sleep - Documentation on MQL5
 
doshur:
Quindi c'è un problema con la classe ctrade?

Qualcuno può confermare questo prima che io cambi il mio codice?
Per favore siate pazienti, vi risponderò il più presto possibile. Cercherò di riprodurre il problema quando il mercato sarà aperto.
 
Non so se il broker gioca a parte qui, ma sembra che il nostro broker sia lo stesso. Alpari.

Pls rimuovere il nome del broker se necessario.
 
Klammeraffe:

Posso solo dire che non ho più questo problema dopo aver rimosso la classe ctrade.

Potresti creare una seconda versione dell'EA che usa il modo "vecchio stile" di aprire un trade e vedere se aiuta.


D'altra parte, la funzione sleep ha risolto il problema anche per me.

Questo è un punto interessante.

Io uso la classe ctrade per regolare il valore dello stoploss.

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


L'apertura della posizione stessa è fatta usando il modo "vecchio stile".

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

E' possibile che la classe ctrade invii un nuovo ordine doppio quando sto regolando l'ordine stoploss? Sembra strano.

 
Klammeraffe:

Posso solo dire che non ho più questo problema dopo aver rimosso la classe ctrade.

Potresti creare una seconda versione dell'EA che usa il modo "vecchio stile" di aprire un trade e vedere se aiuta.


D'altra parte, la funzione sleep ha risolto il problema anche per me.

Se guardate la classe ctrade. C'è qualche differenza nell'usare questa classe rispetto al modo mqltraderequest?
 
snelle_moda:

Questo è un buon punto. Forse dovrei usare solo il cambiamento del prezzo BID.

Una BAR sul grafico si basa anche sul prezzo BID?


Per il segnale di trigger del mio EA mi interessa solo il cambiamento del prezzo su cui si basa la BAR a 1 minuto.

Snelle_moda hai ancora la doppia entrata usando mqltraderequest per inviare l'ordine?
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 chiedere se PositionSelect() controlla il lato client o il lato sever?

Ho la forte sensazione che il problema sia causato dal ritardo in cui il server (lato broker) sta elaborando la richiesta e non ha aggiornato il lato client, ecco perché PositionSelect() funziona di nuovo

Ho la forte sensazione che non ci sia alcuna differenza quando usiamo il modo cTrade vs MqlTradeRequest e la funzione Sleep dovrebbe aiutare a ritardare tutto per far sì che il nostro lato client venga "aggiornato" prima che PositionSelect() venga eseguito nuovamente causando una doppia entrata. Controllando dalla mia scheda giornale, >2013.12.20 08:35:00 Trades '800****': exchange buy 0.01 EURUSD at market placed for execution in 313 ms <

mettere sonno più di 400 dovrebbe essere sicuro??

Cosa ne pensate?

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 hai ancora la doppia entrata usando mqltraderequest per inviare l'ordine?


Ho avuto 1 altro doppio ingresso dal 03-10-2013. Uso entrambi i metodi per inviare il mio ordine. Vedi il mio post precedente.