MT4 iMAOnArrayとiBandsOnArrayの要素数が計算に与える影響について

 

これが問題なのです。配列全体を計算する必要がなく、最後のN個の要素だけを計算する場合。

リミッターをかけるときに、これらの関数を計算するロジックがよくわからない。時系列配列(インジケータバッファの1つ)があるのですが、要素数を0にしておくと問答無用で全てカウントされて計算されますが、計算に関わる要素数を同じシフト数だけ減らすと、主要なものだけが表示されます。簡単に言うと、5000個の要素(チャート上のバー)があり、時間を節約するために最後の300個だけを計算する必要があるのですが、第2パラメータに値300を指定すると、一次5000-4700個の要素が得られ、オフセット300-0で、呼び出し時のそれ以上の値は変わりません。このパラメータを使う意味は何でしょうか?

 
Sergey Efimenko:

これが問題なのです。配列全体を計算する必要がなく、最後のN個の要素だけを計算する場合。

リミッターをかけるときに、これらの関数を計算するロジックがよくわからない。時系列配列(インジケータバッファの1つ)があるのですが、要素数を0にしておくと問答無用で全てカウントされて計算されますが、計算に関わる要素数を同じシフト数だけ減らすと、主要なものだけが表示されます。簡単に言うと、5000個の要素(チャート上のバー)があり、時間を節約するために最後の300個だけを計算する必要があるのですが、第2パラメータに値300を指定すると、一次5000-4700個の要素が得られ、オフセット300-0で、呼び出し時のそれ以上の値は変わりません。このパラメータを使う意味は何でしょうか?

質問を完全に理解するために、コード例を教えてください。
 
Alexander Voronkov:
質問を完全に理解するために、サンプルコードを教えてください。

これは問題なく動作します。

Buffer[i]=GetValue(i);
BufferMA=iMAOnArray(Buffer,0,PeriodMA,0,MethodMA,i);
BufferBMA[i]=iBandsOnArray(Buffer,0,PeriodBands,DevBands,0,MODE_MAIN,i)

というのはうまくいきません。

Buffer[i]=GetValue(i);
BufferMA=iMAOnArray(Buffer,300,PeriodMA,0,MethodMA,i);
BufferBMA[i]=iBandsOnArray(Buffer,300,PeriodBands,DevBands,0,MODE_MAIN,i) とする。

 
Sergey Efimenko:

これは問題なく動作します。

Buffer[i]=GetValue(i)。
BufferMA=iMAOnArray(Buffer,0,PeriodMA,0,MethodMA,i) とする。
BufferBMA[i]=iBandsOnArray(Buffer,0,PeriodBands,DevBands,0,MODE_MAIN,i);

これがうまくいかないんです。

Buffer[i]=GetValue(i)。
BufferMA=iMAOnArray(Buffer,300,PeriodMA,0,MethodMA,i);
BufferBMA[i]=iBandsOnArray(Buffer,300,PeriodBands,DevBands,0,MODE_MAIN,i);

時間を節約し、最後の300本(チャート上のバー)だけをカウント するには、 for() またはif() 演算子を使用します。
 
Alexander Voronkov:
時間を節約し、直近の300本(チャート上のバー)のみをカウント するには、 for() またはif() 演算子の値を使用します。

なんというか、繊細というか...。何を言ってるのかわかってるのか?タイトルにある関数をコードで使って、配列全体ではなく、配列の一部を計算しようとしたことがありますか?まあ、やってみれば、「視覚的に」理解できるかもしれません。棒グラフの計算など、カウントする量を明示的に指定できる場合はご提案が関係しますが、これらの関数を使った配列の場合は 関係ありません。上のコードの部分は全く同じです。唯一の違いは、最初のケースでは配列全体を数えているのに対し、2番目のケースではそのうちの300個の値だけを数えていることですが、値は配列の終端で数えられますが、参照は先頭まで使われます。私の説明不足かもしれませんが、このコードを何らかのインジケータに取り付けて、その結果を比較すれば、このことが分かると思います...。

PS 代替関数アナログの「自作版」については、明確ですが、言語によって必要な結果を得たいと思います。

 
Sergey Efimenko:

なんというか、繊細というか...。何を言ってるのかわかってるのか?タイトルにある関数をコードで使って、配列全体ではなく、配列の一部を計算しようとしたことがありますか?まあ、やってみれば、「視覚的に」理解できるかもしれません。棒グラフの計算など、カウントする量を明示的に指定できる場合はご提案が関係しますが、これらの関数を使った配列の場合は 関係ありません。上のコードの部分は全く同じです。唯一の違いは、最初のケースでは配列全体を数えているのに対し、2番目のケースではそのうちの300個の値だけを数えていることです。ただし、値は配列の終端で数え、参照は先頭で使われます。私の説明不足かもしれませんが、このコードを何らかのインジケータに取り付けて、その結果を比較すれば、このことが分かると思います...。

PS "自作 "代替機能類似品については明確ですが、私は言語によって望ましい結果を得たいと考えています。

ありのままを伝えればいいんです、いいんです。

だから、私はあなたを誤解していたのです。

 
これらの機能を使って、このような状況に直面した人はいないのでしょうか?
 
Sergey Efimenko:

これは問題なく動作します。

Buffer[i]=GetValue(i)。
BufferMA=iMAOnArray(Buffer,0,PeriodMA,0,MethodMA,i) とする。
BufferBMA[i]=iBandsOnArray(Buffer,0,PeriodBands,DevBands,0,MODE_MAIN,i);

これがうまくいかないんです。

Buffer[i]=GetValue(i)。
BufferMA=iMAOnArray(Buffer,300,PeriodMA,0,MethodMA,i);
BufferBMA[i]=iBandsOnArray(Buffer,300,PeriodBands,DevBands,0,MODE_MAIN,i);

どのような結果を期待し、どのように正常に動作させるべきか?
 
Alexey Viktorov:
どのような結果を期待し、どのように正常に動作させるべきか?
何を期待しているのかって?上に書いたように、300の最初の(初期)値ではなく、300の最新の(現在の)実際の値が必要です。さらに、オフセット299-0で配列にアクセスしますが、「配列の終わり」から「配列の終わり-300」の値(私の場合は4999から4700まで)のオフセットでデータを得ます。つまり、オフセット299にはオフセット4999にあるべき値、同様にオフセット0にあるべき値、オフセット4700にあるべき値があります。配列の計算回数を減らす場合、初期の履歴データではなく現在のデータを取得することが重要ですが、問題は現在の値が計算されないのに、最も古い値を計算する目的は何でしょうか?
 
Sergey Efimenko:
何を期待してるかって?また、オフセット300-0で配列にアクセスしますが、「配列の終わり」から「配列の終わり-300」までの値(私の場合は4999から4700まで)のオフセットでデータを取得します。つまり、オフセット300にはオフセット4999にあるべき値が、同じようにオフセット0にはオフセット4700にあるべき値が存在します。配列の計算回数を減らす場合、初期の履歴データではなく現在のデータを取得することが重要ですが、問題は現在の値が計算されないのに、最も古い値を計算する目的は何でしょうか?

ArraySetAsSeries() は役に立ちますか?

一度、そういうことに直面したことがあるのですが、勝てなかったのであきらめました。iMAOnArray()を使わずにやってみました。

 
Artyom Trishkin:

ArraySetAsSeries()は役に立ちますか?

一度、そういうことに直面したことがあるのですが、勝てなかったのであきらめました。iMAOnArray()を使わずにやってみました。

これが問題で、配列は最初は「シリアル」バッファなんです。問題は計算回数の制限で、すでに書いたように、配列全体の計算を使用するとデータは正常ですが、初期化時に端末が遅くなり、さらに異なるタイムフレームで複数の指標を使用すると難しく、ましてやそのような指標のためにEAを最適化する ことはできません。問題はMT4内部の性質で、つまり唯一の解決策は指定した関数の独自のアナログを使うことですが、私はそれを避けたいと思います。

PS 私もiMAOnArrayの自作アナログを使っていますが、ソースコードを持つのは私だけではないでしょう。 ライブラリを使うこともできますが、iBandsも必要ですが、偏差の計算が必要になってきますね。一般に標準機能でこのような状況になっているのは残念なことです。

理由: