Discussão do artigo "Expert Advisor Universal: O Modelo de Evento e o Protótipo da Estratégia de Negociação (Parte 2)"
Vamos abordar a falta de estrada da automação dos sistemas de negociação, as torturas da criatividade e a negligência dos desenvolvedores com o "mecanismo de negociação "!
Agradeço ao autor pelo artigo informativo, mas tenho algumas dúvidas sobre a confiabilidade da implementação do software.
No código proposto, todas as funções do manipulador de eventos referem-se à variável comum event_type ou à estrutura m_event em uma instância comum de CStrategy.
Mas isso pode ser perigoso, pois os eventos ocorrem de forma assíncrona e os threads de seus manipuladores podem se sobrepor no tempo, alterando caoticamente os dados comuns ou causando falhas ao acessar as mesmas áreas de memória.
Normalmente, a sincronização de threads é realizada usando semáforos, mutexes, funções de espera, seções de código crítico, etc., mas a MQL não tem esses meios, portanto, é óbvio que em funções manipuladoras de eventos assíncronos é necessário minimizar as referências a instâncias globais de objetos e variáveis, tentando usar as locais.
Com base nisso, o manipulador de eventos e o bloco de dados combinados propostos no artigo, na minha opinião, não são uma boa ideia.
Obrigado ao autor. O material do artigo é extremamente útil e também apresentado de forma excelente. Há muito tempo eu queria colocar em ordem minhas abordagens de escrita especializada, e aqui o autor do artigo já passou por todas as dores da criatividade e oferece uma solução pronta. Excelente! Aguardo ansiosamente a continuação.
Vamos abordar a falta de estrada da automação dos sistemas de negociação, os tormentos da criatividade e a negligência dos desenvolvedores com o "mecanismo de negociação"!
Obrigado!
Agradeço ao autor pelo artigo informativo, mas tenho algumas dúvidas sobre a confiabilidade da implementação do software.
No código proposto, todas as funções do manipulador de eventos referem-se à variável comum event_type ou à estrutura m_event em uma instância comum do CStrategy.
Mas isso pode ser perigoso, pois os eventos ocorrem de forma assíncrona e os threads de seus manipuladores podem se sobrepor no tempo, alterando caoticamente os dados comuns ou causando falhas ao acessar as mesmas áreas de memória.
...
Obrigado pela observação interessante. De fato, os eventos no MetaTrader são assíncronos. No entanto, a execução de threads de usuário é estritamente sequencial. Isso significa que outros eventos não serão processados até que o Expert Advisor termine de processar o evento atual. O código abaixo ilustra esse ponto:
//+------------------------------------------------------------------+ //|TestAsynch.mq5 //|Copyright 2015, Vasiliy Sokolov. | //|http://www.mql5.com //+------------------------------------------------------------------+ #property copyright "Copyright 2015, Vasiliy Sokolov." #property link "http://www.mql5.com" #property version "1.00" bool need_check = true; #define EVENT_CHECK_ASYNCH 1 //+------------------------------------------------------------------+ //| Função de tique de especialista| //+------------------------------------------------------------------+ void OnTick() { //--- if(need_check) { EventChartCustom(ChartID(), EVENT_CHECK_ASYNCH, 0.0, 0.0, "Verificação de assincronia"); } if(need_check) printf("O thread do usuário é encerrado primeiro."); } //+------------------------------------------------------------------+ //| Função ChartEvent| //+------------------------------------------------------------------+ void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) { //--- if(id == CHARTEVENT_CUSTOM+EVENT_CHECK_ASYNCH && need_check) { printf("Em seguida, o evento OnChartEvent é chamado."); need_check = false; } } //+------------------------------------------------------------------+
Sua execução produz linhas na seguinte sequência:
2016.01.15 13:51:31.724 TestAsynch (NZDUSD,W1) Потом вызывается событие OnChartEvent 2016.01.15 13:51:31.722 TestAsynch (NZDUSD,W1) Сначала завершается пользовательский поток
Assim, não há erros causados pela alteração conjunta da variável compartilhada m_event, porque o código é executado sequencialmente. Também devo observar que a estrutura em si é privada e só pode ser acessada por referência a métodos especiais. Portanto, sua localização real dentro do CStrategy não importa, a estrutura pode ser facilmente criada diretamente nos métodos do manipulador de eventos e também passada para instâncias de estratégia.
Obrigado!
Obrigado por sua observação interessante. De fato, os eventos no MetaTrader são assíncronos. No entanto, a execução de threads de usuário é estritamente sequencial. Isso significa que outros eventos não serão processados até que o Expert Advisor termine de processar o evento atual. O código abaixo ilustra esse ponto:
Sua execução produz linhas na seguinte sequência:
Assim, não há erros causados pela alteração conjunta da variável compartilhada m_event, porque o código é executado sequencialmente. Também devo observar que a estrutura em si é privada e só pode ser acessada por referência a métodos especiais. Portanto, sua localização real dentro do CStrategy não importa, a estrutura pode ser facilmente criada diretamente nos métodos do manipulador de eventos e também passada para instâncias de estratégia.
Você tem razão, a execução estritamente sequencial dos manipuladores de eventos pode eliminar erros, mas esse é essencialmente um modo de thread único, em que é difícil obter alto desempenho.
Ao mesmo tempo, há tarefas de tempo crítico que exigem paralelização, por exemplo, cálculos com grandes volumes de preços e dados históricos realizados com OpenCL ou tarefas mais específicas que são relevantes para mim - treinamento de redes neurais em diferentes símbolos e períodos realizados com a ajuda do mecanismo multithread descrito em meu artigo.
https://www.mql5.com/pt/articles/706
- 2013.08.29
- Ivan Negreshniy
- www.mql5.com
Você tem razão, a execução estritamente sequencial dos manipuladores de eventos pode eliminar erros, mas esse é essencialmente um modo de thread único em que é difícil obter alto desempenho.
Ao mesmo tempo, existem tarefas de tempo crítico que exigem paralelização, por exemplo, cálculos com grandes volumes de preços e dados históricos realizados com OpenCL ou tarefas mais específicas que são relevantes para mim - treinamento de redes neurais por diferentes símbolos e períodos, realizado com a ajuda do mecanismo multithreaded descrito em meu artigo.
https://www.mql5.com/pt/articles/706.
A paralelização no MetaTrader é feita pelo testador de estratégia multi-threaded. Assim, se você executar uma estratégia escrita com a ajuda do mecanismo descrito no testador de estratégia, ela se tornará automaticamente multithread. Como não há dlls de terceiros, você pode usar o MQL Networl Cloud em todo o seu potencial. O que você escreveu se refere ao próprio MetaTrader. Sim, o mecanismo, assim como qualquer Expert Advisor ou script no MetaTrader, é single-threaded, mas o otimizador permite que você execute multi-threaded e computação em nuvem do código apresentado.
Quanto ao desempenho do mecanismo em si, tudo está bem aqui. Você pode se certificar disso fazendo uma análise de perfil. Os custos de infraestrutura e de fornecimento de eventos são mínimos. O principal tempo de execução está concentrado em chamadas de funções do sistema e métodos personalizados BuyInit, SellInit, BuySupport, SellSupport. Com base em cálculos de perfil, o mecanismo é capaz de lidar com muitas dezenas de eventos por segundo, redirecionando-os sem esforço para várias estratégias simultaneamente.
Peço desculpas, mas o que é oferecido neste artigo não é uma acusação. Trata-se de uma solução verificada e testada há vários anos. Todas as chamadas e procedimentos internos são ideais e importantes. Os algoritmos são testados no criador de perfil. Não há restrições quanto à organização interna do código do usuário. Em geral, há tudo para a felicidade completa. Pegue-o e use-o.
O artigo foi escrito com clareza e é muito útil, pelo menos para os iniciantes em MQL, como é o meu caso. :)
Por favor, responda à seguinte pergunta:
Em meus algoritmos de negociação, as posições por ordens de mercado do tipo Compra/Vendasão abertas em situações especiais - se o preço já tiver ultrapassado o nível correspondente ou antes do final da sessão de negociação.
Geralmente, as posições são abertas/fechadas na quebra de nível para cima/para baixo (para Long), colocando ordens de parada BuyStop/SelStop, que são recalculadas no início de uma nova barra.
Você poderia sugerir como seria possível introduzir a colocação e a alteração de ordens de parada nas classes descritas?
Muito obrigado a Vasiliy Sokolov por seus esforços para promover o bom estilo de programação em geral e a OOP em particular.
O artigo foi escrito com clareza e é muito útil, pelo menos para os iniciantes em MQL, como é o meu caso. :)
Por favor, responda à seguinte pergunta:
Em meus algoritmos de negociação, as posições por ordens de mercado do tipo Compra/Vendasão abertas em situações especiais - se o preço já tiver ultrapassado o nível correspondente ou antes do final da sessão de negociação.
Geralmente, as posições são abertas/fechadas na quebra de nível para cima/para baixo (para Long), colocando ordens de parada BuyStop/SelStop, que são recalculadas no início de uma nova barra.
Você poderia sugerir como eu poderia introduzir a colocação e a alteração de ordens de parada nas classes descritas?
Saudações. No momento, os algoritmos para gerenciar ordens pendentes estão sendo elaborados, mas ainda não há implementação concreta na versão atual do mecanismo. A única coisa que posso sugerir no momento é colocar o código para a colocação de ordens pendentes nos métodos BuyInit e SellInit. Também é necessário enumerar as ordens pendentes e todas as ações que normalmente precisam ser feitas nos Expert Advisors comuns.
No futuro, planeja-se adicionar métodos para processar ordens pendentes no mecanismo e fazer a descrição correspondente. Eles funcionarão de forma semelhante aos métodos de gerenciamento de posição.
Saudações. No momento, os algoritmos para o gerenciamento de ordens pendentes estão sendo elaborados, mas não há implementação concreta na versão atual do mecanismo. A única coisa que posso sugerir no momento é colocar o código para a colocação de ordens pendentes nos métodos BuyInit e SellInit. Também é necessário enumerar as ordens pendentes e todas as ações que normalmente precisam ser feitas em Expert Advisors comuns.
No futuro, planeja-se adicionar métodos para processar ordens pendentes no mecanismo e fazer a descrição correspondente. Eles funcionarão de modo semelhante aos métodos de gerenciamento de posição.
Agradecimentos
*****
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
Novo artigo Expert Advisor Universal: O Modelo de Evento e o Protótipo da Estratégia de Negociação (Parte 2) foi publicado:
Este artigo continua a série de publicações do modelo universal de um Expert Advisor. Esta parte descreve em detalhes o modelo de eventos original, baseado no processamento de dados centralizado e considera a estrutura da classe base CStrategy.
De fato, se um Expert Advisor recebe uma notificação de um novo tick, não tem importância se a informação é recebida através do OnTick, OnTimer ou do OnBookEvent. A única coisa que importa é que existe um novo tick no símbolo determinado. Um manipulador de eventos pode ser usado para muitas estratégias. Por exemplo, se cada estratégia é representada como uma classe customizada, múltiplas instâncias destes tipos podem ser armazenadas na lista especial das estratégias. Neste caso, qualquer estratégia da lista poderá receber um novo evento gerado pelo EventProcessor. O diagrama a seguir mostra como os eventos são gerados e enviados:
Fig. 1. Diagrama de geração e envio do evento
Autor: Vasiliy Sokolov