Ajuda com aritmética básica...ou variável que não funciona.

 

Bom dia, amigos!


Eu raramente venho aqui perturbar os colegas mais inteirados no assunto, sem antes gastar um pouco de massa cinzenta.

Ocorre que estou com dois dias tendo problemas com uma função que, hora funciona, hora não funciona e ainda apresenta uma curiosidade, explico:


A função a seguir visa mensurar e classificar os candles de forma a me fornecer parâmetros para tomada de decisões, porém, não funciona a parte onde preciso fazer uma simples expressão matemática:

segue a função, completa, com todas as suas variáveis e dependências:

A matemática é meio mirabolante mas dá de vocês entenderem e me ajudarem...agradeço qualquer ajuda.


//+--------------------------------------------------------------------------------------------------------------------------------------+ 
double Zigzag_candles;                    //candles_alta/candles_baixa
double Zigzag_precos;                     //fator_alta/fator_baixa
int Saldo_cand;                           //candles_alta-candles_baixa
double Saldo_mov;                         //fator_alta-fat_baixa
int candles_alta;                         //Qt de candles de alta do período pesquisado
int candles_baixa;                        //Qt de candles de baixa do período pesquisado
double fator_alta;                        //A soma da diferença entre o open e o close de todos os corpos dos candles de alta do dia
double fator_baixa;                       //A soma da diferença entre o open e o close de todos os corpos dos candles de baixa do dia
string the_My_zigzag;                     //string para imprimir o resultado         
double fator_my_candles;                  //candles_alta/(candles_alta+candles_baixa)=fator_my_candles
double fator_my_precos;                   //fator_alta/(fator_alta+fator_baixa)=fator_my_precos
//+--------------------------------------------------------------------------------------------------------------------------------------+ 
bool My_zigzag()
{
          fator_my_precos = 0;
          fator_my_candles = 0;
          Zigzag_candles = 0;
          Zigzag_precos = 0;
          Saldo_cand = 0;
          Saldo_mov = 0;
          candles_alta = 0;
          candles_baixa = 0;
          fator_alta = 0;
          fator_baixa = 0;
          int cand_alta = 0;
          double fat_alta = 0;
          int cand_baixa = 0;
          double fat_baixa = 0;
          int Contador;
          if(Qt_Barras_do_dia == 0) {
                    Contador = 1;
          }
          else {
                    Contador = Qt_Barras_do_dia;
          }
          MqlRates Inf_MqlRates[];
          ArraySetAsSeries(Inf_MqlRates, true);
          int copied = CopyRates(My_Symbol, PERIOD_CURRENT, 0, Contador, Inf_MqlRates);
          Last_index = Contador - 1;
//+-------------------------------------------------------------------------------------------+
//+-------------------------------------------------------------------------------------------+
          if(copied > 0) {
                    for(int i = 0; i <= Last_index; i++) {
                              if(Inf_MqlRates[i].close > Inf_MqlRates[i].open) { //Candles de altas
                                        cand_alta++;
                                        fat_alta += Inf_MqlRates[i].close - Inf_MqlRates[i].open;
                              }
                              else if(Inf_MqlRates[i].close < Inf_MqlRates[i].open) {   //Candles de baixa
                                        cand_baixa++;
                                        fat_baixa += Inf_MqlRates[i].open - Inf_MqlRates[i].close;
                              }
                    }
          }else{Print(magic_number," > Não foi possível copiar os dados de CopyRates: ",__LINE__);return false;}
          
          candles_alta   = cand_alta;
          candles_baixa  = cand_baixa;
          fator_alta     = fat_alta;
          fator_baixa    = fat_baixa;
          
          int teste2=candles_baixa+candles_alta;             //Curioso, o fato de somar dar zero
          int teste1=candles_baixa-candles_alta;             //Curioso, o fato de quando se subtrai da o resultado que deveria da na soma
          Print(magic_number, " > Valor de teste 1: ", teste1);
          Print(magic_number, " > Valor de teste 2: ", teste2);
          
          Print(magic_number, " > Valor de candles_alta: ", candles_alta);
          Print(magic_number, " > Valor de candles_baixa: ", candles_baixa);
          Print(magic_number, " > Valor de fator_alta: ", fator_alta);
          Print(magic_number, " > Valor de fator_baixa: ", fator_baixa);
          
          if((candles_alta !=0 && candles_baixa !=0 && fator_alta !=0 && fator_baixa !=0)) {
                    Saldo_mov         = fator_alta - fat_baixa;
                    Saldo_cand        = candles_alta - candles_baixa;
                    Zigzag_candles    = NormalizeDouble(candles_alta / candles_baixa, 3);
                    Zigzag_precos     = NormalizeDouble(fator_alta / fator_baixa, 3);                    
                    fator_my_candles  = candles_alta / (candles_alta + candles_baixa);                            //NÃO FUNCIONA !!!!!!!!!!!
                    fator_my_precos   = NormalizeDouble(fator_alta / (fator_alta + fator_baixa), 2) * 100;
                    
                    Print(magic_number," > Imprimindo o valor de Saldo_mov: ",Saldo_mov);
                    Print(magic_number," > Imprimindo o valor de Saldo_cand: ",Saldo_cand);
                    Print(magic_number," > Imprimindo o valor de Zigzag_candles: ",Zigzag_candles);
                    Print(magic_number," > Imprimindo o valor de Zigzag_precos: ",Zigzag_precos);                    
                    Print(magic_number," > Imprimindo o valor de fator my candles: ",fator_my_candles);           //Imprimi 0.0 !!!!!!!!!!!
                    Print(magic_number," > Imprimindo o valor de fator my preços: ",fator_my_precos);
                    
          }
//+------------------------------------------------------------------+
          the_My_zigzag =
                    "Candles de alta: " + (string)candles_alta
                    + ", Candles de baixa: " + (string)candles_baixa
                    + ", // Fator de alta: " + (string)fator_alta
                    + ", Fator de baixa: " + (string)fator_baixa
                    + ", // Zigzag_candles: " + (string)NormalizeDouble(Zigzag_candles, 2)
                    + ", fator_zigzag_preços: " + (string)NormalizeDouble(Zigzag_precos, 2)
                    + ", // Saldo_cand: " + (string)Saldo_cand
                    + ", Saldo_mov: " + (string)Saldo_mov
                    + ", // fator_my_candles: " + (string)fator_my_candles
                    + ", fator_my_precos: " + (string)fator_my_precos
                    ;
return true;}
//+--------------------------------------------------------------------------------------------------------------------------------------+

Segue a tela de resultados da impressão:

Tela de impressão

 
Francisco Carlos Sobral Ribeiro:

....

Vc está usando variaveis do tipo inteira para o calculo e o compilador está truncando o valor, use float ou double que deve funcionar 

 
Jonathan Pereira:

Vc está usando variaveis do tipo inteira para o calculo e o compilador está truncando o valor, use float ou double que deve funcionar 

Bom dia!


Testei double, não deu resultado diferente, continua zero!

testei float, informa possível perda de dados, mas o resultado também não muda, continua zero!

 
Francisco Carlos Sobral Ribeiro:

Bom dia!


Testei double, não deu resultado diferente, continua zero!

testei float, informa possível perda de dados, mas o resultado também não muda, continua zero!

double e float darao diferente de zero. Fator_mycandles ser do tipo mencionado nao alterara o resultado para nao zero, ja que todas as variaveis no calculo sao inteiras, o compilador entende que deve ser um resultado inteiro. Logo, zero.
 
Ricardo Rodrigues Lucca:
double e float darao diferente de zero. Fator_mycandles ser do tipo mencionado nao alterara o resultado para nao zero, ja que todas as variaveis no calculo sao inteiras, o compilador entende que deve ser um resultado inteiro. Logo, zero.

Mas, o que me traz aqui é que, na lógica que alcanço, mesmo sendo todas as variáveis inteiras, matematicamente não devia dar zero...

Fiz é refiz essa cálculo na calculadora e no excel centenas de vezes e arrumei e rearrumei o código em questão, o resultado não muda, na calculadora dá resultado diferente de zero, no excel da resultado diferente de zero, mas na função, só dá zero.

 
Francisco Carlos Sobral Ribeiro:

Mas, o que me traz aqui é que, na lógica que alcanço, mesmo sendo todas as variáveis inteiras, matematicamente não devia dar zero...

Fiz é refiz essa cálculo na calculadora e no excel centenas de vezes e arrumei e rearrumei o código em questão, o resultado não muda, na calculadora dá resultado diferente de zero, no excel da resultado diferente de zero, mas na função, só dá zero.


 Zigzag_candles    = NormalizeDouble( (double) candles_alta / (double) candles_baixa, 3);
fator_my_candles  = (double) candles_alta / (double) (candles_alta + candles_baixa); 
 
Rogerio Giannetti Torres:


Obrigado, amigo Rogério, está funcionando!


É por isso que quebro bastante a cabeça antes de vir aqui, pois na maioria das vezes a solução está diante de nossos olhos...felizmente podemos contar com ajuda de pessoas mais experientes e resolver problemas que para mim já não tinha mais solução.


Mais uma vez, muito obrigado!

 
Francisco Carlos Sobral Ribeiro:

Obrigado, amigo Rogério, está funcionando!


É por isso que quebro bastante a cabeça antes de vir aqui, pois na maioria das vezes a solução está diante de nossos olhos...felizmente podemos contar com ajuda de pessoas mais experientes e resolver problemas que para mim já não tinha mais solução.


Mais uma vez, muito obrigado!

Só acho estranho você dizer que a indicação do @Jonathan Pereira abaixo não funcionou,

double candles_alta;                         //Qt de candles de alta do período pesquisado

double candles_baixa;                        //Qt de candles de baixa do período pesquisado
 
Rogerio Giannetti Torres:

Só acho estranho você dizer que a indicação do @Jonathan Pereira abaixo não funcionou,

Do jeito que entendi não funcionou...

Do jeito que ele falou eu fui lá e mudei as declarações das variáveis envolvidas para double, testei e depois mudei para float e testei, deu na mesma...mas como eu disse, talvez eu tenha entendido errado ou não alcancei a amplitude do que ele quis dizer.

Se vocês dois falaram a mesma coisa, acho que você foi mais didático, por isso consegui resolver.

Mas agradeço a todos por todas as contribuições.

Uso muito esse fórum para aprender, mas postar mesmo só quando eu realmente não consigo resolver., tanto é que esse tempo todo só criei dois tópicos...isso porque tem alguns contribuintes do fórum que já chegam dando patadas na gente, pessoas grosseiras, mas nenhum desses a grosseiros a quem me refiro contribuíram aqui nesse tópico, graças a Deus.


Sempre nas minhas andanças por esse fórum observo e aprendo muito com suas contribuições, bem como, com as do @Jonathan Pereira, e outros que também ajudam muito.


Comecei a estudar MQL5 há quase um ano, sozinho, em casa...ainda não fiz nenhum curso, mas pretendo fazer e mergulhar na programação, essa área me encanta muito.


Mas uma vez obrigado a todos pelas contribuições.

Jonathan Pereira
Jonathan Pereira
  • 2021.07.10
  • www.mql5.com
Perfil do Trader
 
Francisco Carlos Sobral Ribeiro:

...

De uma forma geral, linguagem compiladas como Java, C++, MQL, se declararmos vaiáveis do tipo inteira e usar isso para cálculos que envolvem casas decimais vc acaba caindo num "problema", eu digo problema pois em linguagens interpretadas como python e javascript isso não acontece.

Enfim o que quero dizer é que o compilador sempre usará a parte inteira para armazenar o resultado. 

Razão: