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

 
Igor Makanu:

私のコードは、あなたが書いたインジケータ#1だけが「すべてのティックに ハンマーで叩く」ことになります。

これにより、端末が独自に「より高い時間軸」を構築することが可能になります。

私にとっては、インジケータ1の完全な再計算を行うよりも「安上がり」です。これは、「高いTF」で履歴を同期するときにコードで発生します。

はい、しかし、なぜプリフォールトリセットが下位TFにあるのでしょうか?

 
Andrey Dik:

はい、しかし、なぜ下位のTFでは、prev kalkがリセットされるのでしょうか?

は0を返すからです。
 
Andrey Dik:

そうなんですが、なぜTFが低いとプリクラがリセットされるのでしょうか?

多くのバリエーションがあり、実装は不明です


昨年、MT4について同じような議論があり、開発者の一人(Slavaと思う)が、「古いTF」にアクセスするたびに、必要であればデータの同期を 開始すると言っていました...。

MT5でも必要に応じて端末が勝手にTFを構築していたと思うのですが、ネットワークの遅延があったのか・・・実装は不明です・・・。そして、ターミナルは、シニアTFのインジケータにデータを与える前に、サーバーと履歴データを同期させる、それが瞬時に起こるとき、そして、おそらく長い時間がかかるとき、それはおそらくpre_calculated = 0になるときです。

 
Igor Makanu:

選択肢は多く、実装はわからない。

ダウンロードで安値TFのヒストリカルデータが変更されると、安値TFのカウンターは端末によって強制的にゼロにされるので、いきなり問題を起こさないこと

 
Andrey Dik:

同志よ、あなたは私の主張を証明しています。

私は、コーダーとは...同志ではありません。確認ではなく、ヒントです、0を返してはいけません、それで全ての問題が解決します。あなた自身が、インジケーターの完全な再計算を引き起こしているのです。

 


prev_calculatedは実際には増加せず,常に計算終了時と同じ値になる

return(rates_total);


つまり、OnCalculated()の終了時に戻ってきたものが、次のティックでprev_calculatedに返されます(prev_calculated == 0以外、インジケータの起動時やTFの同期時に端末が行います............)。


Andrei Trukhanovich:

ダウンロードでローローTFの履歴データを変更すると、ローTFのカウンタが端末で強制的にゼロになるので、いきなりトラブルを起こさないこと

私は二日目のために彼に書いてきた - Mladenから指標を取ると、それらを勉強する - 彼らは仕事、そしてTF間の任意の複雑な同期せずに、ここで...端末にTFを形成させず、リソースを節約しています。

 
Andrei Trukhanovich:

取り替える

まで

とテストしてください。

どうせ信じてもらえないんだから・・・。

 
Alexey Viktorov:

私は......コーダーの味方ではありません。これは確認ではなく、ヒントです。0を返してはいけません。それがすべての問題の原因です。あなた自身が、インジケーターの完全な再計算を引き起こしているのです。

ヒントを出すのはバカでも、理解し説明するのは誰でもできることではありません。

 
Andrei Trukhanovich:

取り替える

まで

とテストしてください。

アンドレイさん、ありがとうございます。その問いを完全に突き詰めているのは、あなただけです。

2021.05.28 21:22:54.394 LitTF (EURUSD,M2) 期間3の指標はまだ計算されていません。

2021.05.28 21:22:54.396 LitTF (EURUSD,M2) 期間3に関する指標はまだ算出されていない。

2021.05.28 21:22:54.397 OldTF (EURUSD,M3) 0.000262 sec, 50046 bars calculated, total 50046 bars

2021.05.28 21:22:55.796 LitTF (EURUSD,M2) 0.007693 sec, 50000 bars calculated, 50000 total bars

2021.05.28 21:24:02.286 LitTF (EURUSD,M2) 期間3に関する指標は未計算

2021.05.28 21:24:02.286 OldTF (EURUSD,M3) 0.000000 sec, 1 bar calculated, 50047 bars total

2021.05.28 21:24:03.017 LitTF (EURUSD,M2) 0.000015 sec, calculated 1 bars, total bars 50001

2021.05.28 21:26:03.898 LitTF (EURUSD,M2) 0.000007 sec, calculated 1 bars, total bars 50002

指標は最初の1回だけ計算され、その後は各バーにつき1回だけ計算されます。


2つ目のインジケータの最終的なコードですが、どなたかのお役に立てれば幸いです。

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   ulong t = GetMicrosecondCount ();
   if (rates_total == prev_calculated) return rates_total;

   
   if (SeriesInfoInteger (Symbol (), OldTF, SERIES_SYNCHRONIZED))
   {
      if (iBars (Symbol (), OldTF) != BarsCalculated (Handle))
      {
        Print ("Индикатор на периоде ", OldTF, " ещё не рассчитан");
        return prev_calculated;
      }
   }
   else 
   {
     Print ("Период ", OldTF, " не синхронизирован.");
     return prev_calculated;
   }

   ArraySetAsSeries (high, true);
   ArraySetAsSeries (time, true);

   int limit = rates_total - prev_calculated - 1;

   double buff [];
   int ind = 0;
   for (int i = limit; i >= 0; i--)
   {
      ind = iBarShift (Symbol (), OldTF, time [i], false);
      if (CopyBuffer (Handle, 0, ind, 1, buff) != -1)
      {
        IBuffer [i] = buff [0];
      }
      else
      {
        Print ("Ошибка копирования буфера ", GetLastError ());
        return 0;
      }
   }

   //----------------------------------------------------------------
   double e = (GetMicrosecondCount () - t) / 1000000.0;
   Print (DoubleToString (e, 6), " sec, расcчитано ", rates_total - prev_calculated, " баров, всего баров ", rates_total);
   return(rates_total);
}
 
Andrey Dik:

どんなバカでもヒントを与えてくれるが、細かく理解して助けてくれる人はそういない。

何人の馬鹿が忠告しているか数えてみてください・・・ただ一人の賢い男は誰の声も聞かず頑固に・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・。

あなたは自分で問題を作り出し、あなたの...コードをmqlのバグとして提示しようとしています。