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;
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*******************/ voidOnStart() { string i = DoubleToString(SymbolInfoDouble(_Symbol, SYMBOL_BID)/_Point, 0); Print(i); Print(SymbolInfoDouble(_Symbol, SYMBOL_BID)/_Point); }/*******************************************************************/
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
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
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.
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
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?
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
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?
void OnStart()
{
string i = DoubleToString(SymbolInfoDouble(_Symbol, SYMBOL_BID)/_Point, 0);
Print(i);
Print(SymbolInfoDouble(_Symbol, SYMBOL_BID)/_Point);
}/*******************************************************************/
Execute-o assim.
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?
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 como está escrito.
Obrigado - Perdi um zero.
Esta é a construção.
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
Print("testX=",testX);
Eu provavelmente deveria cortar o fio, mas como posso fazer isso de forma otimizada?
Sim, a variável string recebe o número correto (preliminarmente), mas os zeros 161188.00000000 são adicionados, como posso me livrar deles?
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);
}
//+------------------------------------------------------------------+
Obrigado - eu perdi o zero.
Foi esta construção que surgiu
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
Print("testX=",testX);
Eu provavelmente deveria cortar o fio, mas como posso fazer isso de forma otimizada?
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