Matlab y MT4 Matlab a Metatrader, algunos consejos necesarios Recientemente he aprendido a hacer un sistema comercial completo en matlab que se autoadapta, no voy a molestarle con los detalles ahora mismo, sólo necesito un consejo. Básicamente lo que necesito es obtener un flujo de datos que va entre metatrader y matlab, o al menos hacer un DLL que puedo utilizar en un indicador o asesor experto. Mi sistema de comercio optimiza dentro de matlab, digamos cada 6 horas o así. He leído y seguido el artículo DDE en MQL4, pero no funciona para mí, curiosamente, no da errores, pero tampoco datos, todo el tiempo con DDE activado en metatrader, también sólo va de una manera. Cualquier asesoramiento sobre otras opciones y enfoques son más que bienvenidos gracias de antemano Computación paralela y GPUs en Matlab Applied Time Series Analysis Matlab. Análisis de series de tiempo aplicado como conferencias descargables y scripts matlab (los datos forex son en esencia datos clásicos de series de tiempo, por lo que no deben confundirse con el hecho de que éstos no tratan directamente con los datos de divisas) Aplicada Time Series AnalysisMetaTrader 4 - Ejemplos Interacción entre MtaTrader 4 Y MATLAB Engine (Máquina Virtual MATLAB) Introducción MetaTrader 4 y el paquete matemático MATLAB han ganado gran popularidad entre los usuarios debido a sus características positivas, incluyendo la flexibilidad en la creación de sistemas de cálculo complejos. Existen tres formas principales de conexión MATLAB con aplicaciones externas, pero sólo se recomienda una de ellas: el uso del motor de escritorio virtual MATLAB Engine. Este método garantiza la compatibilidad total con todo el paquete MATLAB. Muchos programadores evitar este método por debajo razones: Muchos usuarios lo encuentran lento. Esto es cierto, si se compara con la llamada de función directa de bibliotecas DLL de MATLAB. El retraso principal se produce al inicio de la operación, cuando se llama a la máquina virtual debido a la llamada de numerosas bibliotecas que se suben al espacio virtual del proceso de llamada (en nuestro caso MetaTrader 4). Transferibilidad del proyecto. Es cierto que al transferir un proyecto a otro ordenador se deben transferir todas las bibliotecas DLL de MATLAB, aunque también cuando se utiliza la llamada directa, para conocer las relaciones de estos últimos, es decir, cola de inicio Conocimientos obligatorios de C o Fortran. Bueno, si conoces MQL4, puedes aprender fácilmente C y viceversa. Porqué recomiendo este método: Éste es el más confiable e independiente del método de la versión de MATLAB de la conexión con programas externos. Puede cambiar la versión de MATLAB y sus indicadores o asesores expertos no lo notarán. Esta es la ventaja más importante. Tiene un método de desarrollo relativamente rápido. No requiere depuradores, y no hará ninguna dificultad para escribir el envoltorio de DLL. Escritorio común para varios indicadores y / o asesores expertos. Considero este método útil cuando tenemos que tomar una decisión basada en datos de varios indicadores o en la implementación de un comercio de pirámide. En este artículo se describe la forma de conectar MetaTrader 4 y MATLAB ver. 7.4.0 (R2007a) a través de un DLL-wrapper escrito en Borland C Builder 6. Los programadores que prefieren los productos de Microsoft tendrán que adaptar ejemplos a su compilador (buena suerte en este asunto complicado). I. Establecimiento de una tarea En primer lugar, tenemos que definir de qué debemos comenzar el proyecto. Vamos a dividir el proceso de desarrollo en tres partes: Desarrollo de la función M en MATLAB que implementa el cálculo de un indicador / EA. Desarrollo del DLL-wrapper para conectar MATLAB y MetaTrader 4. Desarrollo del programa MQL. II. Desarrollo de la función M Este es probablemente el proceso más interesante y de larga duración que incluye las siguientes acciones: 1. Preexportación de datos de MetaTrader 4 a MATLAB. Las figuras muestran el proceso de exportación manual de datos en MATLAB. Una vez finalizada la exportación, se crearán variables en el escritorio de MATLAB. 2. Buscar fórmulas correctas, rango de parámetros de fórmula, etc. Este proceso es creativo y muy importante, pero el desarrollo del algoritmo matemático de un indicador y / o asesor experto no es el tema de nuestro artículo. Puede encontrar información sobre el tema en MATLAB. 3. Creación de la función M en MATLAB. Un programador que conoce C y / o MQL4 no tendrá dificultades para crear la función - además todas las variables tienen el tipo de datos sano - matriz. Es decir. No es significativo definir claramente una variable como una matriz o una matriz multidimensional - el lenguaje lo hará por sí mismo. Y no encuentro el proceso de selección de tipo de datos importante. En cuanto a mí, siempre uso mxREAL. Bueno, tal vez más memoria se utiliza, pero no hay ninguna confusión en tal caso. Se pueden encontrar más detalles en las referencias 1, 2. En el ejemplo dado se implementa el filtro de altas frecuencias. III. Desarrollando el DLL-Wrapper Vamos a detenernos en este punto en detalles mire, porque es tan ESENCIAL como el aire es. Por lo tanto, cada biblioteca DLL de enlace tardío debe cumplir las siguientes condiciones: Debe tener funciones internas para la recolección de residuos y el borrado de memoria después de su funcionamiento. Debe ser posiblemente multihilo, es decir, el funcionamiento de soporte de más de un hilo al mismo tiempo. Debe ubicarse en ciertos directorios, ver más: ubicación de los archivos del proyecto. Las principales funciones externas del DLL-wrapper son la interfaz API de MATLAB Engine y una función de la biblioteca de entrada / salida estándar C. La interfaz API de MATLAB Engine es simple y compacta que contiene sólo 8 funciones: Engine pEng engOpen (NULL) función que llama al escritorio MATLAB, el parámetro es siempre NULL, devuelve el puntero al descriptor de escritorio, es necesario para el funcionamiento de otros Funciones, la variable se hace global. I nt exitCode engClose (Engine pEng) la función que cierra el escritorio, pEng el puntero al descriptor del escritorio, devuelve el valor que es sin importancia, porque esta función se llama en el cierre de DLL y no es importante, devuelve el número de usuarios de escritorio de MATLAB. MxArray mxVector mxCreateDoubleMatrix (int m, int n, int ComplexFlag) la función crea una matriz para el escritorio MATLAB, devuelve el puntero a la matriz variable. Es necesario para la creación de una variable compatible con MATLAB. Matrices de datos usuales y / o tipos de datos simples no se pueden enviar a MATLAB mxArray mxVector puntero a matriz variable int m número de filas int n número de columnas ComplexFlag tipo de número complejo, siempre mxREAL para la operación correcta con MetaTrader 4. void mxDestroyArray (mxArray mxVector ) La función borra la matriz MATLAB, necesaria para borrar la memoria. Siempre elimine los datos cuando ya no son necesarios, de lo contrario habrá problemas con la memoria o la superposición de resultados. MxArray mxVector puntero a matriz variable. Int engPutVariable (Engine pEng, nombre char, mxArray mxVector) función que envía una variable al escritorio. Las variables del tipo mxArray no solo deben ser creadas, sino también enviadas a MATLAB. Motor pEng puntero al descriptor de escritorio char Nombre nombre de la variable en el escritorio MATLAB, tipo - char mxArray puntero mxVector a matriz variable. MxArray mxVector engGetVariable (Engine pEng, char Name) función de la variable que recibe desde el escritorio, función opuesta a la anterior. Se pueden recibir variables del tipo mxArray. MxArray mxVector puntero a la matriz variable PENg del motor puntero al descriptor del escritorio char Nombre nombre de la variable en el escritorio de MATLAB, tipo - char. Double p mxGetPr (mxArray mxVector) la función recibe un puntero a la matriz de datos que se utiliza para copiar datos junto con memcpy (). Utilice esta función al recibir / escribir una variable del tipo mxArray, para extraer / pegar una variable de un tipo simple (int, double.). Doble p puntero a la matriz de doble tipo mxArray mxVector puntero a variable matriz. La función int engEvalString (Engine pEng, char Command) envía comando al escritorio. El comando de la línea de comandos será ejecutado por el escritorio de MATLAB. Motor pEng puntero al descriptor de escritorio char Comando de comando para MATLAB, línea de tipo char. Sólo hay una función para trabajar con la memoria: void pIn memcpy (void pIn, void pOut, int nSizeByte) función copiar (clonar) una variable (array) pOut en pIn variable de nSizeByte tamaño de byte. ATENCIÓN: Observe la dimensionalidad de la matriz. Deben ser iguales, o pIn matriz debe ser mayor que pOut. Requisitos para las funciones de exportación de DLL-Wrapper Para que MetaTrader 4 pueda utilizar MATLAB, se deben escribir transmisores de funciones. Permite ver los requisitos para la proyección de dichas funciones. Cualquier función que se llamará desde MetaTrader 4 debe ser stdcall, es decir, los parámetros se transmiten a través de la pila, la función limpia la pila. Así se declara la función: extern C declspec (dllexport) ltvariabletypegt stdcall Función (lttypegt ltnamegt) extern C declspec (dllexport) - informa al compilador C que la función es externa, se escribe en la tabla de exportación. Ltvariabletypegt - tipo de una variable a devolver puede ser: void, bool, int, double, tipos compuestos y punteros no pueden ser transmitidos ver más acuerdo stdcall en la transmisión de parámetros en la función y la parte posterior nombre de función de su función lttypegt ltnamegt - tipo y nombre de La variable de entrada el número máximo de variables - 64. Aquí está el prototipo de la definición de la función, también prestar atención a stdcall Además de esto, un archivo con extensión def debe ser creado. Normalmente se trata de un archivo de texto que describe el nombre de la biblioteca y los nombres de las funciones de exportación. Si este archivo no existe, su archivo creará sus propios nombres de función distorsionados que complicarán el uso de DLL. Aquí está el ejemplo del archivo: LIBRARY palabra accesoria, apunta al nombre DLL. La palabra accesoria de EXPORTACIONES dice que debajo de los nombres de la función serán enumerados. NameFunctionA, NameFunctionB nombres de las funciones DLL. Pero hay restricciones impuestas por MQL: Dado que este lenguaje no tiene punteros, no tiene memoria dinámica, por lo que las matrices, estructuras, etc no se puede pasar de una biblioteca DLL. Pero en MetaTrader los datos pueden escribirse en matrices pasadas por una función por referencia. El resultado se puede escribir en una matriz creada por MetaTrader, el puntero del cual recibió su DLL. Pero la matriz debe ser de cierta dimensionalidad y no puede ser una línea de indicador (esta restricción probablemente esté conectada con la disposición de memoria específica en MetaTrader 4). Ahora, sabiendo cómo escribir y qué funciones llamar, vamos a ver un típico algoritmo de la DLL-wrapper: 1. Inicio MATLAB Engine utilizando la función engOpen () durante la primera llamada de DLL 2. Obtención de datos de MetaTrader y el envío de nuevo, Función DLL 2.1. Creación de variables mediante la función mxCreateDoubleMatrix () 2.2. Copiando datos en la variable mxVector, funciones memcpy () y mxGetPr () 2.3. Pasar variables al escritorio MATLAB, función engPutVariable () 2.4. Pasando fórmula / código a MATLAB escritorio, engEvalString () función 2.5. Recepción de respuesta del escritorio de MATLAB, función engGetVariable () 2.6. Devolver valor a MetaTrader, funciones memcpy () y mxGetPr () 3. Cierre MATLAB utilizando la función engClose (), eliminando todas las variables mxDestroyArray () al cargar DLL desde el área de direcciones del proceso MetaTrader. Ahora vamos a crear el esqueleto del DLL-wrapper: Asamblea del proyecto La siguiente figura muestra cómo se agregan las bibliotecas y los archivos. def en el proyecto: Aquí está la lista de archivos necesarios para el proyecto DLL-wrapper: libeng. lib ubicado en: FilesMATLABR2007aexternlibwin32borland libmx. lib localizado en: Programa de ArchivosMATLABR2007aexternlibwin32borland libmex. lib localizado en: Programa de ArchivosMATLABR2007aexternlibwin32borland. def este archivo se debe crear en un bloc de notas tal y como se describe más arriba. El archivo engine. h debe ser copiado desde el programa FilesMATLABR2007aexterninclude en la carpeta Program FilesBorlandCBuilder6Include - por lo tanto no tiene que indicar la ruta al compilador cada vez. Atención: Estas instrucciones se dan para montar el proyecto en Borland C Builder 6 sólo IV. Desarrollo de un programa MQL4 Veremos las preguntas relacionadas sólo con la declaración de las funciones del contenedor DLL y el paso de parámetros. Por lo tanto, para declarar una función, se necesita la siguiente construcción de lenguaje: Importar palabra clave HighPass. dll y el nombre de una biblioteca DLL void MakeBuffFilter (int nSize) - nombre de la función, tipo de un valor a devolver, nombre y tipo de Un valor pasado. NB se utiliza cuando se pasa de matrices, el ampersand amperio de caracteres es necesario, si dll escribe una respuesta en esta matriz de datos No hay otras formas de matriz de pasar de los programas externos en MQL 4 La matriz a pasar debe ser de cierta dimensionalidad y No puede ser una matriz de indicadores V. Ubicación de los archivos Después de que el proyecto que construye todos los archivos de proyecto debe estar ubicado correctamente:.dll y. m - archivos de biblioteca y m-funciones en el catálogo Program FilesMetaTraderexpertslibraries. mql se encuentra en su lugar habitual. Es decir, si se trata de un indicador - en la carpeta de indicadores, si un EA - en los expertos, si un script - en la carpeta de scripts. Atención: Al iniciar un indicador o un Asesor experto, puede aparecer la advertencia sobre el servidor ocupado: En este caso, espere de 5 a 10 segundos hasta que Console Matlab aparezca en la barra de tareas y haga clic en Repetir. PD Tengo un cuaderno con 512 RAM, Celeron M 2100 No experimenté ningún retraso en la operación de filtro, el número de cartas - 5 con el buffer total 500 8 5 20 000 byte. Por lo tanto, la elección depende de usted En cuanto a mí, ya lo he hecho. Si se producen retrasos, se puede implementar fácilmente un sistema de cálculo distribuido en MATLAB, es decir, se pueden iniciar varios escritorios en diferentes PC conectados a una red local. Lista de referencia Ayuda incorporada de MATLAB. Matlab 5. Cálculos, Visualización, Programación N. N. Martynov. C Builder 6. Manual de referencia A. Y. Arkhangelski. Ayuda incorporada de MQL4. Conclusión En este artículo discutimos los fundamentos del desarrollo de DLL-wrapper para vincular MetaTrader 4 con el paquete matemático MATLAB. No hemos abordado las cuestiones de proporcionar el funcionamiento de varios indicadores y / o asesores expertos - se discutirán en el próximo artículo. El archivo adjunto contiene MACD mejorado debido al uso de filtro de alta frecuencia. MetaTrader 5 - Ejemplos MetaTrader 5 e Interacción MATLAB Introducción Mi primer artículo La interacción entre MetaTrader 4 y MATLAB Engine (Máquina Virtual MATLAB) fue notada por la comunidad MQL. Algunos lectores (1Q2W3E4R5T) fueron incluso capaces de mover este proyecto de Borland a VS2008. Pero el tiempo corre hacia adelante sin descanso y (triste pero cierto) MetaTrader 4 está desapareciendo, dando paso a su sucesor MetaTrader 5 con MQL5, que introdujo punteros y memoria dinámica. Gracias a estas innovaciones, tenemos la oportunidad de escribir una biblioteca universal de interacción con la máquina virtual de MATLAB Engine, y de vincular directamente bibliotecas, generadas por MATLAB, con MetaTrader 5. Este artículo cubre tal funcionalidad. Este artículo continúa lógicamente el anterior y cubre mejor el problema de la interacción entre MetaTrader 5 y MATLAB. Para que el alcance de este artículo sea más comprensible para los lectores no preparados, lo dividiremos en tres partes: teoría, referencia y práctica. La teoría cubrirá los tipos de datos utilizados en MQL5 y MATLAB, así como su conversión mutua. En Referencia aprenderá las estructuras lingüísticas y la sintaxis de las funciones, necesarias para crear una DLL. Y en la práctica analizaremos los peligros de esta interacción. Los lectores con experiencia pueden saltar teoría y referencia, y comenzar con la práctica. A otros se les insta a leer Teoría y Referencia, y sólo entonces proceder a la Práctica. También vale la pena leer los libros mencionados en la sección de Literatura. 1. Teoría 1.1 Tipos de datos en MATLAB y MQL5 1.1.1 Tipos de datos simples En primer lugar, necesitamos familiarizarnos con los mundos internos de MQL5 y MATLAB. Tabla 1. Tipos de datos en MATLAB y MQL5 Existe una diferencia importante: las variables en MQL5 pueden ser simples o complejas (complejas), y en MATLAB todas las variables son multidimensionales (Complejo) - es decir, matriz. Siempre debes recordar acerca de esta diferencia. 1.1.2 Tipos de datos complejos En MQL5 hay 4 tipos complejos de datos: arrays, strings, estructuras y clases. Tipo de datos complejos se establece de varios tipos de datos simples, combinados en bloque de memoria de cierta longitud. Al ocuparse de tales datos usted necesita siempre saber el tamaño del bloque de la memoria en bytes, o el número de elementos (excepto clases). Estamos interesados sólo en matrices y cadenas, porque presentar clases y estructuras MQL5 a MATLAB no tiene sentido. Al pasar las matrices de cualquier tipo que usted necesita saber: tipo (dimensión) y número de elementos usando la función ArraySize (). Debe prestarse especial atención a la indexación en MetaTrader 5 - por lo general es hacia atrás (es decir, el primer elemento contiene datos más recientes que el siguiente). Compruebe esto utilizando la función ArrayIsSeries (). Y MATLAB tiene la siguiente indexación: el primer elemento contiene los datos antiguos que el siguiente - por lo que debe invertir sus matrices antes de enviarlos a MATLAB, si flag ASSERIES TRUE. Basado en lo anterior, vamos de acuerdo con lo siguiente: Revertir matrices de forma invisible a MQL5-programas, excepto para matrices del tipo char y matrices bidimensionales - dejarlos sin cambios. Invertir invisiblemente todas las matrices de MATLAB, y asignar el indicador ASSERIES con TRUE, excepto para arrays del tipo char y matrices bidimensionales - dejarlos sin cambios. En todas las matrices del programa MQL5, creadas de acuerdo con la indexación hacia atrás, el indicador ASSERIES debe ser TRUE, excepto para los arrays del tipo char y los arrays bidimensionales, dejarlos sin cambios. Pero esta no es la única limitación cuando se trabaja con matrices. Cuando se trabaja con matrices multidimensionales, o matrices para ser más correcto, especialmente de MATLAB, introducimos la restricción para no más de 2 arrays dimensionales. Aquí el indicador ASSERIES no puede ser VERDADERO, y por lo tanto tales arreglos no se invierten. No olvide que las cadenas en MQL5 no son arrays de los elementos de tipo char. Así que al pasar cadenas viene un pequeño problema: en las cadenas MQL5 codificadas utilizando Unicode, y MATLAB utiliza la codificación ANSI. Así que antes de pasar una cadena, debe convertirse en una matriz de caracteres ANSI utilizando la función StringToCharArray (). Y viceversa, cuando obtiene una matriz de caracteres de MATLAB, convertirla utilizando la función CharArrayToString () (consulte la Tabla 2). Para evitar confusiones, conviene: almacenar todas las cadenas en los programas MQL5 utilizando Unicode, no arrays del tipo char. 1.2 Comparación de los tipos de datos MQL5 y MATLAB Con el fin de reducir la cantidad de funciones y simplificar el algoritmo de la biblioteca, reduciremos la cantidad de tipos mediante conversión automática, lo cual no debería afectar la integridad de los datos. La siguiente tabla ilustra la regla de conversión de tipo de datos de MQL5 en MATLAB: Con este tipo de conversión hay una pérdida de precisión. No lo utilizaremos, pero puede utilizar esa conversión en sus programas. Tabla 2. Comparación de tipos de datos MQL5 y MATLAB Ahora está familiarizado con los tipos de datos utilizados en MQL5 y MATLAB. Sabes lo que aguardan los errores en el paso de datos y cómo evitarlos con competencia. Aún tiene que conocer la API de MATLAB Engine y familiarizarse con MATLAB Compiler 4. 2. Referencia de la API de MATLAB Engine, Referencia del compilador 4 de MATLAB y Referencia de la biblioteca de entrada / salida C En esta sección se presentan las funciones más importantes de MATLAB Engine API, MATLAB Compiler 4 y número de funciones útiles de la biblioteca de entrada / salida estándar de C. Así que, vamos a comenzar. 2.1 MATLAB Engine API y MCR Funciones MATLAB Engine - es una interfaz externa que permite a otros programas usar el escritorio de MATLAB. Proporciona un trabajo totalmente funcional de todos los paquetes MATLAB sin ninguna restricción. Aunque no se dice en la documentación, sino en términos de programador de sistema - es sólo una máquina virtual, como PHP, MySQL, etc. que soporta una forma sencilla y relativamente rápida de intercambiar datos entre MetaTrader 4/5 y MATLAB. Este método de conexión de programas externos con el paquete MATLAB es recomendado por los desarrolladores. La interfaz consta de seis funciones: Engine pEng engOpen (NULL) esta función llama al escritorio de MATLAB, el parámetro es siempre NULL, devuelve un puntero al descriptor de escritorio. Int exitCode engClose (Engine pEng) esta función cierra el escritorio, devuelve el número de usuarios restantes del escritorio de MATLAB, donde: El puntero del motor pEng al descriptor del escritorio. MxArray mxVector mxCreateDoubleMatrix (int m, int n, int ComplexFlag) esta función crea una variable (matriz) de escritorio MATLAB, devuelve un puntero a variable (matriz), donde: mxArray mxVector puntero a variable de matriz. Int m número de filas. Int n número de columnas. ComplexFlag tipo de número complejo, para MetaTrader 4/5 mxREAL. Void mxDestroyArray (mxArray mxVector) esta función destruye MATLAB matriz, es necesario para borrar la memoria, donde: mxArray mxVector puntero a variable de matriz. Int engPutVariable (Engine pEng, char Name, mxArray mxVector) esta función envía una variable al escritorio. No sólo debe crear variables del tipo mxArray, sino también enviarlas a MATLAB, donde: Motor pEng puntero al descriptor de escritorio. Char Nombre nombre de variable del tipo char en el escritorio de MATLAB. MxArray MxVector puntero a variable de matriz. MxArray mxVector engGetVariable (Engine pEng, char Name) esta función obtiene variable desde el escritorio - la inversa de la función anterior. Sólo se aceptan variables del tipo mxArray, donde: mxArray mxVector puntero a variable de matriz. Motor pEng puntero al descriptor de escritorio. Char Nombre nombre de variable del tipo char en el escritorio de MATLAB. Doble p mxGetPr (mxArray mxVector) esta función obtiene un puntero a matriz de valores, se utiliza para copiar datos junto con memcpy () (ver 2.3 C Biblioteca de entrada / salida estándar), donde: doble p puntero a matriz del tipo doble. MxArray MxVector puntero a variable de matriz. Int engEvalString (Engine pEng, comando char) esta función envía comandos al escritorio de MATLAB, donde: Engine pEng puntero al descriptor de escritorio. Char Comando para MATLAB, cadena del tipo char. Probablemente haya notado que la API de MATLAB Engine le permite crear una estructura mxArray sólo para el tipo doble. Pero esta restricción no afecta sus posibilidades, pero afectará el algoritmo de su biblioteca. MCR (MCR instance) es la biblioteca especial del paquete MATLAB, que permite ejecutar aplicaciones independientes / bibliotecas públicas, generadas por el entorno MATLAB en cualquier computadora. Tenga en cuenta que incluso si tiene un paquete MATLAB completo, debe instalar la biblioteca MCR ejecutando el archivo MCRInstaller. exe, que se encuentra en la carpeta ltMATLABgtToolboxcompilerdeploywin32. Por lo tanto, antes de llamar a cualquier función de biblioteca pública, creada por el entorno MATLAB, necesita llamar a la función de inicialización de MCR: bool mclInitializeApplication (const char opción, int count) devuelve TRUE si MCR inicio fue exitoso, Opciones, como en mcc - R usualmente es NULL int count size options cadena, normalmente 0. Al finalizar el trabajo de la biblioteca pública debes llamar: bool mclTerminateApplication (void) devuelve TRUE si MCR se cerró satisfactoriamente. 2.2 MATLAB Compiler 4 El compilador MATLAB le permite crear lo siguiente desde las funciones M: Aplicaciones independientes que se ejecutan incluso si MATLAB no está instalado. C / C, que pueden utilizarse sin MATLAB en los sistemas de usuario final. Compiler soporta la mayoría de los comandos y paquetes de MATLAB, pero no todos. La lista completa de restricciones se puede encontrar en el sitio web de MATLAB. Este método le permite crear un paquete independiente de software de MetaTrader 5 y MATLAB, pero en contraste con el motor MATLAB, requiere un programador bien entrenado y un profundo conocimiento de la compilación. MATLAB Compiler requiere al menos uno de los siguientes compiladores C / C: Lcc C (normalmente viene con MATLAB). Su único compilador C. Borland C versiones 5.3, 5.4, 5.5, 5.6. Microsoft Visual C / C versiones 6.0, 7.0, 7.1. MATLAB Compiler 4, a diferencia de sus predecesores, genera sólo el código de interfaz (wrapper), es decir, no traduce m-funciones en código binario o C / C, sino que crea un archivo especial basado en la tecnología de Component Technology File (CTF) Que incluye integraciones de varios paquetes, necesarios para soportar m-functions. MATLAB Compiler también cifra este archivo con clave única (no repetida) de 1024 bits. Ahora vamos a considerar el algoritmo de MATLAB Compiler 4 de trabajo, ya que la ignorancia de este tema dará lugar a muchos errores estúpidos en el tiempo de compilación: dependencias de análisis en esta etapa determinar todas las funciones, MEX-archivos y P-archivos, . Creación de archivo: se crea el archivo CTF, se cifra y se comprime. Generando el código objeto del envoltorio en esta etapa se crean todos los códigos fuente necesarios para el componente: código de interfaz C / C para las funciones m especificadas en la línea de comandos (NameFilemain. c). Archivo de componentes (NameFilecomponent. dat), que contiene toda la información necesaria para ejecutar m-code (incluidas las claves y rutas de cifrado, almacenadas en el archivo CTF). Traducción C / C. En esta etapa, los archivos de código fuente de C / C se compilan en archivos de objetos. Enlace. La etapa final de la construcción del proyecto. Ahora, cuando esté familiarizado con el comportamiento del algoritmo del compilador MATLAB, tiene que aprender más acerca de las claves para tener un plan detallado de acciones, al usar el compilador (mcc): Tabla 4. Listas de Matlab mbuild Linker (versión 4) Las teclas principales. Para obtener más información, utilice los comandos mbuild o doc mbuild de ayuda. 2.3 C Biblioteca de entrada / salida estándar La utilización de la biblioteca de entrada / salida estándar proporciona la copia de datos correcta. Su uso lo ahorrará de errores estúpidos que surgen durante la fase de diseño del programa (por ejemplo: muchos programadores principiantes copian sólo el puntero al bloque de memoria en lugar de copiar todo el bloque de memoria). De toda la biblioteca de entrada / salida nos interesa sólo una función: void pIn memcpy (void pIn, void pOut, int nSizeByte) esta función copia (clones) variable / array de pOut a pIn con tamaño de nSizeByte bytes, donde: void pIn Puntero a matriz, donde copiar. Void pOut puntero a la matriz, de la que se realiza la copia. Int nSizeByte el tamaño de los datos copiados, no debe exceder el tamaño de la matriz pIn, de lo contrario se producirá un error de acceso a la memoria. 3. Práctica Ahora estamos hechos con la teoría y podemos proceder con la realización de la interacción MetaTrader 5 AMP MATLAB. Como usted probablemente adivinó, esto se hará de dos maneras: utilizando la máquina virtual de MATLAB Engine y utilizando las bibliotecas generadas por MATLAB Compiler. Primero, considere una manera simple, rápida y versátil de interacción a través de MATLAB Engine. Esta parte del artículo debe ser leída de principio a fin, ya que, a pesar de la aparente diferencia entre los métodos de interacción, tienen una filosofía y una sintaxis familiar de constructos de lenguaje, y aprender algo nuevo es más fácil con ejemplos simples. 3.1 Desarrollo de la biblioteca universal de MetaTrader 5 amperios Interacción del motor MATLAB Este método de interacción no se puede llamar elegante y rápido, pero es el más fiable y cubre todo el paquete MATLAB. Por supuesto, debemos mencionar la velocidad del desarrollo del modelo final. La esencia del desarrollo es escribir un contenedor de biblioteca universal para la interacción MetaTrader 4/5 amperios MATLAB Engine. Después de este MetaTrader 4/5 script / indicador / experto puede manejar MATLAB escritorio virtual. Y todo el algoritmo matemático puede almacenarse en el programa MQL como cadenas, por lo que puede utilizarlo para proteger su propiedad intelectual (para más detalles, consulte el artículo Protéjase a sí mismo, desarrolladores). También puede almacenarse en m-functions o en archivos P-functions separados en la carpeta ltMetaTrader 5gtMQL5Libraries. Posibles áreas de aplicación de dicha interacción: Para probar o demostrar modelos / ideas matemáticas sin tener que escribir programas complejos (la protección de la propiedad intelectual se puede arreglar como en el programa MQL y mediante el paquete MATLAB - usando funciones P). Escribir modelos matemáticos complejos usando todas las características de MATLAB. A todos aquellos que no van a distribuir sus guiones / indicadores / expertos. Vamos a continuar. Espero que haya leído los 1.1 tipos de datos en MATLAB y MQL5. 1.2 Comparación de tipos de datos MQL5 y MATLAB. 2.1 API de MATLAB Engine y Funciones de MCR y 2.3 C Standard Input / Output Library, ya que no haremos una pausa y analizaremos más. Lea atentamente el siguiente esquema de bloques, que ilustra el algoritmo de la futura biblioteca: Figura 1. Esquema de Bloque del Algoritmo de Biblioteca Como se ve en la Figura 1, la biblioteca consta de tres bloques principales. Considere sus propósitos: Bloque MQL5, preparación preliminar de los datos enviados / recibidos: Arrays inversos. Conversión de tipos. Conversión de codificaciones de cadenas. Bloque C / C: Convierte matriz en la estructura mxArray. Pasa los comandos de MATLAB Engine. Sistema de cálculos MATLAB Engine block. Ahora, vamos a tratar con los algoritmos. Bien comenzar con el bloque MQL5. Lector atento ya ha notado que se centrará en la aplicación de lo que se escribió en los tipos de datos en MATLAB y MQL5 sección. Si te has perdido, difícilmente entenderás por qué todo esto es necesario. El algoritmo de las funciones de mlInput ltvariabletypegt es casi idéntico. Vamos a discutir su trabajo utilizando la función mlInputDouble () que proporciona entrada de variables del tipo doble a MATLAB máquina virtual. Bool mlInputDouble (doble amparray, int sizeArray, cadena NameArray). Donde: matriz de referencia a la variable o matriz del tipo doble. SizeArray matriz tamaño (número de elementos, no bytes). Cadena NameArray, que contiene el nombre de variable único para la máquina virtual MATLAB (el nombre debe corresponder a los requisitos de MATLAB). Convierta la serie NameArray a char array utilizando la función StringToCharArray (). Compruebe el tipo de indización mediante la función ArrayIsSeries (). Si el tipo de indexación es valor de pase normal a la función mlxInputDouble (). ELSE indexación de serie de tiempos: matriz inversa y valor de paso a la función mlxInputDouble (). End, pasa el valor devuelto a la función mlxInputDouble (). El algoritmo de las funciones mlGet ltvariabletypegt también es casi idéntico. Vamos a discutir su trabajo con la función mlGetDouble (), que devuelve la variable del tipo doble de MATLAB máquina virtual. Int mlGetDouble (doble amparray, int sizeArray, cadena NameArray). Donde: matriz de referencia a la variable o matriz del tipo doble. SizeArray matriz tamaño (número de elementos, no bytes). Cadena NameArray, que contiene el nombre de variable exclusivo para la máquina virtual MATLAB. Convierta la serie NameArray a char array utilizando la función StringToCharArray (). Encuentre el tamaño del arreglo usando la función mlxGetSizeOfName (). SI el tamaño es MÁS QUE CERO. Asignar la matriz de destinatarios de tamaño necesario utilizando la función ArrayResize (), obtener los datos de mlxGetDouble (). Devuelve el tamaño de la matriz. SI el tamaño es CERO. Error de retorno, es decir, valor nulo. Thats it Las funciones mlGetInt () y mlGetLogical () producen la conversión de sombra de los tipos double - gt int / bool. Para este propósito, estas funciones crean un buffer de memoria temporal en sus cuerpos. Esta es una medida forzada, porque, por desgracia, MATLAB API no permite crear estructuras mxArray para tipos de datos distintos del doble. However, this does not mean that MATLAB operates exclusively the double types. C/C block is far easier - it should provide data translation from the double type into the mxArray structure. It is done using the mxCreateDoubleMatrix() . mxGetPr() and memcpy() functions. Then, using the engPutVariable() function it passes data to MATLAB virtual machine, and to extract data it uses the engGetVariable() function. Again, pay attention to functions with prefixes Int and Logical as seen in the block-scheme, they dont directly interact with MATLAB, but use the mlxInputDouble/mlxGetDouble and mlxInputChar() functions. Algorithm of their behavior is simple: call of the mlxInputDouble/mlxGetDouble function input/output values as double() and send the shadow MATLAB command to convert data type via the mlxInputChar() function. MATLAB Engine block is even easier. It provides only mathematical functions. Its behavior depends on your commands and your m/p-functions. Now, when all the details of the project are clear, its time to deal with project building. Any such build begins with the creation of main library in our case it is C/C block. For this purpose, in any ANSI-text editor (Notepad, Bred, etc.) create a file with the DEF extension. It is desirable that the name of this file consist of Latin characters with no spaces and punctuation, otherwise you will hear many flattering words from your compiler. This file provides the permanence of your functions. If this file is absent, C/C compiler will invent his own exotic names to export functions. This file contains: LIBRARY control word, LibMlEngine name of the library, and EXPORTS second control word, then come the names of functions. As you probably knew, the names of export functions cant have spaces and punctuation. Here is the text of the DllUnit. def file from MATLABEngine. zip archive: LIBRARY LibMlEngine EXPORTS mlxClose mlxInputChar mlxInputDouble mlxInputInt mlxInputLogical mlxGetDouble mlxGetInt mlxGetLogical mlxGetSizeOfName mlxOpen So, we have the first file of project. Now open Windows Explorer and go to the ltMATLABgtExterninclude folder. Copy the engine. h file (header file of MATLAB virtual machine) to folder, where you project is built (if you wont do this, you will have to manually specify the path to file at the stage of compilation). Now its time to create C/C block. We will not include the entire source code of program in the article, because this file can be found in MATLABEngine. zip as DllUnit. cpp and it is well commented. Note that its better to create functions using stdcall convention i. e. parameters are passed through the stack, and function cleans the stack. This standard is native for Win32/64 API. Consider how to declare a function: extern C declspec(dllexport) ltvariabletypegt stdcall Function(lttypegt ltnamegt) extern C declspec(dllexport) tells C compiler that function is external. ltvariabletypegt type of returned variable, may be: void, bool, int, double . composite types (known not only to Dll, but also to calling program) and pointers. stdcall declaration about passing parameters to function and back, its a standard for Win32/64 API. Funcion your function name. lttypegt ltnamegt type and name of input variable, maximal number of variables is 64. C/C block building: for this you need to include standard input/output library and add to project the following files (in your compiler: Project-gtAdd Project): DllUnit. def In ltMATLABgtExternlibltwin32/64gtltcompilergt folder, where: ltMATLABgt MATLAB main folder. ltwin32/64gt either win32 folder for 32-bit OS, or win64 for 64-bit OS. ltcompilergt the borland folder for Borland C/C ver. 5-6, the microsoft folder for Microsoft Visual C: libeng. lib libmx. lib A common question like this may arise: I have different version of compiler or no such a compiler in the list (Very rarely there are no such files) . Lets see how to manually create a public library. We will consider how its done in Visual C and in Borland C: In FAR open ltMATLABgtBinltwin32/64gt folder, where: ltMATLABgt MATLAB main folder. ltwin32/64gt either win32 folder for 32-bit OS, or win64 for 64-bit OS. For Borland C enter: implib libeng. lib libeng. dll. The same for libmx. dll. For Visual C enter: lib libeng. dll. The same for libmx. dll. If other compiler . any compiler of any programming language must have this utility - Library Manager, usually this is a console program ltcompiler foldergtbinlib. exe. By the way, I forgot to warn you - dont try to make 64-bit LIB for 32-bit compiler. First, find out if there is 64-bit addressing support in compiler help. If not, either looking for 32-bit MATLAB DLL, or choose another C/C compiler. Getting down to compilation, after which we get a library, that should be placed in the terminalfolderMQL5Libraries folder. Now lets begin with MQL block. Run MetaEditor, click New and do as on following figures: Figure 2. MQL5 Wizard: Create Library Figure 3. MQL5 Wizard: General Properties of Library Now, when Wizard MQL5 has created a template, proceed to its editing: Note that MQL 5 you can pass pointers in two ways: void NameArray // This method of passing from array allows only to read data. However, if you try to use this reference to edit its contents, youll get memory access error (in the best case for you, MetaTrader 5 will quietly handle the error in the SEH-frame, but we HAVENT WRITE a SEH-frame, so we can even miss the reason of error). voidamp NameArray // This method of passing allows you to read and edit array contents, but you must retain array size. If function doesnt accept or doesnt pass parameters, always specify the void type. 2. We wont describe all functions of the MQL block, because you can find MatlabEngine. mq5 source code in MATLABEngine. zip. Therefore, well consider the details of declaration and definition of external functions in MQL5: As seen in the example, the declaration and definition of function are combined. In this case, we declare a function named mlInputChar() as external (export ), which returns value of the bool type and accepts the array string as parameter. Now compile. Now that we have completed the last block of the library and compiled it, its time to test it in real conditions. To do this, write a simple test script (or take it from MATLABEngine. zip, file: TestMLEngine. mq5). Script code is simple and well commented: As seen from the script, we are entering values, and then get values. However, in contrast to MetaTrader 4, where we needed to know the size of buffer at design stage, in MetaTrader 5 its not needed, as we use dynamic buffers . Now that youve finally understood MATLAB virtual machine, you can begin using DLL built in MATLAB environment. 3.2 Technical guidelines of building/using DLL generated by MATLAB Compiler 4 In the previous section youve learned how to create a library for universal interaction with MATLAB package. However, this method has one drawback - it requires MATLAB package from end user. This restriction creates a number of difficulties in distribution of finished software product. Thats why MATLAB mathematical package has a built-in compiler, that allows you to create standalone applications independent from MATLAB package. Lets take a look at it. For example, consider a simple indicator - moving average (SMA). Slightly upgrade it by adding a Neural Network Filter (GRNN), that allows to smooth white noise (random bursts). Name the new indicator as NeoSMA, and filter as GRNNFilter. Thus we have two m-functions, of which we want to create a DLL, that can be called from MetaTrader 5. Now remember that the MetaTrader 5 searches fro DLLs in following folders: ltterminaldirgtMQL5Libraries ltterminaldirgt Current folder System folder ltwindowsdirgtSYSTEM32 ltwindowsdirgt Directories listed in the system environment variable PATH. Therefore, place into one of these directories two m-functions (NeoSMA. m and GRNNFilter. m), where we will build DLL. I draw your attention to this fact of placement, as this is done not by accident. Attentive reader already knows the MATLAB compiler feature - it preserves the paths when compiling (see 2.2 MATLAB Compiler 4). Before you begin to compile project, you must configure compiler. To do this, follow these steps: In MATLAB command line enter: mbuild - setup Press y to confirm find of C/C compatible compilers installed in your system. Choose standard Lcc-win32 C compiler. Press y to confirm selected compiler. Figure 4. Compiling the project Now we are ready to move to the m-functions compilation process. mcc - N - W lib:NeoSMA - T link:lib NeoSMA. m GRNNFilter. m Explain the keys: - N to skip all unnecessary paths - W lib:NeoSMA tells compiler that NeoSMA is the name of library - T link:lib tells compiler to create public library with linking NeoSMA. m and GRNNFilter. m m-functions names Now, lets see what compiler has created: mccExcludedFiles. log log-file containing compilers actions NeoSMA. c C version of library (contains - code of wrapper) NeoSMA. ctf CTF file (see 2.2 MATLAB Compiler 4 ) section NeoSMA. h header file (contains declarations of libraries, functions, constants) NeoSMA. obj object file (source file containing machine and pseudo code) NeoSMA. exports exported functions names NeoSMA. dll Dll for further linking NeoSMA. lib Dll to use in C/C projects NeoSMAmcccomponentdata. c C version on component (used for compliance with CTF-file, contains paths, etc.) NeoSMAmcccomponentdata. obj object version of component (source file containing machine and pseudo code) So lets handle with DLL, precisely with its internal structure. It consists of (basic functions only) from: Main function of any DLL - BOOL WINAPI DllMain() . which (according to Microsoft specification) handles events occurring in DLL: DLL loading into address space of process, creating a new stream, deleting the stream and unload Dll from memory. Service functions of DLL initialization/deinitialization . BOOL ltNameLibgtInitialize(void)/void ltNameLibgtTerminate(void) are needed to start/unload Math Work environment before using library functions and at the end of their use. Exported m-functions void mlfltNameMfilegt(int ltnumberofreturnvaluesgt, mxArray ltreturnvaluesgt, mxArray ltinputvaluesgt. ), where: ltnumberofreturnvaluesgt number of returned variables (dont confuse with array size, etc.). mxArray ltreturnvaluesgt address of mxArray structure where the results of m-function work will be returned. mxArray ltinputvaluesgt pointer to mxArray structure of m-function input variable. As you can see, exported m-functions contain addresses and pointers to mxArray structure, and you cant directly call these functions from MetaTrader 5, as it will not understand this type of data. We wont describe mxArray structure in MetaTrader 5, because MATLAB developers do not guarantee that it will not change over time, even within the same version of the product, so you need to write a simple DLL-adapter. Its block-scheme is shown below: Figure 5. DLL-adapter Block-Scheme It is very similar to the right side of DLL for MATLAB Engine, so we wont parse its algorithm and proceed directly to the code. To do this, create two small files in your C/C compiler: nSMA. cpp (from DllMatlab. zip): nSMA. def (from DllMatlab. zip): LIBRARY nnSMA EXPORTS IsStartSMA nSMA Build the project in your C/C compiler: for this you need to include standard input/output library and add to project the following files (in your compiler: Project-gtAdd Project): nSMA. def In ltMATLABgtExternlibltwin32/64gtltcompilergt folder, where: ltMATLABgt MATLAB main folder. ltwin32/64gt either win32 folder for 32-bit OS, or win64 for 64-bit OS. ltcompilergt the borland folder for Borland C/C ver. 5-6, the microsoft folder for Microsoft Visual C (I have files for version 6): libmx. lib mclmcr. lib NeoSMA. lib create manually (see 3.1 Developing Universal Library of MetaTrader 5 amp MATLAB Engine Interaction ). The last, what I want to tell you in this section, is about files needed when moving project to another computer, where there is no MATLAB installed. Here is a list of files and paths on the target machine: MCRInstaller. exe any folder (MCR installer) extractCTF. exe any folder (for MCR installer) MCRRegCOMComponent. exe any folder (for MCR installer) unzip. exe any folder (for MCR installer) NeoSMA. dll ltterminaldirgtMQL5Libraries NeoSMA. ctf ltterminaldirgtMQL5Libraries nnSMA. dll ltterminaldirgtMQL5Libraries Many advanced programmers have already guessed, that it is advisable to use an installer program (SETUP). There are many of them over the Internet, including free products. Now we have to test this DLL in MetaTrader 5. To do this we will write a simple script ( TestDllMatlab. mq5 from the DllMatlab. zip): Conclusion So, you know how to create a universal library for MetaTrader 5 amp MATLAB interaction, and how to connect DLL built in MATLAB environment. But still there are interfaces of MetaTrader 5 amp MATLAB interaction to be described, but this is beyond the scope of this article. The topic of this article is covered in details. Ive chose the most effective ways of interaction, not requiring a special kind of adapters. Although you can go another way, such as. NET technology - How to Export Quotes from MetaTrader 5 to. NET Applications Using WCF Services . Many readers may have a question: what method to choose The answer is simple - both, because during the design/debugging of mathematical model the speed is not needed. But youll need the full power of MATLAB without special production costs for programming. MATLAB Engine will help here, of course. However, when the mathematical model is debugged and ready to use, youll need speed, multitasking (work of indicator and/or trade system at several price charts) - here without a doubt youll need a DLL, built in MATLAB environment. But all this does not oblige you to follow it. Everybody will give the answer to this question himself, relying primarily on the proportion of programming cost to the scale of the project (number of indicator and/or trade system users). It makes no sense to create Dll in the MATLAB environment for one or two users (its easier to install MATLAB on two computers). Many readers, who are unfamiliar with MATLAB, probably have a question: why all of this MQL5 has already mathematical functions The answer is that use of MATLAB enables you to effortlessly implement your mathematical ideas, here is just a partial list of possibilities: dynamic algorithm of fuzzy logic in the indicator and/or mechanical trade system dynamic genetic algorithm in mechanical trade system (dynamic strategy tester) dynamic neural network algorithm in the indicator and/or mechanical trade system three dimensional indicators simulation of nonlinear management systems So, all in your hands, and do not forget: Mathematics has always been the queen of sciences, and MATLAB package is your scientific calculator. Literature Translated from Russian by MetaQuotes Software Corp. Original article: mql5/ru/articles/44
No comments:
Post a Comment