Llamar a funciones desde la dll y devolver resultados - página 6

 
Ese foro de f1
Mike = Terranin = yo :) Y ya te he dado el emulador en el foro de Alpari. El MTS no me interesa mucho, si supieras la cantidad de ellos que se estrellan en mi emulador... :)
 
2 micrófonos
:)) Eso es lo que pensé. Si te interesa, puedes ver mi sistema aquí
http://forum.alpari-idc.ru/viewtopic.php?t=45555
Es un poco desordenado, por supuesto...
Si quieres, te describo el sistema, ya que me ayudaste con el emulador.
 
OK, si quieres compartir, entonces a murdoc (at) newmail.ru. Lo pondré en marcha en mi probador y te diré los resultados.
 
Renat:<br / translate="no"> Por _defecto_ cualquier importación desde una DLL está _completamente_ prohibida_. Esta es la protección.
Si quieres usar una DLL externa, sólo tienes que activar el botón "Confirmar cada llamada a una función DLL" y ver qué se llama allí. Esto también es protección. Así como la protección de todas las operaciones de archivos incrustados con acceso sólo a los directorios /historia y /archivos.

Si alguna persona ofrece el Asesor Experto al público con su DLL, el usuario confía en esta DLL o no. Si no se fía, no lo descargará. Si se fía, tendrá que marcar la casilla "Permitir la importación de funciones DLL", de lo contrario el experto no funcionará. Los nombres de las funciones a las que se llama tampoco serán útiles para el Asesor Experto, porque para saber lo que hace una función, tendrá que desmontar la DLL, y no todo el mundo podrá hacerlo. Y en esta DLL se pueden hacer un montón de cosas desagradables, y el terminal MT no puede impedirlo. Por lo tanto, la "protección" es muy condicional y no es una protección real en este contexto. Creo que esto es lo que quería decir Mike.

La posibilidad de llamar a funciones desde DLLs personalizadas en МТ 4 Expert Advisors se posiciona como un reemplazo de API que está presente en MT 3. Así que, de todos modos, hay una oportunidad para transformar el terminal MT 4 en un datafeed y colocar órdenes, que fue una de las razones (a juzgar por varios temas en los foros) por las que se eliminó la API. Pero la API se mantuvo, es muy incómoda, muchos usuarios hablan de ella, y recuerda a la situación del chiste: ".... No me importa, mientras te aburras". Y este tema es una confirmación de ello. El autor no ha recibido ninguna respuesta concreta e informativa a sus preguntas. Estas preguntas también son relevantes para mí, las respuestas son aún más relevantes :-).
Tal vez yo tampoco sea un programador experimentado, pero en el actual sistema Expert Advisor<->DLL, por definición, no se puede tener una solución simple y bonita. Para ser más exactos, en el ámbito de MQL4 puede haber una bonita solución, pero en el ámbito de la integración del terminal MT4 con el software personalizado no es nada, por decirlo suavemente. Hay otras soluciones más funcionales, sólo hay que encontrarlas :-). Por ejemplo, podemos crear una DLL con funciones como en mtapi.dll, pero no interactuará con el servidor del centro de operaciones, sino con el terminal cliente. En este caso, tanto los intereses de los desarrolladores serán preservados (sin el terminal MT4 la DLL no será capaz de operar) y las personas, que son capaces de crear algo más complejo que los Asesores Expertos MQL4, tendrán una buena oportunidad de integrar su propio software (incluyendo su propia gui) con el sistema de comercio. Si tal variante ha sido considerada y discutida, por favor dame un enlace (no he encontrado tal variante). Si no es así, me gustaría conocer la opinión de los desarrolladores sobre este tema.

P.D. La línea "posibilidad de utilizar la API del cliente" en la descripción del terminal de comercio es muy atractiva. Eso es lo que me atrajo a MetaTrader, y me decepcionó mucho la falta de API en la versión 4 del terminal. Espero que los desarrolladores, por un lado, y los usuarios de la API, por otro, lleguen a un compromiso. El estado actual de las cosas (llamar a funciones DLL desde ekperts) es insatisfactorio.
 
Me he encontrado con un problema, claro que puede que sea demasiado lento y no lo haya entendido bien.....

Tengo una dll compilada para VC++
hay una función:

void __stdcall process_arr(double *in, double *out, int size);

hay una declaración de este tipo en el Asesor de Expertos:
#importar "algo.dll"
void process_arr(double in[], double& out[], int size);

se declaran las matrices a continuación:

doble arr1[100];
doble arr2[100];

entonces inicializo el primer array y paso ambos a la función
process_arr(arr1,arr2,100);

se pasa todo, pero la función se niega a devolverlo

Después de regresar de la función, emito el valor de la prueba:
Print(arr2[1]);
y aparece la siguiente entrada en el registro
2005.09.19 18:30:03 arrtest EURUSD,H1: 2147483647
este no es el punto, ¿qué tiene que ver 2^31....?
funciona de la misma manera con cualquier otro elemento de la matriz.
aunque bajo el depurador antes de salir de la función los valores en el array out son como deberían ser (cerca del precio - ~1.2)
 
El número 2147483647 está muy cerca de cero, parece.
2^31-1 para ser exactos, que debería ser como el cero.
 
void __stdcall process_arr(double *in, double *out, int size); <br / translate="no">
Esta es la declaración en el Asesor Experto:
#importar "algo.dll"
void process_arr(double in[], double& out[], int size);


Sólo una sugerencia (porque no estoy familiarizado con MQL): ¿es realmente necesario & para el segundo parámetro?
void process_arr(double in[], double& out[], int size);
 
a Rosh, eso es cierto, pero estamos hablando del tipo doble, y ahí la representación numérica es "ligeramente" diferente, y 2^31 está bastante lejos de 0.... :(

a VicK, el ampersand es todo el punto, gracias a él puedo realmente cambiar el contenido del array...
la segunda matriz es una matriz con valores de retorno
 
a VicK, el ampersand es todo el punto, gracias a él puedo realmente cambiar el contenido del array... <br / translate="no"> la segunda matriz es una matriz con valores de retorno


En este caso no hay esencia en el ampersand (acabo de probarlo yo mismo), y puedes cambiar el contenido del array gracias a otra cosa :-). ¿Has mirado el ejemplo de DLL en el directorio? Allí todo funciona bien. Hazlo de la misma manera.
 
parece que el ampersand no hace ninguna diferencia si se trata de un array de tipo double[]
pero todo funciona bien con int[]. Tengo la sospecha de que aquí empieza a oler a bug.... :(
Me gustaría conocer los comentarios de los desarrolladores

si esta cosa viniera con el código fuente, nadie se molestaría, pero... adelante, estoy pidiendo ayuda.
Razón de la queja: