カスタムシンボル。エラー、バグ、質問、提案。 - ページ 27

 
Stanislav Korotky:

空の新しいカスタムシンボルに1対1のティック(特にMQ DemoのEURUSDから)を追加すると、エラー5310(すぐにではなく、任意の日付からのループで)が発生します。

どうしたんですか?具体的にどのダニが叱られているかは、どうすればわかるのですか?ログに配列を入れる-そこに時系列違反はない。

ティックコピーのチェックを入れてみてください。
ティック処理のリアルタイムデータでインジケータを使用していますが、CopyCloseをコピーすると、コピーエラーが発生することがあります。
何が原因なのかがわからない。もしかしたら、あなたの場合、コピーミスかもしれません。

また、CopyTicksでは、大量のticks Limitをコピーし、whileループで、つまり繰り返しごとにticksの大きな配列をコピーしています。
そしてCustomTicksAddでは、同じように大量のtickを配列に渡します。
1ティックをコピーして、1ティックをパスするようにしてください。
whileループで動作している。

input int Limit = 10000;
input datetime Start = D'2020.06.01';

int fillArray(ulong &_start)
{
  MqlTick array[];
  int size = CopyTicks(_Symbol, array, COPY_TICKS_ALL, _start, Limit);

  if(size <= 0) 
  {
     Print("Ошибка копирования ценовых данных "+_Symbol+" "+(string)size+" ",GetLastError());
     return(size);
  }

  if(size > 0)
  {
    _start = array[size - 1].time_msc + 1;
    if(CustomTicksAdd(symbolName, array) == -1)
    {
      Print("Error:", GetLastError());
      return(-1);
    }
  }
  return(size);
}

...
{
  ulong startMsc = (ulong)Start * 1000;
  while(fillArray(startMsc) > 0);
}
追加されました。カスタムシンボルとは関係ありません。

インターネット接続が数秒間切断され、接続後にコピーエラー 4401The requested history was not found
不思議なことに、期間M5はまだ新しいバーに変わっていないのに、エラーが出たのです。
 
Roman:

コピーチックなチェックを入れてみてください。
ティック処理のリアルタイムデータのインジケーターで、CopyCloseをコピーすると、コピーエラーが発生することがあります。
何が原因なのかがわからない。もしかしたら、あなたの場合、コピーミスかもしれません。

また、CopyTicksでは、大量のticks Limitをコピーし、whileループで、つまり繰り返しごとにticksの大きな配列をコピーしています。
そしてCustomTicksAddでは、同じように大量のtickを配列に渡します。
1ティックをコピーし、1ティックをパスしてみてください。

コピーエラーはなく、コードはコピーされたティックの数(サイズ)の正常な値を取得し、配列は常に正常なデータで満たされています。リミット値は変更可能ですが、1~数千までの任意の意味のある値でエラーが発生します。一度にすべての目盛りをコピーすることは(いくつかのコードのように)明らかに間違っています。なぜなら、メモリ割り当て エラーが発生し、ユーザーに進行状況を示すことができずに長時間スレッドをロックする可能性があるからです。また、1枚はともかく、10枚という小ロットでダニをコピーすると、全体の処理速度が遅くなり、これは許せません。

提案するバリエーションは最適です。また、誰かにとっては議論の余地があるとしても、形式的にはコードが正しく(あるいは私が間違っているところを引用して)、現在の動作はエラー、すなわちコード5310なしでティックを追加しなければなりません。

また、ダニデータベースのクリアについては、まだ長年の問題が残っています。CustomTicksDelete(symbolName, 0, LONG_MAX)を呼び出すと、すべてのティックを削除しようとせず、一部を残す(常時ではなく、たまに観測される)。Expert Advisor を再起動すると、カスタムシンボルは完全にクリアされます。CopyTicksの場合と同様に、エラーはありません。

 
OnTickイベントを増やさずにtickを書きたい場合は、別の関数を使用した方がよいかもしれません。
 
Stanislav Korotky:

もしかしたら、パックの接合部に同じmsの刻みがあり、これがエラーとしてカウントされるのでしょうか?

推測に過ぎない

 
Andrey Khatimlianskii:

もしかしたら、パックの接合部に同じmsの刻みがあり、これがエラーとしてカウントされるのでしょうか?

あくまで推測ですが。

コードから、ティックが重複していることがわかります。この場合、ティックのフラグは互いに対応しない場合があります。

 
fxsaber:
OnTickイベントを増やさずにtickを書き込む必要がある場合は、別の関数を使用した方がよいかもしれません。

私もそう思います。試してみます。でも、今のやり方がダメな理由はないと思うんです。

 
Stanislav Korotky:

コピーエラーはなく、コードはコピーされたティックの数(サイズ)の正常な値を取得し、配列は常に正常なデータで満たされています。Limitは変更可能ですが、1~数千までの任意の意味のある値でエラーが発生します。一度にすべての目盛りをコピーすることは(いくつかのコードのように)明らかに間違っています。なぜなら、メモリ割り当て エラーが発生し、ユーザーに進行状況を示すことができずに長時間スレッドをロックする可能性があるからです。また、10個という小ロットでダニをコピーすると(1個はともかく)全体の処理速度が遅くなる。

提案するバリエーションは最適です。また、誰かにとって疑問であっても、形式的にはコードが正しく(または私が間違っているところを引用して)、現在の動作はエラー、すなわちコード5310なしでティックを追加する必要があります。

また、ダニデータベースのクリアについては、まだ長年の問題が残っています。CustomTicksDelete(symbolName, 0, LONG_MAX)を呼び出すと、すべてのティックを削除しようとせず、一部を残す(常時ではなく、たまに観測される)。Expert Advisor を再起動すると、カスタムシンボルは完全にクリアされます。CopyTicksの場合と同様に、エラーはありません。

err_custom_ticks_wrong_order

5310

時間順でない刻みの配列


次のイテレーションで既に存在するものを上書きするため、大きなバッチでテロップを削除する時間がない可能性があります。
つまり、配列として重ね合わせながら、遅延なく飛んでいくので、別のパックが来てもメモリがクリアされる暇がないのです。
そのため、1ティックずつ追加することを提案したのですが、1ティックずつコピーして問題ありませんでした。

ティックデータベースのクリアについては、私はこの場合、定数LONG_MAXが好きではありません。
CustomTicksDelete関数のヘルプには、「削除する価格履歴の指定範囲内の最後のティックの時間」とあります。1970年01月01日からのミリ秒単位の 時間。
そして、LONG_MAXはこの値よりずっと大きい。つまり、このパラメータが設計されていない、より大きな値が渡される。
ミリ秒の桁に対応する数値、つまり13の値を使用するようにしてください。

 
fxsaber:

コードから、ティックが重複していることがわかります。この場合、ティックの素フラグが対応しない場合があります。

受信配列に重複しているティックはCopyTicksか?ダニが重複していること、同じダニでないことは、どうしてわかるのでしょうか(結局、ダニには固有の識別子がありません)。たとえ重複があっても、理論上、カットオフが等しい刻みはシーケンスを壊さない。最後に、「どうやって複製を作るのか」という疑問が湧いてきます。

 
Roman:

err_custom_ticks_wrong_order

5310

時間順でない刻みの配列


次のイテレーションで既に持っているものを上書きしているので、ティックの大きなパックは削除する暇がない可能性があります。
つまり、配列として重なり合っているのですが、それが滞りなく飛んでいる間に、別のパックが到着すると、メモリがクリアされる時間がないらしいのです。
そのため、1ティックずつ追加することを提案し、1ティックずつコピーしていきましたが、問題はありませんでした。

削除の言葉はなく、何も上書きされません。反復は重ならないように時間設定されています。常に空のカスタムキャラクター(新しいもの、またはすべてのティックの削除に成功した後のもの)になります。

 
Stanislav Korotky:

受信配列CopyTicksのTickが重複している?これが重複したティックであり、同一のティックではないことがどうしてわかるのでしょうか(結局、ティックには固有の識別子がないのです)。たとえ重複があっても、理論上、カットオフが等しい刻みはシーケンスを壊さない。最後に、「どうやって複製を作るのか」という疑問が湧いてきます。

コードをもっとよく見てみました。分けて受信する際にダニを飛ばしている。Ticks[Limit - 1].time_msc == Ticks[Limit + k], k >= 0 という状況が発生する場合があるようです。

従って、スキップして追加した場合、フラグが一致しない場合があります。


同じ時刻のヒストリカル・ティックがすべて部分の最後にあることを確認する。つまり、次のチャンクの始まりは違う時間であるべきなのです。そうしないと、カスタムに書き込む場合でも損失が発生します。

CopyTicksを使用する場合、最も簡単な方法は、受信したパックから最も長い時間を持つ極端なティックを破棄することです。そして、_startをこの時間に等しくする。