記事「オブジェクトを使用して複雑な指標を簡単に」についてのディスカッション

 

新しい記事「オブジェクトを使用して複雑な指標を簡単に」はパブリッシュされました:

この記事では、複数のプロットやバッファを扱ったり複数のソースからのデータを組み合わせたりするときに発生する問題を回避しながら、複雑な指標を作成する方法を紹介します。

指標の最終結果は次のようになります。


作者: Manuel Alejandro Cercos Perez

 
グラフィカル・オブジェクトのことだと思っていた。クラス・オブジェクトの ことだとわかったんだ。
 
Dmitriy Skub #:
グラフィカル・オブジェクトのことだと思ったんだ。そして何が新しいのか?

この記事の実装に対する良いアプローチであるだけで、目新しいことは何もない。

 

あなたの記事はとても良かった😁.でも、おっしゃる通り、パフォーマンスの問題にはちょっとした問題が絡んでいます。ほとんどの場合、何の影響もありませんし、何の問題もなく生活できます。しかし、変動が大きい時には、OnCalculateが受ける呼び出しの数のために、システムがクラッシュしたり、非常に遅くなったりすることがあります。しかし、問題は関数にあるのではなく、関数内で行われる相互作用にあります。なぜなら、呼び出されるたびに、MetaTraderはインジケータのバッファを読み込むことを余儀なくされ、その数が多い場合は問題が発生する可能性があるからです。これを解決する1つの方法は、OnTimeへのコールを使用することで、計算イベントごとではなく、あらかじめ定義された期間にわたってコールが実行されるため、負荷が少し軽くなります。手動または半自動で操作するのであれば、各計算は例えば200ミリ秒以内に実行されるから問題ないだろう。しかし、OnTimeイベントが計算スレッドに影響を与える可能性があるため、インジケーターでOnTimeイベントを使用するのはあまり適していません。これを実現する一つの方法は、OnCalculate自体で計算を強制し、CopyBufferコールを行う必要がないようにすることです。もうひとつ、OnCalculate関数の 次の行を修正することで、プロセッサーの消費サイクルを数マシンサイクル減らすことができる:

int OnCalculate(const int rates_total, 
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
//---
   int limit = MathMax(0, prev_calculated-1);

という行を修正することです:

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
//---
   int limit = (prev_calculated <= 0 ? 0 : prev_calculated - 1);

たいしたことではないと思われるかもしれないが、この場合に三項演算子を使うと、関数を呼び出すよりも効率が良くなる。このような些細なことが、ボラティリティの高い時には大きな違いを生む.😁👍