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);
つまり、161184という数値の最後の部分、つまり4単位の発散です。
この式の変形は、同じ値を生成します。
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;
間違った結果がプリントされます。オリジナルは161188 (1.61188) あなたの方法161187プリントは1.6119 (なぜprint Low[1] if five decimal placesで丸めるのですか?), 私のバージョンは161188です。
しかし、問題を複雑にすれば
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);
つまり、161184という数値の最後の部分、つまり4単位の発散です。
この式であなたの変形は同じ値を与えます。
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;
エラーの内容と修正方法に心当たりはありますか?
このように実行します。
/********************Script program start function*******************/ voidOnStart() { string i = DoubleToString(SymbolInfoDouble(_Symbol, SYMBOL_BID)/_Point, 0); Print(i); Print(SymbolInfoDouble(_Symbol, SYMBOL_BID)/_Point); }/*******************************************************************/
丸め問題の解決策をアドバイスしてください
余りなく小数点を取り除く必要があります。丸めや指数計算では全体の問題を解決できません。どうしたらよいでしょうか?
例えば1.44430だったのですが、144430が必要なんです。
コードの一部 - そのまま
NormalizeDouble(Low[1],Digits)*MathPow(10,(Digits+1)*1-1)
で割るだけで_ポイント。
間違った結果がプリントされます。オリジナルは161188(1.61188)です。あなたの方法161187プリントは1.6119(小数点以下5桁の場合、なぜprint Low[1] は切り上げを行うのですか?
しかし、問題を複雑にすれば
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);
つまり、161184という数値の最後の部分、つまり4単位の発散です。
この式の変形は、同じ値を生成します。
NormalizeDouble(Close[1],Digits)*MathPow(10,(Digits+1)*3-1)+
NormalizeDouble(High[1],Digits)*MathPow(10,(Digits+1)*2-1)+
Low[1]/Point;
エラーの内容と修正方法に心当たりはありますか?
間違った結果がプリントされます。オリジナルは161188 (1.61188) あなたの方法161187プリントは1.6119 (なぜprint Low[1] if five decimal placesで丸めるのですか?), 私のバージョンは161188です。
しかし、問題を複雑にすれば
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);
つまり、161184という数値の最後の部分、つまり4単位の発散です。
この式であなたの変形は同じ値を与えます。
NormalizeDouble(Close[1],Digits)*MathPow(10,(Digits+1)*3-1)+
NormalizeDouble(High[1],Digits)*MathPow(10,(Digits+1)*2-1)+
Low[1]/Point;
エラーの内容と修正方法に心当たりはありますか?
void OnStart()
{
string i = DoubleToString(SymbolInfoDouble(_Symbol, SYMBOL_BID)/_Point, 0);
Print(i);
Print(SymbolInfoDouble(_Symbol, SYMBOL_BID)/_Point);
}/*******************************************************************/
このように実行します。
void OnStart()
{
string i = DoubleToString(SymbolInfoDouble(_Symbol, SYMBOL_BID)/_Point, 0);
Print(i);
Print(SymbolInfoDouble(_Symbol, SYMBOL_BID)/_Point);
}/*******************************************************************/
はい、文字列変数は(予備的に)正しい数値を取得しますが、ゼロ161188.00000000が追加されます、どうすればそれを取り除くことができますか?
はい、文字列変数は(予備的に)正しい数値を取得しますが、ゼロ161188.00000000が追加されます、どうすればそれを取り除くことができますか?
私のコードにはゼロがありません。どう書いてあるか見てください。
ありがとうございます - ゼロを見逃しました。
これが、その構造です。
DoubleToString(Close[1]/_Point,0)+
DoubleToString(High[1]/_Point,0)+
DoubleToString(Low[1]/_Point,0);
Print("CalcX=",CalcX);
さて、これらの数字を分解して、構成要素に戻す必要がある。
文字列を数値に 変換しようとすると、161188ではなく、161184という間違った数値が再び表示されます。
Print("testX=",testX);
糸を切ったほうがいいのだろうが、どうすれば最適なのか?
はい、文字列変数は(予備的に)正しい数値を取得しますが、ゼロ161188.00000000が追加されます、どうすればそれを取り除く ことができますか?
それで...パターンを見せてください。中身がどうなっているのか、どうやって知ることができるのですか?
//| 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);
}
//+------------------------------------------------------------------+
ありがとうございます。ゼロを見落としました。
それは、このような構造を思いつきました。
DoubleToString(Close[1]/_Point,0)+
DoubleToString(High[1]/_Point,0)+
DoubleToString(Low[1]/_Point,0);
Print("CalcX=",CalcX);
さて、これらの数字を分解して、構成要素に戻す必要がある。
文字列を数値に 変換しようとすると、161188ではなく、161184という間違った数値が再び表示されます。
Print("testX=",testX);
糸を切ったほうがいいのだろうが、どうすれば最適なのか?
まあ、どうしても混乱させたい場合は、文字列を StringToDouble() の数値に変換して戻し、_Point を掛けて、希望の桁数(おそらく _Digits)に正規化すればよいでしょう。