Discussão do artigo "Biblioteca para desenvolvimento fácil e rápido de programas para a MetaTrader (parte V): Classes e coleções de eventos de negociação, envio de eventos para o programa"

 

Novo artigo Biblioteca para desenvolvimento fácil e rápido de programas para a MetaTrader (parte V): Classes e coleções de eventos de negociação, envio de eventos para o programa foi publicado:

Nos artigos anteriores, nós começamos a criar uma grande biblioteca multi-plataforma, simplificando o desenvolvimento de programas para as plataformas MetaTrader 5 e MetaTrader 4. Na quarta parte, nós testamos o monitoramento de eventos de negociação na conta. Neste artigo, nós vamos desenvolver classes de eventos de negociação e colocá-los nas coleções de eventos. A partir daí, eles serão enviados ao objeto base da biblioteca Engine e ao gráfico do programa de controle.

Agora nós podemos compilar o EA e lançá-lo no testador. Ao clicar nos botões, são exibidas no diário do testador duas linhas de mensagens curtas sobre os eventos da conta que ocorrem.


As entradas do manipulador de eventos do EA não são exibidas no diário, pois elas funcionam fora do testador. Se clicar nos botões do EA em uma conta demo, três linhas serão exibidas no diário do terminal: duas linhas do método para exibir as mensagens curtas da classe CEvent e outra — do manipulador OnChartEvent() do EA.

Abaixo está uma amostra exibindo uma mensagem no diário quando uma ordem pendente é colocada e removida:

- Pending order placed: 2019.04.05 23:19:55.248 -                                                              
EURUSD 0.10 Sell Limit #375419507 at price 1.14562                                                             
OnChartEvent: id=1001, event=TRADE_EVENT_PENDING_ORDER_PLASED, lparam=375419507, dparam=1.14562, sparam=EURUSD 
- Pending order removed: 2019.04.05 23:19:55.248 -                                                             
EURUSD 0.10 Sell Limit #375419507 at price 1.14562                                                             
OnChartEvent: id=1002, event=TRADE_EVENT_PENDING_ORDER_REMOVED, lparam=375419507, dparam=1.14562, sparam=EURUSD

Autor: Artyom Trishkin

 
Gostaria de saber como a biblioteca lida com muitas nuances de negociação. Portanto, provavelmente vale a pena tentar fazer pelo menos o teste inicial

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação.

Menos código, mais rolagem... escrevendo um EA

fxsaber, 2019.03.12 21:46

Essa tarefa pode muito bem ser considerada um teste inicial da capacidade de escrever negociações no MT5. Assim, todos podem experimentar.

 
fxsaber:
Gostaria de saber como a biblioteca lida com muitas nuances de negociação. Portanto, provavelmente vale a pena tentar passar pelo menos no teste inicial

Ainda não há classes de negociação na biblioteca. No momento, o trabalho com o histórico da conta e o estado do mercado ativo está chegando ao fim - o rastreamento dos eventos da conta de compensação será publicado no próximo artigo, depois o trabalho com a conta no MetaTrader 4 e, em seguida, após a preparação das classes para a saída de mensagens, o trabalho com as classes de negociação será descrito.

 
Artyom Trishkin:

Ainda não há classes de negociação na biblioteca. No momento, o trabalho com o histórico da conta e o estado do mercado ativo está chegando ao fim - o rastreamento dos eventos da conta de compensação será publicado no próximo artigo, depois o trabalho com a conta no MetaTrader 4 e, em seguida, após a preparação das classes para a saída de mensagens, o trabalho com as classes de negociação será descrito.

Entendi. O MT5 é tão complexo nesse aspecto que acho que precisamos de um artigo inteiro que descreva em detalhes as sutilezas de negociação que surgem no MT5 e como levá-las em consideração.

 
Artyom Trishkin: O rastreamento de eventos de contas de compensação será publicado no próximo artigo e, em seguida, a
a biblioteca detectará e trabalhará automaticamente com os tipos de conta de compensação e de conta de hedge?
 
fxsaber:

Roger. O MT5 é tão complexo nesse aspecto que provavelmente precisaria de um artigo inteiro descrevendo em detalhes as sutilezas de negociação que surgem no MT5 e como levá-las em consideração.

Estou ocupado lidando com essas situações. Espero ser capaz de lidar com todas elas corretamente.

Outra coisa interessante é que, com base na biblioteca descrita, serão criadas funções de caso de usuário para facilitar o acesso aos dados coletados e armazenados na biblioteca, para o uso de classes de negociação e, consequentemente, para a criação simples e fácil de programas baseados nela.
Embora já esteja como está, existe a possibilidade de usá-la, mas em um nível mais baixo de acesso, por meio de ponteiros para listas de coleções e, a partir delas, por ponteiros para qualquer um de seus dados. Mas isso não corresponde às "afirmações" feitas logo no início sobre a facilidade de criar seus próprios programas com base na biblioteca. Mas isso é apenas o começo :)

 
Igor Makanu:
A biblioteca detectará e trabalhará automaticamente com contas de compensação e contas do tipo hedge?

Sim, já foi feito. Isso será publicado no próximo artigo.

 
Artyom Trishkin:

Sim, já. O próximo artigo será publicado.

Mas, por enquanto, só trabalharemos com o histórico da conta e o estado do mercado. Em seguida, será possível obter o histórico de qualquer posição em qualquer tipo de conta com base nos dados coletados. Vou incluir isso em meus planos.
 

Muito poderosa como ferramenta de teste, obrigado por compartilhar!

 

Olá Artyom, parabéns pelo excelente trabalho! Seguindo a descrição no texto, parece que a função CHistoryCollection::OrderSearch(...) pode estar com uma quebra faltando.

O loop for sempre completa todas as iterações de start-1 a 0, quer encontre a "ordem perdida" ou não.

Talvez seja mais eficiente incluir uma pausa após encontrar a "ordem perdida ":

ulong CHistoryCollection::OrderSearch(const int start,ENUM_ORDER_TYPE &order_type) 
  { 
   ulong order_ticket=0; 
   for(int i=start-1;i>=0;i--) 
     { 
      ulong ticket=::HistoryOrderGetTicket(i); 
      if(ticket==0) 
         continue; 
      ENUM_ORDER_TYPE type=(ENUM_ORDER_TYPE)::HistoryOrderGetInteger(ticket,ORDER_TYPE); 
      if(this.IsPresentOrderInList(ticket,type)) 
         continue; 
      order_ticket=ticket; 
      order_type=type; 
      break; 
     } 
   return order_ticket; 
  } 

O que você acha?

Documentation on MQL5: Constants, Enumerations and Structures / Trade Constants / Order Properties
Documentation on MQL5: Constants, Enumerations and Structures / Trade Constants / Order Properties
  • www.mql5.com
Requests to execute trade operations are formalized as orders. Each order has a variety of properties for reading. Information on them can be obtained using functions Position identifier that is set to an order as soon as it is executed. Each executed order results in a deal that opens or modifies an already existing position. The identifier of...
 
Alvaro Arioni :

Olá Artyom, parabéns pelo excelente trabalho! Seguindo a descrição no texto, parece que a função CHistoryCollection::OrderSearch(...) pode estar com uma quebra faltando.

O loop for sempre completa todas as iterações de start-1 a 0 , quer encontre a "ordem perdida" ou não.

Talvez seja mais eficiente incluir uma pausa após encontrar a "ordem perdida":

...

O que você acha?

Pode haver mais de uma ordem perdida