初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 985

 

する { ...バッファリングコード

}

while(この2つの値が一致 しない)

要するに、ループの中で値が一致するまで取得し、その後、以下のコードを実行するだけです。
 
Maxim Dmitrievsky:

する { ...バッファリングコード

}

while(この2つの値が一致 しない)

要するに、ループ内の値を、同じになるまで取得し、そのときだけ、次のコードを実行します。

要は、片方のインジケータが動くまで、もう片方のインジケータにデータ(フロー)が渡らない、つまり、このインジケータのOnCalculateが ないインジケータでのループは何の役にも立たないということです。そしてOnCalculateが終了すると同時にExpert Advisorにデータが渡されるのですが、これが間違っているのです。

それとも、あなたの考えが理解できないのでしょうか。
 
Aleksey Vyazmikin:

つまり、あるインジケータが動作するまでは、別のインジケータにデータ(フロー)が転送されない、つまり、このインジケータのOnCalculateが終了しないままインジケータでループしても、何の役にも立たないという点です。

他のインジケータのバッファから値を一つずつ受け取り、その数が同じでなければ、同じになるまで再度取得し、ストリームを忘れる。 しかし、一般にこの方法で行う人はいない - 非常に遅い

 
Aleksey Vyazmikin:

つまり、あるインディケータが動作するまでは、別のインディケータにデータ(フロー)が渡らない、つまり、このインディケータのOnCalculateがないインディケータでのループは役に立たないと言うことです。しかし、OnCalculateが終了した途端、Expert Advisorにデータが渡され、エラーになる。

あるいは、あなたの考えが理解できない。

条件がtrueであれば、バッファだけが満たされると理解しています。

現在のインジケータのバッファを満たす前に、強制的にすべての条件を満たすようにします。

とか、間違ったプログラマーに返すとか、なぜ間違った分野で彼の問題を解決しなければならないのでしょうか?

 
Maxim Dmitrievsky:

他の指標のバッファから値を1つずつ取得し、その数が同じでない場合は、同じになるまで再度取得し、ストリームを忘れる。

マキシム・ドミトリエフスキー

条件を満たす必要がある場合、バッファだけが満たされます。

現在のインジケータのバッファが満たされる前に、すべての条件を強制的に実行する。

とか、手癖の悪いプログラマーに返したり、なぜ悪いところで彼の問題を解決しなければならないのか?

他のインジケーターから計算が出来ていない場合は値が0になるので、ここで強制的に埋める意味はなく、過去のデータを埋めればいいのですが、同じ効果で、インジケーターに現在のバーではなく、過去のデータを要求すれば、コードは全く変更されないはずです。

なぜここで議論しているかというと、テスターと実際の口座の状況が異なるため、スリープのシミュレーションが非常におかしく、15秒スリップの指標の再計算が一度だけ発生し、それが毎ティック、またはリクエストで発生しなければならないのに、ログによると15秒ではなく13秒で発生しています。

さらに、同期の問題があり、このような状況のために、データフローを他の指標に渡す必要性を指標に通知する可能性を追加するとよいでしょう。それなしでは、さらに計算を行うことができません。

それぞれ、Expert Advisor はインジケータからのデータを待ち、完全な計算が行われるまでティックをスキップする必要があります。現在、「while」文を 使用しようとすると、計算結果がハング/停止し(つまり、何も起こらず、テスターはただ立っている)、これも正しくないです。

もちろん、開発元にも連絡しましたが、1カ月以上連絡がありません。

 

テスターと実際のアカウントでは状況が異なり、スリープシミュレーションは非常に奇妙な動作をし、15秒スリップの指標の再計算は、それが毎ティック、またはオンデマンドで発生する必要がありますが、それは15秒ではなく、13で発生します、ログによると、。

さらに、同期の問題があり、このような状況のために、データフローを他の指標に渡す必要性を指標に通知する可能性を追加するとよいでしょう。それなしでは、さらに計算を行うことは不可能です。

それぞれ、Expert Advisorはインジケータからのデータを待ち、完全な計算が終わるまでティックをスキップする必要がありますが、現在、「while」文を使って 正しい計算結果を待とうとすると、フリーズ/停止してしまい(つまり、何も起きず、テスターはただそこに立っている)、これもまた正しくありません。

 

DearArtyom Trishkin!

上記の質問が初心者向けと判断された以上、すでに答えをご存じで、助けていただけることを切に願います

プロの方からの回答を待っています。

 
Aleksey Vyazmikin:

DearArtyom Trishkin!

上記の質問が初心者向けと判断された以上、すでに答えをご存じで、助けていただけることを強く希望します

プロの方からの回答を待っています。

計算のために必要な数のバーを受け取っていない場合、インジケータはOnCalculate()を終了する必要があります: if(rates_total<number of_bars required) return 0.計算のために必要な数のバーを受け取っていない場合、インジケータはOnCalculate()を終了する必要があります。

Expert Advisorは、インジケータから受信したデータを確認し、空のインジケータ値と等しくない場合のみ、受信したデータで計算を実行する必要があります。

  1. インジケータでは、まず、バッファは空の値で初期化されます(それが何かは、インジケータで設定可能です)
  2. インジケータ(バッファはすでに空の値で満たされている)で、利用可能なバーの数を確認します(上記で説明したとおりです)。
  3. バーの有無のチェックに合格すると、必要な値をバッファに詰めてインジケータの計算サイクルが実行される。
    .........
  4. Expert Advisorで、インジケータが何本のバーを計算しているか確認します(標準関数BarsCalculated()があります)。
  5. インジケータからデータを取得する
  6. 何を得るかによって-それはあなたのTSのロジックに依存する
    1. インジケータがラインの場合、その空の値はまだ計算されていないことを示します - 私たちは計算のためにそれを取ることはありません
    2. インジケータ - 矢印は、別のロジック(空の値は、その作業データでもあるため)があり、例えば、これはフラクタルである場合、我々はバー番号3をチェックし、得られた値から押し戻されます。
  7. まあ、自分なりのロジックを含めて、すべてを末端のバグのせいにしないことです。
  8. まず、自分自身でバグをチェックします。
  9. あなたは?
 
Artyom Trishkin:

計算のために正しい数のバーを取得しなかった場合、インジケータはOnCalculate()を終了する必要があります: if(rates_total<number_of_bars required) return 0;

ヒントありがとうございます、終了に問題はありませんが、それは状況を解決していない、私は今のところ失敗した計算として行っている

if(barsch!=channel.BarsCalculated())return(counted_bars=rates_total-1);

そして、なぜかバッファを満たし、他の指標からデータを取得し、条件が満たされるまでEAにデータが渡らない。データの正誤確認はまだしていませんが、正しそうです。それとも、私の勘違いで、何かが確実に間違っているのでしょうか?

アルチョム・トリシキン

Expert Advisorは、インジケータから受信したデータを確認し、空のインジケータ値と一致しない場合のみ、受信したデータで計算を実行する必要があります。

Expert Advisorは、新しいバーの 到着時に1つずつ計算を実行し、それぞれ、インジケータからの正しい値を待とうとすると、テスターが停止します。

アルチョム・トリシキン
  1. インジケータでは、バッファはまず空の値で初期化されます(それが何であるかは、インジケータで設定できます)。
  2. インジケータ(バッファはすでに空の値で満たされています)で、利用可能なバーの数を確認します(上記)。
  3. バーの有無のチェックに合格した場合、バッファに必要な値を入れてインジケータ計算のサイクルが実行される
    .........
  4. Expert Advisorで、インジケータが何本のバーを計算しているか確認します(標準関数BarsCalculated()があります)。
  5. インジケータからデータを取得する
  6. 何を得るかによって-それはあなたのTSのロジックに依存する
    1. インジケータがラインの場合、その空の値はまだ計算されていないことを示します - 私たちは計算のためにそれを取ることはありません
    2. 矢印の場合は、別のロジック(空の値もその作業データであるため)、例えば、これはフラクタルである場合、我々はバー番号3をチェックし、得られた値から我々は開始されます。
  7. まあ、自分なりのロジックを含めて、すべてを末端のバグのせいにしないことです。
  8. まずは自分自身でバグをチェックします。
  9. あなたは?

1.それは真実である。

2.そして、そうなった。この計算は次のティックで正しく行われますが、Expert Advisorが他のティックをループで待たないか、期待値が私の忍耐力に見合わない、つまり現実的でないため、最初のティックで正しい計算を受け取りたい - エラーが発生しています。

