NormalizeDouble()

Para adicionar comentários, por favor Faça o login ou registrar
Evandro Pinho
41
Evandro Pinho  
estou usando NormalizeDouble porém não está funcionando como desejado.
void recuperarPorcentagem(){
   double porcentagem = NormalizeDouble(inputRecuperacao*0.01,2);
   double saldoRecuperado =  NormalizeDouble((saldoPerdedor + (saldoPerdedor*porcentagem))*-1,2);
   for(int i = PositionsTotal()-1; i>=0; i--) {
            string symbol = PositionGetSymbol(i);
            ulong magic = PositionGetInteger(POSITION_MAGIC);
            if(symbol == _Symbol && magic==magicNum)
               {
                  ulong PositionTicket = PositionGetInteger(POSITION_TICKET);
                  double ProfitAtual = PositionGetDouble(POSITION_PROFIT);
                  if(ProfitAtual >= saldoRecuperado){  
                     Fechar();   
                  }
                }
}
}

os resultados apontados no debug das variáveis onde eu necessito normalizar ainda aparecem os valores após os 2 digitos. 
Alguma sugestão?

Flavio Jarabeck
53539
Flavio Jarabeck  
Evandro Pinho:
estou usando NormalizeDouble porém não está funcionando como desejado.

os resultados apontados no debug das variáveis onde eu necessito normalizar ainda aparecem os valores após os 2 digitos. 
Alguma sugestão?

O MQL5 é bizarro em alguns tratamentos. Minha sugestão é fazer o cálculo antes, e depois usar o NormalizeDouble()...

Estou chutando... Não sei se resolverá...

;)

Thiago Duarte
27019
Thiago Duarte  
O que o Flavio falou é verdade, faça o cálculo antes para depois normalizar ;)
Evandro Pinho
41
Evandro Pinho  
Flavio Jarabeck:

O MQL5 é bizarro em alguns tratamentos. Minha sugestão é fazer o cálculo antes, e depois usar o NormalizeDouble()...

Estou chutando... Não sei se resolverá...

;)

assim voce fala? 

void recuperarPorcentagem(){
   double porcentagem = inputRecuperacao*0.01;
   NormalizeDouble(porcentagem,2);
   double saldoRecuperado =  saldoPerdedor + ((saldoPerdedor*porcentagem)*-1);
   NormalizeDouble(saldoRecuperado,2);
   for(int i = PositionsTotal()-1; i>=0; i--) {
            string symbol = PositionGetSymbol(i);
            ulong magic = PositionGetInteger(POSITION_MAGIC);
            if(symbol == _Symbol && magic==magicNumber)
               {
                  ulong PositionTicket = PositionGetInteger(POSITION_TICKET);
                  double ProfitAtual = PositionGetDouble(POSITION_PROFIT);
                  if(ProfitAtual >= saldoRecuperado){  
                     Fechar();   
                  }
                }
   }
}
Rogerio Giannetti Torres
2758
Rogerio Giannetti Torres  
Evandro Pinho:

assim voce fala? 

Não,  a sugestão foi de operar todo cálculo e depois "normalizar".

void recuperarPorcentagem()
{
   double porcentagem = inputRecuperacao*0.01;
   double saldoRecuperado =  saldoPerdedor + ((saldoPerdedor*porcentagem)*-1);
   NormalizeDouble(saldoRecuperado,2);
...
...

}

OU

void recuperarPorcentagem()
{
   double saldoRecuperado =  saldoPerdedor + ((saldoPerdedor*inputRecuperacao*0.01)*-1);
   NormalizeDouble(saldoRecuperado,2);
...
...

}
Davi Silva
899
Davi Silva  

Olá,


Veja, no fórum em inglês, tem um gringo que diz: A função NormalizeDouble do mt não funciona muito bem.

Seguindo esse conselho dele eu criei minha propria função para 'normalizar' Double, segue ela, espero que ajude. Nota que alem de normalizar os Doubles ele arredonda o valor

//+------------------------------------------------------------------+
//|                                              NormalizeDouble.mq4 |
//|                                    Copyright 2019, DsTrade Corp. |
//|                                               www.dstrade.com.br |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, DsTrade Corp."
#property link      "www.dstrade.com.br"
#property version   "1.00"
#property strict

input double varNumberToNormalize = 35.67845; //Numero para normalizar
input int  varNumberDecimal = 2; //Numero para normalizar de 1 até 3
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Alert(DoubleToStr(NormalizeNumber(varNumberToNormalize),varNumberDecimal));
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double NormalizeNumber(double number)
  {
// exemplo transformando em decimal de 2 casas
// 37.66666 * variavel de decimal =3766.66
// 3766.66 + .5 =3767.16    para arredondar o valor
// faça um  cast para int, para que o valor seja 3767
// dividido por variavel de decimal para que o valor convertido fique em 37.67
//caso queira mais casas decimais ai divida por 10,100,1000 etc

   int decimal = 0; //casas decimais

   if(varNumberDecimal==1) // uma casa decimal
      decimal = 10;
   if(varNumberDecimal==2) //duas casas decimais
      decimal = 100;
   if(varNumberDecimal==3) //tres casas decimais
      decimal = 1000;
   double value = (int)(number * decimal + .5); //Calculo

   return (double)value / decimal;
  }
//+------------------------------------------------------------------+
Flavio Jarabeck
53539
Flavio Jarabeck  
Davi Silva:

Olá,


Veja, no fórum em inglês, tem um gringo que diz: A função NormalizeDouble do mt não funciona muito bem.

Seguindo esse conselho dele eu criei minha propria função para 'normalizar' Double, segue ela, espero que ajude. Nota que alem de normalizar os Doubles ele arredonda o valor

Pressuposto... e talvez para MT4..., e, talvez para 32 bits...


Você está postando código de uma versão de MQL que já está em extinção... As Libraries de C para 64 bits são mais precisas e inclusive não tem resíduos, principalmente no MT5.

Evandro, siga a ideia original!

;)

Para adicionar comentários, por favor Faça o login ou registrar