在MetaTrader 5策略测试器中分析测试结果并进行优化 - 页 2

 
Anatoli Kazharski:

长参数(lparam)被检查。滴答事件的标识符被包含在其中。

用户事件的 标识符(int id)等于零。

可以这样写,使之更加清晰。

我明白,一切都应该重写,以使其正常工作。我现在给你看。

 
fxsaber:

我意识到,一切都需要重写,以使其正常工作。我马上就要做了。

而我不能,因为这该死的事情正在发生。

2018.01.28 12:37:23.692 Tester  EURUSD: preliminary downloading of history ticks started, it may take quite a long time
2018.01.28 12:37:24.692 Tester  EURUSD: preliminary downloading of history ticks completed, 89 bytes in 0:00.998 (0.09 Kb/sec)
2018.01.28 12:37:24.692 Tester  EURUSD: ticks data begins from 2017.09.01 00:00
2018.01.28 12:37:24.692 Core 1  agent process started
2018.01.28 12:37:33.425 Core 1  connecting to 127.0.0.1:3000
2018.01.28 12:37:50.450 Core 1  tester agent authorization error
2018.01.28 12:37:50.456 Core 1  connection closed
而我无法让测试器运行。
 

指标

#property indicator_chart_window
#property indicator_plots 0

input long Chart = 0; // идентификатор графика-получателя события
input int Index = 0;

int OnCalculate( const int rates_total, const int prev_calculated, const int, const double &[] )
{
  if (prev_calculated)
    EventChartCustom(Chart, 0, Index, 0, NULL);
  
  return(rates_total);
}


专家顾问

#include <TesterBenchmark.mqh> // https://www.mql5.com/ru/code/18804

input int AmountSymbols = 1;

const string Symbols[] = {"EURUSD", "GBPUSD", "AUDUSD", "USDJPY", "USDCAD"};

double Sum2 = 0;

double GetBid( const string &Symb )
{
  static MqlTick Tick;

  return(SymbolInfoTick(Symb, Tick)? Tick.bid : 0);
}

void OnInit()
{
  for (int i = 0; i < AmountSymbols; i++)
    iCustom(Symbols[i], PERIOD_W1, "Spy.ex5", ChartID(), i); // MQL5\Indicators\Spy.ex5
}

void OnDeinit( const int )
{
  Print(Sum2);
}

void OnTick()
{
}

void OnChartEvent( const int id, const long &lparam, const double&, const string& )
{
  if (id == CHARTEVENT_CUSTOM)
    Sum2 += GetBid(Symbols[(int)lparam]);
}

EURUSD M1 MetaQuotes-Demo, Hedge, USD, no lag, Core1-agent only, real ticks 01.09.2017 - 28.01.2018。


一个符号

i = 0 Pass = 0 OnTester = 7.053 s.: Count = 9986677, 1415947.4 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 6.930 s.: Count = 9986677, 1441078.9 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755


两个符号

i = 0 Pass = 0 OnTester = 25.747 s.: Count = 9986677, 387877.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 26.118 s.: Count = 9986677, 382367.6 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755


三个符号

i = 0 Pass = 0 OnTester = 47.448 s.: Count = 9986677, 210476.2 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 46.994 s.: Count = 9986677, 212509.6 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755


  1. 在单符号模式下,"间谍 "比纯OnTick慢2.5倍。也就是说,空指标(建立在PERIOD_W1的基础上,所以条形历史是最小的)在测试器中有着巨大的开销。
  2. 两个符号比一个符号要慢3.5倍。
  3. 但三个符号的速度只比两个符号慢1.8倍。I.e.从二到三的过渡是由于可扩展性,而不是第2项。
 

安纳托利,我建议将该主题移至外汇专家、交易机器人和专家顾问,并将其固定在那里的顶部。

这样一来,它就会一直在人们的视野中。这里已经有很多发布的主题

 
Rashid Umarov:

安纳托利,我建议将该主题移至外汇专家、交易机器人和专家顾问,并将其固定在那里的顶部。

这样一来,它就会一直在人们的视野中。这里已经有很多发布的主题

如果这个话题可能是有用的,我并不介意。
 
fxsaber:

...

  1. 在单符号模式下,Spy比纯OnTick慢2.5倍。也就是说,空指标(建立在PERIOD_W1的基础上,所以条形历史是最小的)在测试器中有着巨大的开销。
  2. 两个符号比一个符号要慢3.5倍。
  3. 但三个符号的速度只比两个符号慢1.8倍。也就是说,从二到三的过渡是由于可扩展性。 与第2点不同的是。

你的结果是6,25,46。为什么不是6、12和18?

你必须要看一下相对于单个字符的减速情况。那么三个字符的速度几乎是一个字符的8倍,而不是预期的3倍。

问题恰恰在于此。为什么在可扩展性方面会有这样一个结果?而如果结果不能得到改善,则建议选择新的测试模式。这将解决使用多个字符时的长测试问题。

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

对MetaTrader 5策略测试器的测试和优化的分析

Anatoli Kazharski, 2018.01.27 20:15

问题。

有没有可能在MQL中创建这样的多符号专家顾问方案,以便在测试中增加符号时,测试的持续时间不会重复增加?

//---

如果这是不可能的,那么终端的开发者的选择之一就是增加一种模式,这时测试可以逐个符号 进行,而不是一次性进行所有的符号。这将在最后产生预期的测试时间。问题是,多符号的EA很多时候只是用于那些情况。

  1. 需要更多的数据进行测试。
  2. 在更多的价格行为、条件(价差、止损/限价水平)等方面测试交易算法,参数相同。

正是在这种情况下,我们需要一种新的模式,使我们能够大大减少测试的时间和优化参数。而已经为最后的测试,同时测试所有的符号。


 
Anatoli Kazharski:

你的结果是6,25,46。为什么不是6、12和18?

必须将减速与一个符号联系起来看。

两个有尖刺的角色与一个角色相比,是一个大不相同的测试者模式。因此,看一下相对于两个的可扩展性是合乎逻辑的。

此外,头顶上的指标是如此疯狂,以至于通过间谍工作是一种拐杖。等待服务,相对于只有一个符号而言,可扩展性应该是几乎完美的。正如计时器的情况一样。只有在那里,才不会出现打钩跳过的情况。

 
明显加快了
#include <TesterBenchmark.mqh> // https://www.mql5.com/ru/code/18804

input int AmountSymbols = 1;

const string Symbols[] = {"EURUSD", "GBPUSD", "AUDUSD", "USDJPY", "USDCAD"};

double Sum2 = 0;

double GetBid( const string &Symb )
{
  static MqlTick Tick;

  return(SymbolInfoTick(Symb, Tick)? Tick.bid : 0);
}

void OnInit()
{
  for (int i = 0; i < AmountSymbols; i++)
    if (Symbols[i] != _Symbol)
      iCustom(Symbols[i], PERIOD_W1, "Spy.ex5", ChartID(), i); // MQL5\Indicators\Spy.ex5
}

void OnDeinit( const int )
{
  Print(Sum2);
}

void OnTick()
{
  OnTick(_Symbol); 
}

void OnTick( const string &Symb )
{
  Sum2 += GetBid(Symb);
}

void OnChartEvent( const int id, const long &lparam, const double&, const string& )
{
  if (id == CHARTEVENT_CUSTOM)
    OnTick(Symbols[(int)lparam]);
}


一个符号

i = 0 Pass = 0 OnTester = 2.697 s.: Count = 9986677, 3702883.6 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 2.657 s.: Count = 9986677, 3758628.9 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755


两位数

i = 0 Pass = 0 OnTester = 17.632 s.: Count = 9986677, 566395.0 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 17.539 s.: Count = 9986677, 569398.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755


三个符号

i = 0 Pass = 0 OnTester = 35.639 s.: Count = 9986677, 280217.7 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 35.462 s.: Count = 9986677, 281616.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755


四个符号

i = 0 Pass = 0 OnTester = 68.459 s.: Count = 9986677, 145878.2 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 69.429 s.: Count = 9986677, 143840.1 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
 
fxsaber:

对测试人员来说,两个角色带间谍是一种与单个角色非常不同的操作模式。因此,相对于二者而言,考察可扩展性是合乎逻辑的。

此外,头顶上的指标是如此疯狂,以至于成为通过间谍工作的拐杖。等待服务,相对于只有一个符号而言,可扩展性应该是几乎完美的。正如计时器的情况一样。只有在那里,才不会出现打钩跳过的情况。

fxsaber:
明显加快了

一个符号

两个符号

三个人物

四个字符

如果我们看的是相对于两个符号的结果,那么我们把两个符号的结果除以2:17 / 2 = 8.5

然后,在添加符号时,我们用这个值乘以符号的数量,得到预期的测试时间。

  • 三个字符:8.5*3=25,实际时间为35.462
  • 四个字符:8.5*4=34,而实际时间是68.459

但无论如何,这都是迄今为止最好的结果。一个有趣的变体是在OnTick中使用当前的符号,而其余的在自定义事件中使用。

你可以在没有服务的时候使用它。

这是一个关于交易、自动交易系统和策略测试的论坛。

Init()和DeInit()执行顺序

斯拉瓦, 2017.04.14 10:18

这些服务,除其他外,将具有交易功能和管理对象的能力。还有图表。

市场数据提供者只是一种可能性。

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

Init()和DeInit()执行顺序

斯拉瓦, 2017.04.14 10:21

这些服务将有OnTick(字符串符号)。但来自一个特定符号的ticks将需要被订阅到

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

Init()和DeInit()执行顺序

fxsaber, 2017.04.14 10:46

事实证明,服务部门将拥有几乎所有的安氏功能。OnInit, OnDeinit, OnTick(string),OnTimer,OnTrade,OnTradeTransaction,OnTester, OnTesterInit, OnTesterPass, OnTesterDeinit, OnBookEvent, OnChartEvent(long ChartID, ...),OnCalculate, ...

如果你不需要指标缓冲区,也不想处理指标/顾问的拐杖,那就写进一种新的程序类型--服务,它没有任何限制(从以前的MT版本中延伸)。

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

Init()和DeInit()的执行顺序

斯拉瓦, 2017.04.14 10:56

正是如此。

将不会有OnCalculate。

目前还没有关于OnChartEvent的解决方案。