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
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 puede utilizar este EA por sí mismo sin que se ejecute ningún otro EA, ¡ni siquiera él mismo en otro gráfico!
bool ans;
//You do not select an order
if(OrderType()==OP_BUY){
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);
}
}
Muchas gracias por ayudarme con mi código hasta ahora y por su tiempo, intentaré hacer los ajustes necesarios.
Como tienes demasiados problemas de lógica en tu EA, te sugiero que eches un vistazo al código de ejemplo de MetaQuotes, concretamente"Moving Average.mq4" y/o "MACD Sample.mq4" y construyas sobre él, hasta que entiendas los principios básicos de cómo funciona un EA.
He adjuntado los archivos, pero los encontrarás en tu carpeta "MQL4\Experts".
EDIT: Con respecto al código, usted está usando 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ó.
Después de ver tu edición.....
Siempre había asumido que un OrderSelect() se perdería cuando hay un nuevo tick.
Así que lo he comprobado y he encontrado que una vez que una orden es seleccionada, permanece seleccionada incluso en nuevos ticks posteriores.
Cada día se aprende algo nuevo :)
Siempre había asumido que un OrderSelect() se perdería cuando hay un nuevo tick.
Así que lo comprobé y descubrí que una vez que se selecciona una orden, ésta permanece seleccionada incluso en nuevos ticks posteriores.
Cada día se aprende algo nuevo :)
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's.
Tal y como está, sólo se puede utilizar este EA por sí mismo sin que se ejecute ningún otro EA, ¡ni siquiera él mismo en otro gráfico!
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol()) continue;
//---Check Order Type
if(OrderType()==OP_BUY)
{
if(fastma < slowma)
{
if(OrderClose(OrderTicket(),Lots,Bid,10,clrNONE))
Print("Order Closed : ", OrderClosePrice());
return(0);
}
else
Print("Error : ", GetLastError());
return(0);
break;
}
if(OrderType()==OP_SELL)
{
if(fastma > slowma)
{
if(OrderClose(OrderTicket(),Lots,Ask,10,clrNONE))
Print("Order Closed : ", OrderClosePrice());
return(0);
}
else
Print("Error : ", GetLastError());
return(0);
break;
}
}
Aquí está la sección OrderClose, ya no estoy recibiendo el error de entrada inválida, pero ahora estoy recibiendo el precio inválido
Aquí está directamente desde el registro
2016.12.09 10:47:10.243 Simple Moving Average Crossover Strategy EURUSDi,H1: precio no válido 1.05454000 para la función OrderClose
{
if(OrderClose(OrderTicket(),Lots,Bid,10,clrNONE))
Print("Order Closed : ", OrderClosePrice());
return(0);
}
...
{
if(OrderClose(OrderTicket(),Lots,Ask,10,clrNONE))
Print("Order Closed : ", OrderClosePrice());
return(0);
Aquí está la sección OrderClose, ya no estoy recibiendo el error de ticket inválido, pero ahora estoy recibiendo el precio inválido
Aquí está directamente desde el registro
2016.12.09 10:47:10.243 Simple Moving Average Crossover Strategy EURUSDi,H1: precio no válido 1.05454000 para la función OrderClose
No use Bid/Ask cuando cierre, use OrderClosePrice(). Será automáticamente el precio bueno.
¿Debo sustituirlo en la función OrderClose? y si es así, ¿debo eliminar el OrderClosePrice en la función de impresión que hay debajo?
Editar:
Acabo de hacerlo, pero ahora no mantiene ninguna posición abierta. Sólo abre y cierra posiciones, aunque ahora no tiene ningún problema para trabajar en múltiples pares.
if(OrderType()==OP_BUY)
{
if(fastma < slowma)
{
if(OrderClose(OrderTicket(),Lots,Bid,10,clrNONE))
Print("Order Closed : ", OrderClosePrice());
return(0);
}
else
Print("Error : ", GetLastError());
return(0);
break;
}
No hay necesidad de los retornos o la ruptura, ya que necesita para completar el bucle
Además, su impresión de error depende de que
if(fastma < slowma)
sea falsa, no está relacionada con el hecho de que OrderClose() falle
if(OrderType()==OP_BUY)
{
if(fastma<slowma)
{
if(OrderClose(OrderTicket(),Lots, OrderClosePrice(),10,clrNONE))
Print("Order Closed : ",OrderClosePrice());
else
Print("Error : ",GetLastError())
}
}