
Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
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
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í.
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
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...................
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.
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.
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).