ライブラリ: Init_Sync - ページ 2

 
fxsaber:

危険な例は見つからなかった。

私の記憶では、#includeが存在するにもかかわらず、コードのどこを探してもユーザーから呼び出されないようなライブラリはこれだけだ。

さて、このライブラリの主なものは、標準関数のトリッキーなオーバーライドである。これは暗黙の呼び出しであることがわかる。

私は、変更とコード・サポートの観点から、その危険性をお伝えしているのです。これらの暗黙のオーバーライドはすぐに忘れ去られ、プラットフォームが変わったりシンクロナイザーが壊れたりしたときに、それを検出するのが非常に難しくなる。しかし、それでも、これが突飛な状況であることには同意する。一般的には、このアイデアは非常に独創的で賢明だ。実際、呼び出しなしでライブラリを接続するだけで、非常に便利な結果を得ることができる。

 
fxsaber:


ところで、コードをありがとう。たくさんの貴重なことを学んだし、面白いアイデアももらったよ。
 
遅延時間の測定
    static const ulong StartTime = GetMicrosecondCount();    

// if (FirstRun && (!::GlobalVariableCheck(INIT_SYNC::InitSync.GlobalName)))
    if (FirstRun && (!INIT_SYNC::ResourceCheck(INIT_SYNC::InitSync.GlobalName)))
    {
// FirstRun = (::GlobalVariableSet(INIT_SYNC::InitSync.GlobalName, 0) == 0);
      FirstRun = !INIT_SYNC::ResourceCreate(INIT_SYNC::InitSync.GlobalName);

      if (!FirstRun)
      {
        Print(GetMicrosecondCount() - StartTime);

TF切り替え時に300msに達することがある。これは "コールド "の場合ではない。ホット」端子でも時々遅くなることがわかった。

おそらく、このことをSDに書いて修正すべきだろう。

 

残念ながら、私には理解できない。私のテストでは、シーケンスは乱れていません。

DeInitとInitは期待通りに実行されている。それ以外は疑わしい。


だから、このコード例は何をしようとしているのだろう!

 

このようなことは時々起こるが、常に起こるわけではなく、また必ずしも起こるわけでもないと思う。

これはおそらく「スレッドレース」によるもので、何がいつ、どのような順序で実行されるかを決定することはできません。

私は以前、次のようなアイデアを思いつきました(MT4で、しかしMT5でも動作するはずです)。

   int lastPing = TerminalInfoInteger(TERMINAL_PING_LAST);

サーバーへの接続の中断を使用することを考えましたが、それは不可能でした!

pingテストはターミナルによって独自のスレッドで実行されるため、このコマンドがOnCalculate()またはOnTick()の一番最初であっても、過少計算が正しく表示されるとは限りません。

もしpingテストがほんの1ミリ秒前に実行されたのであれば、すべて問題ないと表示されます :(

ランディングケーブルを引っ張って試してみてください。

私の提案は、スレッドを変更するか(おそらく難しい)、EAやインジケータから 最後の2、3回のpingテストを提供するか(簡単でしょう)、中断を超簡単に認識できるようにすることです:そんなつもりはありません。

 
Otto Pauser:

残念ながら、私には理解できない。私のテストでは、シーケンスは乱れていません。

DeInitとInitは期待通りに実行されている。それ以外は疑わしい。


このコード例は何をするものなのでしょうか!

このインディケータを起動し、時間枠やシンボルを変更すると、ジャーナル内の文字列「Init」と「Deinit」の順序に乱れが生じます。
 

別のMT5インジケーターの特異性のごった煮


ライブラリソースに非常に微妙な点がある。

  static string GetMyUniqueName( void )
  {
    const int handle = GetMyHandle();

    MqlParam Params[];
    ENUM_INDICATOR Type;

    const int Total = ::IndicatorParameters(handle, Type, Params);
    ::IndicatorRelease(handle);

    uchar Bytes[];

    for (int i = 1; i < Total; i++)
    {
      ::ArrayCopy(Bytes, _R(Params[i].double_value).Bytes, ::ArraySize(Bytes));
      ::ArrayCopy(Bytes, _R(Params[i].integer_value).Bytes, ::ArraySize(Bytes));
      ::ArrayCopy(Bytes, _R(Params[i].string_value).Bytes, ::ArraySize(Bytes));
    }

    return("::" + (string)::ChartID() + (string)INIT_SYNC::crc64(Bytes) + ::MQLInfoString(MQL_PROGRAM_NAME));
  }


それはハイライトされた行で、これは必須なのだが、その理由を言葉で説明するのは難しい。

削除済み  

こんにちは、@fxsaber。あなたのライブラリを使おうとすると、次のようなエラーが出ます。


どうすれば解決できますか?

 
Paul Carissimo:

こんにちは、@fxsaber。あなたのライブラリを使おうとすると、次のようなエラーが出ます。

どうすれば解決できますか?

説明をよく読んでください。