- Trading
- Trading Automático
- Asesores para NetTradeX
- Conversión de los scripts de MetaTrader 4 en NetTradeX
Conversión de los scripts de MetaTrader 4 en NetTradeX
Introducción
Una serie de asesores y scripts han sido creados para la plataforma de trading MetaTrader 4. Antes los traders, quienes querían usar esos scripts en la plataforma NetTradeX, tenían que procesar completamente el código fuente, lo que tomaba mucho tiempo. Con el fin de facilitar ese trabajo, hemos creado una librería para la compatibilidad de los lenguajes MQL4 y NTL+. Esa librería permite la simplificación del proceso de la conversión de los scripts al lenguaje NTL+ para su posterior lanzamiento en la terminal NetTradeX Advisors. Debido a las diferencias entre las plataformas MetaTrader y NetTradeX (y entre los lenguajes MQL4 y NTL+), como regla, se debe hacer algunos cambios en los scripts convertidos. La parte principal de adaptación se realiza por la librería MQL4.ntl, incluida en la terminal NetTradeX Advisors; sin embargo, el elaborador tendrá que modificar su script para el lanzamiento. En este artículo mostraremos cómo se debe usar las funciones de la librería y adicionalmente, qué cambios se debe hacer.
Principios básicos para trabajar con la librería MQL4.ntl
Antes de empezar el trabajo principal, se debe tener un script totalmente depurado en el lenguaje MQL4. ¿Qué pasos hay que seguir para convertir ese código en un script de trabajo de NTL+?
Paso 1 – primero, Usted debe crear un nuevo archivo de script en el arbol Scripts de la ventana Navigator en terminal NetTradeX Advisors. El archivo a su vez debe estar en el archivo Advisors o Utilities, dependiendo de su destinación. Después, debe copiar el texto entero del script a ese archivo en el lenguaje MQL4.
Paso 2 - conexión a la librería MQL4.ntl. Para eso, añada la línea #include "Libraries\MQL4.ntl" al principio de su archivo. Se debe mencionar en seguida que no hace falta compilar la librería MQL4.ntl por sí solo y no se requiere un archivo separado para que las funciones de la libería se ejecuten. Esa librería no es para un lanzamiento independiente y se usa con fines auxiliares.
Paso 3 – compilación de un script generado. Para eso, en el editor del código haga clic en el botón Compile o presione F7. Más probablemente, el compilador mostrará una lista de errores y avisos que eliminaremos paso a paso. Ahora nos interesan 2 momentos claves: si el compilador ha detectado la librería y si todas las funciones especiales están en nuestro script.
Si el compilador no es capaz de detectar el archivo de la librería, se mostrará el mensaje "Failed to open script file". En este caso asegúrese de que MQL4 está en su camino mencionado en las directivas #include, y está mencionado su nombre cirrecto.
En el lenguaje MQL4 3 funciones son especiales con nombres predefinidos init(), start(), deinit(). Para el lanzamiento en la terminal NetTradeX Advisors todas estas funcines deben estar determinadas. Sin embargo, en algunos scripts una de las funciones o dos de ellas, init() y deinit(), pueden faltar. En este caso el compilador le informará "No matching signatures to 'init()'" o "No matching signatures to 'deinit()'". Y, al ser así, debe añadir las funciones init() y deinit() con el operador único return 0;
int init() { return 0; } int deinit() { return 0; }
El primer período se puede considerer realizado con éxito, si no aparecen los mensajes "Failed to open script file" y "No matching signatures to 'init()'" / "No matching signatures to 'deinit()'". Ahora, pasemos a la eliminación de problemas locales.
Mensajes comunes del compilador, causas y métodos de su eliminación
En esta sección describiremos los mensajes comunes del compilador, generados en el proceso de la adaptación del compilador, y daremos decisiones prácticas para la eliminación de la incompatibilidad del código.
No matching signatures to PrintEste tipo de error ha sido causado por el facto de que en NTL+ la implementación de funciones con un número variable de propiedades no es permitida. En este caso hace falta cambiar la función de manera que el número de propiedades en el call corresponda exactamente con el número de las propiedades en su definición. La función Print() debe tener solo una propiedad de entrada. De ese modo, en vez de Print (property1, property 2, property 3) debe producirse un encadenamiento - Print(property 1+ property 2+ property 3).
Unexpected token 'unrecognized token'Una de las razones de que este mensaje aparece es el intento de conectar los archivos de librerías del lenguaje MQL4 a través de las directivas #include. El lenguaje NTL+ no opera con tales librerías, por eso la implementación de esos archivos es imposible y esas líneas deben eliminarse del programa.
'True'/'False' is not declaredLos nombres de las variables lógicas en NTL+ empiezan con minúsculas, por eso solo reemplace True con true y False con false.
No conversion from '_bars&' to 'int' availableLas barras variables en MQL4 son para determinar la cantidad de las barras en el gráfico corriente. En lenguaje NTL+ existe el objeto homónimo Bars, por eso en la librería MQL4.ntl se añaden las barras variables (con minúscula b), revolviendo la cantidad de barras para el gráfico corriente. Eso es lo que se debe usar en su script en lugar de Bars.
Must return a valueEste mensaje se muestra cuando usted llama el operador “return” sin valor de retorno. Por tanto, la función, en cual se usa ese operador, se declara como diferente del valor de retorno void . Cuando se muestra este mensaje, se debe corregir la function o especificar el valor para return.
Uso del número Mágico (Magic number)El uso de números Mágicos no es compatible en la versión corriente de NTL+. Para todas las posiciones abiertas se retorna el valor cero de los números mágicos. En el script del lenguaje MQL4 es recomendable prestar una atención especial al uso de los números mágicos en operadores condicionales. A veces, basta solo con eliminar u omitir la función OrderMagicNumber(), si no necesita identificar posiciones producidas por ese asesor.
Uso de variables estáticasEn NTL+ la palabra clave “static” no se usa. Si se requiere guardar el valor de variables durante el lanzamiento de funciones, tales variables deben hacerse global es (sin la palabra secreta static), colocándolas fuera de la función. Si quiere, puede añadir un modificador extern, en el caso de que se supone cambiar estas propiedades por el usuario durante el lanzamiento o el trabajo del script.
Especificación del tamaño del loteEn la versión corriente el tamaño del lote de cualquier instrumento es 100 000 unidades, por eso si usa el instrumento con un tamaño diferente de lote, especifique separadamente la variable correspondiente y asigne el valor necesario del tamaño del lote para ello, si es diferente a 100 000.
Diferentes tipos de trabajo con archivos DLLEl trabajo con archivos DLL se realiza de manera diferente en las terminales NetTradeX Advisors y MetaTrader4. En MQL4 es necesario una descripción completa de la función de modulo DLL, y en NTL+ no se requiere tal descripción. En lugar de indicar
#import "name of file or module" Description of function1; Description of function2; Description of functionN; #import
Se debe solo crear objeto dll random_identifier("name of_file _or_module "); y llamar la function que necesita por
identifier.Cal ("name of_function", parameters of _functions_ separated by_commas);
o
identifier. CallProc("name of_function", parameters of _function _separated by _commas);
En MQL4 y NTL+ hay diferencias en las palabras claves. Los asesores en el lenguaje MQL4 pueden usar nombres de variables o funciones que no están disponibles en NTL+ o viceversa. El compilador puede, por ejemplo, mostrar un mensaje Expected '(' para la línea en cual el uso de las paréntesis no se supone. Una de las razones es la coincidencia del nombre del variable con una de las palabras claves. En el caso de tal coincidencia, es necesario reemplazar el nombre de la variable con el de otra en todas las locaciones del código del programa. La combinación de claves CTRL+H en el editor sirve para llamar rápidamente la ventana Replace.
Float value truncated in implicit convertion to integerEste aviso se muestra cuando uno intenta asignar valores como float o double de la variable del tipo int. La corrección de esa incompatibilidad no se requiere para lanzar el script pero es deseable. La conversión del double a int y de float a int debe realizarse de manera explícita. Por ejemplo, para la variable d del tipo double, tendremos la siguiente forma int(d).
Falta de conversión automática de bool a int y viceversaLa conversión automática de int i; bool b = true; i=b; es imposible en NTL+. En ese caso se muestra el mensaje “Can't implicitly convert from 'bool' to 'int'”. Por tanto, si necesita ese tipo de conversión, puede usar la construcción siguiente:
int Run() { // convertion from bool to int; bool a=false; int b = a?1:0; // convertion from int to bool int c=1; bool d = c==0?false:true; }Can't implicitly convert from 'datetime' to 'int'
En NTL+ es necesario ejecutar la conversión de los objetos datetime a la variable int. Eso se realiza de la siguiente manera int i; datetime d; i=int(d);
Constantes de colorEn MQL4 puede usarse una serie de constantes para trabajar con colores de objetos de primitivas gráficas. Ese tiempo de constantes puede ser cambiado a cualquiera de los 16 colores básicos, por ejemplo, indicando White o Black. La única excepción es el uso del color en los indicadores gráficos. Si se usa un color que no es reconocido por NTL+, es necesario especificar el color por el componente RGB. Por ejemplo, para el color Tomato la especificación debe ser así: color Tomato = 0xFF6347
Trabajar con conjuntos de datosEn MQL4 y NTL+ el trabajo con los conjuntos de datos se realiza de manera diferente. En NTL+ la declaración type name[] se usa para los conjuntos de indicadores. Para guardar otros datos todos los conjuntos se declaran en forma array "type" name; o array "type" name (size) . Por tanto, en lugar de string symb[3] = {"EURUSD", "GBPUSD", "AUDCAD"}; debe usarse array "string" symb= {"EURUSD", "GBPUSD", "AUDCAD"};
Funciones no admitidasAlgunas funciones no se admiten en NTL+. Se debe eliminar esas funciones o cambiar la lógica del trabajo de scripts de manera que se usen las construcciones de NTL+. En el caso de usar esas funciones en el journal, se mostrará el siguiente mensaje 'The function is not supported' o 'No matching signatures to function_name'.
Lista de unas funciones de admitidas:
- SendMail()
- grupo de funciones onArray
- funciones FileOpenHistory, FileIsLineEnding
- grupo de funciones objects y propiedades de objetos
- para los siguientes modos, la función MarketInfo retorna cero valor:
- MODE_SWAPLONG
- MODE_SWAPSHORT
- MODE_STARTING
- MODE_EXPIRATION
- MODE_MINLOT
- MODE_LOTSTEP
- MODE_SWAPTYPE
- MODE_PROFITCALCMODE
- MODE_MARGINCALCMODE
- MODE_MARGININIT
- MODE_MARGINHEDGED
- MODE_FREEZELEVEL
- operador goto
- función para calcular el indicador del usuario iCustom
- grupo de funciones para el trabajo con las ventanas (Window functions), MessageBox
- TerminalCompany(), TerminalName(), TerminalPath()
- Parámetros #property
Resumen
En este artículo hemos introducido dificultades típicas, que se puede enfrentar durante la conversión de scripts de MetaTrader en NetTradeX. Este proceso está simplificado considerablemente por la librería MQL4.ntl, que se proporciona junto con la terminal. La ventaja de esa librería es un código completamente abierto que el elaborador puede cambiar o añadir a su criterio. Nosotros por nuestra parte no descansamos en los laureles y añadiremos nuevas funciones y actualizaremos las existentes en la librería, para facilitar el proceso de conversión.