Discussão do artigo "Como se tornar um bom programador (Parte 2): mais cinco hábitos que devem ser abandonados para programar melhor em MQL5"

 

Novo artigo Como se tornar um bom programador (Parte 2): mais cinco hábitos que devem ser abandonados para programar melhor em MQL5 foi publicado:

Este artigo é uma leitura obrigatória destinada a todos que desejam melhorar sua carreira como programadores. O objetivo desta série de artigos é ajudar o leitor, incluindo experientes, a melhorar suas habilidades de programação. As ideias descritas são aplicáveis tanto a programadores iniciantes em MQL5 quanto a profissionais.

Costumo usar o termo "noob" (do inglês novato) nesta série de artigos. Para simplificar, me refiro a eles como aqueles que têm pouca experiência em programação MQL5 (por favor, não se ofenda). É apenas para facilitar as coisas. Isso não significa que o conteúdo da série se destina especificamente a novatos. Claro que não! Este material é absolutamente para todos, independentemente da experiência em programação. Digo isto porque uma pessoa pode se tornar "noob" por certos hábitos e comportamentos na hora de programar, e não pelo número de anos a desenvolver programas.

Noob vs programador profissional

 


Você pode ler o artigo anterior aqui. Por enquanto, eu continuo minha missão de ajudar os novatos a se tornarem mais profissionais.

Autor: Omega J Msigwa

 
Obrigado por seu artigo...
 

Olá, pessoal,

Sou um novato. Tenho bastante experiência em programação, mas estou apenas começando a programar em MQL5 - é minha primeira linguagem semelhante ao C++. Tenho lido os documentos de referência, mas não consigo identificar meu erro - o valor que espero que seja retornado do expoMA está sendo impresso/comentado no meu gráfico como 0,0 - estou cometendo algum tipo de erro de sintaxe? Não recebo nenhum problema/erro na compilação. Qualquer contribuição que você tiver seria ótima

void OnTick(
  {   
   int days = 3; 
   
   double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
  
   double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
   
   double movingAverageValues[];
   
   double bidAskAverage = (Ask + Bid)/2;
   
   int exponentialMovingAverage = iMA(_Symbol,_Period,MA_Period,0,MODE_EMA,PRICE_CLOSE);
      
   ArraySetAsSeries(movingAverageValues,true);
   
   CopyBuffer(exponentialMovingAverage,0,0,3,movingAverageValues);

   double alpha = expoMA(days);
   
   double dEMA = bidAskAverage - movingAverageValues[1]; // o índice 1 aqui representa a EMA do valor t - 1
      
   Comment("The ask price is: " +     DoubleToString(Ask,5) + "\n"
           "The bid price is: " + DoubleToString(Bid,5) + "\n" 
           "The average price is: " + DoubleToString(bidAskAverage,5) + "\n"
           "The custom expoMA value is: " + DoubleToString(alpha,5) + "\n"
           "The dEMA value is: " + DoubleToString(dEMA,5)) ;   
   }

double expoMA(int days=2)
   {   
    double alpha = 2 / (days + 1);   
    NormalizeDouble(alpha,5);
    return(alpha);
   }
 
spinner461:

Olá, pessoal,

Sou um novato. Tenho bastante experiência em programação, mas estou apenas começando a programar em MQL5 - é minha primeira linguagem semelhante ao C++. Tenho lido os documentos de referência, mas não consigo identificar meu erro - o valor que espero que seja retornado do expoMA está sendo impresso/comentado no meu gráfico como 0,0 - estou cometendo algum tipo de erro de sintaxe? Não recebo nenhum problema/erro na compilação. Qualquer informação que você tiver seria ótima

double expoMA(int days=2)
   {   
    double alpha = 2.0 / (days + 1);

    //...
   }

Você está dividindo 2/4 em inteiros (0) e, em seguida, isso é analisado em um double. Em vez disso, você deve fazer com que um dos dois dividendos ou divisores seja um double (para que a divisão seja feita no tipo de dados "mais detalhado")

Outras opções poderiam ser (sendo dias um int):

double alpha = double(2) / (days + 1);
double alpha = 2 / (days + 1.0);
double alpha = 2 / double(days + 1);
Isso provavelmente é um erro de python heheh
 

Manuel Alejandro Cercos Perez:

Você está dividindo 2/4 em números inteiros (0) e, em seguida, isso é analisado em um double. Em vez disso, você deve fazer com que um dos dois dividendos ou divisores seja um double (para que a divisão seja feita no tipo de dados "mais detalhado")

Outras opções poderiam ser (sendo dias um int):

Isso provavelmente é um erro de python heheh


Olá, Manuel,

Muito obrigado! A dica acima funcionou como um encanto. Você me poupou de gastar muito mais horas para encontrar a causa raiz.

 
Oh, meu Deus, agora de verdade!
 
Como posso criar uma função que permita apenas uma negociação ou posição aberta por candle, não apenas no início do candle, mas até a formação de um novo candle? A função newbar permite apenas no início do novo candle
 
Há muitas bolsas fraudulentas
 
Se for MQL5, você deve iniciar o iMA no OnInit.

Caso contrário, você fará isso em cada tick recebido.

Sua última pergunta: pegue o tempo de abertura e adicione
Period seconds()/2 a ele, então você estará na metade do período.





 
Dominik Egert:
Se for MQL5, você deve iniciar o iMA no OnInit.

Caso contrário, você fará isso em cada tick recebido.

Sua última pergunta: pegue o tempo de abertura e adicione
Period seconds()/2 a ele, então você estará na metade do período.





Toda pergunta sobre ajuda de codificação deve ser postada no fórum como um tópico independente
 

Parabéns aos tradutores.

Depois do primeiro artigo, tive dúvidas, mas agora tenho certeza de que o autor quer explicar aos programadores idiotas que eles são idiotas. Autor, não se ofenda, mas o artigo foi escrito para você. Além disso, a arrogância com que você se dirige aos leitores anula seu trabalho.