標準的なインジケータでは、OnCalulate( ... ) イベント関数を通じて送信されたパラメータからのデータでバッファアレイを構築することになります。しかし、多通貨や 多時間枠の 場合、2つのソリューションのうち1つを使用する必要があります。
- iTime()、iVolume、iOpen、iCloseなどの「iFunction」バリエーションの古いメソッドを使用しますが、デフォルトの_Symbol またはSymbol() の代わりに「EURUSD」「JPYUSD」などの異なるシンボルを使用しています。
- ArrayCopyRates() 関数の最初のバリエーションの新しいメソッドを MqlRatesの 配列ポインタと一緒に使用します。 コピーされた」配列は、実際にはスペースを取らず、様々なシンボルと時間枠の既存のデータへのポインタと なります。
しかし、これが機能するためには、マルチシンボルやマルチタイムフレームが機能するために、2つの条件のうちの1つが存在しなければなりません。
- シンボルとタイムフレームのそれぞれのチャートがすでに開かれていて、エラーが発生しないかどうか。
- を使用すると、最初にデータを要求したときに4066エラー(ERR_HISTORY_WILL_UPDATED)が発生し、データのダウンロードを待って再度データを要求するために、スリープと再試行のループを コーディングする必要があります。
私が提案する解決策は、4066エラーを処理する最も効率的で簡単な方法として、ArrayCopyRates() とMqlRates メソッドを使用することです。
これについては、MQL4のドキュメントとヘルプファイルに詳細な情報があります。
PS!NB! iMA()、iATR() など、様々なシンボルや時間枠の組み込みインジケーター関数にアクセスする際は、4066エラーにならないよう、スリープとリトライのループを実装することを忘れないでください。以下は、MQL4ドキュメントからの引用です。
OPはインジケータについて質問していることを忘れないでください。Sleep()はインジケータでは無視されます。
すみません、知りませんでした。私はEAではこの方法を多用していますが、Indicatorでは使用していませんので、スリープのハンディキャップについては知りませんでした。
その場合、OnCalculate() 関数へのティックコール ごとに連続したコールの周りに再試行ループを構築する必要があります(ここでArrayCopyRates() の使用がより良い解決策です)。
あるいは、OnInit() 関数で動作するのであれば、インジケータ用のデータを準備する方法として、このケースでは非常に長いリトライ回数(スリープなし)が望ましいかもしれません。
...
- でないと、最初にデータを要求したときにエラー4066(ERR_HISTORY_WILL_UPDATED) が発生し、データのダウンロードを待って再度データを要求するために、スリープと再試行のループを コーディングしなければならなくなります。
PS!NB! iMA()、iATR() など、様々なシンボルや時間枠の組み込みインジケーター関数にアクセスする際は、4066エラーにならないよう、スリープとリトライのループを実装することを忘れないでください。以下は、MQL4ドキュメントからの引用です。
FMIC: その場合、OnCalculate() 関数へのすべてのティックコールで連続したコールの周りに再試行ループを構築する必要があります(ここで、ArrayCopyRates() の使用がより良い解決策となります)。 あるいは、OnInit() 関数で動作するのであれば、今回のように非常に長いリトライ回数(スリープなし)で、インジケータのデータを準備する方法が望ましいかもしれません。 |
|
if(pair1[0].time == 0) return;
これは決して真実ではありません。
シンボルと時間枠に対して読み込まれた履歴がある場合、この関数は最新の値を取得します。
もしヒストリーがロードされていなければ、Array out of range エラーを受け取ります。
iTimeなどでも同じです。
これは決して真実ではありません。
if(pair1[0].time == 0) return;
シンボルと時間枠に対して読み込まれた履歴がある場合、この関数は最新の値を取得します。
履歴が読み込まれていない場合は、Array out of rangeエラーになります。
iTime等と同様です。
ACRを見るには、多くのヒストリ(ビルド600以前)の例があります。それ以外の方法はありません。その後、ACRやiTimeを呼び出しても4066は返ってきませんので、データがダウンロードされたかどうかを知ることはできません。
iTimeは常にエラー時にゼロを返します。
ACRを見るには、歴史的な(600年前の)例がたくさんあります。それ以外の方法はありません。ACRやiTimeのその後の呼び出しは4066を返さないので、データがダウンロードされたかどうかを知ることはできません。
iTimeは常にエラーでゼロを返してきました。
他に方法がない」とはどういう意味でしょうか?
ArrayCopyRates」からのリターンカウントをチェックし、配列のサイズをチェックすることは、「Array index isout of range」エラーを簡単に返してしまう「pair1[0].time == 0」よりも、強固なチェック方法であるように思われます。
EDIT: あなたの投稿をよく読んで、私の発言のいくつかを削除しました。

- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
1~10種類の通貨を選択し、各通貨に5本のバーを表示させたいと思っています。
しかし、私はこれを行う方法を知りません。