mql4言語の特徴、微妙なニュアンスとテクニック - ページ 29

 
Vladimir Karputov:

データ ウィンドウの時刻は同じですか?

はい。

 
Andrey Khatimlianskii:

はい。

なるほど、本当にバータイムなんですね。ただ、「Precise timeline」のパラメーターに疑惑があったんです。

Настройки платформы - Начало работы - Справка по MetaTrader 5
Настройки платформы - Начало работы - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая платформа обладает множеством настроек, что позволяет организовать работу в ней так, как это удобно именно вам. Выполните команду " Настройки" меню "Сервис" или нажмите "Ctrl+O". Графики — общая настройка отображения ценовых графиков, а также настройка параметров управления объектами: выделение объектов после их создания, немедленная...
 

こんにちは!
「for」ループで「double」を使用する正しい方法は何ですか?ヘルプに "double "の使用禁止はないようです。i」を正規化しなければならないのはわかるのですが、私にはうまくいきません。

double expr1=1.0;
double expr2=2.8;
double step=0.2;
double i;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int count=0;
   for(i=expr1; i<=expr2; i+=step)
     {
      NormalizeDouble(i,1);
      count++;
      Print(" i: ",DoubleToStr(i,8)," step: ",DoubleToStr(step,8));
     }
   int MaxPass=(int)NormalizeDouble(((expr2-expr1)/step),0)+1;
   Print(" MaxPass: ",MaxPass," count: ",count," i: ",i);
  }
//+------------------------------------------------------------------+

expr2=2.6」の場合は9回の繰り返しでまだ大丈夫ですが、「expr2=2.8」の場合はすでに9回の繰り返しが間違って表示されています(正しい値は10です)。

 
Nauris Zukas:

こんにちは!
「for」ループで「double」を使用する正しい方法は何ですか?ヘルプに "double "の使用禁止はないようです。i」を正規化しなければならないのはわかるのですが、私にはうまくいきません。

expr2=2.6」の場合は9回の繰り返しでまだ良いのですが、「expr2=2.8」の場合はすでに不正な9回の繰り返しを表示しています(正しい値は10です)。

おそらく、値を正規化する必要があるのでしょう。

 
Alexey Viktorov:

おそらく、値を正規化する必要があるのでしょう。

このような意味であれば、それも仕方がない。

double expr1=1.0;
double expr2=2.8;
double step=0.2;
double i;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int count=0;
   for(i=NormalizeDouble(expr1,1); i<=NormalizeDouble(expr2,1); i+=NormalizeDouble(step,1))
     {
      NormalizeDouble(i,1);
      count++;
      Print(" i: ",DoubleToStr(i,8)," step: ",DoubleToStr(step,8));
     }
   int MaxPass=(int)NormalizeDouble(((expr2-expr1)/step),0)+1;
   Print(" MaxPass: ",MaxPass," count: ",count," i: ",i);
  }
 
Nauris Zukas:

このような意味であれば、それも仕方がない。

いいえ、最低でも最適化する必要があります。

double expr1=1.0;
double expr2=2.8;
double step=0.2;
double i;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int count=0;
   for(i=NormalizeDouble(expr1,1); i<=NormalizeDouble(expr2,1); NormalizeDouble(i+=step,1))
     {
      NormalizeDouble(i,1);
      count++;
      Print(" i: ",DoubleToStr(i,8)," step: ",DoubleToStr(step,8));
     }
   int MaxPass=(int)NormalizeDouble(((expr2-expr1)/step),0)+1;
   Print(" MaxPass: ",MaxPass," count: ",count," i: ",i);

というのは、それが間違った値を与えてしまうからです。そして、他の人はそうする必要がないかもしれません。

 
Nauris Zukas:

こんにちは!
「for」ループで「double」を使用する正しい方法は何ですか?ヘルプに "double "の使用禁止はないようです。i」を正規化しなければならないのはわかるのですが、私にはうまくいきません。

expr2=2.6 "の場合は、9回の繰り返しで問題ありませんが、"expr2=2.8 "の場合は、9回の繰り返しでは正しくありません(正しくは10回です)。

ここで、Nikolayの投稿を読むと、ダブルhttps://www.mql5.com/ru/forum/1111/page2623#comment_14473837 の非常に詳細かつ非常に定性的な記述があります。

初回で理解できなかった場合は、少なくとも15桁目までのdoubleを出力するコードで、Print()をprintf()に置き換えてみてください。https://www.mql5.com/ru/forum/1111/page2623#comment_14474138

そうすれば、なぜそうなのかがわかるかもしれません

 
Alexey Viktorov:

いいえ、最低でもこの最適化は必要です。

というのは、それが間違った値を与えてしまうからです。そして、他の人はそうする必要がないかもしれません。

ありがとうございます。しかし、あなたの例も正しい結果を得ることができませんでした。printfでは、正規化が行われないことがわかります。

0 10:29:31.595 Test_Double_For EURCHF,H4: i = 1.00000000000000000000
0 10:29:31.595 Test_Double_For EURCHF,H4: i = 1.0000000000000000000000000000 0 10:29:31.595 Test_Double_For EURCHF,H4: i = 1.1999999999995559107901499373838305473327636718750000
0 10:29:31.595 Test_Double_For EURCHF,H4: i = 1.1.399999999999991111182158029987476766109466552734375000000000
0 10:29:31.595 Test_Double_For EURCHF,H4: i = 1.5999999999999866773237044981212151491164199829101562500000000
0 10:29:31595 Test_Double_For EURCHF,H4: i = 1.7999999999982236431605997495353221893310546875000000
0 10:29:31.595 Test_Double_For EURCHF,H4: i = 1.799999999999.1.0.0.0.0.1.0.0.0.0.0.0.0.1.0.1.0 0.0999999999997779553950749686919152736638618359375000000
0 10:29:31.595 Test_Double_For EURCHF,H4: i = 2.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1999999999999997335464740899624302983283996582031250000000
0 10:29:31.595 Test_Double_For EURCHF,H4: i = 2.399999999999991191821580299874766109466552734375000000000
0 10:29:31595 Test_Double_For EURCHF,H4: i = 2.60000000000887841970012523233890533447265625000000000
0 10:29:31595 Test_Double_For EURCHF,H4: MaxPass: 10 count: 9
0 10:29:31.595 Test_Double_For EURCHF,H4: Last i = 2.800000000002664535259100375697016716003417968750000000

 
Igor Makanu:

ここで、Nikolayの投稿を読むことができます。彼は、非常に詳細かつ非常に定性的な方法で、ダブルでの作業について説明しています。https://www.mql5.com/ru/forum/1111/page2623#comment_14473837

初回から教材を消化できない場合は、少なくとも15桁目までのdoubleを出力するprintf()に置き換えてみてください。https://www.mql5.com/ru/forum/1111/page2623#comment_14474138

そうすれば、なぜそうなるのかがわかるかもしれません。

ありがとうございます。なぜそうなるのか、その理由がわかりました。だから正常化しようとしたのです。私には効果がありませんでした。Alexey Viktorovのオプションでも直らず、値は正規化されないままです。 そこで疑問が残るのですが、ループ内で「double」を使用して、常に正しい反復回数を得ることができるのでしょうか?

 
Nauris Zukas:

そこで疑問が残るのですが、「double」はループの中で使えるのでしょうか

Nauris Zukas:

で、常に正しい反復回数を得ることができますか?

doubleの値は常に正しいですが、あなたが見たり得たりしたい位置の10進法には対応しません。

Nauris Zukas:

ありがとうございます。なぜこのようなことが起こるのか、それが正常化しようとした理由です。私には効果がありませんでした。Alexey Viktorovのオプションも修正されず、値は正規化されていないままです。

ダブルコンバージョンによる操作には常に限界があり、この問題があなたの例のような方法で解決されるとは思えません。

信頼性の高いソリューションを作る:ループとdoubleの結果値を計算する式でintを使用し、ループ内の繰り返し時に結果としてdoubleの加算を使用しないでください - もう一度ニコラエフとの対話で私の例を見てください

理由: