エラー、バグ、質問 - ページ 1782

 
-Aleks-:

どれが効果的か?

有効数字をなくし、ランダムな数字で埋めるルールが有効

結果は長いですが、doubleの中間計算で、そこで有効桁が失われます

(Digits+1)*3-1=17となります。

 
A100:

有効数字をなくしてランダムで埋めるルールで動作

結果は長いですが、doubleの中間計算で、そこで有効桁が失われます

(Digits+1)*3-1=17となります。

情報をありがとうございました。

しかし、情報が把握しにくい。つまり、数値はそうなっても、それで計算ができないのか?

以下は、文字列から数値に変換されるコードの例です。

long CalcY=StringToDouble("111111111111111111");
Print ("CalcY=",CalcY);

111111111111111104を表示します。

I.e.ここに計算はないのか、それとも私が間違っているのか?

この数字を扱うことは可能なのか、それとも言語の制限なのか?

 
-Aleks-:

つまり、ここには計算がないのですが、私の勘違いでしょうか?

計算とは、あらゆる操作( この場合は変換)のことです指定された数値に対して、StringToDoubleは精度を落として doubleを返す

StringToInteger は long を返しますが、NormalizeDouble や MathPow など、double を扱う他の関数は精度を落とさずに計算を行うことができません。

 
A100:

計算 - あらゆる操作( この場合、変換)StringToDoubleはdoubleを返す -精度の損失が ある

StringToInteger は long を返しますが、NormalizeDouble や MathPow など、double を扱う他の関数は精度を落とさずに計算を 行うことができません。

StringToIntegerは 数字を表現するのに有効でしたが、その後が悪く、数学的な演算のために数字を構成要素に分解しなければならないのでしょう......。

long CalcZ=StringToInteger("111111111111111111");
Print ("CalcZ=",CalcZ);

double Test=CalcZ;
Print ("Test=",Test);

Test=1.111111111111111e+17

 

ここでもヘルプデスクに書かれています

INT_MAX

int型で表現可能な最大値

2147483647

では、StringToIntegerは どのように変換を行い、許容値より大きな数値の場合はlongに格納したのでしょうか

 
-Aleks-:

では、StringToIntegerでは、許容値より大きい数値 の場合、どのようにlongに変換して保存していたのでしょうか

StringToIntegerはもともとLONG_MINLONG_MAXの 範囲でlongを返す(StringToColobokと呼ぶこともできる)

 
A100:
StringToIntegerはもともとlongを返す(StringToBoobと呼ばれていたかもしれない)。

確かにその通りなのですが、Helpファイルがとても巧妙なのです。

"

int関数は、数値の文字表現を含む文字列を int(整数)値に変換します。

"

それが、私を惑わせた。

情報提供ありがとうございました。

上記の数値表現は、グラフィカルバッファに収まらないということですね?

 
-Aleks-:

上記の数値は、グラフィカルバッファに収まらないということですね?

B'111111111111111111111111と表記される。

 
A100:

タイムフレームがM5からM15に変更されたとき、M5 Deinitコマンドは最初のインディケータに(そしてそれだけに-この場合はM5に)送られず、ユーザーがEAを削除するまでチャートからアンロードされないと主張します(そしてチェックするよう提案します)。

グローリーは正しく、アンローディングは正しく動作します。

MT5では、インディケータ計算コアは、それ自身のマネージャに使用量カウンタを持つ共有リソースであることに注意してください。 異なるプログラムまたはウィンドウが同じパラメータでインディケータを使用する場合、使用量カウンタを持つ1つの計算コピーが実際に機能します。これは、トレーダーがチャートとExpert Advisorで同じ指標を使用する場合、多くのお金を節約することができます。

インジケーターマネージャーは、インジケーターを物理的に非同期かつ遅延させて削除するように設計されています。そしてその間に、新しいパラメータで新しい作業コピーが作成され、古いコピーが物理的に削除される前に初期化されることが多い。
 
Renat Fatkhullin:
インジケーターマネージャーは、インジケーターを物理的に非同期かつ遅延させて削除するように設計されています。そして、その間に新しい作業コピーが新しいパラメータで作成され、古いコピーが物理的に削除される前に初期化されることが多い。

インジケータを簡略化しよう

//Test_i.mq5 //Индикатор
void Prn( string f, int i = -1 ) { Print( f, "->", StringSubstr( EnumToString( Period()), 7 ), (i == -1 ? "" : ":" + i )); }
void OnInit()                    { Prn( __FUNCTION__ );         }
void OnDeinit( const int reason ) { Prn( __FUNCTION__, reason ); }
int OnCalculate( const int, const int, const int, const double& [] ) { return 0; }

Test.mq5をM5チャートに貼り付けて、チャートの期間を M5->M15に変更してみましょう。

結果

2017.02.06 00:54:20.897 OnInit->M5
2017.02.06 00:54:25.553 OnInit->M15

質問:OnDeinit->M5はいつ呼び出されるのですか?

私の答えは、「絶対にしない」です。

上記の回答:非同期かつ遅延あり

ファイル:
Test.mq5  1 kb