3.

4.もちろんです。

5.はい、そうです。しかし、この指標は他の指標からデータを受け取る必要があり、そこが問題なのです

6.1-2.意図的に偽のデータをインジケータバッファに入れることは正しくありません。エキスパートアドバイザーのコードにあるアルゴリズムエラーの検出を複雑にするだけです。

7.全て論理的に記述していますが、私はこのインジケータを書いたわけではないので、何が原因なのか理解しがたく、インジケータの合理的な発現、つまりデータストリームを独占しているため、他のインジケータからバッファリング値を受け取らないと計算を実行できない(指標は順次計算)ことを記述したのです。

8.私が著者でないことは、ここでも以前にも記したが、私はその理由を特定するために、ほぼ1日という長い時間を費やしたのである。

9.そして、私は問題の解決策を探している、加えて、誰かがこれに直面している場合、すぐに私を助けることができる。私は繰り返し、そのスレッドで私はスリープのために書き始めると、私はまた、エラーを信じるテスターの他の機能が出てきた。

返信ありがとうございました。

 
Aleksey Vyazmikin:

ヒントありがとうございます、出力に問題はありませんが、それは状況を解決していない、私はこれまで失敗した計算として作られています。

そして、なぜかバッファを満たし、他の指標からデータを取得しますが、そのデータは条件が満たされるまでEAに渡されません。データの正誤確認はまだしていませんが、正しそうです。それとも、私の勘違いで、何かが確実に間違っているのでしょうか?

Expert Advisorは、新しいバーが 到着すると単独で計算を行うため、インジケータからの正しい値を待とうとすると、テスターの停止につながるのです。

1.そうです。

というわけで、2.この計算は次のティックで正しく行われますが、私のExpert Advisorは他のティックをループで待たないか、期待値が私の忍耐力に見合わない、つまり現実的でないため、最初のティックで正しい計算を得る必要があります - エラーが発生しました。

3.

4.もちろんです。

5.はい、そうです。しかし、この指標は他の指標からデータを受け取る必要があり、それが問題なのです

6.1-2.意図的に偽のデータをインジケータバッファに入れることは正しくありません。エキスパートアドバイザーのコードにあるアルゴリズムエラーの検出を複雑にするだけです。

7.全て論理的に記述していますが、私はこのインジケータを書いたわけではないので、何が原因なのか理解しがたく、インジケータの合理的な発現、つまりデータストリームを独占しているため、他のインジケータからバッファリング値を受け取らないと計算を実行できない(指標は順次計算)ことを記述したのです。

8.私が著者でないことは、ここでも先ほども書きましたが、原因を特定するために、ほぼ1日という長い時間を費やしたのです。

9.そして、私は問題の解決策を探している、加えて、誰かがこれに直面している場合、すぐに私を助けることができる。私は繰り返し、そのスレッドで私はスリープのために書き始めると、私はまた、エラーを信じるテスターの他の機能が出てきた。

返信ありがとうございました。

OnInit()でシンボルの時系列を呼び出す:iTime(Symbol,Timeframe,1)。

一番最初のOnTick()で、対応するiFunc()を使って必要な時系列の必要なバーを求めるか、if( iTime(Symbol,Timeframe,10)==0) returnをします。

この場合、Expert Advisorは新しいバーを検出せず、次のティックを待ちます。

OnInit()では、時系列データを要求し、データのページングを有効にしています。

OnTick()では、EAに最低限必要な履歴があるかどうかをチェックし、まだない場合は次のティックを待ちます。

そして、Expert Advisorが必要とするすべてのデータを受信するまで、次のティックを待ちます。

必要なデータがすべて吸い上げられ、取得されると同時に、Expert Advisorは新しいバーと必要な履歴を使用して動作を開始します。

シリアルデータを最新の状態に保つには、少なくとも2分に1回はアクセスすることが必要です。1分半(90秒)程度のタイマーを作り、その中でiTime(Symbol,Timeframe,1)のように任意のシンボルの時系列を参照するだけで、受信データをチェックせずに、ただ歴史を「くねくね」させる。そうすれば、シンボル上のすべてのデータは常に最新の状態に保たれます。

理由: