Cerrar la orden automáticamente después de un período determinado y/o SL - página 3

 

Esto está muy mal. . .

OrderSelect(BuyTicket || SellTicket, SELECT_BY_TICKET);

(BuyTicket || SellTicket) dará como resultado true o false . . . y en este caso true o false será considerado como un 1 o 0 . . . no su número de SellTicket o Buyticket . . .

Stoploss = 40 . . . cuando se utiliza un stoploss en OrderSend es un precio . . no un número de pips, el deslizamiento es un número de pips . . . lea la documentación: OrderSend

stoploss - Nivel de stop loss.
takeprofit - Nivel de Take Profit.
 

Vale, ya sé lo que quieres decir, así que necesito un comando para seleccionar el pedido mientras se usa OrderSelect... ¿o es que OrderSelect en este caso es generalmente erróneo?

 

Lea la documentación... OrderSelect es necesario para seleccionar la orden antes de que pueda utilizar las funciones OrderLots, OrderTicket, OrderOpenPrice, etc, etc "Nota: La orden debe ser seleccionada previamente por la funciónOrderSelect() ".

Si no necesita utilizar una información perteneciente a una orden existente no necesita OrderSelect. si lo hace... pues sí.

 
RaptorUK:

Lea la documentación... OrderSelect es necesario para seleccionar la orden antes de que pueda utilizar las funciones OrderLots, OrderTicket, OrderOpenPrice, etc, etc "Nota: La orden debe ser seleccionada previamente por la funciónOrderSelect() ".

Si no necesita utilizar una información perteneciente a una orden existente no necesita OrderSelect. si lo hace... pues lo hace.


Actualmente creo que necesitaría esta información, porque si hay una posición en el mercado necesito cerrarla y sustituirla por otra. Pensé que OrderSelect me ayudaría en este sentido. Pero si Orderselect es sólo para las órdenes abiertas y no para la posición activa en el mercado no es útil. ¿Estoy en lo cierto?

Pero si OrderSelect no sirve, ¿cómo puedo cerrar las posiciones activas?

saludos

Marc

 
Si no utiliza órdenes pendientes y tiene órdenes abiertas, éstas serán de compra o de venta... una orden de mercado.
 
//+------------------------------------------------------------------+
//| Der Stundentrader.mq4 |
//| Der Marc |
//| Es gibt gar keine Internetseite |
//+------------------------------------------------------------------+
#property copyright "Der Marc"
#property link "Es gibt gar keine Internetseite"

//Wichtige Variablen
extern double Minlot=0.01;
extern int Digits2Round=2;
extern int PercentOfFreeDepo=1;
extern int Slippage=5;
extern int MagicNumber =1;
extern int TradeHour3=3;
extern int TradeHour4=4;
extern int TradeHour7=7;
extern int TradeHour10=10;
extern int TradeHour17=17;
extern int TradeHour18=18;
extern int TradeHour20=20;
extern int TradeHour12=12;
extern int TradeHour23=23;
extern int StopLoss=40;

//Globale Variablen
int BuyTicket;
int SellTicket;
double UsePoint;
int UseSlippage;

int openbuy = 0;
int opensell = 0;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
UsePoint = PipPoint(Symbol());
UseSlippage = GetSlippage(Symbol(), Slippage);
}

//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
double FreeDepo=NormalizeDouble(AccountBalance()-AccountMargin(),Digits2Round);
double Risk=NormalizeDouble((FreeDepo*PercentOfFreeDepo/100),Digits2Round);
double Lot=NormalizeDouble(Risk/(StopLoss/0.0001)*0.1,Digits2Round);
//===================== Lets determine lot size and risk ===================================
if ( Lot<Minlot )
{
Lot=Minlot;
}
Comment( "\n","Acceptable risk is ",PercentOfFreeDepo, "% = ",Risk," of the free money ",FreeDepo," in lots = ",Lot);
for(int i = OrdersTotal() - 1; i >= 0; i--)
    {
    if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
       {
       if((OrderOpenTime()+3600) < TimeCurrent())
          { 
           if (OrderType() == OP_BUY)          
              {
               bool Closed = OrderClose(OrderTicket() ,OrderLots(), Ask, UseSlippage, Red);           
               openbuy = 0;
              }
           if (OrderType() == OP_SELL)          
              {
               Closed = OrderClose(OrderTicket() ,OrderLots(), Bid, UseSlippage, Red);  
               opensell = 0;         
              }              
          }
       }
    }


//BuyOrder 
if ((TradeHour3==Hour())||(TradeHour4==Hour())||(TradeHour7==Hour())||(TradeHour10==Hour())||(TradeHour17==Hour())||(TradeHour18==Hour())||(TradeHour20== Hour()) && openbuy == 0) //Signal Buy
{
  openbuy=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage ,Ask - StopLoss * Point,0,"time trader buy order ",MagicNumber,0,Blue);
}
//SellOrder
if ((TradeHour12==Hour())||(TradeHour23==Hour())&& opensell == 0) //Signal Sell
{
  opensell=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,Bid + StopLoss * Point,0,"time trader sell order ",MagicNumber,0,Green);
} 

//----
return(0);
}
//+------------------------------------------------------------------+
//Pip Point Function
double PipPoint (string Currency)
{
int CalcDigits = MarketInfo(Currency, MODE_DIGITS);
if(CalcDigits == 2 || CalcDigits == 3) double CalcPoint = 0.01;
else if(CalcDigits == 4 || CalcDigits == 5) CalcPoint = 0.0001;
return (CalcPoint);
}

//Get Slippage Function
int GetSlippage(string Currency, int SlippagePips)
{
int CalcDigits = MarketInfo(Currency, MODE_DIGITS);
if(CalcDigits == 2 || CalcDigits == 4) double CalcSlippage = SlippagePips;
else if(CalcDigits == 3 || CalcDigits == 5) CalcSlippage = SlippagePips * 10;
return (CalcSlippage);
}

This seems to be mostly correct, but now I need to know why the prog only executes the sell order @ 12 & 23...and not the buy orders...?
 

nirvanamac:

Esto parece ser mayormente correcto, pero ahora necesito saber por qué el prog sólo ejecuta la orden de venta @ 12 y 23...y no las órdenes de compra...?

Probablemente lo haga... y probablemente genere un error que no está atrapando...

Pruebe...................

//BuyOrder 
if ((TradeHour3==Hour())||(TradeHour4==Hour())||(TradeHour7==Hour())||(TradeHour10==Hour())||(TradeHour17==Hour())||(TradeHour18==Hour())||(TradeHour20== Hour()) && openbuy == 0) //Signal Buy
{
  openbuy=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage ,Ask - StopLoss * Point,0,"time trader buy order ",MagicNumber,0,Blue); 
  if (openbuy < 0) Print("OrderSend OP_BUY failed, error: ", GetLastError() );
}
//SellOrder
if ((TradeHour12==Hour())||(TradeHour23==Hour())&& opensell == 0) //Signal Sell
{
  opensell=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,Bid + StopLoss * Point,0,"time trader sell order ",MagicNumber,0,Green);
  if (opensell < 0) Print("OrderSend OP_SELL failed, error: ", GetLastError() );

} 

Tu OrderClose está mal. . . abres una Buy en Ask, para cerrar una Buy vendes. . . vendes en Bid, abres una Sell en Bid para cerrar una Sell compras. . . compras en Ask.

 
RaptorUK:
Tu OrderClose está mal... abres una Buy en Ask, para cerrar una Buy vendes... vendes en Bid, abres una Sell en Bid para cerrar una Sell compras... compras en Ask.
O bien, como ya ha seleccionado la orden sólo tiene que utilizar
Closed = OrderClose(OrderTicket() ,OrderLots(), OrderClosePrice(), UseSlippage, Red);  
Y no tienes que diferenciar el tipo de orden.
 

Muchas gracias por ayudarme... he modificado el código con tus indicaciones. Se ve de esta manera:

//+------------------------------------------------------------------+
//| Der Stundentrader.mq4 |||| Der Marc
//| Der Marc ||
//| No hay página web.
//+------------------------------------------------------------------+
#property copyright "Der Marc"
#property link "No hay sitio de Internet"

//Wichtige Variablen
extern double Minlot=0.01;
extern int Digits2Round=2;
extern int PercentOfFreeDepo=1;
extern int Slippage=5;
extern int MagicNumber=1;
extern int TradeHour3=3;
extern int TradeHour4=4;
extern int TradeHour7=7;
extern int TradeHour10=10;
extern int HoraComercial17=17;
extern int HoraComercial18=18
extern int HoraComercial20=20;
extern int HoraComercial12=12;
extern int TradeHour23=23;
extern int StopLoss=400;

//Variables Globales
int BuyTicket;
int SellTicket;
double UsePoint;
int UseSlippage;

int openbuy = 0;
int opensell = 0;
//+------------------------------------------------------------------+
//| función de inicialización de expertos ||.
//+------------------------------------------------------------------+
int init()
{
UsePoint = PipPoint(Symbol());
UseSlippage = GetSlippage(Symbol(), Slippage);
}

//+------------------------------------------------------------------+
//| función de inicio de experto ||
//+------------------------------------------------------------------+
int inicio()
{
double FreeDepo=NormalizeDouble(AccountBalance()-AccountMargin(),Digits2Round);
double Risk=NormalizeDouble((FreeDepo*PercentOfFreeDepo/100),Digits2Round);
double Lot=NormalizeDouble(Risk/(StopLoss/0.0001)*0.1,Digits2Round);
//===================== Permite determinar el tamaño del lote y el riesgo ===================================
if ( Lote<Minlot )
{
Lot=Minlot;
}
Comment( "\n", "El riesgo aceptable es ",PercentOfFreeDepo, "% = ",Risk," del dinero libre ",FreeDepo," en lotes = ",Lot);
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if((OrderOpenTime()+3600) < TimeCurrent())
{
if (OrderType() == OP_BUY | OP_SELL)
{
bool Closed = OrderClose(OrderTicket(),OrderLots(), OrderClosePrice(), UseSlippage, Red);
openbuy = 0;
opensell = 0;
}
if (OrderType() = OP_SELL)
{
Closed = OrderClose(OrderTicket(),OrderLots(), OrderClosePrice(), UseSlippage, Red);
opensell = 0;
openbuy = 0;
}
}
}
}
//Orden de compra
if ((TradeHour3==Hour())||(TradeHour4==Hour())||(TradeHour7==Hour())||(TradeHour10==Hour())|||(TradeHour17==Hour())||(TradeHour18==Hour())||(TradeHour20== Hour()) && openbuy == 0) //Signal Buy
{
openbuy=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,Ask - StopLoss * Point,0, "time trader buy order ",MagicNumber,0,Blue);
if (openbuy < 0) Print("OrderSend OP_BUY failed, error: ", GetLastError() );
}
//Orden de venta
if ((TradeHour12==Hour())||(TradeHour23==Hour())&& opensell == 0) //Signal Sell
{
opensell=Envío de Orden(Símbolo(),OP_SELL,Lote,Oferta,Deslizamiento,Oferta + StopLoss * Punto,0, "orden de venta del operador de tiempo ",MagicNumber,0,Verde);
if (opensell < 0) Print("OrderSend OP_SELL failed, error: ", GetLastError() );
}

//----
return(0);
}
//+------------------------------------------------------------------+
/Función Pip Point
double PipPoint (string Currency)
{
int CalcDigits = MarketInfo(Moneda, MODE_DIGITS);
if(CalcDigits == 2 | CalcDigits == 3) double CalcPoint = 0.01;
else if(CalcDigits == 4 | CalcDigits == 5) CalcPoint = 0.0001;
return (CalcPoint);
}

//Función GetSlippage
int GetSlippage(string Currency, int SlippagePips)
{
int CalcDigits = MarketInfo(Moneda, MODE_DIGITS);
if(CalcDigits == 2 | CalcDigits == 4) double CalcSlippage = SlippagePips;
else if(CalcDigits == 3 | CalcDigits == 5) CalcSlippage = SlippagePips * 10;
return (CalcSlippage);
}

Mientras se ejecuta el backtest hay un mensaje de error ERR_INVALID_TICKET (4108).

 

No se han ejecutado todas las órdenes

¿Podría ser que el error se deba a que el SL se activó antes?