Publi |
Publi |
¿Para que quieres hacer eso si el propio metatrader te da la opcion de arrastar el stop donde quieras y cuando quieras?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
Última edición por Ciclo; 12:04 a las
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
Aviso Legal Ley Orgánica 15/1999, de 13 de diciembre, de Protección de Datos de Carácter Personal |