文章 "交易者生活窍门: 利用 defines (#define) 融合 ForEach" - 页 2

 
Rashid Umarov:

一种有趣且不显而易见的技术 )

它有缺陷(对无赖结构而言),也不是最佳的。

 
fxsaber:
对于副本

必须声明外部变量并不明显。

[删除]  

"在模板上 "是指这个意思:

template< typename T >
class SeriesVolume
{
public:
   T operator[]( const int i ) const
   {
      long val[1];
      if( CopyTickVolume( Symbol(), Period(), i, 1, val ) == 1 ){
         return (T)val[0];
      }
      return -1;
   }
};

SeriesVolume< long > Volume;

如果你想让人一头雾水,你仍然可以这样做:

#define  CVolume SeriesVolume< long >

CVolume Volume;

其他都是多余的。

 
fxsaber:

少写有时很方便

这只是一个可行性、可用性和性能的问题。

程序的性能不会受到影响。但将过多的细节隐藏起来,却能起到积极的作用。您应该记住并使用这个小窍门。

[删除]  
标准库中 的代码准备好了吗?
 
fxsaber:

太贵了!如果你真的想通过结构来做,你至少应该做过。而且不知道为什么没有支票。

SymbolInfoDouble 完全符合 MT4 标准。

性能测量

#define  BENCH(A)                                                              \
{                                                                             \
  const ulong StartTime = GetMicrosecondCount();                              \
  A;                                                                          \
  Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - StartTime)); \
}

double GetAsk()
{
  static MqlTick tick = {0};
  
  return(SymbolInfoTick(Symbol(),tick) ? tick.ask : 0);
}

#define  AMOUNT 1 e6

void OnStart()
{
  double Sum = 0;
  
  BENCH(for (int i = 0; i < AMOUNT; i++) Sum += GetAsk())
  BENCH(for (int i = 0; i < AMOUNT; i++) Sum += SymbolInfoDouble(_Symbol, SYMBOL_ASK))
  
  Print(Sum);
}


结果

Time[for(inti=0;i<AMOUNT;i++)Sum+=GetAsk()] = 78952
Time[for(inti=0;i<AMOUNT;i++)Sum+=SymbolInfoDouble(_Symbol,SYMBOL_ASK)] = 162606

我完全错了!SymbolInfoDouble 的速度是 SymbolInfoTick 的两倍。

 
fxsaber:

绩效衡量


结果


我完全错了!SymbolInfoDouble 的速度是 SymbolInfoTick 的两倍。

谢谢你的性能测量。

事实证明,SymbolInfoDouble 文档没有说谎:

注意

如果该函数用于获取最后一个刻度的信息,最好使用SymbolInfoTick()

 
fxsaber:

绩效衡量

结果

我完全错了!SymbolInfoDouble 的速度是 SymbolInfoTick 的两倍。

使用 static 会影响速度吗?很抱歉我没有亲自检查,但我想你已经比较过了。

 
Rashid Umarov:

使用静态数据会影响速度吗?很抱歉我没有亲自检查,但我认为您已经比较过了。

在这种情况下是不会的。我认为这是编译器的一个错误。

 
fxsaber:

我完全错了!SymbolInfoDouble 的速度是 SymbolInfoTick 的两倍。

不称职。测试结果

2017.09.01 00:00:10   Time[for(inti=0;i<AMOUNT;i++)Sum+=GetAsk()] = 87424
2017.09.01 00:00:10   Time[for(inti=0;i<AMOUNT;i++)Sum+=SymbolInfoDouble(_Symbol,SYMBOL_ASK)] = 83410

在需要性能的地方(优化器),最好使用 SymbolInfoDouble。在现实世界中没有区别。


ZY 您应该在性能非常重要的环境中测量函数的速度 - 测试程序。