No se que codigo utilizar para modificar una orden abierta

 

Hola tod@s,

Mi cuenta real es ECN, y como sabéis en este tipo de cuentas no se puede poner el SL y TP al enviar la orden, solamente los deja poner modificando la orden ya abierta.

Estoy realizando un asesor experto para MT5 y no se que código o función tengo que poner para que me modifique un orden ya abierta. El programa consiste en unos indicadores que dan una señal para comprar y vender cuando se cumplen una serie de condiciones. Estas condiciones se encuentran en la función OnTick y llaman a unas funciones del tipo bool llamadas compra y venta. Os pongo el código de las funciones compra y venta para que veáis como emito la orden. También he puesto la "función" donde creo que debería ir el código para modificar la orden, la cual la he llamado modificarorden.

Estuve mirando por todas partes y no encuentro nada claro, ya que muchos utilizan el Ctrade y yo no. He visto la función OrderModify, pero el metaeditor no la reconoce si no es con Ctrade.

He probado el asesor en la cuenta real y sin poner los SL y TP me lanza las ordenes correctamente.

Un saludo y espero que podáis ayudarme. Muchas gracias.

bool compra()
{
            MqlTradeTransaction mtransation;
            MqlTradeRequest mrequest;
            MqlTradeResult mresult;
            MqlTick last_tick;
            SymbolInfoTick(_Symbol,last_tick);
            ZeroMemory(mrequest);
            mrequest.action = TRADE_ACTION_DEAL;
            mrequest.symbol = Symbol();
            mrequest.volume = Lote;
            mrequest.magic  = magic;
            mrequest.deviation=Slippage;
            mrequest.type = ORDER_TYPE_BUY;
            mrequest.price=last_tick.ask;
            OrderSend(mrequest,mresult);
            posicionabierta=1;
            return(true);         
}

bool venta()
{
            MqlTick last_tick;
            MqlTradeRequest mrequest;
            MqlTradeResult mresult;
            SymbolInfoTick(_Symbol,last_tick);
            ZeroMemory(mrequest);
            mrequest.action = TRADE_ACTION_DEAL;
            mrequest.symbol = Symbol();
            mrequest.volume = Lote;
            mrequest.magic  = magic;
            mrequest.deviation=Slippage;
            mrequest.type=ORDER_TYPE_SELL;
            ticket=mrequest.order;
            mrequest.price=last_tick.bid;
            OrderSend(mrequest,mresult);
            posicionabierta=1;
            return(true);
}

bool modificarorden()
{

      posicionabierta=0;      
      return(true);
}
 

Puede establecer SL / TP directamente con su orden, incluso con una cuenta ECN.

O usted tiene que utilizar TRADE_ACTION_SLTP :

SL & TP Modification

Es una orden comercial para modificar los niveles StopLoss y/o TakeProfit. Se requiere especificar 4 campos:

  • action
  • symbol
  • sl
  • tp
 
Rick7:

Hola tod@s,

Mi cuenta real es ECN, y como sabéis en este tipo de cuentas no se puede poner el SL y TP al enviar la orden, solamente los deja poner modificando la orden ya abierta.

Estoy realizando un asesor experto para MT5 y no se que código o función tengo que poner para que me modifique un orden ya abierta. El programa consiste en unos indicadores que dan una señal para comprar y vender cuando se cumplen una serie de condiciones. Estas condiciones se encuentran en la función OnTick y llaman a unas funciones del tipo bool llamadas compra y venta. Os pongo el código de las funciones compra y venta para que veáis como emito la orden. También he puesto la "función" donde creo que debería ir el código para modificar la orden, la cual la he llamado modificarorden.

Estuve mirando por todas partes y no encuentro nada claro, ya que muchos utilizan el Ctrade y yo no. He visto la función OrderModify, pero el metaeditor no la reconoce si no es con Ctrade.

He probado el asesor en la cuenta real y sin poner los SL y TP me lanza las ordenes correctamente.

Un saludo y espero que podáis ayudarme. Muchas gracias.

//variables globales

MqlTradeRequest      regSolicitud;      // solicitar datos para acción comercial
MqlTradeResult       regResultado;      // resultado de la acción comercial
MqlTradeCheckResult  regComprueba;      // comprobar datos de la acción comercial

//------------------------------------------------------------------+
//| Modifica posición abierta previamente                           |
//+-----------------------------------------------------------------+
bool modifPosicion(string simb, double sl, double tp, string coment="", ulong nMagico= 1234)
{
   bool exito= false;
   limpiaRegistros();
   regSolicitud.action  = TRADE_ACTION_SLTP;
   regSolicitud.symbol  = simb;
   regSolicitud.magic   = nMagico;
   regSolicitud.sl      = sl;       //SL en precio
   regSolicitud.tp      = tp;       //TP en precio
   regSolicitud.comment = coment;
   exito= OrderCheck(regSolicitud, regComprueba);
   exito= exito && OrderSend(regSolicitud, regResultado);
   return(exito);
}
//-------------------------------------------- LIMPIAR ESTRUCTURAS DE COMERCIO ---------------------------
void limpiaRegistros()
{
   ZeroMemory(regSolicitud);
   ZeroMemory(regResultado);
   ZeroMemory(regComprueba);
}

 

Buenas tardes,


Gracias por responder a los dos pero tengo una duda. Con ese trozo de código que me has puesto, entiendo que hace la modificación, pero no esta indicando a que operación abierta tiene que realizarla, es decir no se debería de comprobar de alguna forma el número de operación abierta y a continuación ir a la función modifPosicion para que esta incluya el SL y TP?


Un saludo y gracias.

 
Rick7 :

Buenas tardes,


Gracias por responder a los dos pero tengo una duda. Con ese trozo de código que me has puesto, entiendo que hace la modificación, pero no esta indicando a que operación abierta tiene que realizarla, es decir no se debería de comprobar de alguna forma el número de operación abierta y a continuación ir a la función modifPosicion para que esta incluya el SL y TP?


Un saludo y gracias.

Con MT5 / mql5, sólo hay 1 posición (operación). SL / TP están relacionados con esa posición.

Órdenes, Posiciones y Transacciones en MetaTrader 5
Órdenes, Posiciones y Transacciones en MetaTrader 5
  • 2013.12.20
  • MetaQuotes Software Corp.
  • www.mql5.com
No se puede crear un robot de trading robusto sin un entendimiento de los mecanismos del sistema de trading del del MetaTrader 5. El terminal de cliente recibe la información sobre las posiciones, órdenes y transacciones del servidor de trading. Para gestionar esta propiedad de datos usando el MQL5 es necesario tener un buen entendimiento de la interacción entre el programa MQL5 y el terminal de cliente.
 
angevoyageur:

Con MT5 / mql5, sólo hay 1 posición (operación). SL / TP están relacionados con esa posición.

Gracias por tu aporte, me hes de gran utilidad ese articulo. Espero que se me resuelvan las dudas y pueda proseguir con el desarrollo del asesor.

 Un saludo.

Razón de la queja: