Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 106

 
-Aleks-:

Aconselhe por favor sobre uma solução para o problema do arredondamento!

Preciso me livrar do ponto decimal sem um resto - arredondamento e exponenciação não resolvem o problema todo - o que devo fazer?

Por exemplo, era 1.44430 e eu preciso de 144430.

Parte do código - como é

NormalizeDouble(Low[1],Digits)*MathPow(10,(Digits+1)*1-1)

Basta dividir por _Ponto.
 
Alexey Viktorov:
Basta dividir por _Ponto.

Impressão de resultado errado, o original é 161188 (1,61188) seu método de impressão 161187 dá 1,6119 (por que o arredondamento é feito quando se imprime Low[1] se cinco casas decimais?), minha versão é 161188.

Mas se complicarmos o problema.


long Calc=
NormalizeDouble(Close[1],Digits)*MathPow(10,(Digits+1)*3-1)+
NormalizeDouble(High[1],Digits)*MathPow(10,(Digits+1)*2-1)+
NormalizeDouble(Low[1],Digits)*MathPow(10,(Digits+1)*1-1);

Ou seja, a última parte do número 161184 - ou seja, a divergência de 4 unidades.

Sua variante desta expressão produz o mesmo valor

long CalcX=
NormalizeDouble(Close[1],Digits)*MathPow(10,(Digits+1)*3-1)+
NormalizeDouble(High[1],Digits)*MathPow(10,(Digits+1)*2-1)+
Low[1]/Point;

Alguma idéia do que é o erro e como corrigi-lo?

 
-Aleks-:

Resultado de impressão errado, o original é 161188 (1,61188) Seu método de impressão 161187 dá 1,6119 (por que o arredondamento é feito quando se imprime Low[1] se cinco casas decimais?), minha versão é 161188.

Mas se complicarmos o problema.


long Calc=
NormalizeDouble(Close[1],Digits)*MathPow(10,(Digits+1)*3-1)+
NormalizeDouble(High[1],Digits)*MathPow(10,(Digits+1)*2-1)+
NormalizeDouble(Low[1],Digits)*MathPow(10,(Digits+1)*1-1);

Ou seja, a última parte do número 161184 - ou seja, a divergência de 4 unidades.

Sua variante nesta expressão dá o mesmo valor

long CalcX=
NormalizeDouble(Close[1],Digits)*MathPow(10,(Digits+1)*3-1)+
NormalizeDouble(High[1],Digits)*MathPow(10,(Digits+1)*2-1)+
Low[1]/Point;

Alguma idéia do que é o erro e como corrigi-lo?

Execute-o assim.

/********************Script program start function*******************/
void OnStart()
{
   string i = DoubleToString(SymbolInfoDouble(_Symbol, SYMBOL_BID)/_Point, 0);
   Print(i);
   Print(SymbolInfoDouble(_Symbol, SYMBOL_BID)/_Point);
}/*******************************************************************/
 
Alexey Viktorov:
Execute-o assim.

/********************Script program start function*******************/
void OnStart()
{
   string i = DoubleToString(SymbolInfoDouble(_Symbol, SYMBOL_BID)/_Point, 0);
   Print(i);
   Print(SymbolInfoDouble(_Symbol, SYMBOL_BID)/_Point);
}/*******************************************************************/

Sim, a variável string recebe o número correto (preliminarmente), mas os zeros 161188.00000000 são adicionados, como posso me livrar deles?

 
-Aleks-:

Sim, a variável string recebe o número correto (preliminarmente), mas os zeros 161188.00000000 são adicionados, como posso me livrar deles?

Não há zeros em meu código. Veja a forma como está escrito.
 
Alexey Viktorov:
Não há zeros em meu código. Veja como está escrito.

Obrigado - Perdi um zero.

Esta é a construção.

string CalcX=
DoubleToString(Close[1]/_Point,0)+
DoubleToString(High[1]/_Point,0)+
DoubleToString(Low[1]/_Point,0);
Print("CalcX=",CalcX);

Agora eu preciso decompor esses números de volta em seus componentes.

Quando tento converter a corda para um número, recebo novamente o número errado 161184 ao invés de 161188

long testX = StringToDouble(CalcX);
Print("testX=",testX);

Eu provavelmente deveria cortar o fio, mas como posso fazer isso de forma otimizada?


 
-Aleks-:

Sim, a variável string recebe o número correto (preliminarmente), mas os zeros 161188.00000000 são adicionados, como posso me livrar deles?

Analisar o fio usando o "..." delimitador
 
Artyom Trishkin:
Então... me mostre o padrão. Como você sabe o que está lá dentro?
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
  
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
  
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Você pode me dizer como implementar um indicador para que o segundo tempo de coordenada na linha de tendência seja definido pelo tempo de ruptura ou seu toque. Ou seja, a linha de tendência tem seu início em um determinado lugar, e a hora da segunda coordenada é definida a critério, mas a linha deve terminar onde ela se cruza com uma vela. Como por exemplo no indicador mostrado na figura
 
-Aleks-:

Obrigado - eu perdi o zero.

Foi esta construção que surgiu

string CalcX=
DoubleToString(Close[1]/_Point,0)+
DoubleToString(High[1]/_Point,0)+
DoubleToString(Low[1]/_Point,0);
Print("CalcX=",CalcX);

Agora eu preciso decompor esses números de volta em seus componentes.

Quando tento converter a corda para um número, recebo novamente o número 161184 errado em vez do 161188

long testX = StringToDouble(CalcX);
Print("testX=",testX);

Eu provavelmente deveria cortar o fio, mas como posso fazer isso de forma otimizada?


Não há necessidade de cortar nada. A conversão para string é apenas para ver o número certo. Você não tem que fazer nada para os cálculos.

Bem, se você tem um desejo avassalador de fazer uma bagunça, converta a string de volta para um número StringToDouble() e multiplique por _Ponto com normalização para o número desejado de dígitos, provavelmente _Dígitos
Razão: