MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 106

 
-Aleks-:

丸め問題の解決策をアドバイスしてください

余りなく小数点を取り除く必要があります。丸めや指数計算では全体の問題を解決できません。どうしたらよいでしょうか?

例えば1.44430だったのですが、144430が必要なんです。

コードの一部 - そのまま

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

単純に_Pointで割ってください。
 
Alexey Viktorov:
で割るだけで_ポイント。

間違った結果がプリントされます。オリジナルは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単位の発散です。

この式の変形は、同じ値を生成します。

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;

エラーの内容と修正方法に心当たりはありますか?

 
-Aleks-:

間違った結果がプリントされます。オリジナルは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*******************/
void OnStart()
{
   string i = DoubleToString(SymbolInfoDouble(_Symbol, SYMBOL_BID)/_Point, 0);
   Print(i);
   Print(SymbolInfoDouble(_Symbol, SYMBOL_BID)/_Point);
}/*******************************************************************/
 
Alexey Viktorov:
このように実行します。

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

はい、文字列変数は(予備的に)正しい数値を取得しますが、ゼロ161188.00000000が追加されます、どうすればそれを取り除くことができますか?

 
-Aleks-:

はい、文字列変数は(予備的に)正しい数値を取得しますが、ゼロ161188.00000000が追加されます、どうすればそれを取り除くことができますか?

私のコードにはゼロがありません。その書き方を見てください。
 
Alexey Viktorov:
私のコードにはゼロがありません。どう書いてあるか見てください。

ありがとうございます - ゼロを見逃しました。

これが、その構造です。

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

さて、これらの数字を分解して、構成要素に戻す必要がある。

文字列を数値に 変換しようとすると、161188ではなく、161184という間違った数値が再び表示されます。

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

糸を切ったほうがいいのだろうが、どうすれば最適なのか?


 
-Aleks-:

はい、文字列変数は(予備的に)正しい数値を取得しますが、ゼロ161188.00000000が追加されます、どうすればそれを取り除く ことができますか?

文字列を". "区切りでパースする。
 
Artyom Trishkin:
それで...パターンを見せてください。中身がどうなっているのか、どうやって知ることができるのですか?
//+------------------------------------------------------------------+
//| 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);
  }
//+------------------------------------------------------------------+
 
トレンド ラインの2つ目の座標時間をブレイクスルー時間またはそのタッチで設定するようなインジケーターの実装方法を教えてください。つまり、トレンドラインはスタートがある場所にあり、2番目の座標の時間は任意に設定されるが、ローソク足と交差するところで終了するはずである。例えば写真のようなインジケーターで
 
-Aleks-:

ありがとうございます。ゼロを見落としました。

それは、このような構造を思いつきました。

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

さて、これらの数字を分解して、構成要素に戻す必要がある。

文字列を数値に 変換しようとすると、161188ではなく、161184という間違った数値が再び表示されます。

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

糸を切ったほうがいいのだろうが、どうすれば最適なのか?


何かを削る必要はありません。文字列への変換は、正しい数値を見る ためだけです。計算のために何かをする必要はありません。

まあ、どうしても混乱させたい場合は、文字列を StringToDouble() の数値に変換して戻し、_Point を掛けて、希望の桁数(おそらく _Digits)に正規化すればよいでしょう。