MT5とスピードの関係 - ページ 88

 
fxsaber:

1つで十分です。

int CTickSeriesCollection::IndexTickSeries(const string symbol)
  {
   const CTickSeries *obj=new CTickSeries(symbol==NULL || symbol=="" ? ::Symbol() : symbol);
   ...
   ...
   ...
  }

さらに、""をチェックします。私自身は、現在のキャラクターに対するメソッドを呼び出すときは、常にNULLを使用しています。

 
Artyom Trishkin:

あなたのコードは加速を与えない。

 
fxsaber:
当たり前のことを当たり前に説明するのは難しいと感じています。このコードでGetMarketWatchTickを高速化することが可能です。
const MqlTick GetMarketWatchTick( const string &Symb )
{
  MqlTick Tick = {0};

  SymbolInfoTick(Symb, Tick);

  return(Tick);
}

void OnTick()
{
  MqlTick Ticks[1];
  
  Ticks[0] = GetMarketWatchTick(_Symbol);
  ArrayPrint(Ticks);
}

Symbolパラメータに_Symbolを渡したとしても、SymbolInfoTick() には文字列が渡されると思いますか?

標準的な関数内部では、現在のシンボルと文字列が等しいかどうかのチェックは行われていないと思いますし、そのような明示的なパラメータは、現在のシンボルのキャッシュが手元にあれば「全速力で」チェックを開始します。

 

高速化は実行時ではなく、コンパイル時に行われる。

コンパイラはこの置換を行う。

SymbolInfoTick(_Symbol, Tick) -> SymbolInfoTickInside(Tick);
SymbolInfoTick(NULL, Tick) -> SymbolInfoTickInside(Tick);
SymbolInfoTick(::Symbol(), Tick) -> SymbolInfoTickInside(Tick);

それ以外の場合、代用はしない。

 
fxsaber:

高速化は実行時ではなく、コンパイル時に行われる。

コンパイラはこの置換を行う。

それ以外の場合、代用はしない。

まあね。つまり、あなたのコードは、現在の文字ではない文字に対して、通常の機能を高速化することはできません。また、現在のキャラクターを高速化することもできません。

そして、私のはそうではありません。そして、それは決してそうではありません。私も幻想を抱いていたわけではありません。しかし、私の関数にNULLや""が渡された場合、通常の関数を呼び出すときは常にSymbol()またはNULLを使用します。これは、現在のシンボルに対してキャッシュからデータを取得する、通常の関数の高速コードを呼び出します。
関数呼び出しでSymbol() または_Symbolを使用する場合、標準関数内で現在のシンボルと一致するかどうかチェックされないのでしょうか?現在のシンボルのフルレンジチェックで本当にコードが実行されるのだろうか?信じられない...。

 
Artyom Trishkin:

まあね。つまり、あなたのコードは、現在の文字ではない文字に対して、通常の機能を高速化することはできません。また、現在のキャラクターを高速化することもできません。

もしかしたら、もっとわかりやすく説明してくれる人がいるかもしれません。私には効果がありませんでした。

 
fxsaber:

もしかしたら、もっとわかりやすく説明してくれる人がいるかもしれません。わからなかったんです。

通常の機能を高速化するために、何を魔術しているのですか?

staff関数に渡すときに、現在の文字の値を代入して、キャッシュから現在の文字のデータを使わせているのですね。これは、通常の機能を高速化するのではなく、現在のキャラクターに対する速度を使用します。

ソースにアクセスできないものを高速化することはできません。関数を 正しく呼び出すための標準的なテクニックを使用しています。しかし、よくわからないのですが、EURUSDを扱うときにSymbolが文字列で「EURUSD」と指定されている場合、つまり現在のシンボルを使っている場合、staff関数は文字列「EURUSD」がSymbol()と同じかどうかをチェックせず、キャッシュからデータを使わず、全速力でシンボルをチェックし始めてしまうのです。

では、正規関数の加速度はどこにあるのでしょうか?あるとすれば、それは十二分に興味深く、有用なものです。

 
fxsaber:

MT4でも同じですか?また、MT5-Testerではどうでしょうか?

CopyTicksでも同じでしょうか?

 
fxsaber:

もしかしたら、もっとわかりやすく説明してくれる人がいるかもしれません。わからなかったんです。

それよりも、私の質問を理解できていない可能性が高いです。何度か繰り返しましたが(この質問は「レギュラー機能の高速化」についての質問ではありません)。

 
Slava:

Symbol()、_Symbol、NULLの代わりに 通常の文字列パラメータが 指定された場合、完全なチェックが行われ、プロパティも照会されます。

なぜかこの説明では、文字列パラメータが現在の文字と同じであれば、プログラム全体に対するチェックは行われないということは書かれていません。