Automatizando el MagicNumber

El MagicNumber es un parámetro de las órdenes de MetaTrader que sirve para identificar qué EA la ejecutó. Cuando queremos probar un expert en varios gráficos ya sea en en distintos símbolos o en el mismo pero con distintos periodos de tiempo, hay que modificar el parámetro del EA y asignar un MagicNumber distinto a cada gráfico. Vamos a ver cómo hacer esto de forma automática.
Es muy sencillo, símplemente necesitamos un identificador único para cada gráfico, buscando en las funciones de ventanas de MetaTrader nos encontramos con la función WindoHandle, manejador de ventanas.
int WindowHandle( string symbol, int timeframe)
Returns the system window handler containing the given chart. If the chart of symbol and timeframe has not been opened by the moment of function calling, 0 will be returned.Parameters:
symbol – symbol name.
timeframe – Timeframe. It can be any of Timeframe enumeration values. 0 means the current chart timeframe.Sample:
int win_handle=WindowHandle(”USDX”,PERIOD_H1);
if(win_handle!=0)
Print(”Window with USDX,H1 detected. Rates array will be copied immediately.”);
Ya solo queda asignar al MagicNumber este identificador único:
int MagicNumber; int init() { MagicNumber = WindowHandle(Symbol(),0); Comment(MagicNumber); }
Listo para utilizarlo en cada llamada a OrderSend que realice el EA. Como veis en la imagen cada nuevo gráfico sobre el que carguemos el EA mostrará en el Comment un MagicNumber único. De momento nos arreglamos así, esperemos que en el nuevo MetaTrader5 hayan contado ya con esto.

Ahora bien, este código todavía no funciona correctamente del todo. Cuando hagamos backtesting de EAs notaremos que no abre operaciones cuando desmarcamos la casilla visual y sí las abre cuando la marcamos ¿cómo es posible? pues como ya habréis adivinado al hacer un backtesting desmarcando el modo visual la plataforma MetaTrader NO crea una nueva ventana gráfica y por lo tanto estamos utilizando mal la función WindowHandle (¿manejar qué ventana?), hay que preveer esta situación y asignar un número mágico fijo para el caso en el que estemos haciendo un backtesting no visual. Lo haremos de la siguiente forma:
int MagicNumber; int init() { if(!IsTesting()) MagicNumber = WindowHandle(Symbol(),0); else if(!IsVisualMode()) MagicNumber = 23; }
Con este código ya no necesitamos estar siempre pendientes de asignar nuevos MagicNumber únicos a cada gráfico.




