算法、解决方法、其性能的比较 - 页 22

 

更新至2269年。一个大型(非合成)EA的分析器结果。


测试员



虚拟的


可能是剖析器做出了错误的测量。否则,事实证明,OrderSend 5平均需要912毫秒。

 

任何通过相同算法(例如通过NormalizeDouble)归一化的二维码都可以直接相互比较。


这个明显的事实使得在许多情况下可以避免昂贵的实数比较结构。这在某些任务中可能会显著提高性能。

也许这些任务中最有典范意义的是Tester。让我们通过实例来分析一下。


有BuyLimit。在每个tick,测试者必须比较BuyLimit和Ask价格。目前,标准测试器是这样做的

if (NormalizeDouble(BuyLimit_Price - Ask , Symbol_Digits) >= 0)
  BuyLimit -> Buy;


也就是说,任何交易水平(挂单 或SL/TP)都会触发一次规范化。


但是,如果价格事先已经被规范化(在回测之前),我们总是可以通过一个非常有效的比较结构来实现。

if (BuyLimit_Price >= Ask)
  BuyLimit -> Buy;


让我们试着做个比较。我在Tester中通过Virtual运行了这个机器人。

#include <MT4Orders.mqh>

#define  VIRTUAL_TESTER // Запуск в виртуальном торговом окружении
#include <fxsaber\Virtual\Virtual.mqh>

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

input int inAmountOrders = 10;
input int inFakeRange = 0;

void OnTick()
{
  static bool FirstRun = true;
  
  if (FirstRun)
  {
    for (int i = 0; i < inAmountOrders; i++)    
      OrderSend(_Symbol, OP_BUYLIMIT, 0.1, Ask - 10000 * _Point, 0, 0, 0);
      
    FirstRun = false;
  }
}


通过规范化进行价格比较。

pass 0 returned result 100000.000000 in 0:00:01.578
pass 1 returned result 100000.000000 in 0:00:00.759
pass 2 returned result 100000.000000 in 0:00:00.894
pass 3 returned result 100000.000000 in 0:00:00.769
pass 4 returned result 100000.000000 in 0:00:00.806
pass 5 returned result 100000.000000 in 0:00:00.772
pass 6 returned result 100000.000000 in 0:00:01.253
pass 7 returned result 100000.000000 in 0:00:01.200
pass 8 returned result 100000.000000 in 0:00:01.089
pass 9 returned result 100000.000000 in 0:00:00.780
pass 10 returned result 100000.000000 in 0:00:01.258
optimization finished, total passes 11
optimization done in 0 minutes 11 seconds
shortest pass 0:00:00.759, longest pass 0:00:01.578, average pass 0:00:01.014


没有规范化。

pass 0 returned result 100000.000000 in 0:00:01.743
pass 1 returned result 100000.000000 in 0:00:00.844
pass 2 returned result 100000.000000 in 0:00:00.672
pass 3 returned result 100000.000000 in 0:00:00.817
pass 4 returned result 100000.000000 in 0:00:00.635
pass 5 returned result 100000.000000 in 0:00:00.604
pass 6 returned result 100000.000000 in 0:00:00.867
pass 7 returned result 100000.000000 in 0:00:00.611
pass 8 returned result 100000.000000 in 0:00:00.899
pass 9 returned result 100000.000000 in 0:00:00.649
pass 10 returned result 100000.000000 in 0:00:00.742
optimization finished, total passes 11
optimization done in 0 minutes 09 seconds
shortest pass 0:00:00.604, longest pass 0:00:01.743, average pass 0:00:00.825


我们可以看到,如果我们在比较价格时不做归一化处理,收益就会超过20%。


因此,如果内部测试人员改用归一化的价格,并且在比较价格时不做内部归一化,就可以实现性能的严重改善。

 
在不进行矩阵运算的直接赋值后,也
 
TheXpert:
在没有垫子的直接分配后。 业务也

当然,前缀会复制数字的字节表示法而不改变。

 

为了清楚起见,我们是否应该进行超过一秒钟的测试?

在一个版本中,有3次传播:最短的传球0:00:00.604,最长的传球0:00:01.743。我们怎么比较?

 
Andrey Khatimlianskii:

为了清楚起见,我们是否应该进行超过一秒钟的测试?

在一个版本中,有3次传播:最短的传球0:00:00.604,最长的传球0:00:01.743。我们怎么比较?

当然,是比较最短的。我已经习惯了在过滤的蜱虫上比赛。稍后将准备未经过滤的。

 
fxsaber:

当然,是比较最短的。

为什么?优化并不包括单次通过。如果平均水平相差不大,那么一次就这么快,又有什么区别呢?


fxsaber:

我已经习惯了在过滤的蜱虫上比赛。我以后会准备未经过滤的。

我可以只做一个较长的间隔。至少有30秒的测试时间。

 
Andrey Khatimlianskii:

为什么?这并不像优化包括一个通道。如果平均水平相差不大,那么一次就这么快,又有什么区别呢?

该参数已被优化。

input int inFakeRange = 0;

而且这并不影响逻辑。这就是为什么它是最短的。

 
fxsaber:

该参数已被优化

而且这并不影响逻辑。这就是为什么它是最短的。

EA的逻辑与此有什么关系?我们正在测量测试器的速度。

 
Andrey Khatimlianskii:

EA的逻辑与此有什么关系?我们正在测量测试器的速度。

这就是一个代理人的工作方式,它连续计算同一事物。如果你去掉所有的随机性,净性能接近于最短。