Publi

Publi

Resultados 1 al 3 de 3


  1. #1

    ergaster


    Reputación:
    Poder de reputación: 3

    Mensajes: 24
    Créditos: 847

    Modificar operacion abierta


    Publi
    Buenas tardes a tod@s,

    Como el titulo indica necesito saber como modificar una posición abierta, para poner el SL y TP, debido a que mi cuenta es ECN.

    El caso es que la forma que tengo desarrollada no creo que sea la correcta, puesto que una vez envío la orden y esta se ejecuta, al entrar en la función de modificar en el siguiente tick, me vuelve a calcular el precio del ultimo tick, y me pone el SL y TP, en base a ese ultimo precio y no al de la orden de apertura, por lo que este ya ha podido variar. También he notado que me ha abierto dos operaciones consecutivas, no se si esto tendrá algo que ver, pero solo me paso desde que hice esta función.

    Mas concretamente necesito una forma de ordenar la modificación de la orden ya abierta en base al precio de apertura. Yo pienso que debería hacerse utilizando el ticket de la operación pero no se como desarrollarlo.

    Os pongo el código ya que no se si vais a entender mi explicación.


    void OnTick()
    {
    if(CopyBuffer(rsi_handle,0,0,3,rsi_buffer)<0 || CopyBuffer(cci_handle,0,0,3,cci_buffer)<0)
    {
    return;
    }

    if(!ArraySetAsSeries(rsi_buffer,true) || !ArraySetAsSeries(cci_buffer,true))
    {
    return;
    }

    Comment(" --- Valor vela previa --- RSI= <=30 / >=70: "+DoubleToString(rsi_buffer[2],4)+" -- >30 / <70: "+DoubleToString(rsi_buffer[1],4)+" --- CCI= <=-100 / >=100: "+DoubleToString(cci_buffer[2],4)+" -->-100 / <100: "+DoubleToString(cci_buffer[1],4));

    if (posicionabierta==1 || posicionabierta==2)
    {
    modifPosicion();
    }

    if(!PositionSelect(_Symbol))
    {
    if (rsi_buffer[2]<=30 && rsi_buffer[1]>30 && cci_buffer[2]<=-100 && cci_buffer[1]>-100)
    {
    compra();

    }
    else if(rsi_buffer[2]>=70 && rsi_buffer[1]<70 && cci_buffer[2]>=100 && cci_buffer[1]<100)
    {
    venta();
    }
    }


    }
    //+------------------------------------------------------------------+

    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;
    precio_ask=last_tick.ask;
    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;
    precio_bid=last_tick.bid;
    mrequest.price=last_tick.bid;
    OrderSend(mrequest,mresult);
    posicionabierta=2;
    return(true);
    }

    //------------------------------------------------------------------+
    //| Modifica posición abierta previamente |
    //+-----------------------------------------------------------------+
    bool modifPosicion()
    {
    MqlTradeRequest regSolicitud;
    MqlTradeResult regResultado;
    MqlTick last_tick;
    ZeroMemory(regSolicitud);
    ZeroMemory(regResultado);
    ZeroMemory(last_tick);
    SymbolInfoTick(_Symbol,last_tick);

    if (posicionabierta==1)
    {
    regSolicitud.action = TRADE_ACTION_SLTP;
    regSolicitud.symbol = Symbol();
    regSolicitud.sl = last_tick.bid-StopLoss*Point();
    regSolicitud.tp = last_tick.ask+TakeProfit*Point();
    OrderSend(regSolicitud, regResultado);
    }
    else if (posicionabierta==2)
    {
    regSolicitud.action = TRADE_ACTION_SLTP;
    regSolicitud.symbol = Symbol();
    regSolicitud.sl = last_tick.ask+StopLoss*Point();
    regSolicitud.tp = last_tick.bid-TakeProfit*Point();
    OrderSend(regSolicitud, regResultado);
    }
    posicionabierta=0;
    return(true);
    }


    Un saludo y gracias.
    Foro de Forex Trading United

     

  2.                         
    Publi
  3. #2
    Avatar de Ciclo
    Heidelbergensis


    Reputación:
    Poder de reputación: 14

    Espana
    Mensajes: 2.431
    Créditos: 19.921

    Re: Modificar operacion abierta

    Cita Iniciado por Rick7 Ver mensaje
    Buenas tardes a tod@s,

    Como el titulo indica necesito saber como modificar una posición abierta, para poner el SL y TP, debido a que mi cuenta es ECN.

    El caso es que la forma que tengo desarrollada no creo que sea la correcta, puesto que una vez envío la orden y esta se ejecuta, al entrar en la función de modificar en el siguiente tick, me vuelve a calcular el precio del ultimo tick, y me pone el SL y TP, en base a ese ultimo precio y no al de la orden de apertura, por lo que este ya ha podido variar. También he notado que me ha abierto dos operaciones consecutivas, no se si esto tendrá algo que ver, pero solo me paso desde que hice esta función.

    Mas concretamente necesito una forma de ordenar la modificación de la orden ya abierta en base al precio de apertura. Yo pienso que debería hacerse utilizando el ticket de la operación pero no se como desarrollarlo.

    Os pongo el código ya que no se si vais a entender mi explicación.


    void OnTick()
    {
    if(CopyBuffer(rsi_handle,0,0,3,rsi_buffer)<0 || CopyBuffer(cci_handle,0,0,3,cci_buffer)<0)
    {
    return;
    }

    if(!ArraySetAsSeries(rsi_buffer,true) || !ArraySetAsSeries(cci_buffer,true))
    {
    return;
    }

    Comment(" --- Valor vela previa --- RSI= <=30 / >=70: "+DoubleToString(rsi_buffer[2],4)+" -- >30 / <70: "+DoubleToString(rsi_buffer[1],4)+" --- CCI= <=-100 / >=100: "+DoubleToString(cci_buffer[2],4)+" -->-100 / <100: "+DoubleToString(cci_buffer[1],4));

    if (posicionabierta==1 || posicionabierta==2)
    {
    modifPosicion();
    }

    if(!PositionSelect(_Symbol))
    {
    if (rsi_buffer[2]<=30 && rsi_buffer[1]>30 && cci_buffer[2]<=-100 && cci_buffer[1]>-100)
    {
    compra();

    }
    else if(rsi_buffer[2]>=70 && rsi_buffer[1]<70 && cci_buffer[2]>=100 && cci_buffer[1]<100)
    {
    venta();
    }
    }


    }
    //+------------------------------------------------------------------+

    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;
    precio_ask=last_tick.ask;
    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;
    precio_bid=last_tick.bid;
    mrequest.price=last_tick.bid;
    OrderSend(mrequest,mresult);
    posicionabierta=2;
    return(true);
    }

    //------------------------------------------------------------------+
    //| Modifica posición abierta previamente |
    //+-----------------------------------------------------------------+
    bool modifPosicion()
    {
    MqlTradeRequest regSolicitud;
    MqlTradeResult regResultado;
    MqlTick last_tick;
    ZeroMemory(regSolicitud);
    ZeroMemory(regResultado);
    ZeroMemory(last_tick);
    SymbolInfoTick(_Symbol,last_tick);

    if (posicionabierta==1)
    {
    regSolicitud.action = TRADE_ACTION_SLTP;
    regSolicitud.symbol = Symbol();
    regSolicitud.sl = last_tick.bid-StopLoss*Point();
    regSolicitud.tp = last_tick.ask+TakeProfit*Point();
    OrderSend(regSolicitud, regResultado);
    }
    else if (posicionabierta==2)
    {
    regSolicitud.action = TRADE_ACTION_SLTP;
    regSolicitud.symbol = Symbol();
    regSolicitud.sl = last_tick.ask+StopLoss*Point();
    regSolicitud.tp = last_tick.bid-TakeProfit*Point();
    OrderSend(regSolicitud, regResultado);
    }
    posicionabierta=0;
    return(true);
    }


    Un saludo y gracias.
    ¿Para que quieres hacer eso si el propio metatrader te da la opcion de arrastar el stop donde quieras y cuando quieras?
    Foro de Forex Trading United
    Última edición por Ciclo; 12-12-2014 a las 13:04



  4. #3

    ergaster


    Reputación:
    Poder de reputación: 3

    Mensajes: 24
    Créditos: 847

    Re: Modificar operacion abierta


    Publi
    Cita Iniciado por Ciclo Ver mensaje
    ¿Para que quieres hacer eso si el propio metatrader te da la opcion de arrastar el stop donde quieras y cuando quieras?
    Estoy programando un asesor experto, para eso es.

    Un saludo.
    Foro de Forex Trading United

     

Etiquetas para este tema

Publi
Publi


Aviso Legal
Ley Orgánica 15/1999, de 13 de diciembre, de Protección de Datos de Carácter Personal