Mi EA hace una doble entrada - página 3

 
doshur:
Omg. ¿Entonces dormir no ayuda?

¿Qué podemos hacer para evitarlo?

A mí me ayudó. Usé el consejo de snelle_modas más el sueño. Eso funcionó.

Pero desde entonces renové la forma de abrir las operaciones. Ahora no necesito ninguna de estas soluciones. Esto es lo que escribí a angevoyageur ayer. Espero que sea de ayuda:

Hola,

Bueno, la última vez que lo resolví, fue usando la función de dormir después del comercio. Pero con mi nuevo bot esto ya no es necesario. Tal vez eso es porque la apertura de un comercio se maneja ahora de manera diferente. Este primer bot con el que tuve este problema (tal vez otros EAs también tenían esta forma de abrir una operación y por eso tenían el problema también (por ejemplo, metaquant)) utilizaba 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));
}


Ahora abro las órdenes como he aprendido de la documentación y ya no tengo 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;
           }
}


Tal vez esto ayude. Veo que doshur usa una forma similar de abrir operaciones como yo cuando causaba este comportamiento.

Saludos cordiales
 
Entonces, ¿hay un problema con la clase ctrade?

¿Alguien puede confirmar esto antes de que cambie mi código?
 
doshur:
¿Así que hay un problema con la clase ctrade?

¿Puede alguien confirmar esto antes de que cambie mi código?

Sólo puedo decir que ya no tengo este problema después de eliminar la clase ctrade.

Tal vez quieras crear una segunda versión del EA que utilice la forma "antigua" de abrir una operación y ver si ayuda.


Por otro lado, la función sleep también me solucionó el problema.

Documentation on MQL5: Common Functions / Sleep
Documentation on MQL5: Common Functions / Sleep
  • www.mql5.com
Common Functions / Sleep - Documentation on MQL5
 
doshur:
¿Hay algún problema con la clase ctrade?

¿Puede alguien confirmar esto antes de que cambie mi código?
Por favor, tenga paciencia, le responderé lo antes posible. Intentaré reproducir el problema cuando el mercado esté abierto.
 
No sé si el broker juega aparte aquí pero parece que nuestro broker es el mismo. Alpari.

Por favor, elimine el nombre del corredor si es necesario.
 
Klammeraffe:

Sólo puedo decir que ya no tengo este problema después de quitar la clase ctrade.

Tal vez quieras crear una segunda versión del EA que utilice la forma "antigua" de abrir una operación y ver si ayuda.


Por otro lado, la función sleep también me solucionó el problema.

Este es un punto interesante.

Yo uso la clase ctrade para ajustar el valor del stoploss.

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


La apertura de la posición en sí se hace utilizando la forma "antigua".

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

¿Es posible que la clase ctrade esté enviando una nueva orden doble cuando estoy ajustando la orden de stoploss? Parece extraño.

 
Klammeraffe:

Sólo puedo decir que ya no tengo este problema después de eliminar la clase ctrade.

Tal vez quieras crear una segunda versión del EA que utilice la forma "antigua" de abrir una operación y ver si ayuda.


Por otro lado, la función sleep también me solucionó el problema.

Si se mira la clase ctrade. ¿Hay alguna diferencia usando esta clase vs la forma mqltraderequest?
 
snelle_moda:

Es un buen punto. Tal vez debería utilizar sólo el cambio en el precio BID.

¿Una barra en el gráfico también se basa en el precio BID?


Para la señal de activación de mi EA sólo me interesa el cambio del precio en el que se basa la barra de 1 minuto.

Snelle_moda ¿todavía se obtiene la doble entrada utilizando mqltraderequest para enviar la orden?
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
 

¿Puedo preguntar si PositionSelect() comprueba el lado del cliente o el lado del servidor?

Tengo la fuerte sensación de que el problema es causado por el retraso en el que el servidor (lado del corredor) está procesando la solicitud y no se actualiza el lado del cliente es por eso que PositionSelect() se ejecuta de nuevo

Siento fuertemente que no hay diferencia cuando usamos cTrade vs MqlTradeRequest manera y la función Sleep debe ayudar a retrasar todo para conseguir nuestro lado del cliente se "actualiza" antes de PositionSelect() se ejecuta de nuevo causando una doble entrada. Comprobando desde mi ficha de diario, >2013.12.20 08:35:00 Trades '800****': exchange buy 0.01 EURUSD at market placed for execution in 313 ms <

poner el sueño más de 400 debe ser seguro???

¿Qué piensa usted?

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 ¿todavía tienes doble entrada usando mqltraderequest para enviar la orden?


He tenido 1 doble entrada más desde el 03-10-2013. Utilizo ambos métodos para enviar mi orden. Ver mi post anterior.

Razón de la queja: