mql5言語の特徴、微妙なニュアンスとテクニック - ページ 60

 
アレクセイ・コジツィン
どのようなGUIかわかりませんが、テスターウィンドウのパラメータタブで、スタートフィールドとストップフィールドを設定 することができます。そして、テスターはパラメータ値の数を正しく判断する。

フィールドステップ

 
fxsaber

フィールドステップ

すみません、よく読んでませんでした。
 
fxsaber

ステップ・フィールド

おそらく、列挙型のフィールドには、どのステップの倍数にもならないような固有値が与えられることがあるからだ。

 
アレクセイ・コジツィン

その理由は、列挙型フィールドには固有値が与えられるが、その固有値はどのステップの倍数にもならない可能性があるためと思われる。

はい、バグではありません、だからこのスレッドで話し始めたのです。最適化ステップが必要な場合は、MQL for enumで設定することができます。

 

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

ライブラリ: TesterBenchmark

fxsaber さん 2017.11.22 16:54

MT5の各バリエーションに1行だけ挿入する

#define Comment(A)

本格派は67%、職人派は108%に加速!?


しかし、それは本題ではありません。1行でEAを高速化することに成功!そして、これはCommentが何の役にも立たないOptimizerでの話です。

 
// Возвращает true только в случае, если выбран (в тестере) режим по реальным тикам
// Перед использованием должен быть хотя бы один OnTick вызван тестером
bool IsRealTicks( void )
{
  MqlTick Tick;
  
  return(SymbolInfoTick(_Symbol, Tick) && (Tick.volume || !(Tick.flags & TICK_FLAG_LAST)));
}


使用例

// Советник будет тестироваться только в режиме по реальным тикам
void OnTick()
{
  static bool IsRemove = true;
  
  if (IsRemove)
  {
    IsRemove = MQLInfoInteger(MQL_TESTER) && !IsRealTicks();
    
    if (IsRemove)
    {
      Print("Real ticks mode is needed!");
      
      ExpertRemove();
      
      return;
    }
  }
  
  //........
}
OnInitで(OnTickなしで)これを行う方法 - 知りません。
 

この話題に関する 対談の一部をご紹介します。

fxsaber2017.11.24 08:35
print(コメント)パラメータに式を使わないでください。パラメータはカンマで区切って指定する。そうすると、確実にすべての文字列変換がオーバーライドされます。

この2つの文字列が、Optimizeモードではどのように違うのか、例を挙げて説明してください。

Print((string)i + (string)d);
Print(i, d);
サポートチーム2017.11.24 08:44

最初のケースで最適化する場合、文字列式は印刷の前に計算されます。プリント自体は呼び出されますが、うまくいきません。

2番目の場合、Printは呼び出されますが、動作しません。また、i+dの文字列変換もうまくいきません

簡単なテストでは、1回目と2回目の呼び出しの結果は、時間、受信出力ともに同じになります。

つまり、Optimizeモードの入力パラメータを1つだけ文字列として形成するよりも、Printをカンマで区切って使用する方がはるかに安上がりなのです。


一方、Printの内部ですべてを1つの文字列として形成する場合は、Optimizeモードで

#define Print(A)

が、カンマが使われていると、このような構成はうまくいきません。さらに、このような構成にすると、Optimizeモードでも無効化されます

Print(SendOrder()); // SendOrder будет проигнорирован при #define Print(A)


したがって、(他の理由もありますが)本当に重要な関数はPrintの内部で呼び出さない方がよいでしょう。その結果、Optimizeモードでパフォーマンスをケアした場合でも、次のようなことが必要になります。

static const bool IsNotOptim = !MQLInfoInteger(MQL_OPTIMIZATION);

if (IsNotOptim)
{
  const string Str = GetString(); // дорогой вызов
  
  Print(Str);
//  Comment(Str); 
//  Alert(Str);
}
 
fxsaber

ダイアログの一部を抜粋してご紹介します。

つまり、Optimizeモードでは、単一の入力パラメータを文字列として形成するよりも、カンマ付きのPrintを使用する方がはるかに安上がりなのです。


一方、Printの右側ですべてを一本の線として形成する場合、Optimizeモードでその形成を無効にするのは簡単である。

が、カンマが使われていると、このような構成はうまくいきません。さらに、このような構成にすると、Optimizeモードでも無効化されます


したがって、(他の理由もありますが)本当に重要な関数はPrintの内部で呼び出さない方がよいでしょう。その結果、Optimizeモードでパフォーマンスを重視する場合は、やはり次のような工夫が必要になります。

すみません、理解できていないかもしれませんが、なぜprint内で重要な機能を呼び出すのでしょうか?
 
ウラジスラフ・アンドルシェンコ
すみません、もしかしたら理解できないかもしれませんが、なぜプリントで重要な関数を呼び出す必要があるのでしょうか?

禁じ手ではありません。

 
fxsaber

禁じ手ではありません。

私もそう思います。

ということを知りたかっただけです。

この度、履歴に1000件以上の取引があり、履歴の利益を計算するために履歴処理機能などを呼び出すと、問題が発生しました。+ なぜこの問題に悩まされるのかわからない。つまり、見積もりには遅延が発生します。

理由: