Discusión sobre el artículo "Biblioteca para el desarrollo rápido y sencillo de programas para MetaTrader (Parte XIII): Eventos del objeto "cuenta""
Gracias por su gran y útil trabajo @Artyom Trishkin, debo hacer una pregunta aquí;
Creo que es necesario guardar el estado del motor y cargarlo en la próxima ejecución de scripts / EAs para reanudar la captura de eventos e identificar los cambios en el tiempo de EA cerrado.
Pero tiene funciones virtuales CObject Save/Load y devuelve true sin ninguna acción.
P: ¿Qué debemos guardar y cómo acceder a ellos para guardar?
Gracias por su trabajo maravilloso y útil @ Artyom Trishkin, tengo que hacer una pregunta aquí;
Creo que es necesario guardar el estado del motor y cargarlo la próxima vez que los scripts / asesores se inician, con el fin de reanudar la captura de eventos y detectar cambios en el tiempo cerrado del asesor.
Pero tiene funciones virtuales CObject Save / Load que devuelven true sin ninguna acción.
P: ¿Qué debemos guardar y cómo acceder a ellos?
Para aprovechar las funciones virtuales, es necesario implementarlas en los objetos-herederos. Vea cómo se hace y se describe en el artículo sobre la creación de una colección de cuentas. En él, cada uno de los objetos cuenta se escribe en un fichero, y luego se lee del fichero.
Planeo guardar gradualmente todos los objetos almacenados en diferentes colecciones de la biblioteca en archivos. Pero mientras estoy ocupado con las clases de comercio para la biblioteca.
Tuve un problema al usar ResetLastTradeEvent y voy a reportarlo aquí,
Estoy leyendo los últimos eventos obteniendo una lista de ellos, comprobando si hay nuevos eventos o no; porque guardar el estado del último evento y compararlo en las próximas comprobaciones, no es una buena solución. Si dos ordenes pendientes se colocan en diferente tiempo sin ningún otro evento entre ellas, nos perdemos la segunda.
entonces, compruebo los eventos, haciendo mis cosas y ResetLastTradeEvent y buscando nuevos valores != _NO_EVENT . entonces, ¿cuál es el problema?
está devolviendo m_last_trade_event cuando se llama LastTradeEvent
ENUM_TRADE_EVENT LastTradeEvent(void) const { return this.m_last_trade_event; }
entonces:
void ResetLastTradeEvent(void) { this.m_events.ResetLastTradeEvent(); this.m_last_trade_event = TRADE_EVENT_NO_EVENT; }
También hice algunas modificaciones para asegurar que la función Clear() haga su trabajo en Listas y Arrays.
Aquí está mi caso de uso
if(engine.LastTradeEvent()!=TRADE_EVENT_NO_EVENT) { CArrayObj* list=engine.GetListAllOrdersEvents(); if(list!=NULL) { int total=list.Total(); for(int i=0; i<total ; i++){ CheckThisEvent(list.At(i)); } } //-- engine.m_events.Clear(); engine.ResetLastTradeEvent(); }
Tuve un problema al usar ResetLastTradeEvent y voy a reportarlo aquí,
Estoy leyendo los últimos eventos obteniendo una lista de ellos, comprobando si hay nuevos eventos o no; porque guardar el estado del último evento y compararlo en las próximas comprobaciones, no es una buena solución. Si dos órdenes pendientes se colocan en diferentes momentos sin ningún otro evento entre ellas, nos perderemos la segunda.
entonces, compruebo los eventos, haciendo mis cosas y ResetLastTradeEvent y buscando nuevos valores != _NO_EVENT . entonces, ¿cual es el problema?
devuelve m_last_trade_event cuando llamas a LastTradeEvent
entonces:
También hice algunas modificaciones para asegurar que la función Clear() haga su trabajo en Listas y Arrays.
Este es mi caso de uso
Это, к сожалению, неправильное решение. Вы перенесли список m_events в публичную секцию класса? Вы очищаете весть список событий?
engine.m_events.Clear();
Тем самым вы разрушаете структуру коллекции событий. А ведь не зря же список m_events находится в приватной секции класса CEngine - к этим спискам запрещён доступ извне.
В последней версии библиотеки (статья 23), которая уже готова к выходу, возвращается флаг произошедшего торгового события в управляющую программу. И последнее событие всегда можно получить.
А в статье 24 будет доступен список всех событий, произошедших одновременно, например - удаление множества отложенных ордеров. Каждое событие будет отображено в программе. И к каждому из этих событий можно будет получить доступ для работы с ними.
-----------------------------------------------------
Esto, por desgracia, es la decisión equivocada. ¿Has movido la lista m_events a la sección pública de la clase? ¿Está borrando los eventos de la lista de noticias?
engine.m_events.Clear();
Así, destruyes la estructura de la colección de eventos. Pero no en vano la lista m_events se encuentra en la sección privada de la clase CEngine - el acceso a estas listas está prohibido desde el exterior.
En la última versión de la librería (artículo 23), que ya está lista para su lanzamiento, se devuelve al programa de control la bandera del evento comercial ocurrido. Y el último evento está siempre disponible.
Y en el artículo 24, estará disponible una lista de todos los eventos que ocurrieron simultáneamente, por ejemplo, la eliminación de muchas órdenes pendientes. Cada evento se mostrará en el programa. Y se podrá acceder a cada uno de estos eventos para trabajar con ellos.
Estaba intentando obtener todos los eventos por ese bucle for en el último bloque de código que envié en el comentario anterior.
Estaba recibiendo eventos antiguos por cada uno nuevo, así que destruí los privados e hice todo público; no es la forma correcta, pero lo hice de todos modos para asegurarme de que la lista se está limpiando (con v13).
Gracias por las mejoras en los próximos artículos. Las revisaré lo antes posible.
Yo estaba tratando de obtener todos los eventos por ese bucle for en el último bloque de código que lo envié en el comentario anterior.
Estaba recibiendo eventos antiguos por cada uno nuevo, así que destruí los privados e hice todo público; no es la forma correcta, pero lo hice de todos modos para asegurarme de que la lista se está limpiando (con v13).
Gracias por las mejoras en los próximos artículos. Las revisaré lo antes posible.
Так как в статьях описываются все этапы создания библиотеки, то я, к сожалению, не счёл необходимым дать сразу полный доступ к списку торговых событий, а дал лишь доступ к последнему событию. А последнее событие всегда возвращается то, которое произошло последним - не важно когда - прямо сейчас, или час назад. Оно всё равно является последним событием, и оно же и возвращается. И я упустил из виду, что два одинаковых события по названию, но разные по свойствам, уже потребуется кому-то получать. По этой причине и не было доведено до нормального состояния получение торговых событий. В классах коллекций аккаунтов и символов уже созданы и работают методы получения всех событий аккаунта или символов, и их легко получить в своих программах. Точно таким же образом в ближайших двух статьях будет дана возможность получения и торговых событий.
К слову - это ещё не всё, что будет реализовано. Далее будут созданы методы для поиска и получения любых данных и событий в своих программах. И сделано это будет весьма удобным и наглядным способом - не нужно будет получать списки, искать и фильтровать данные, а просто ввводить префикс с точкой (set, get., find.) и из выпадающего списка (после точки) выбирать нужный метод. Это планировалось ещё на этапе обдумывания концепции библиотеки, но делаться всё будет только тогда, когда будет готов весь базовый функционал библиотеки.
Также будет дана возможность работать с графикой - будет полноценная графическая оболочка, знающая о всех собранных библиотекой данных. Плюс - интерактивные пользовательские графические объекты...
---------------------------------
Dado que los artículos describen todas las etapas de la creación de una biblioteca, yo, por desgracia, no consideró necesario dar acceso completo a la lista de eventos comerciales a la vez, pero dio acceso sólo al último evento. Y el último evento siempre devuelve el que ocurrió en último lugar - no importa cuándo - ahora mismo, o hace una hora. Sigue siendo el último evento, y vuelve. Y perdí de vista el hecho de que dos eventos idénticos por nombre, pero diferentes en propiedades, ya requerirán que alguien los reciba. Por esta razón, la recepción de eventos de comercio no fue llevado a la normalidad. En las clases de colecciones de cuentas y símbolos, ya se han creado métodos que funcionan para obtener todos los eventos de la cuenta o símbolos, y son fáciles de conseguir en sus programas. Exactamente de la misma manera, los próximos dos artículos darán la oportunidad de recibir eventos de negociación.
Por cierto - esto no es todo lo que se implementará. A continuación, se crearán métodos para buscar y recuperar cualquier dato y eventos en sus programas. Y esto se hará de una manera muy conveniente y visual - usted no tendrá que recibir listas, buscar y filtrar datos, sino simplemente introducir un prefijo con un punto (set., get., find.) Y seleccione el método deseado en la lista desplegable (después del punto). Esto se planeó en la fase de reflexión sobre el concepto de la biblioteca, pero todo se hará sólo cuando esté lista toda la funcionalidad básica de la biblioteca.
También se le dará la oportunidad de trabajar con gráficos - habrá un shell gráfico en toda regla que sabe acerca de todos los datos recogidos por la biblioteca. Además - objetos gráficos interactivos personalizados ...
Yo estaba tratando de obtener todos los eventos por ese bucle for en el último bloque de código que lo envié en el comentario anterior.
Estaba recibiendo eventos antiguos por cada uno nuevo, así que destruí los privados e hice todo público; no es la forma correcta, pero lo hice de todos modos para asegurarme de que la lista se está limpiando (con v13).
Gracias por las mejoras en los próximos artículos. Las revisaré lo antes posible.
В русском сегменте ресурса вышла статья, в которой есть доступ к последнему событию из программы...
---------------------------------------
Un artículo aparecido en el segmento ruso del recurso en el que hay acceso al último evento del programa:
- www.mql5.com
Gracias Artyom, ya lo había encontrado,
Creo que hay un error: cuando abrimos o cerramos más de una operación en el mismo segundo, no detecta una de ellas o sólo detecta una; ¡también detecta dos veces algunas veces!
te muestro mis logs
2019.10.14 15:58:14.489 MT4EventsEA EURUSD,M1: uninit reason 4
2019.10.14 15:57:28.424 MT4EventsEA EURUSD,M1: 2019.10.14 15:27:22.000: El saldo de la cuenta disminuyó en -0.75 USD (5445.52 USD)
2019.10.14 15:57:28.423 MT4EventsEA EURUSD,M1: 2019.10.14 15:27:22.000: El nivel de margen disminuyó en -16456.49% (0.00%)
2019.10.14 15:57:27.895 MT4EventsEA EURUSD,M1: CEventsCollection::CreateNewEvent, Línea 767: Este evento ya está en la lista.
2019.10.14 15:57:27.474 MT4EventsEA EURUSD,M1: - Posición cerrada: 2019.10.14 15:27:13.000 - EURUSD Cerrar Compra #542264335 al precio 1.10304, ganancia -0.14 USD
2019.10.14 15:57:27.472 MT4EventsEA EURUSD,M1: - Posición cerrada: 2019.10.14 15:27:12.000 - EURUSD Cerrar Comprar #542264333 al precio 1.10304, ganancia -0.14 USD
2019.10.14 15:57:19.095 MT4EventsEA EURUSD,M1: 2019.10.14 15:27:13.000: Nivel de margen disminuido en -32915.87% (16456.49%)
2019.10.14 15:57:18.844 MT4EventsEA EURUSD,M1: - Posición abierta: 2019.10.14 15:27:13.000 - EURUSD Open 0.01 Buy #542264335 [0.01 Market order Buy #542264335] al precio 1.10304
2019.10.14 15:57:18.002 MT4EventsEA EURUSD,M1: - Posición abierta: 2019.10.14 15:27:12.000 - EURUSD Open 0.01 Comprar #542264333 [0.01 Orden de mercado Comprar #542264333] al precio 1.10304
2019.10.14 15:57:17.547 MT4EventsEA EURUSD,M1: 2019.10.14 15:27:12.000: Nivel de margen aumentado en 49372.35% (49372.35%)
2019.10.14 15:57:17.175 MT4EventsEA EURUSD,M1: - Posición abierta: 2019.10.14 15:27:11.000 - EURUSD Open 0.01 Buy #542264331 [0.01 Orden de mercado Buy #542264331] al precio 1.10301
2019.10.14 15:56:17.144 MT4EventsEA EURUSD,M1: 2019.10.14 15:26:11.000: Nivel de margen disminuido en -12343.32% (0.00%)
2019.10.14 15:56:16.800 MT4EventsEA EURUSD,M1: - Posición cerrada: 2019.10.14 15:22:40.000 - EURUSD Cerrar Compra #542263747 al precio 1.10301, ganancia -0.07 USD
2019.10.14 15:56:16.798 MT4EventsEA EURUSD,M1: - Posición cerrada: 2019.10.14 15:22:41.000 - EURUSD Cerrar Comprar #542263749 al precio 1.10301, ganancia -0.07 USD
2019.10.14 15:56:16.347 MT4EventsEA EURUSD,M1: - Posición cerrada: 2019.10.14 15:22:42.000 - EURUSD Cerrar Comprar #542263753 al precio 1.10304, ganancia -0.14 USD
2019.10.14 15:56:15.926 MT4EventsEA EURUSD,M1: - Posición cerrada: 2019.10.14 15:22:42.000 - EURUSD Cerrar Comprar #542263753 al precio 1.10304, ganancia -0.14 USD
2019.10.14 15:56:09.140 MT4EventsEA EURUSD,M1: inicializado
aquí está el historial de operaciones de la cuenta MT4:
y es mi código:
void OnTick() { DoChecks(); } void OnTimer() { DoChecks(); } //+------------------------------------------------------------------+ //| Mi función de comprobación| //+------------------------------------------------------------------+ void DoChecks() { engine.OnTimer(); //\\//\\ Eventos comerciales if(engine.LastTradeEvent()!=TRADE_EVENT_NO_EVENT) { //engine.LastTradeEvent()!=last_trade_event CArrayObj* list=engine.GetListAllOrdersEvents(); if(list!=NULL) { int total=list.Total(); for(int i=0; i<total ; i++){ CheckTradeEvent(list.At(i)); } } //-- engine.ResetLastTradeEvent(); } //\\//\\ Eventos de la cuenta if(engine.LastAccountEvent()!=ACCOUNT_EVENT_NO_EVENT){ CArrayInt* list=engine.GetListAccountEvents(); if(list!=NULL){ int total=list.Total(); for(int i=0;i<total;i++){ ENUM_ACCOUNT_EVENT event=(ENUM_ACCOUNT_EVENT)list.At(i); if(event==NULL){ continue; } CheckAccountEvent(event); } } //-- engine.ResetLastAccountEvent(); } }
Qué opinas al respecto, ¿hay algún problema en mi implementación?
Gracias Artyom, lo encontré antes,
Creo que hay un error: cuando abrimos o cerramos más de una operación en el mismo segundo, no detecta una de ellas o sólo detecta una; ¡también detecta dos veces algunas veces!
te muestro mis logs
2019.10.14 15:58:14.489 MT4EventsEA EURUSD,M1: uninit reason 4
2019.10.14 15:57:28.424 MT4EventsEA EURUSD,M1: 2019.10.14 15:27:22.000: El saldo de la cuenta disminuyó en -0.75 USD (5445.52 USD)
2019.10.14 15:57:28.423 MT4EventsEA EURUSD,M1: 2019.10.14 15:27:22.000: El nivel de margen disminuyó en -16456.49% (0.00%)
2019.10.14 15:57:27.895 MT4EventsEA EURUSD,M1: CEventsCollection::CreateNewEvent, Línea 767: Este evento ya está en la lista.
2019.10.14 15:57:27.474 MT4EventsEA EURUSD,M1: - Posición cerrada: 2019.10.14 15:27:13.000 - EURUSD Cerrar Compra #542264335 al precio 1.10304, ganancia -0.14 USD
2019.10.14 15:57:27.472 MT4EventsEA EURUSD,M1: - Posición cerrada: 2019.10.14 15:27:12.000 - EURUSD Cerrar Comprar #542264333 al precio 1.10304, ganancia -0.14 USD
2019.10.14 15:57:19.095 MT4EventsEA EURUSD,M1: 2019.10.14 15:27:13.000: Nivel de margen disminuido en -32915.87% (16456.49%)
2019.10.14 15:57:18.844 MT4EventsEA EURUSD,M1: - Posición abierta: 2019.10.14 15:27:13.000 - EURUSD Open 0.01 Buy #542264335 [0.01 Orden de mercado Buy #542264335] al precio 1.10304
2019.10.14 15:57:18.002 MT4EventsEA EURUSD,M1: - Posición abierta: 2019.10.14 15:27:12.000 - EURUSD Open 0.01 Comprar #542264333 [0.01 Orden de mercado Comprar #542264333] al precio 1.10304
2019.10.14 15:57:17.547 MT4EventsEA EURUSD,M1: 2019.10.14 15:27:12.000: Nivel de margen aumentado en 49372.35% (49372.35%)
2019.10.14 15:57:17.175 MT4EventsEA EURUSD,M1: - Posición abierta: 2019.10.14 15:27:11.000 - EURUSD Open 0.01 Buy #542264331 [0.01 Orden de mercado Buy #542264331] al precio 1.10301
2019.10.14 15:56:17.144 MT4EventsEA EURUSD,M1: 2019.10.14 15:26:11.000: Nivel de margen disminuido en -12343.32% (0.00%)
2019.10.14 15:56:16.800 MT4EventsEA EURUSD,M1: - Posición cerrada: 2019.10.14 15:22:40.000 - EURUSD Cerrar Compra #542263747 al precio 1.10301, ganancia -0.07 USD
2019.10.14 15:56:16.798 MT4EventsEA EURUSD,M1: - Posición cerrada: 2019.10.14 15:22:41.000 - EURUSD Cerrar Comprar #542263749 al precio 1.10301, ganancia -0.07 USD
2019.10.14 15:56:16.347 MT4EventsEA EURUSD,M1: - Posición cerrada: 2019.10.14 15:22:42.000 - EURUSD Cerrar Comprar #542263753 al precio 1.10304, ganancia -0.14 USD
2019.10.14 15:56:15.926 MT4EventsEA EURUSD,M1: - Posición cerrada: 2019.10.14 15:22:42.000 - EURUSD Cerrar Comprar #542263753 al precio 1.10304, ganancia -0.14 USD
2019.10.14 15:56:09.140 MT4EventsEA EURUSD,M1: inicializado
Aquí está el historial de operaciones de la cuenta MT4:
y es mi código:
¿Qué piensa usted al respecto, hay algún problema en mi aplicación?
Espere a que el próximo artículo en el segmento ruso del recurso.
En el próximo artículo, el seguimiento de los eventos comerciales que se produjeron simultáneamente en un ciclo ya está listo y funcionando.
Y también proporciona un ejemplo de seguimiento de eventos comerciales en un asesor.
Espere el próximo artículo en el segmento ruso del recurso.
En el próximo artículo, el seguimiento de los eventos comerciales que ocurrieron simultáneamente en un ciclo ya está listo y funcionando.
Y también proporciona un ejemplo de seguimiento de eventos comerciales en un asesor.
Gracias por sus útiles respuestas y artículos.
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso

Artículo publicado Biblioteca para el desarrollo rápido y sencillo de programas para MetaTrader (Parte XIII): Eventos del objeto "cuenta":
En este artículo, analizaremos los métodos de trabajo con los eventos de cuenta (de la cuenta comercial) que permiten monitorear los eventos importantes de cambio en las propiedades de una cuenta comercial y que influyen de una forma u otra en el comercio automático. Ya creamos cierta parte de la funcionalidad para el seguimiento de eventos de cuenta en el artículo anterior, al crear la colección de objetos de cuenta.
Ahora, iniciamos el asesor en el simulador y abrimos muchas posiciones, para captar rápidamente el evento de aumento de fondos y el procesamiento que hemos escrito para este evento, es decir, el cierre de la posición más rentable:
Podemos ver que cuando los fondos aumentan por encima de la magnitud establecida, la posición más rentable se cierra automáticamene. Y en el diario, se muestra un mensaje sobre el evento de cuenta que estamos monitoreando.
Autor: Artyom Trishkin