MT5和速度在行动 - 页 46

 
Renat Fatkhullin:

毫秒计时器已经存在很长时间了: EventSetMillisecondTimer()

你完全脱离了这个圈子。假设你需要在OnTick中建立两个头寸。第一个OrderSend是几毫秒的时间。在这之后,你需要做一个快照。然后应该调用第二个OrderSend。

只有OnTick可以执行数百毫秒。你建议拍一些OnTimer的快照。

 
Renat Fatkhullin:

计量库本身也有问题。有很多不必要的东西,包括开销。

演播室里的争论!

 
Renat Fatkhullin:

这是我的代码和稳定的运行时间:在20个图形上没有数百或数千微秒的并行运行时间

你有多少个核心,什么样的处理器? i7-2600?

8个核心。

2020.10.06 02:27:59.464 Terminal        MetaTrader 5 x64 build 2630 started for MetaQuotes Software Corp.
2020.10.06 02:27:59.465 Terminal        Windows 10 build 19042, Intel Core i7-2700 K  @ 3.50 GHz, 7 / 15 Gb memory, 19 / 29 Gb disk, IE 11, Admin, GMT+3

隐蔽的压力测试再次以数百万的请求并行进行?

告诉过你很多次,战斗顾问。尽可能地减少了通话次数。理论上(我没有测量过),每个OnTick最多有10次调用。


要更加透明。仅仅因为你贴出了几个简单的_B电话,并不能证明你的其他主张。你一提出离谱的要求,就突然忘记了代码和条件的实际描述。

你不需要在头脑中想象什么--告诉并展示你实际调用和测试的东西。不是 "运行了一个未知的压力测试并等待警报来显示世界 "的撕掉的结果,而正是测试的完整代码。

我公布了实时EA的结果。那里有70个mqh文件,包括WinAPI。如果你真的理解了,而不是只言片语,我就给你源代码。你会很快重现刹车的效果。

 
fxsaber:

你完全脱离了这个圈子。假设你需要在OnTick中开设两个头寸。第一个OrderSend是几毫秒的时间。在这之后,你需要做一个快照。然后应该调用第二个OrderSend。

只有OnTick可以执行数百毫秒。你建议拍一些OnTimer的快照。

我没有建议抢购,我直接回答了一个关于毫秒计时器 的问题。

它是存在的,尽管在当前的测试器中,它仍然在1秒内被触发。在我们正在编写的新测试器中,我们将尝试改变这一点。
 
fxsaber:

8个核心。

多次说到战斗顾问。尽可能地减少了通话次数。理论上(我没有测量过),每个OnTick最多可有10次调用。


我正在公布专家顾问的结果。那里有70个mqh文件,包括WinAPI。如果你不只是谈论它,而是真正理解它,我将给你源代码。你会很快发挥出刹车的作用。

我们会搞清楚的,给我们源代码。
 
fxsaber:

桌子上的争论!

你的 整个基准 有太多的垃圾,事实上这里有一个干净和可理解的(不像你的杂乱的代码)版本。


//--- benchmark macros
#define _B(_function,_alert_interval)               \
          {                                         \
           ulong _latency=GetMicrosecondCount();    \
           _function;                               \
           _latency=GetMicrosecondCount()-_latency; \
           if(_latency > _alert_interval)           \
              ::Alert("Time[" + __FILE__ + " " + (string)__LINE__ + " in " + __FUNCTION__+ ": " + #_function + "] = " + (string)_latency + " mсs"); \
          }



//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   MqlTick Tick;
   
   _B(SymbolInfoTick(_Symbol,Tick),0);
   _B(SymbolInfoTick(_Symbol,Tick),0);
  }

你的问题是什么。

  1. 看不懂的代码

  2. 绑定到一个有大量开销的类中

  3. 在堆栈中存储50个结果的成本
      static bool Set( const string Str )
      {
        if (BENCHMARK::Amount == BENCHMARK::ReserveSize)
          BENCHMARK::ReserveSize = ::ArrayResize(BENCHMARK::Bench, BENCHMARK::ReserveSize + BENCHMARK_RESERVE);
    
        BENCHMARK::Bench[BENCHMARK::Amount++].Set(Str);
    
        return(true);
      }
    
  4. 采取的结果 - 一个坚实的开销和对象绑定中的垃圾
      static ulong Get( const uint AlertInterval = 0 )
      {
        const int Pos = BENCHMARK::Amount - 1;
        const ulong Res = (Pos < 0) ? 0 : BENCHMARK::Bench[Pos].Get();
    
        if (Pos >= 0)
        {
          if (AlertInterval && (Res > AlertInterval))
            ::Alert("Time[" + BENCHMARK::Bench[Pos].Str + "] = " + (string)Res + " mсs.");
    
          BENCHMARK::Amount = Pos;
        }
    
        return(Res);
      }
    


我希望你没有禁用测试的代码优化

我是指metaeditor.ini中的全局参数Optimize=0

 
Renat Fatkhullin:

你的 整个基准 有太多的垃圾,事实上这里有一个干净和可理解的(与你的杂乱的代码相比)版本。

不幸的是,你的版本处于理解便利性的早期阶段。方便的是当你可以这样做的时候。

关于交易、自动交易系统和策略测试的论坛

图书馆:标杆

fxsaber, 2020.10.01 23:49

现在我们试图找出标准变体中的打嗝之处。我们在源代码中添加一些符号。

    for (long Chart = _B2(::ChartFirst()); (Chart != -1) && !Res; Chart = _B2(::ChartNext(Chart)))
      Res = (Chart != chartID) && _B2(::ChartGetInteger(Chart, CHART_IS_MAXIMIZED));

并立即看到了原因。

2020.10.02 00:45:14.113 Alert: Time[Test9.mq5 36 in IsInvisible: ::ChartGetInteger(Chart,CHART_IS_MAXIMIZED)] = 878 mсs.
2020.10.02 00:45:14.114 Alert: Time[Test9.mq5 36 in IsInvisible: ::ChartGetInteger(Chart,CHART_IS_MAXIMIZED)] = 943 mсs.
2020.10.02 00:45:14.114 Alert: Time[Test9.mq5 36 in IsInvisible: ::ChartGetInteger(Chart,CHART_IS_MAXIMIZED)] = 297 mсs.
2020.10.02 00:45:14.116 Alert: Time[Test9.mq5 36 in IsInvisible: ::ChartGetInteger(Chart,CHART_IS_MAXIMIZED)] = 1787 mсs.
2020.10.02 00:45:14.116 Alert: Time[Test9.mq5 35 in IsInvisible: ::ChartNext(Chart)] = 2 mсs.
2020.10.02 00:45:14.117 Alert: Time[Test9.mq5 36 in IsInvisible: ::ChartGetInteger(Chart,CHART_IS_MAXIMIZED)] = 980 mсs.
2020.10.02 00:45:14.117 Alert: Time[Test9.mq5 35 in IsInvisible: ::ChartNext(Chart)] = 2 mсs.
2020.10.02 00:45:14.117 Alert: Time[Test9.mq5 36 in IsInvisible: ::ChartGetInteger(Chart,CHART_IS_MAXIMIZED)] = 59 mсs.
2020.10.02 00:45:14.118 Alert: Time[Test9.mq5 36 in IsInvisible: ::ChartGetInteger(Chart,CHART_IS_MAXIMIZED)] = 803 mсs.
2020.10.02 00:45:14.119 Alert: Time[Test9.mq5 36 in IsInvisible: ::ChartGetInteger(Chart,CHART_IS_MAXIMIZED)] = 1059 mсs.

CHART_IS_MAXIMIZED对别人的图表来说太慢了。错误报告已经准备好了!与图书馆的合作非常容易。


有什么问题呢。

  1. 不可读的代码

  2. 捆绑在一个有大量开销的班级中

  3. 堆栈存储成本的50个结果
  4. 得到的结果 - 一个巨大的开销和对象绑定的垃圾

可用性超过了微薄的开销。如果你仔细看一下它是如何实施的,那就很悲惨了。例如,ArrayResize是一个开销,所以要尽量减少它的使用。

我希望你没有禁用测试的代码优化

我是指metaeditor.ini中的全局参数Optimize=0

对慢速模式不感兴趣。我在看战斗EA的性能,当然也注意算法优化和编译器优化。

 
Renat Fatkhullin:

你的 整个基准 有太多的垃圾,事实上这里有一个干净和可理解的(不像你的杂乱的代码)版本。

你有什么问题。

  1. 不可读的代码

  2. 与一个有大量开销的班级相联系

  3. 堆栈存储成本的50个结果
  4. 获取结果--对象绑定中的所有开销和垃圾


我希望你没有禁用测试的代码优化

我是指metaeditor.ini中的全局参数Optimize=0

这里是C风格,它很简单,而且真的没有垃圾。谢谢你的例子。

一位C语言老师建议最好不要在用户名中使用下划线_B
,因为这个前缀是由库、程序等的开发者使用的。
,而且不要遇到重叠的情况,他建议最好不要使用它。

在mql5中是否有可能与你的名字重叠?
或者说,自定义的名字完全被屏蔽在MQ的名字之外?

 
Roman:

一位C语言老师建议不要在用户名中使用下划线_B
,因为这个前缀被图书馆、软件等的开发者使用。
,而且为了避免重叠,他建议不要使用。

在C语言中,以"_"开头的名称被用作服务、系统或特殊名称。在这种情况下,我认为这是可以允许的。因为这个功能是用于代码维护和检查的。

 
Edgar Akhmadeev:

以"_"开头的名称在C语言中被用作服务、系统或特殊名称。在这种情况下--可以接受,我想。因为这个功能是用于代码维护和检查的。

这就是问题所在,除了mql5,还有开发者的MQ服务名称。