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

 
Andrey Dik:

アンドリュー、ありがとうございます。この質問を完全に理解したのは、あなただけです。


現在、すべてが意図したとおりに動作しており、インジケータは最初の実行中に一度だけ完全に計算され、その後、新しいバーで毎回一度だけ計算されています。


2つ目のインジケータの最終的なコードは、誰かの役に立つことを期待しています。

ここに、あなたが考えるべきことの始まりがあります。

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

バグ、バグ、質問

アレクセイ・ヴィクトロフ, 2021.05.28 08:36

このチェックは何のためのものですか?

//проверка готовности данных и индикатора на другом TF
if (SeriesInfoInteger (Symbol (), tf, SERIES_SYNCHRONIZED))
{
  if (iBars (Symbol (), tf) != BarsCalculated (handleFr)) return 0;
}
else return 0;

無条件にreturn 0;と書いた方が楽なのでは...。

新しいバーができるたびに条件が満たされ、同期に関係なくすべてのバーが再計算されます。配慮のないコードを書き、末端のバグを装う...。


そして、イゴール・マカヌはもっと前にこう言っていた......。
 

思い出していただきたいのです。

1.少なくとも1つのチャートが開かれている各シンボルに対して、別のスレッドが受信ティックを処理するために動作します。あるシンボルについて複数のチャートを開くことができますが、いずれにせよスレッドは1つしかありません。

2.シンボルスレッドはチャートを処理するのではなく、時系列を処理します。つまり、CopyRatesリクエストに提出される、まったく同じデータ配列です。

3. OnTickやOnCalculateで、シンボルが同期しているかどうかを確認するのは無駄です。もちろん、そうです。

4.すべての時系列は、低いものから高いものへと順番に処理されます。まず、ティックが適用され、次にこの時系列で作成されたすべての指標の計算が行われます。M1で動作するインジケータから同じH1シンボルのデータを要求しても、適用されたティックでデータを取得することはできません。どんなトリックを施しても、データは必ず1ティック戻る。連続したタイムフレーム処理で1シンボルにつき1スレッドだから。

5.EAとスクリプトはそれぞれ別のスレッドで動作するため、前言は当てはまりません。

 
Slava:

思い出していただきたいのです。

1.少なくとも1つのチャートが開かれている各シンボルに対して、別のスレッドが受信ティックを処理するために動作します。あるシンボルについて複数のチャートを開くことができますが、スレッドは1つしかありません。

2.シンボルスレッドでは、チャートではなく、時系列を扱います。つまり、CopyRatesリクエストに提出される、まったく同じデータ配列です。

3. OnTickやOnCalculateで、シンボルが同期しているかどうかを確認するのは無駄です。もちろん、そうです。

4.すべての時系列は、低いものから高いものへと順番に処理されます。まず、ティックが適用され、次にこの時系列で作成されたすべての指標の計算が行われます。M1で動作するインジケータから同じH1シンボルのデータを要求しても、適用されたティックでデータを取得することはできません。どんなトリックを施しても、データは必ず1ティック戻る。連続したタイムフレーム処理で1シンボルにつき1スレッドだから。

5.Expert Advisorとスクリプトはそれぞれ別のスレッドで動作するため、前言はExpert Advisorとスクリプトには関係ありません。

このような細かい注意喚起をもっと送ってくださいありがとうございました。

 
Slava:

思い出していただきたいのです。

4.すべての時系列は、低いものから高いものへと順番に処理されます。最初にティックアプリケーション、次にこのタイムシリーズで作成されたすべての指標の計算を行います。M1で動作するインジケーターから同じH1シンボルのデータを要求している場合、適用されたティックでデータを取得することはありません。どんなトリックを施しても、データは必ず1ティック戻る。連続したタイムフレーム処理で1シンボルにつき1スレッドだから。

5.EAとスクリプトはそれぞれ別のスレッドで動作するため、前言は当てはまらない。

M1で動作するEAがM1(または他のTF?)で上位TFからデータを取得するインジケータを使用する場合、新しいバーの最初のティックで、上位TFの計算キューがnティック後に到達するため、いかなる場合でも実際の値を返すことはできないということですね?

単純にそのような挙動に直面し、インジケータに問題がないかと探していたところ、そうであるべきだということがわかりました。しかし、もしそうであれば、OHLCモードでテストする際に重要ないくつかのティックをスキップしなければならないため、テストに強い支障をきたします。

 
Slava:

2.シンボルストリームは、グラフを処理するのではなく、時系列を処理します。つまり、CopyRatesリクエストに渡されるデータ配列そのものが

....

4.すべての時系列は、低いものから高いものへと順番に処理されます。最初にティックを適用し、次にこの時系列で作成したすべての指標を計算します。M1で動作するインジケーターから同じH1シンボルのデータを要求している場合、適用されたティックでデータを取得することはありません。どんなトリックを施しても、データは必ず1ティック戻る。連続したタイムフレーム処理で1シンボルにつき1スレッドだから

TFを切り替えると黒い「Update」画面が表示されるのはなぜですか?

以前使っていたチャート(EURUSDのH1)を開き、インジケータを放置して2~3分何もせず、下のチャート(M30...M1)に切り替えると、黒い画面「Update」が10秒ほど表示されることがあります。

この黒い画面はビルドに依存します - 端末が黒い画面なしで、それが本当に私を悩ますとき、あなたは正確にどのような履歴がロードされて知っているので、あなただけの端末にグラフをレンダリングする必要があり、なぜこの黒い画面を待つことができます


例えば、M5上で動作しているインジケータを30分ごとにH1上で呼び出す場合、CopyBuffer()は常にH1から正しいデータを取得するのでしょうか?

とは限らないので、H1では1ティック ごとに「インジケータを引く」(接続の切断はまだ考慮されていない)

 

あるループ/関数の変数を別の関数で処理するには?

は、よりグローバルな視認性を実現することができるのでしょうか?

 
Igor Makanu:

TFを切り替えると、黒い「Update」画面が表示されるのはなぜですか?

以前使っていたチャート(EURUSDのH1)を開き、インジケータを投げて2~3分何もせず、下のチャート(M30・・・M1)に切り替えると黒い画面の「リフレッシュ」が10秒ほど表示される場合があります。

そして、この黒い画面は、ビルドに依存します - 端末が黒い画面なしで、それが本当に私を悩ますとき、あなたは正確にどのような履歴がロードされている知っているので、あなただけの端末にチャートをレンダリングする必要があり、なぜこの黒い画面を待っています。


例えば、M5上で動作しているインジケータを30分ごとにH1上で呼び出す場合、CopyBuffer()は常にH1から正しいデータを取得するのでしょうか?

または事実ではない、したがって、すべてのティック(我々はまだ接続の破損のバリエーションを考慮していない)でH1の "インジケータを引っ張る" 。

スラバの言葉からすると、事実無根だと思うのですが。

すべての計算はティックにのみ行われるため、紐付けられた指標の連鎖が完了せず、次のティックを待たなければならない場合があります。

しかし、いくつかの興味深い問題があり、その答えはドキュメントには載っていないのです。

ティックが発生しない場合(例えば週末)、どうすればいいのでしょうか? 現在のタイムフレームで動作するインディケータを配置した場合、問題なく描画され、興味深いことに、受信するティックを必要としません!しかし、インディケータが他のタイムフレームからデータを要求すると、新しいティックが来るまでは何もしません、週末には、ティックが来ていません!ティックを受信するために必要なのは、そのタイムフレームで動作することです。

タイマーでChartRedraw (ChartID ()) を呼び出すと、あるComment (cnt); でcntが1ずつ増加するため、cntは画面上で正しく動作しているが、インジケータが描画 されていないことがわかる。

コンテキストメニューのRefreshボタンで画面を更新すると、インジケータが最初から最後まで再描画されます。

しかし、コンテキストメニューからUpdateで画面を更新した途端、インジケータが最初から最後まで楽しく描画されるようになりました


HH 2番目のインジケータの例は動作しますが、Expertのコードの方が速いです。

 
Andrey Dik:

現在のTFで動作するインジケータを置くと、問題なく描画され、興味深いのは、このためにティックの到着を必要としないことです。

には及ばない

つまり、最初のOnCalculated()はティック受信の前に呼び出され、そのためprev_calcは0と 比較される必要があります。

アンドレイ・ディク

ChartRedraw()とボタンによるUpdateは、逆に考えても同じものではないことがわかりました。

パラメータにNULLと 現在の期間を指定してChartSetSymbolPeriod()を使用するとよいでしょう。

 
Igor Makanu:

NULLと 現在の期間をパラメータとしてChartSetSymbolPeriod()を使用するとよいでしょう。

ChartSetSymbolPeriod(チャートセット・シンボル・ピリオド

同じシンボルとタイムフレームでChartSetSymbolPeriodを呼び出すと、チャートを更新することができます(ターミナルのRefreshコマンドと同様です)。チャートの更新は、それに付随する指標の再計算をトリガーします。そのため、ティックのない時間帯(週末など)でも、チャート上でインジケーターの再計算を行うことができます。

また、今思い出したのですが、プーシキンがよく言っていた言葉です。

Oh, how many wondrous discoveries
Prepareourenlightened spirit
And experience, the son of hard errors,
And genius, the friend of paradoxes,
And chance, God the inventor.

 
Andrey Dik:


ティックが来ない時(例えば週末)の対処法 現在のタイムフレームで動作するインディケータであれば、問題なく描画されますし、興味深いことに、ティックが来る必要はありません!しかし、インディケータが他のタイムフレームからデータを要求する場合、新しいティックが来るまで何もできませんし、それは週末に来ることはありません!ティックが来ない時、どうするのですか?


もう一方のタイムフレームからは、その時点で用意されているデータを取得する。そのため、出力ではすべてのデータが完全に同期されます