程序库: 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 时,延迟时间有时长达 300 毫秒。而且这不是在 "冷 "状态下。原来,即使是 "热 "终端有时也会变慢。

也许,我应该把这个问题写给 SD 来解决。

 

遗憾的是,我无法理解这一点。在我的测试中,顺序没有被打乱。

DeInit 和 Init 都按预期执行。其他任何情况都值得怀疑。


所以我想知道这段代码示例应该做什么!

 

我怀疑有时会出现这种情况,但并不总是,也不一定。

这可能是由于 "threadrace"(线程竞赛)的缘故,而且无法确定什么时候以什么顺序执行。

我曾有过这样的想法(在 MT4 中,但在 MT5 中也应该可行)

   int lastPing = TerminalInfoInteger(TERMINAL_PING_LAST);

中断与服务器的连接--不可能!

由于 ping 测试是由终端在自己的线程中执行的,因此无法确定这条命令(即使它是 OnCalculate() 或 OnTick() 中的第一条命令)是否会正确显示计算不足。

如果 ping 测试是在一毫秒前执行的,则会显示一切正常:(

拉一下着陆电缆试试看...

我的建议是,要么改变线程(可能很难),要么提供 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,我在尝试使用您的程序库时出现了以下错误

如何解决?

请仔细阅读说明。