- [ARCHIVO]Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No puedo ir a ningún sitio sin ti - 5.
- Ayuda a la codificación
- Necesito ayuda para detectar un pequeño error.
Soy muy nuevo en la codificación de mql4, y he completado mi primera EA. Mi único problema ahora es que no puedo conseguir que abra operaciones en más de un par. En la sección de EA en el terminal al lado de la revista, se envía una corriente del error, ticket inválido para la función orderclose, a pesar de que la EA abre y cierra las operaciones muy bien en un par. ¿Podría alguien echar una mano, por favor?
¿Cómo esperas que lo sepamos si no muestras tu código ni el registro de los errores?
Si quieres que te ayudemos, tendrás que mostrar tu código y los errores que da (los resultados en el registro). También será útil saber qué pares de divisas y plazos de tiempo está probando, cuando echemos un vistazo a su código.
Además, tenga en cuenta que en MetaTrader 4 sólo se puede probar una sola moneda a la vez en el Probador de Estrategias. Si su EA opera con varias divisas simultáneamente desde un solo gráfico, no podrá probarlo en el Probador de Estrategias - ¡sólo en una cuenta Demo o real!
Matt_Townsend: a pesar de que el EA abre y cierra operaciones sin problemas en un par. | Por eso recomiendo No operar con varias divisas en un EA
|
Por favor, edita tu mensaje y utiliza el botón SRC para añadir tu código. No se limite a copiar y pegar como texto estándar, ya que es difícil de leer. Estoy seguro de que puedes ver en otros hilos cómo se debe hacer. Por favor, utilice el botón SRC para publicar su código.
EDIT: Como se pidió antes - . .. También será útil saber qué pares de divisas y marcos de tiempo que está probando en ...
EDIT2: Como se pidió antes - ... así como los errores que da (los resultados en el registro) ...
Por favor, edita tu mensaje y utiliza el botón SRC para añadir tu código. No se limite a copiar y pegar como texto estándar, ya que es difícil de leer. Estoy seguro de que puedes ver en otros hilos cómo se debe hacer. Por favor, utilice el botón SRC para publicar su código.
//| Simple Moving Average Crossover Strategy.mq4 |
//| Matthew Townsend |
//+------------------------------------------------------------------+
#property version "1.05"
#property strict
//---
//---Inputs
extern double Lots =0.01;
extern int FastMA =5;
input int FastMAMode =MODE_EMA;
extern int SlowMA =8;
input int SlowMAMode =MODE_SMA;
//+----------------------------------------+
//|undesirables |
//+----------------------------------------+
int init()
{
//----
//----
return(0);
}
int deinit()
{
//----
//----
return(0);
}
//+---------------------------------------------+
//|System start |
//+---------------------------------------------+
int start()
{
double fastma, slowma;
int ticket, total;
//---define Ma's
fastma = iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,0);
slowma = iMA(NULL,0,8,0,MODE_SMA,PRICE_CLOSE,0);
total = OrdersTotal();
//---Start operations
if(total < 1)
{
if(fastma > slowma)
{
ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,10,0,0,"",0,0,Blue);
if(ticket > 0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Buy order opened : ", OrderOpenPrice());
}
else
Print("Error opening order : ", GetLastError());
return(0);
}
if(fastma < slowma)
{
ticket = OrderSend(Symbol(),OP_SELL,Lots,Bid,10,0,0,"",0,0,Red);
if(ticket > 0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Sell order opened : ", OrderOpenPrice());
}
else
Print("Error opening order : ", GetLastError());
return(0);
}
return(0);
}
bool ans;
if(OrderType()==OP_BUY)
{
while(fastma < slowma)
{
ans = OrderClose(OrderTicket(),Lots,Bid,10,clrNONE);
if(ticket < 1)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Buy order closed : ", OrderClosePrice());
}
else
Print("Error closing order : ", GetLastError());
return(0);
}
}
if(OrderType()==OP_SELL)
{
while(fastma > slowma)
{
ans = OrderClose(OrderTicket(),Lots,Ask,10,clrNONE);
if(ticket < 1)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Sell order closed : ", OrderClosePrice());
}
else
Print("Error closing order : ", GetLastError());
return(0);
}
}
return(0);
}
//+-----------------------------------------------------------------------------------+
He pedido que EDITES tu post anterior, no que añadas uno nuevo, ¡para no alargar tanto el hilo!
Estaba probando en un marco de tiempo de 1 hora, EURUSD y 1 hora GBPUSD
...
ans = OrderClose(OrderTicket(),Lots,Bid,10,clrNONE);
...
ans = OrderClose(OrderTicket(),Lots,Ask,10,clrNONE);
...
No está comprobando correctamente el resultado de la operación de cierre.
¡En términos de lógica hay varios problemas con su EA, pero tal como está en este momento, se está ejecutando sin ningún error en mi extremo en el Probador de Estrategias, así que por favor proporcione la lista de errores que está recibiendo!
Ya hay dos advertencias del compilador para el siguiente código:
...
ans = OrderClose(OrderTicket(),Lots,Bid,10,clrNONE);
...
ans = OrderClose(OrderTicket(),Lots,Ask,10,clrNONE);
...
No está comprobando correctamente el resultado de la operación de cierre.
¡En términos de lógica hay varios problemas con su EA, pero tal como está en este momento, se está ejecutando sin ningún error en mi extremo, así que por favor proporcione la lista de errores que está recibiendo!
El único error que he estado recibiendo del EA es laentrada inválida para la función orderclose, con un número al lado, me gustaría mostrar el registro real, pero en el segundo gráfico con el EA ejecutándose no está haciendo nada, ya que para normalmente intentaría abrir una operación inmediatamente. Si, y cuando el registro empieza a llenarse con el error, ¿cómo haría para mostrar el registro real?
Seleccione las líneas en cuestión con Click, Ctrl-Click o Shift-Click (operación estándar de windows), luego haga click derecho en la selección y elija "Copiar".
EDIT: Con respecto al código, usted está utilizando el OrderSelect, pero siempre está asumiendo que funciona cada vez. Y cuando no funciona sigues usando las funciones de detalles del pedido como OrderTicket() en tu cierre, que podría fallar si el OrderSelect() inicial también falló. Como he dicho, ¡tienes muchos problemas de lógica en tu código!
bool ans;
//You do not select an order
{
while(fastma < slowma) //Use if not while
{
ans = OrderClose(OrderTicket(),Lots,Bid,10,clrNONE);
if(ticket < 1) //ticket is a local variable and has not been assigned a value
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Buy order closed : ", OrderClosePrice());
}
else
Print("Error closing order : ", GetLastError());
return(0);
}
}
El único error que he estado recibiendo del EA es laentrada inválida para la función orderclose, con un número al lado, me gustaría mostrar el registro real, pero en el segundo gráfico con el EA corriendo no está haciendo nada, ya que para normalmente intentaría abrir una operación inmediatamente. Si, y cuando el registro comienza a llenarse con el error, ¿cómo haría para mostrar el registro real?
Otra nota muy importante con respecto al uso de su EA en múltiples pares de divisas o marcos de tiempo.
Su código no utiliza la selección del "Número Mágico" ni comprueba el Símbolo (ni el "Número Mágico") en uso cuando comprueba las órdenes abiertas en el Historial. Así que, en esencia, su EA no funcionará correctamente ni con él mismo ni con otros EA.
Tal y como está, sólo se puede utilizar este AE por sí mismo sin que se ejecute ningún otro AE, ni siquiera en otro gráfico.
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso