記事"トレーダーのハック: 定義と ForEach のブレンド (#define)"についてのディスカッション - ページ 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の2倍遅い。

 
fxsaber:

パフォーマンス測定


測定結果


私は完全に間違っていた!SymbolInfoDoubleはSymbolInfoTickの2倍遅い。

パフォーマンス測定ありがとう。

SymbolInfoDoubleの ドキュメントは嘘ではないことがわかりました:

この関数が最後のティックに関する情報を取得するために使用される場合は、SymbolInfoTick()を使用する方がよい

 
fxsaber:

パフォーマンス測定

測定結果

私は完全に間違っていた!SymbolInfoDoubleはSymbolInfoTickの2倍遅い。

staticを使うと速度に影響するのでしょうか?自分で確認しなかったことをお詫びします。

 
Rashid Umarov:

スタティックはスピードに影響しますか?自分で確認しなかったことをお詫びしますが、すでに比較されたと思います。

この場合は違います。コンパイラのバグだと思います。

 
fxsaber:

私は完全に間違っていた!SymbolInfoDoubleはSymbolInfoTickの2倍遅い。

無能だ。テスターの結果

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 パフォーマンスが重要視される環境(テスター)で関数の速度を測定すべきです。