Discussão do artigo "Biblioteca para desenvolvimento fácil e rápido de programas para a MetaTrader (parte XIII): Eventos do objeto Conta"

 

Novo artigo Biblioteca para desenvolvimento fácil e rápido de programas para a MetaTrader (parte XIII): Eventos do objeto Conta foi publicado:

O artigo considera trabalhar com os eventos da conta para monitorar alterações importantes nas propriedades da conta que afetam a negociação automatizada. Nós já implementamos algumas funcionalidades para monitorar os eventos da conta no artigo anterior ao desenvolver a coleção de objetos da conta.

Agora, iniciamos o EA no testador e abrimos mais posições para detectar rapidamente o evento de aumento de capital, seguido pelo encerramento da posição mais lucrativa:


Como podemos ver, a posição mais lucrativa é encerrada automaticamente quando o capital exceder o valor especificado. O diário exibe as mensagens sobre o evento da conta monitorada.

Autor: Artyom Trishkin

 

Obrigado por seu excelente e útil trabalho @Artyom Trishkin, mas gostaria de fazer uma pergunta aqui;

Acho que é necessário salvar o estado do mecanismo e carregá-lo na próxima execução de scripts/EAs para retomar a captura de eventos e identificar alterações no tempo de fechamento do EA.

Mas ele tem funções virtuais CObject Save/Load e retorna true sem nenhuma ação.

P: O que devemos salvar e como acessá-los para salvar?

 
Mohammad Bazrkar :

Obrigado por seu trabalho maravilhoso e útil @ Artyom Trishkin, preciso fazer uma pergunta aqui;

Acho que é necessário salvar o estado do mecanismo e carregá-lo na próxima vez que os scripts/conselheiros forem iniciados, para retomar a captura de eventos e detectar alterações no tempo de fechamento do consultor.

Mas ele tem funções virtuais CObject Save / Load que retornam true sem nenhuma ação.

P: O que devemos salvar e como obter acesso a eles?

Para aproveitar as vantagens das funções virtuais, elas precisam ser implementadas nos objetos herdeiros. Veja como isso é feito e descrito no artigo sobre a criação de uma coleção de contas. Nele, cada um dos objetos de conta é gravado em um arquivo e, em seguida, lido do arquivo.

Planejo salvar gradualmente todos os objetos armazenados em diferentes coleções de bibliotecas em arquivos. Mas estou ocupado com as classes comerciais para a biblioteca.

 

Tive um problema ao usar o ResetLastTradeEvent e vou relatá-lo aqui,

Estou lendo os eventos mais recentes obtendo a lista deles, verificando se há algum evento novo ou não; porque salvar o estado do evento mais recente e compará-lo nas próximas verificações não é uma boa solução. Se duas ordens pendentes forem colocadas em momentos diferentes, sem nenhum outro evento entre elas, perderemos a segunda.

Então, eu verifico os eventos, faço minhas coisas e ResetLastTradeEvent e procuro novos valores != _NO_EVENT . então, qual é o problema?

ele está retornando m_last_trade_event quando você chama LastTradeEvent

   ENUM_TRADE_EVENT     LastTradeEvent(void)                      const { return this.m_last_trade_event;            }

portanto:

   void  ResetLastTradeEvent(void)
   {
      this.m_events.ResetLastTradeEvent();
      this.m_last_trade_event = TRADE_EVENT_NO_EVENT;
   }    

Também fiz algumas modificações para garantir que a função Clear() faça seu trabalho em Lists e Arrays.

Aqui está meu 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();
   }
 
Mohammad Bazrkar :

Tive um problema ao usar o ResetLastTradeEvent e vou relatá-lo aqui,

Estou lendo os eventos mais recentes obtendo a lista deles, verificando se há algum evento novo ou não; porque salvar o estado do evento mais recente e compará-lo nas próximas verificações não é uma boa solução. Se duas ordens pendentes forem colocadas em momentos diferentes, sem nenhum outro evento entre elas, perderemos a segunda.

Então, eu verifico os eventos, faço minhas coisas e ResetLastTradeEvent e procuro novos valores != _NO_EVENT . então, qual é o problema?

ele está retornando m_last_trade_event quando você chama LastTradeEvent

portanto:

Também fiz algumas modificações para garantir que a função Clear() faça seu trabalho em Listas e Matrizes.

Aqui está meu caso de uso

Это, к сожалению, неправильное решение. Вы перенесли список m_events в публичную секцию класса? Вы очищаете весть список событий?

engine.m_events.Clear();

Тем самым вы разрушаете структуру коллекции событий. А ведь не зря же список m_events находится в приватной секции класса CEngine - к этим спискам запрещён доступ извне.

Да, я знаю, что сравнение прошлого события с текущим - это не правильно, и это было сделано лишь для проверки получения событий, а не для полноценной работы с ними.
В последней версии библиотеки (статья 23), которая уже готова к выходу, возвращается флаг произошедшего торгового события в управляющую программу. И последнее событие всегда можно получить.
А в статье 24 будет доступен список всех событий, произошедших одновременно, например - удаление множества отложенных ордеров. Каждое событие будет отображено в программе. И к каждому из этих событий можно будет получить доступ для работы с ними.

-----------------------------------------------------

Infelizmente, essa é a decisão errada. Você moveu a lista m_events para a seção pública da classe? Você está limpando a lista de notícias de eventos?

engine.m_events.Clear();

Assim, você destrói a estrutura da coleção de eventos. Mas não é em vão que a lista m_events está localizada na seção privada da classe CEngine - o acesso a essas listas é proibido de fora.

Sim, eu sei que comparar um evento passado com um atual não é correto, e isso foi feito apenas para verificar o recebimento de eventos, e não para trabalhar totalmente com eles.
Na versão mais recente da biblioteca (artigo 23), que já está pronta para ser lançada, o sinalizador do evento de negociação ocorrido é retornado ao programa de controle. E o último evento está sempre disponível.
E no artigo 24, uma lista de todos os eventos que ocorreram simultaneamente estará disponível, por exemplo, a remoção de muitas ordens pendentes. Cada evento será exibido no programa. E cada um desses eventos pode ser acessado para trabalhar com eles.
 

Eu estava tentando obter todos os eventos por meio daquele loop for no último bloco de código que enviei no comentário anterior.

Eu estava obtendo eventos antigos a cada novo evento, então destruí o privado e tornei tudo público; não é a maneira correta, mas fiz isso de qualquer forma para ter certeza de que a lista está sendo limpa (com a v13).

Obrigado pelas melhorias nos próximos artigos. Eu as verificarei assim que possível.

 
Mohammad Bazrkar :

Eu estava tentando obter todos os eventos por meio desse loop for no último bloco de código que enviei no comentário anterior.

Eu estava obtendo eventos antigos a cada novo evento, então destruí o privado e tornei tudo público; não é a maneira correta, mas fiz isso de qualquer forma para ter certeza de que a lista está sendo limpa (com a versão 13).

Obrigado pelas melhorias nos próximos artigos. Eu as verificarei assim que possível.

Так как в статьях описываются все этапы создания библиотеки, то я, к сожалению, не счёл необходимым дать сразу полный доступ к списку торговых событий, а дал лишь доступ к последнему событию. А последнее событие всегда возвращается то, которое произошло последним - не важно когда - прямо сейчас, или час назад. Оно всё равно является последним событием, и оно же и возвращается. И я упустил из виду, что два одинаковых события по названию, но разные по свойствам, уже потребуется кому-то получать. По этой причине и не было доведено до нормального состояния получение торговых событий. В классах коллекций аккаунтов и символов уже созданы и работают методы получения всех событий акккаунта или символов, и их легко получить в своих программах. Точно таким же образом в ближайших двух статьях будет дана возможность получения и торговых событий.

К слову - это ещё не всё, что будет реализовано. Далее будут созданы методы для поиска и получения любых данных и событий в своих программах. И сделано это будет весьма удобным и наглядным способом - не нужно будет получать списки, искать и фильтровать данные, а просто ввводить префикс с точкой (set, get., find.) и из выпадающего списка (после точки) выбирать нужный метод. Это планировалось ещё на этапе обдумывания концепции библиотеки, но делаться всё будет только тогда, когда будет готов весь базовый функционал библиотеки.
Также будет дана возможность работать с графикой - будет полноценная графическая оболочка, знающая о всех собранных библиотекой данных. Плюс - интерактивные пользовательские графические объекты...

---------------------------------

Como os artigos descrevem todos os estágios da criação de uma biblioteca, infelizmente não considerei necessário fornecer acesso total à lista de eventos comerciais de uma só vez, mas dei acesso apenas ao último evento. E o último evento sempre retorna aquele que aconteceu por último - não importa quando - agora mesmo ou uma hora atrás. Ele ainda é o último evento e retorna. E perdi de vista o fato de que dois eventos idênticos pelo nome, mas diferentes nas propriedades, já exigirão que alguém os receba. Por esse motivo, o recebimento de eventos de negociação não foi normalizado. Nas classes de coleções de contas e símbolos, os métodos já foram criados e funcionam para obter todos os eventos da conta ou dos símbolos, e eles são fáceis de obter em seus programas. Exatamente da mesma forma, os próximos dois artigos darão a oportunidade de receber eventos de negociação.

A propósito, isso não é tudo o que será implementado. Em seguida, serão criados métodos para pesquisar e recuperar quaisquer dados e eventos em seus programas. E isso será feito de uma forma muito conveniente e visual - você não precisará receber listas, pesquisar e filtrar dados, mas simplesmente digitar um prefixo com um ponto (set., get., find.) e selecionar o método desejado na lista suspensa (após o ponto). Isso foi planejado na fase de reflexão sobre o conceito da biblioteca, mas tudo será feito somente quando toda a funcionalidade básica da biblioteca estiver pronta.
Também será dada a oportunidade de trabalhar com gráficos - haverá um shell gráfico completo que conhece todos os dados coletados pela biblioteca. E mais: objetos gráficos personalizados interativos ...

 
Mohammad Bazrkar :

Eu estava tentando obter todos os eventos por meio desse loop for no último bloco de código que enviei no comentário anterior.

Eu estava obtendo eventos antigos a cada novo evento, então destruí o privado e tornei tudo público; não é a maneira correta, mas fiz isso de qualquer forma para ter certeza de que a lista está sendo limpa (com a versão 13).

Obrigado pelas melhorias nos próximos artigos. Eu as verificarei assim que possível.

В русском сегменте ресурса вышла статья, в которой есть доступ к последнему событию из программмы...

---------------------------------------

Um artigo apareceu no segmento russo do recurso, no qual há acesso ao último evento do programa:

Библиотека для простого и быстрого создания программ для MetaTrader (Часть XXIII): Основной торговый класс - контроль допустимых параметров
Библиотека для простого и быстрого создания программ для MetaTrader (Часть XXIII): Основной торговый класс - контроль допустимых параметров
  • www.mql5.com
Продолжаем развивать торговый класс. У нас готовы торговые методы, работающие с "чистыми" условиями. Перед отправкой торгового приказа на сервер мы уже проверяем возможность его отправки — отсутствие ограничений на торговлю как со стороны торгового сервера, так и со стороны терминала и программы. Но этого, конечно же мало. Нам необходимо ещё...
 

Obrigado, Artyom, eu o encontrei antes,

Acho que há um bug: quando abrimos ou fechamos mais de uma negociação no mesmo segundo, ele não detecta uma delas ou só detecta uma delas; também está detectando duas vezes algumas vezes!

Deixe-me mostrar meus registros

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: O saldo da conta diminuiu em -0,75 USD (5445,52 USD)

2019.10.14 15:57:28.423 MT4EventsEA EURUSD,M1: 2019.10.14 15:27:22.000: O nível da margem diminuiu em -16456.49% (0.00%)

2019.10.14 15:57:27.895 MT4EventsEA EURUSD,M1: CEventsCollection::CreateNewEvent, linha 767: Este evento já está na lista.

2019.10.14 15:57:27.474 MT4EventsEA EURUSD,M1: - Posição fechada: 2019.10.14 15:27:13.000 - EURUSD Close Buy #542264335 ao preço 1.10304, lucro -0.14 USD

2019.10.14 15:57:27.472 MT4EventsEA EURUSD,M1: - Posição fechada: 2019.10.14 15:27:12.000 - EURUSD Fechar Comprar #542264333 ao preço 1.10304, lucro -0.14 USD

2019.10.14 15:57:19.095 MT4EventsEA EURUSD,M1: 2019.10.14 15:27:13.000: O nível da margem diminuiu em -32915.87% (16456.49%)

2019.10.14 15:57:18.844 MT4EventsEA EURUSD,M1: - Posição aberta: 2019.10.14 15:27:13.000 - EURUSD Open 0.01 Buy #542264335 [0.01 Market order Buy #542264335] ao preço 1.10304

2019.10.14 15:57:18.002 MT4EventsEA EURUSD,M1: - Posição aberta: 2019.10.14 15:27:12.000 - EURUSD Open 0.01 Buy #542264333 [0.01 Ordem de mercado Buy #542264333] a preço 1.10304

2019.10.14 15:57:17.547 MT4EventsEA EURUSD,M1: 2019.10.14 15:27:12.000: Nível de margem aumentado em 49372.35% (49372.35%)

2019.10.14 15:57:17.175 MT4EventsEA EURUSD,M1: - Posição aberta: 2019.10.14 15:27:11.000 - EURUSD Open 0.01 Buy #542264331 [0.01 Market order Buy #542264331] ao preço 1.10301

2019.10.14 15:56:17.144 MT4EventsEA EURUSD,M1: 2019.10.14 15:26:11.000: O nível da margem diminuiu em -12343,32% (0,00%)

2019.10.14 15:56:16.800 MT4EventsEA EURUSD,M1: - Posição fechada: 2019.10.14 15:22:40.000 - EURUSD Fechar Compra #542263747 ao preço 1.10301, lucro -0.07 USD

2019.10.14 15:56:16.798 MT4EventsEA EURUSD,M1: - Posição fechada: 2019.10.14 15:22:41.000 - EURUSD Fechar Comprar #542263749 a preço 1.10301, lucro -0.07 USD

2019.10.14 15:56:16.347 MT4EventsEA EURUSD,M1: - Posição fechada: 2019.10.14 15:22:42.000 - EURUSD Fechar Comprar #542263753 ao preço 1.10304, lucro -0.14 USD

2019.10.14 15:56:15.926 MT4EventsEA EURUSD,M1: - Posição fechada: 2019.10.14 15:22:42.000 - EURUSD Fechar Comprar #542263753 ao preço 1.10304, lucro -0.14 USD

2019.10.14 15:56:09.140 MT4EventsEA EURUSD,M1: inicializado

Aqui está o histórico de negociações da conta MT4:

e este é o meu código:

void OnTick() { DoChecks(); }
void OnTimer() { DoChecks(); }
//+------------------------------------------------------------------+
//| Minha função de verificação|
//+------------------------------------------------------------------+
void DoChecks() {
   engine.OnTimer();

   //\\/\\\ Eventos comerciais
   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 da conta
   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();
   }

}


O que você acha disso, há algum problema em minha implementação?

 
Mohammad Bazrkar:

Obrigado, Artyom, eu já havia encontrado isso antes,

Acho que há um bug: quando abrimos ou fechamos mais de uma negociação no mesmo segundo, ele não detecta uma delas ou só detecta uma delas; também está detectando duas vezes algumas vezes!

Deixe-me mostrar meus registros

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: O saldo da conta diminuiu em -0,75 USD (5445,52 USD)

2019.10.14 15:57:28.423 MT4EventsEA EURUSD,M1: 2019.10.14 15:27:22.000: O nível da margem diminuiu em -16456.49% (0.00%)

2019.10.14 15:57:27.895 MT4EventsEA EURUSD,M1: CEventsCollection::CreateNewEvent, linha 767: Este evento já está na lista.

2019.10.14 15:57:27.474 MT4EventsEA EURUSD,M1: - Posição fechada: 2019.10.14 15:27:13.000 - EURUSD Close Buy #542264335 ao preço 1.10304, lucro -0.14 USD

2019.10.14 15:57:27.472 MT4EventsEA EURUSD,M1: - Posição fechada: 2019.10.14 15:27:12.000 - EURUSD Fechar Comprar #542264333 ao preço 1.10304, lucro -0.14 USD

2019.10.14 15:57:19.095 MT4EventsEA EURUSD,M1: 2019.10.14 15:27:13.000: O nível da margem diminuiu em -32915.87% (16456.49%)

2019.10.14 15:57:18.844 MT4EventsEA EURUSD,M1: - Posição aberta: 2019.10.14 15:27:13.000 - EURUSD Open 0.01 Buy #542264335 [0.01 Market order Buy #542264335] ao preço 1.10304

2019.10.14 15:57:18.002 MT4EventsEA EURUSD,M1: - Posição aberta: 2019.10.14 15:27:12.000 - EURUSD Open 0.01 Buy #542264333 [0.01 Ordem de mercado Buy #542264333] a preço 1.10304

2019.10.14 15:57:17.547 MT4EventsEA EURUSD,M1: 2019.10.14 15:27:12.000: Nível de margem aumentado em 49372.35% (49372.35%)

2019.10.14 15:57:17.175 MT4EventsEA EURUSD,M1: - Posição aberta: 2019.10.14 15:27:11.000 - EURUSD Open 0.01 Buy #542264331 [0.01 Market order Buy #542264331] ao preço 1.10301

2019.10.14 15:56:17.144 MT4EventsEA EURUSD,M1: 2019.10.14 15:26:11.000: O nível da margem diminuiu em -12343,32% (0,00%)

2019.10.14 15:56:16.800 MT4EventsEA EURUSD,M1: - Posição fechada: 2019.10.14 15:22:40.000 - EURUSD Fechar Compra #542263747 ao preço 1.10301, lucro -0.07 USD

2019.10.14 15:56:16.798 MT4EventsEA EURUSD,M1: - Posição fechada: 2019.10.14 15:22:41.000 - EURUSD Fechar Comprar #542263749 a preço 1.10301, lucro -0.07 USD

2019.10.14 15:56:16.347 MT4EventsEA EURUSD,M1: - Posição fechada: 2019.10.14 15:22:42.000 - EURUSD Fechar Comprar #542263753 ao preço 1.10304, lucro -0.14 USD

2019.10.14 15:56:15.926 MT4EventsEA EURUSD,M1: - Posição fechada: 2019.10.14 15:22:42.000 - EURUSD Fechar Comprar #542263753 ao preço 1.10304, lucro -0.14 USD

2019.10.14 15:56:09.140 MT4EventsEA EURUSD,M1: inicializado

Aqui está o histórico de negociações da conta MT4:

e este é o meu código:


O que você acha disso, há algum problema em minha implementação?

Aguarde o próximo artigo no segmento russo do recurso.
No próximo artigo, o rastreamento de eventos de negociação que ocorreram simultaneamente em um ciclo já está pronto e funcionando.
Ele também fornece um exemplo de rastreamento de eventos de negociação em um consultor.

 
Artyom Trishkin:

Aguarde o próximo artigo no segmento russo do recurso.
No próximo artigo, o rastreamento de eventos de negociação que ocorreram simultaneamente em um ciclo já está pronto e funcionando.
Ele também fornece um exemplo de rastreamento de eventos de negociação em um consultor.

Obrigado por suas respostas e artigos úteis.