Discussão do artigo "Aprendendo a construindo um Expert Advisor que opera de forma automática (Parte 15): Automação (VII)"

 

Novo artigo Aprendendo a construindo um Expert Advisor que opera de forma automática (Parte 15): Automação (VII) foi publicado:

Para coroar esta sequencia de automação. Vamos complementar o que foi visto no artigo anterior. Este definitivamente mostra como tudo irá se encaixar, fazendo o Expert Advisor, funcionar como um relógio.

Mostrei as principais falhas, problemas e dificuldades, envolvidas no que rege o trabalho de um programador, a fim de conseguir de fato criar um EA, que funcione automaticamente. Mas também mostrei, que é algo que lhe trará muito conhecimento, e uma mudança na maneira de observar de fato o mercado.

Tentei deixar as coisas, de forma que você consiga de fato criar um sistema, que seja seguro, confiável e robusto. Ao mesmo tempo, que ele seja modular, compacto e bastante leve. Podendo ser usado em conjunto com diversas outras coisas. Pois nada adianta, você ter um sistema, que não lhe permita operar uma variedade de coisas ao mesmo tempo. Pois nem sempre você conseguirá de fato fazer um bom ganho, operando apenas e somente um único ativo.

Talvez a grande parte de fato, venha a se interessar por este último artigo da sequencia, onde explico em 3 exemplos práticos. Se bem que o conhecimento, de toda a sequencia de artigos, é necessário para que você consiga de fato tirar proveito deste artigo daqui, em especifico. Mas de uma maneira bem simples, acredito que tenho conseguido passar a ideia, de que não é preciso de fato ser um gênio ou prodígio em programação, ou ter vários cursos e graduações. É preciso apenas que você de fato entenda como a plataforma MetaTrader 5 funciona, como a linguagem MQL5 trabalha, para assim conseguir fazer o que deseja, seja lá o que for.

Apresentei também, como você pode criar circunstâncias especificas, para que o seu sistema funcione e trabalhe, mesmo quando aparentemente o MQL5 ou o MetaTrader 5, não tenham em seu portfólio, o indicador que você desejaria usar. Isto foi feito no exemplo 3, onde mostrei como você faz para criar internamente, o indicador HILO, assim como foi feito ali, podemos também criar outros, desenvolver um especifico para ser utilizado no EA automatizado. Mas independentemente disto, precisamos que o sistema, sempre seja corretamente implementado e testado, pois nada adianta você criar um sistema maravilhoso, que no final não lhe dará nenhum lucro, apenas prejuízo.

Autor: Daniel Jose

 

Olá Daniel, primeiramente gostaria de parabeniza-lo pelo desempenho em colaborar com a comunidade de desenvolvedores e entusiastas.

Estou com uma dúvida na execução do EA desta sequencia de artigos.

Ele não está dando entradas, testei em conta Netting e Hedging trocando de Ordem OCO para Pendente, conforme sua documentação. Mas as ordens não são executadas.

E também não dá nenhum erro no log.

O que poderia ser?

Obs: não alterei nada no código, somente a logica de compra e venda... testei com minha logica (minha estratégia) não deu entradas, pensei: fiz alguma merda, kkkk.... ai peguei seu codigo sem nenhuma alteração, compilei e acontece a mesma coisa.

Executa no manual (quando acerta a quantidade de lote), mas automático não.

 
César Augusto #:

Olá Daniel, primeiramente gostaria de parabeniza-lo pelo desempenho em colaborar com a comunidade de desenvolvedores e entusiastas.

Estou com uma dúvida na execução do EA desta sequencia de artigos.

Ele não está dando entradas, testei em conta Netting e Hedging trocando de Ordem OCO para Pendente, conforme sua documentação. Mas as ordens não são executadas.

E também não dá nenhum erro no log.

O que poderia ser?

Obs: não alterei nada no código, somente a logica de compra e venda... testei com minha logica (minha estratégia) não deu entradas, pensei: fiz alguma merda, kkkk.... ai peguei seu codigo sem nenhuma alteração, compilei e acontece a mesma coisa.

Executa no manual (quando acerta a quantidade de lote), mas automático não.

As entradas automáticas somente acontecem quando os parâmetros de entrada, que você definiu permitem o disparo da ordem. Ou seja se a sua lógica dizer que tal indicador, seja ele qual for, precisa ter um dado valor, a entrada ou saída automática somente acontecerá quando o valor for atingido. Caso contrário, ela jamais irá acontecer. Você deve ter visto que existem 3 exemplos de setups na sequencia. Experimente e estude cada um deles, para entender como a lógica de disparo acontece. Sem entender esta lógica de disparo, você não conseguirá fazer o mecanismo automático funcionar. Ele é como se fosse uma ratoeira, se você armar ela para pegar um elefante, ela não será disparada quando o rato mexer nela 😂 ... De qualquer forma estude os mecanismo que estão nos exemplos e boa sorte ... 😁👍

 

Daniel, obrigado pela sua dedicação em ensinar.

Você pode, por favor, verificar o funcionamento do EA desta parte 15 - versão v3 - que usa a C_Automaton_v3.mqh?

A definição da lista eSelectMedia é clara. Entretanto, acho que a sua utilização tem algum problema, no que diz respeito à manipulação dos elementos dos arrays m_Op no loop FOR, especificamente com "sizeof(eSelectMedia)".

Segundo a documentação (https://www.mql5.com/en/docs/basis/types/integer/enumeration), o sizeof sempre retorna 4, mesmo para enumerações com mais elementos.

Documentation on MQL5: Language Basics / Data Types / Integer Types / Enumerations
Documentation on MQL5: Language Basics / Data Types / Integer Types / Enumerations
  • www.mql5.com
Enumerations - Integer Types - Data Types - Language Basics - MQL5 Reference - Reference on algorithmic/automated trading language for MetaTrader 5
 
FernandoN23 #:

Daniel, obrigado pela sua dedicação em ensinar.

Você pode, por favor, verificar o funcionamento do EA desta parte 15 - versão v3 - que usa a C_Automaton_v3.mqh?

A definição da lista eSelectMedia é clara. Entretanto, acho que a sua utilização tem algum problema, no que diz respeito à manipulação dos elementos dos arrays m_Op no loop FOR, especificamente com "sizeof(eSelectMedia)".

Segundo a documentação (https://www.mql5.com/en/docs/basis/types/integer/enumeration), o sizeof sempre retorna 4, mesmo para enumerações com mais elementos.

Você está confundindo as coisas. Este 4 que a documentação diz é o tamanho, em termos de bytes, usado no retorno de sizeof e não a quantidade de elementos máximos que será retornado.

 
Daniel Jose #:

Você está confundindo as coisas. Este 4 que a documentação diz é o tamanho, em termos de bytes, usado no retorno de sizeof e não a quantidade de elementos máximos que será retornado.

Daniel, obrigado pela resposta rápida.

Ainda sobre o FOR com o sizeof(enum), adiciono um script de teste, o resultado obtido e mais uma pergunta, logo abaixo.

Agradeço a orientação.

script teste.mq5

//+------------------------------------------------------------------+
void OnStart()
  {
      enum eSelectMedia {MEDIA_FAST, MEDIA_SLOW};
      enum eSelectMeses {JANEIRO, FEVEREIRO, MARCO, ABRIL, MAIO, JUNHO, JULHO, AGOSTO, SETEMBRO, OUTUBRO, NOVEMBRO, DEZEMBRO};
   
      struct st01
         {
               double  Buff[];
               int     Handle;
         }m_Op[sizeof(eSelectMedia) + 1];
                   
      Print("Tamanho do eSelectMedia = ", sizeof(eSelectMedia));
      Print("Tamanho do eSelectMeses = ", sizeof(eSelectMeses));
      Print("Tamanho do m_Op = ", ArraySize(m_Op));
      
      Print("========= Mostrar enum eSelectMedia =========");
      for (int i = sizeof(eSelectMedia); i >= 0; i--)
        {
            Print("eSelectMedia - idx = ", i);
        }
   
      Print("========= Mostrar enum eSelectMeses =========");
      for (int i = sizeof(eSelectMeses); i >= 0; i--)
        {
            Print("eSelectMeses - idx = ", i);
        }
   
      Print("========= Mostrar enum m_Op =========");
      for (int i = ArraySize(m_Op); i >= 0; i--)
        {
            Print("m_Op - idx = ", i);
        }     
  }
// Fim OnStart()  
//+------------------------------------------------------------------+


Resultado:

2023.06.07 09:09:10.415    teste (EURUSD,M1)    Tamanho do eSelectMedia = 4
2023.06.07 09:09:10.415    teste (EURUSD,M1)    Tamanho do eSelectMeses = 4
2023.06.07 09:09:10.415    teste (EURUSD,M1)    Tamanho do m_Op = 5
2023.06.07 09:09:10.415    teste (EURUSD,M1)    ========= Mostrar enum eSelectMedia =========
2023.06.07 09:09:10.415    teste (EURUSD,M1)    eSelectMedia - idx = 4
2023.06.07 09:09:10.415    teste (EURUSD,M1)    eSelectMedia - idx = 3
2023.06.07 09:09:10.415    teste (EURUSD,M1)    eSelectMedia - idx = 2
2023.06.07 09:09:10.415    teste (EURUSD,M1)    eSelectMedia - idx = 1
2023.06.07 09:09:10.415    teste (EURUSD,M1)    eSelectMedia - idx = 0
2023.06.07 09:09:10.415    teste (EURUSD,M1)    ========= Mostrar enum eSelectMeses =========
2023.06.07 09:09:10.415    teste (EURUSD,M1)    eSelectMeses - idx = 4
2023.06.07 09:09:10.415    teste (EURUSD,M1)    eSelectMeses - idx = 3
2023.06.07 09:09:10.415    teste (EURUSD,M1)    eSelectMeses - idx = 2
2023.06.07 09:09:10.415    teste (EURUSD,M1)    eSelectMeses - idx = 1
2023.06.07 09:09:10.415    teste (EURUSD,M1)    eSelectMeses - idx = 0
2023.06.07 09:09:10.415    teste (EURUSD,M1)    ========= Mostrar enum m_Op =========
2023.06.07 09:09:10.415    teste (EURUSD,M1)    m_Op - idx = 5
2023.06.07 09:09:10.415    teste (EURUSD,M1)    m_Op - idx = 4
2023.06.07 09:09:10.415    teste (EURUSD,M1)    m_Op - idx = 3
2023.06.07 09:09:10.415    teste (EURUSD,M1)    m_Op - idx = 2
2023.06.07 09:09:10.415    teste (EURUSD,M1)    m_Op - idx = 1
2023.06.07 09:09:10.415    teste (EURUSD,M1)    m_Op - idx = 0


O enum eSelectMedia tem 2 elementos.
O enum eSelectMeses tem 12 elementos.
O retorno de sizeof() é 4, para qualquer um deles, conforme a documentação.

O m_Op tem ArraySize() = 5, porque foi definido com base no sizeof(eSelectMedia) + 1, conforme o arquivo C_Automaton_v3.mqh.

Quando usei o sizeof(enum) no loop FOR, não foi considerada a quantidade de elementos no enum correspondente. A interação considerou 4, que é o retorno de sizeof(enum), tanto para o enum com 2 elementos quanto para o enum com 12 elementos.

Com isto, como devo criar um loop que considere a quantidade exata de elementos de uma enumeração?

Código formatado incorrectamente editado pelo moderador.

 
@FernandoN23 #: script teste.mq5

Por favor utilize o botão do CÓDIGO (Alt -S) ao inserir o seu código.

Botão de código no editor

Nota de usuário - MQL5.community
Nota de usuário - MQL5.community
  • www.mql5.com
Você acabou de registrar e, provavelmente, você tem perguntas como: "Como faço para inserir uma imagem na minha mensagem?", "Como faço para formatar meu código fonte MQL5?", "Onde são mantidas minhas mensagens pessoais?". Você pode ter muitas outras perguntas. Neste artigo, nós preparamos algumas dicas práticas que ajudarão você a se acostumar com o MQL5.community e tirar o máximo proveito de seus recursos disponíveis.
Razão: