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

 
Nauris Zukas:

こんにちは!
「for」ループで「double」を使用する正しい方法は何ですか?ヘルプに "double "の使用禁止はないようです。

とにかく、私の結論は、各反復の後のExpressionZの正規化ができないため、"for"ループでは "double "は推奨されないということです。
1) 反復回数の間違い。
2) ExpressionZ を使って文中で計算すると、間違った結果になる。

Документация по MQL5: Основы языка / Операторы / Оператор цикла for
Документация по MQL5: Основы языка / Операторы / Оператор цикла for
  • www.mql5.com
. Все повторяется, пока выражение2 не станет ложным. Если оно ложно, цикл заканчивается и управление передается следующему оператору. ВыражениеЗ вычисляется после каждой итерации. могут отсутствовать, однако разделяющие их точки с запятыми (;) опускать нельзя. Если опущено...
 
Nauris Zukas:

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

整数が得られるまで、10を適当にかける。私も最初は苦労しましたが、今では価格を整数に変換したり、整数に丸めたりする作業までしています。エラーが少なくなり、読みやすくなりました。

一般に、あるプログラマーが取引所からサマリーを受け取って言ったように、ある桁数の数字が整数ではなく実数で表現される理由がわからないのである。これは論理的に正しくないです ))))

 
Valeriy Yastremskiy:

整数が得られるまで、10を適当にかける。最初は私も苦労しましたが、今では価格を整数に変換したり、四捨五入して整数にする作業までしています。エラーが少なくなり、読みやすくなりました。

一般に、あるプログラマーが取引所からサマリーを受け取って言ったように、ある桁数の数字が整数ではなく実数で表現される理由がわからないのである。これは論理的に正しくないです ))))

ありがとうございます!旧来の方法でintを使い、doubleで割ることにします。;)

 
Nauris Zukas:

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

すみません、確認すべきでした。そして、ここには「ちゃんとやりたかったのに、いつもと同じになってしまった」というのがあります。

結果

2020.05.29 14:26:33.855 !00 (GBPUSD.m,M15)       i: 1.0 step: 0.2
2020.05.29 14:26:33.855 !00 (GBPUSD.m,M15)       i: 1.2 step: 0.2
2020.05.29 14:26:33.855 !00 (GBPUSD.m,M15)       i: 1.4 step: 0.2
2020.05.29 14:26:33.855 !00 (GBPUSD.m,M15)       i: 1.6 step: 0.2
2020.05.29 14:26:33.855 !00 (GBPUSD.m,M15)       i: 1.8 step: 0.2
2020.05.29 14:26:33.855 !00 (GBPUSD.m,M15)       i: 2.0 step: 0.2
2020.05.29 14:26:33.855 !00 (GBPUSD.m,M15)       i: 2.2 step: 0.2
2020.05.29 14:26:33.855 !00 (GBPUSD.m,M15)       i: 2.4 step: 0.2
2020.05.29 14:26:33.855 !00 (GBPUSD.m,M15)       i: 2.6 step: 0.2
2020.05.29 14:26:33.855 !00 (GBPUSD.m,M15)       i: 2.8 step: 0.2
2020.05.29 14:26:33.855 !00 (GBPUSD.m,M15)       MaxPass: 10 count: 10 i: 3.0

正しいコード

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

正しいコード

step=0.04としないように注意;)

 
Andrey Khatimlianskii:

step=0.04としないように注意;)

これはあくまで頭の使い方がわからない人へのアドバイスです)))

 
Alexey Viktorov:

すみません、確認すべきでした。ただ、"良かれと思ってやったのに、いつもと違う "ということです。

結果

正しいコードです。

i=NormalizeDouble(i+step, 1)

あ、ありがとうございます!自分では思いつかなかった。まさに、私たちプログラミング初心者を助けてくれる存在です! ;)

 
構造 体の配列をソートするメソッドを探して います。どなたか、動作するバリアントをお持ちではないでしょうか?
 
Vladimir Pastushak:
構造 体の配列をソートするメソッドを探して います。どなたか、動作するバリアントをお持ちではないでしょうか?

https://www.mql5.com/ru/forum/170952/page134#comment_11532251

Особенности языка mql5, тонкости и приёмы работы
Особенности языка mql5, тонкости и приёмы работы
  • 2019.04.19
  • www.mql5.com
В данной теме будут обсуждаться недокументированные приёмы работы с языком mql5, примеры решения тех, или иных задач...
 
fxsaber:

https://www.mql5.com/ru/forum/170952/page134#comment_11532251

うまくいかない...。