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

 
Roman:

ありがとうございます、これで理由がわかりました。
システムタイマーステップは、やはり15.625の倍数になります

追加されました。
しかし、Wine apiの関数timeBeginPeriod(1)のシステムタイマーの周期を変更しました。
つまり、システムタイマーを1ミリ秒にインクリメントするようにしました。
そして、システムタイマーのステップは1ミリ秒でいいんですよね?
コメント内のカウンターがフリーズしたままなのはなぜですか?
https://rsdn.org/forum/winapi/4159851.1
 
また、Wine下のLinuxでは、コメント中のカウンタはEventSetMillisecondTimer(1)でも支障なく動いています。
しかし、プロセッサの負荷は8スレッドで最大40%まで増大する。
一般的には、話題を閉じて、オフトピック ))
 
Roman:
また、Wine下のLinuxでは、EventSetMillisecondTimer(1); でも、CPU負荷は最大40%まで上昇し、CPUスレッドは8つです。

そういうことなんだ...。
なぜ1秒間に64回なのか?
いろんな情報を画面に表示できるようにするためだと思います。周波数はこれで十分です。これ以上頻繁に展示しても意味がないし、お金もかかる。
OnChartEvent、OnCalculate、OnTickも同様に1秒間に64回トリガーされるのでしょうかね。- そう思います、はい。

 
Nikolai Semko:

そういうことなんだ...。
なぜ1秒間に64回なのか?
いろんな情報を画面に表示できるようにするためだと思います。周波数はこれで十分です。これ以上頻繁に展示しても意味がないし、お金もかかる。
OnChartEvent、OnCalculate、OnTickも1秒間に64回生成されているのでしょうかね。

ここでのポイントは、負荷ではなく、OnTimer()ハンドラの能力にありました。
Windowsはこの能力を制限していますが、Linuxは制限していないことが判明しました。

質問、OnChartEvent、OnCalculate、OnTickも1秒間に64回までしか生成されないのでしょうか?
開発元からの回答を待ったほうがいいかもしれませんね。

 
Roman:

質問ですが、OnChartEvent、OnCalculate、OnTickも1秒間に64回までしか発生しないのでしょうか?
開発元からの回答を待ったほうがいいかもしれませんね。

マウスでOnChartEventを確認
最大で124ヘルツの周波数が出ました。もういいや。なんで128じゃないんだろう。

ファイル:
 
Nikolai Semko:

マウスでOnChartEventを確認。
最大周波数は124ヘルツです。それ以上はない。なぜ128でないのか不思議です。

アルゴリズムを少し変更しました。コメントで時間を食うことを考慮していない。127Hzになりました。
もう論理的ですね。1Hzの誤差は、すでにプログラム自体で説明できますので、128を少し外れたということです。

そのため、OnChartEventの 最大周波数は128Hzとなります。

ファイル:
 
MQL5を使用して合成スプレッドを取得することは可能ですか?
端末自体に合成樹脂のスプレッドがあります。
 
Aidas Geguzis:
MQL5を使用して合成スプレッドを取得することは可能ですか?
端末自体に合成樹脂のスプレッドがあります。

サードパーティ製プログラムの場合、カスタムシンボルは オリジナルのものと最小限の違いで済みます。だから、何の障害もないはずです。

 
カスタム商品がターミナルインターフェースを通じて作成され、カスタムシンボルが 負の値を持つ場合
カスタムシンボルのインターフェースで、負の価格を許可する必要があります。
この設定をしない場合、作成されたシンボルの履歴は計算されず、チャートは現在の瞬間からしか表示されません。
ジャーナルにマイナス価格を有効にすべきとの警告が表示されないため、履歴が計算されない理由が長い間分かりませんでした。
ログにそのような警告が表示されると良いですね。
 

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

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)
  {
    _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);
}

どうしたんですか?具体的にどのダニが叱られているかは、どうすればわかるのですか?ログへの配列の出力 - 時系列違反はありません。