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

 
Por cierto, ahora lo que ofrece Min es más parecido a lo que se puede comprar que antes. <br / translate="no"> Pura imho :)

Gracias. Esperamos recibir ofertas comerciales. Buena suerte.
 
Es difícil llamarlo una API. Biblioteca + EA. Funciona MUY lentamente.
 
...
 
Pregunta al desarrollador de la biblioteca: ¿por qué la velocidad de obtención de citas al utilizar su biblioteca es más lenta que cuando se trabaja con archivos temporales? ¿Cuál es entonces la ventaja de utilizar la memoria compartida? <br/ translate="no">

¿A qué se refiere con la velocidad de obtención de presupuestos? Si se trata de obtener ticks entonces ya escribí que trabajar con ticks de cotizaciones incluso directamente en MT4 es difícil.
La biblioteca no fue diseñada originalmente para atrapar garrapatas. Tiene que ver con el hecho de que el sistema puede simplemente colgarse cuando el mercado es muy activo, porque no puede seguir el ritmo de los ticks. Por eso, la biblioteca lleva incorporada una protección de software contra la avalancha de garrapatas.
Las ventajas de utilizar la memoria compartida son la alta fiabilidad de este sistema y la ausencia de atascos en el disco duro. Además, varios programas pueden acceder a la biblioteca, y no necesitan "conocer" la ubicación exacta de los archivos temporales. Buena suerte.
 
Cuando el mercado es muy activo, el sistema puede simplemente congelarse debido a la incapacidad de seguir el ritmo de los ticks. Por eso en la librería hay una protección de software incorporada contra la avalancha de ticks.


parece que el autor se excedió :)
según tengo entendido, si el EA está dentro de la función start() (y envía información sobre un tick al cliente de la API desde allí), entonces MT no dará un nuevo tick hasta que el EA salga de la función start(). Por eso no está claro cómo puede producirse una avalancha de ticks...

si el EA está en bucle y recibe ticks a través de RefreshRates, entonces primero debería salir de la API del cliente, y luego se produciría la llamada de RefreshRates. Por eso tampoco hay lugar para congelar aquí.

La ventaja de utilizar la memoria compartida es la alta fiabilidad de este sistema

suena bien, pero no es la única forma de comunicación entre procesos.
así que el tema "¿Para qué sirve el uso de la memoria compartida?" no está resuelto :)

imho, MMF es bueno sólo en un caso cuando necesitas bombear grandes cantidades de datos entre procesos - la velocidad de bombeo es de ~150Mb/seg. (hace un par de meses tuve que hacer tal mecanismo sólo con MMF, porque según las pruebas esta es la manera más rápida).

en esta tarea (transferir parámetros para OrderSend etc.) - es como un pájaro por una pluma, más fácil crear una ventana y usar SendMessage con wm_copydata.
 
suena sólido, pero no es la única forma de comunicación entre procesos. <br / translate="no"> así que el tema "...¿Cuál es la ventaja de usar memoria compartida entonces?" no está resuelto :)

No creo que esté discutiendo que el algoritmo utilizado sea el mejor. Eso es lo bueno de la programación, que un problema así puede resolverse al menos de una docena de maneras. La variante con archivos temporales también funcionaba plenamente. Mi tarea consistía en desarrollar un sustituto fiable, viable y totalmente funcional de la API de MT3. Ahora la biblioteca trabaja con el programa de comercio práctico durante aproximadamente medio año. Y el principal problema en este caso no era la consecución de la máxima velocidad, sino la fiabilidad y la respuesta adecuada a un gran número de situaciones de emergencia. Así que, gracias por tus comentarios, son muy apropiados, pero esa es "otra historia". Buena suerte.
 
Hola, así que el principal problema en este momento es la conexión:

Incluir Mforex2.lib biblioteca de importación en el proyecto (para Delpi - sólo describir las funciones de la biblioteca),
Especificar el archivo de cabecera Mforex.h en el programa principal (por ejemplo: #include "Mforex.h" - sólo para Builder C++);

Estos 2 puntos son misteriosos para mí porque Omega es el programa listo, todos los demás archivos que he colocado como se describe, la función prescrita para iniciar MT4, y en el inicio me dio el mensaje de que es necesario prescribir la ruta exacta, pero también prescribí ruta. No sé qué hacer ahora.
 
Incluir en el proyecto de importación de la biblioteca Mforex2.lib (para Delpi - sólo describir las funciones de la biblioteca),<br/ translate="no"> Especificar en el archivo de cabecera del programa principal Mforex.h (por ejemplo: #include "Mforex.h" - sólo para Builder C++);
Estos 2 puntos me desconciertan porque Omega es un programa ya hecho, todos los demás archivos los he colocado como se describe, la función prescrita de inicio de MT4 y en el inicio recibí el mensaje de que es necesario prescribir la ruta exacta, pero yo también he prescrito la ruta. No sé qué hacer ahora.

Omega tiene la posibilidad de importar funciones de DLLs externas. Por lo tanto, debe especificar Mforex2.dll como la biblioteca externa. Al mismo tiempo, este archivo debe estar en el "campo de visión" de los programas Omega. En los procedimientos de llamada, especifique el nombre de las funciones importadas de la DLL, como se indica en la documentación. Observe también que Omega "no conoce" las definiciones del archivo Mforex.h. Es decir, por ejemplo, cuando se llama a la función de abrir una posición, hay que especificar el código de operación para, por ejemplo, Vender - 1, en lugar de OP_SELL, etc. Para más detalles, consulte la documentación de DevKit, que describe la forma en que omega trabaja con las bibliotecas externas.
Buena suerte.
 
<br / translate="no"> Es posible importar funciones de DLLs externas en Omega. Por lo tanto, Mforex2.dll debe ser especificado como una biblioteca externa. Al mismo tiempo, este archivo debe estar "a la vista" de los programas Omega. En los procedimientos de llamada, especifique el nombre de las funciones importadas de la DLL, como se indica en la documentación. Observe también que Omega "no conoce" las definiciones del archivo Mforex.h. Es decir, por ejemplo, cuando se llama a la función de abrir una posición, hay que especificar el código de operación para, por ejemplo, Vender - 1, en lugar de OP_SELL, etc. Para más detalles, consulte la documentación de DevKit, que describe la forma en que omega trabaja con las bibliotecas externas.
Buena suerte.


Así que prescribí lo siguiente en Omega:

DefineDLLfunc: "Mforex2.dll", int, "Start"; {Llamada a la DLL}
_gbp = Start(); {función de inicio del terminal}

Pero dices que aquí debemos escribir algo más en lugar de "Start()", ¿lo he entendido bien?
 
<br/ translate="no"> Así que prescribí lo siguiente en Omega:

DefineDLLfunc: "Mforex2.dll", int, "Start"; {llamar a DLL}
_gbp = Start(); {función de inicio de terminal}

Pero dices que en lugar de "Start()" hay que escribir otra cosa, ¿tengo razón?

Yo mismo respondo: No tienes que escribir algo más en lugar de "Start()" - así es, Omega inicia MT4 sin problemas.

Pero es un poco más complicado en la función de apertura de posiciones, por lo que he prescrito la función:

Input: Symbol(NumericSimple), Order(NumericSimple), Lot(NumericSimple),
price(NumericSimple), sl(NumericSimple), tp(NumericSimple);


DefineDLLfunc: "Mforex2.dll", int, "NewPos",char, int, int, double, double, double;

_NewPos = NewPos(Symbol, Order, Lot, price, sl, tp);

Lógicamente todo se ajusta a la descripción del fabricante, pero en la práctica tenemos problemas: todo se establece en números...
Razón de la queja: