Desarrollo de una biblioteca de funciones API para MetaTrader 4 - página 7

 
Buenas tardes, por lo que consulté con un programador que conozco, y me explicó que si esta DLL no fue escrita específicamente para su uso en Omega, no se puede garantizar su funcionalidad. Porque Omega puede no tener los recursos que necesitamos en los parámetros de llamada a la función de la DLL. He aquí un ejemplo :
int TikKot(char *kotx, double *bid, double *ask, TDateTime *tim);
esta línea no admite datos como "TDateTime *tim" en Omega.
Significa que sólo funcionan las funciones de inicio y finalización del terminal en las que no se establecen parámetros. Cuando se establecen parámetros, necesitamos saber qué parámetros toma la DLL, sería bueno tener ejemplos.
Creo que tendrás que ver un ejemplo en Delphi con un programador que te diga exactamente lo que necesitas, y luego buscar herramientas Omega para entregar los parámetros requeridos a la DLL. Si quisieras lanzar una versión de la DLL específicamente para Omega, facilitaría enormemente su rápida prueba y uso, creo que habría muchos usuarios con Omega. Ya hay algunos usuarios interesados. He aquí un pequeño extracto de la AYUDA de Omega:
Un punto importante es la lista de tipos de datos soportados, véase más abajo.



Definición de la función DLL

Antes de poder llamar a una función DLL desde EasyLanguage, debe declarar la DLL utilizando la instrucción de declaración de la función DLL.

Sintaxis:

DefineDLLFunc: "DLLNAME.DLL", Return Type, "FunctionName", Parameters;

DLLNAME.DLL es el nombre de la DLL donde reside la función, Return Type es el tipo de expresión que devolverá la función, FunctionName es el nombre de la función tal y como se define en la DLL, Parameters es la lista de parámetros esperados por la función (cada parámetro separado por coma).

Es muy importante recordar que las DLL de 32 bits utilizan funciones exportadas, declaradas con mayúsculas y minúsculas, utilizando _cdecl, stdcall o fastcall. Para que las DLLs sean compatibles con EasyLanguage, las funciones exportadas deben ser creadas usando letras mayúsculas y deben ser declaradas como _stdcall. Estas funciones de exportación deben figurar en la sección EXPORTS .DEF del archivo DLL. Utilizar "_declspec (dllexport)" desde el prototipo de la función no es suficiente para que EasyLanguage localice las funciones DLL exportadas.

Por ejemplo, la siguiente instrucción declara una función llamada MessageBeep que se encuentra permanentemente en una DLL llamada USER32.DLL. Devuelve un valor booleano (verdadero/falso) y espera un único parámetro, int.

DefineDLLFunc: "USER32.DLL", bool, "MessageBeep", int;

Tipos de datos

EasyLanguage soporta muchos tipos de datos válidos que pueden ser usados para enviar y recibir información a funciones contenidas en DLLs. Esta es una lista de los tipos de datos soportados por EasyLanguage:

Tipos de datos fundamentales:

BYTE
Tipo de datos enteros de 1 byte.

char
Tipo de datos enteros de 1 byte.

int
Tipo de datos enteros con signo de 4 bytes.

WORD
Tipo de datos enteros sin signo de 2 bytes.

long
Tipo de datos enteros con signo de 4 bytes.

DWORD
Tipo de datos enteros sin signo de 4 bytes.

float
Tipo de datos de punto flotante de 4 bytes.

double
Tipo de datos de punto flotante de 8 bytes.

BOOL
Tipo de datos booleanos de 4 bytes.




Variantes:


UNSIGNED LONG
Igual que DWORD.

VOID
Significa "No hay valor devuelto".

Tipos de punteros:


LPBYTE
Puntero a un BYTE.

LPINT
Puntero a un int.

LPWORD
Puntero a un WORD.

LPLONG
Puntero a un LONG.

LPDWORD
Puntero a un DWORD.

LPFLOAT
Puntero a un flotador (en float FAR).

LPDOUBLE
Puntero a un doble (en doble FAR).

LPSTR
Puntero a un char.


Todos los punteros son punteros de 32 bits y EasyLanguage maneja cada uno de ellos de la misma manera.

También es muy importante recordar que todos los valores en EasyLanguage son flotantes, excepto Open, High, Low y Close, que son enteros. Para controlar estos precios, debe enviar la función de escala de precios al símbolo que compone el gráfico.

Por ejemplo, si un valor tiene una escala de precios de 1/1000 y el precio final fue de 105,125, ese precio se enviará a la DLL como 105125. Para que la DLL sepa cómo leer este precio, debe enviar el valor en la palabra reservada PriceScale, que en este caso devuelve el valor 1.000.
 
Es posible que Omega no tenga los recursos que necesita en los parámetros de la llamada a la función DLL. He aquí un ejemplo :<br/ translate="no"> int TikKot(char *kotx, double *bid, double *ask, TDateTime *tim);
en esta línea los datos de tipo "TDateTime *tim" no son soportados por Omega.

Ahora todo tiene sentido. Para solucionar este problema, intente especificar el tipo double en Omega en lugar de TDateTime - es decir, int TikKot(char, double, double, double);
De hecho, estos tipos son fácilmente intercambiables y utilizan 8 bytes de memoria cada uno. Buena suerte.
 
Bien, gracias. ¿Qué pasa con el tipo "char", Omega requiere Numeric, pero la DLL necesita texto? ¿Es posible sustituirlo?
 
Bien, gracias. ¿Qué pasa con el tipo "char", Omega requiere Numeric, pero la DLL necesita texto? ¿Se puede sustituir por ? <br / translate="no">

¿Por qué? Está en la descripción:
LPSTR
Puntero a un char.

Es lo mismo. ¿Hay ejemplos de este tipo de variables en la documentación de Omega? Hay que buscar allí cuidadosamente variantes similares. Buena suerte.
 
Buenas tardes, he encontrado el problema:
Esto es de la ayuda de la DLL:

Nota: Las DLL de 32 bits utilizan funciones exportadas que distinguen entre mayúsculas y minúsculas declaradas con _cdecl, _stdcall , o fastcall. Para que las DLLs sean compatibles con EasyLanguage, las funciones exportadas deben ser creadas usando todas las letras mayúsculas y ser declaradas como _stdcall. Estas funciones exportadas deben figurar en la sección EXPORTS del archivo .DEF de la DLL. Utilizar "_declspec (dllexport)" desde el prototipo de la función no es suficiente para que EasyLanguage localice las funciones exportadas de una DLL.

Así que aquí dice que Omega sólo funciona con aquellas Funciones que están escritas en letras GRANDES. He comprobado cómo está escrito en otra DLL, realmente sólo en LETRAS GRANDES.
Si cambias la llamada de Funciones (nombres en mayúsculas) entonces podemos hacer más pruebas.
Personalmente estoy muy interesado en su producto y mi petición es que adapten la DLL a Omega. Espero que funcione... ¡buena suerte!
Si no lo hace entonces publique aquí por favor, tendré que trabajar en otra solución de automatización del comercio. Gracias.
 
<br / translate="no"> Si cambias la llamada de la Función (nombres en mayúsculas) entonces puedes probar más.
Personalmente estoy muy interesado en su producto y mi petición es que adapten la DLL a Omega. Espero que funcione... ¡buena suerte!

Hice una variante con letras de función grandes y la envié a tu bandeja de entrada. Buena suerte.
 
Muchas gracias, voy a hacer pruebas y publicaré los resultados.