mql5语言的特点、微妙之处以及技巧 - 页 37

 

HistorySelect是一个非常昂贵的函数。但是HistorySelectByPosition就更贵了。

例如,如果我们需要找到平仓的第一笔交易,我们可以通过两种方式来实现它

  1. 进行HistorySelectByPosition,然后从获得的小列表中找到必要的交易。但这个列表的形成过程如下 首先,所有的历史被形成(相当于调用 "无限 "的HistorySelect)。然后在这个列表中进行FULL FOR循环,只选择那些有适当POSITION_IDENTIFIER的交易。
  2. 进行HistorySelect(你可以 "无限",但最好使用一个间隔,如果知道的话),然后在for循环中,当你达到相应的DEAL_ENTRY时,进行中断。

第二项可能要便宜得多。但肯定不会更贵。

在测试器中调用HistorySelect*-函数几乎是在浪费计算资源。因此,你应该始终尝试尽量减少它们的数量。特别是HistorySelectByPosition。

 
对于测试器中的对冲账户
在下一次打勾时对常规限制器进行激活检查。
这意味着测试者的结果在很大程度上取决于账户的类型。
 
fxsaber:
对于测试器中的对冲账户,这意味着测试器的结果在很大程度上取决于账户的类型。


正如在一个相邻的线程中所发现的,测试者的结果甚至取决于测试是在本地代理还是在分布式网络代理中进行。

https://www.mql5.com/ru/forum/1111/page1880#comment_4904481

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • www.mql5.com
Форум алго-трейдеров MQL5
 
尤里-基里洛夫


正如在一个相邻的线程中所发现的,测试者的结果甚至取决于测试是在本地代理上进行还是在分布式网络上的某个代理上进行。

https://www.mql5.com/ru/forum/1111/page1880#comment_4904481

你描述了一个BAG,这不在这个主题的范围内。限制执行差异是官方立场。
 
fxsaber:
你描述了BAG,这不在这个主题的范围内。对限制器的不同执行是官方立场。

同意,只是想指出,测试器正成为一个越来越不可预测的工具。
 
尤里-基里洛夫

我同意,我只是想指出,测试器正成为一个越来越难以预测的工具。
不幸的是,它从来都 是可预测的。
 
fxsaber:
这意味着测试者的结果在很大程度上取决于账户的类型。
这只适用于交易所交易的工具。
 
所有标准类型都是相互匹配的
void OnStart()
{
  string Str = "1.23qwedfg";
  
  Print((int)Str);
  Print((double)Str);
}

结果

1
1.23
 

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

虫子,虫子,问题

fxsaber, 2017.04.10 16:53

亲爱的开发者,在这种情况下,如何摆脱警告?
template <typename T>
T GetValue()
{
  T Res; // possible use of uninitialized variable 'Res'
  
  return(Res);
}

void OnStart()
{
  MqlTick Tick = GetValue<MqlTick>();
  int i = GetValue<int>();
}
生活小窍门
template <typename T>
const T GetDefaultValue( void )
{
  struct STRUCT_TYPE
  {
    const T Value;
  };
  
  const STRUCT_TYPE Res = {0};
  
  return(Res.Value);
}

void OnStart()
{
  int i = GetDefaultValue<int>();
  MqlTick Tick = GetDefaultValue<MqlTick>();
  string Str = GetDefaultValue<string>();
}
 

基本功能(非必需)

  • 字符串转双数
  • 字符串转整数
  • 弦乐到时间
  • 弦外之音
  • 弦外之音
  • 字符串串联
  • 读取指针(GetPointer