記事"トレーダーのライフハック: インジケーターで作られたファストフード"についてのディスカッション - ページ 3

 
Renat Fatkhullin:

...異なるパラメータで呼び出しを開始し、インジケータを乗算し、すべてのハンドルを失い、そしてブレーキとメモリ消費について疑問に思う。

正直なところ、ハンドルがMetaTraderの舞台裏に保存されているのであれば、どのようにしてハンドルが失われるのか、私には理解できません。

p.s.一般的に、この記事の著者が議論に参加し、MT5でインジケータハンドルを使用する際のビジョンについていくつかの点を説明しましょう。

 
Vasiliy Sokolov:
正直なところ、MetaTraderの裏側でハンドルが記憶されている場合、どうしてハンドルが失われるのか理解できませんでした。

コード品質に対するこのアプローチで、もう疑問はなくなりました。

 
Vasiliy Sokolov:

おっしゃる意味がよくわかりません。私が理解する限り、ヘンドルはどこにもクローズされません(IndicatorReleaseへの呼び出しは ありません)。iMACDのような、ヘンドルを作成する標準的な関数が常に呼び出されています:

明らかに、ここでのゲーム全体は、iMACDや同様の関数が以前に返されたハンドルを自分自身の中にキャッシュするという事実に基づいています。


OnInit()で1つのハンドルを作成し、インジケータ・データへのアクセスはCopyXXXX関数を通して取得する。MQL4スタイルのハンドルの再作成を使用すると、それは非常に間違っており、大失敗となる。しかしその過程で、MQL5カーネルは非常に賢く(明らかに同一ハンドルの内部キャッシュが存在する)、ハンドルの再作成を許可しないことが判明した。

副次的な効果として、MQL5カーネルは非常にうまく設計されているため、MQL5が流行に流されない方法で動作することを可能にしている。

 
Vasiliy Sokolov:

類似点は見当たらない。

どちらの記事もMQL5で最も単純なMQL4スタイルのバリアントを書くという同じことを提供している。比較する

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

記事「トレーダーのためのライフハック:インジケータからファーストフードを作る」のディスカッション

Vasiliy Sokolov, 2018.01.25 16:05

//+------------------------------------------------------------------+
//| MQL4表記によるiMACD関数|
//| バッファ番号は以下の通り。
//| mql4 0 - mode_main、1 - mode_signal|
| mql5 0 - メイン・ライン、1 - シグナル・ライン|
//+------------------------------------------------------------------+
double   iMACD(
               string                     symbol,              // シンボル名 
               ENUM_TIMEFRAMES            timeframe,           // タイムフレーム 
               int                        fast_ema_period,     // 高速平均の計算期間 
               int                        slow_ema_period,     // スロー平均の計算期間 
               int                        signal_period,       // その差の平均化期間 
               ENUM_APPLIED_PRICE         applied_price,       // 価格またはハンドルの種類 
               int                        buffer,              // バッファ 
               int                        shift                // シフト
               )
  {
   
   double result=NaN;
//---
   int handle=iMACD(symbol,timeframe,fast_ema_period,slow_ema_period,signal_period,applied_price);
   if(handle==INVALID_HANDLE)
     {
      Print(__FUNCTION__,": INVALID_HANDLE error=",GetLastError());
      return(result);
     }
   double val[1];
   int copied=CopyBuffer(handle,buffer,shift,1,val);
   if(copied>0)
      result=val[0];
   else
      Print(__FUNCTION__,": CopyBuffer error=",GetLastError());
   return(result);
  }

そしてこれ

double iMACDMQL4(string symbol,
                 int tf,
                 int fast_ema_period,
                 int slow_ema_period,
                 int signal_period,
                 int price,
                 int mode,
                 int shift)
  {
   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
   ENUM_APPLIED_PRICE applied_price=PriceMigrate(price);
   int handle=iMACD(symbol,timeframe,
                    fast_ema_period,slow_ema_period,
                    signal_period,applied_price);
   if(handle<0)
     {
      Print("Объект iMACD не создан: Ошибка ",GetLastError());
      return(-1);
     }
   else
      return(CopyBufferMQL4(handle,mode,shift));
  }

実は同じことです。

存在すべきでしょうか?記事のタイトル(というかその説明)には、明らかにインジケーターについてのみ書かれていると思うのですが?

タイトルから判断して、あってはならない。しかし、この記事は時系列を使ったMQL4スタイルの作業に触れている。そしてそれなしでは不完全な解決策を得ることになる。MQL4ではほとんどの人が "High[i]"を使っている。しかもその実装は簡単に見つけることができる。

残念ながら、MQLは任意の数のパラメータを持つ関数をサポートしていないため、iCustomを "MT4と同じように "実装することはできません。

MT4のスタイルを完全にエミュレートした本格的なエンジン全体を1つの記事で書くことは不可能だと思います。トピックは、MQL4スタイルでインジケータを操作すること、と明記されています(記事のタイトルがトピックを反映しておらず、紛らわしいのが残念です)。

MQL4スタイルはまだ概念であるが、構文に明確に準拠しているわけではない。

 
Vladimir Karputov:

MQL4スタイルでハンドルの再作成を行うと、メモリが消費されてしまう。

だからこそ、MQL4のスタイルで 正しく行えるのに、なぜ間違った作業を実装したのかという疑問が生じるのだ。

MQL5は賢くはない。そうでなければ、どんな偶発的なエラーも不幸な結果を招くだろう。しかし、性能測定が示すように、フールプルーフ・プロテクションは性能に不具合が生じるように設計されている。そのため、「ハンドルの再作成」をMQL5ラッパーに移し、(OOP能力のごく一部を)ユーザーの目から隠す必要があるのだ。

 
fxsaber:

...しかし、性能測定が示すように、フールプルーフは性能の落ち込みがあるような方法で行われている.

それは興味深いね。速度を測定して、その結果をここに投稿するよ。

 
Vasiliy Sokolov:

最もシンプルなブランクで測定した。

専門家名測定内容パフォーマンス
iMACD古典的なMT5スタイルのヘンドルワークEURUSD,M5:26189141ティック、74266バーを生成。環境は0:00:01.045で同期。テストは0:00:12.121(ティックの前処理0:00:01.966を含む)で合格。
MACD MQL4スタイルEAショートMQL4スタイルで動作EURUSD,M5: 26189141ティック、74266バーを生成。環境は0:00:00.047で同期。0:00:34.960でテスト合格(ティックの前処理0:00:01.872を含む)。

オーバーヘッドは約3倍。そう、MetaTrader 5はキャッシュされたハンドルを見つけるのにかなりの時間がかかるのだ。


MACDの MQL4スタイルEAショート」に似たEAで、2つだけでなく、3つ、4つ、5つのインジケーターを扱うことができます。この文脈では、「インジケータ」とは(MACDを例にして)異なるパラメータを持つインジケータを意味しますが、それぞれ1つのシンボルです。

 

MACD MQL4スタイルのEAが 追加でグラフィックサブシステムにアクセスしている ことに気づいたので、前の投稿を削除した:

//+------------------------------------------------------------------+
//| エキスパート・ティック機能|
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   double macd_main_1=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MAIN_LINE,1);
   Comment("MACD, main buffer, index 1: ",DoubleToString(macd_main_1,Digits()+1));
  }

つまり、行ったテストが誤っていたのです。コメント関数を コメントした後、パフォーマンスはほぼ同じになりました:

EURUSD,M5: 26189141 ticks, 74266 bars generated. Environment synchronized in 0:00:00.047. Test passed in 0:00:15.444 (including ticks preprocessing 0:00:01.872).

結論:MetaTrader 5はまだ効果的に以前に作成されたキャッシュを見つけ、提案されたコードスタイルを使用することが可能です。

fxsaber:

しかし、パフォーマンス測定が示すように、フールプルーフプロテクションはパフォーマンス障害が発生するように作られています。そのため、「ハンドルの再作成」をMQL5ラッパーに移行し、(OOP機能のごく一部を)ユーザーの目から隠す必要があるのだ。

もし最後のテストが正しく行われれば、OOPラッパーに移行しても何も起こらないことが判明する。スピードはほぼ同等だ。
 
Vasiliy Sokolov:

MetaTrader 5はキャッシュされたハンドルを見つけるのにかなりの時間を必要とします。

ユーザーが一般的な方法でこのプロセスをスピードアップできる確実性はありません。明らかに、オーバーヘッドはハッシュ関数の計算に費やされます。

このような一般的な形式のインジケータ・ハッシュ関数の1つの変形が、ここに 投稿されている。

  static string GetMyUniqueName( void )
  {
    const int handle = GetMyHandle();

    MqlParam Params[];
    ENUM_INDICATOR Type;

    const int Total = ::IndicatorParameters(handle, Type, Params);
    ::IndicatorRelease(handle);

    uchar Bytes[];

    for (int i = 1; i < Total; i++)
    {
      ::ArrayCopy(Bytes, _R(Params[i].double_value).Bytes, ::ArraySize(Bytes));
      ::ArrayCopy(Bytes, _R(Params[i].integer_value).Bytes, ::ArraySize(Bytes));
      ::ArrayCopy(Bytes, _R(Params[i].string_value).Bytes, ::ArraySize(Bytes));
    }

    return("::" + (string)::ChartID() + (string)INIT_SYNC::crc64(Bytes) + ::MQLInfoString(MQL_PROGRAM_NAME));
  }

そこでは性能は気にしていなかったが、ハッシュ関数の入力がMqlParam-valueの配列でなければならないことは明らかだった。そしてこれは、遅い文字列フィールドがあるという事実を考慮すると、高速には動作しない。

したがって、MT5に組み込まれているものよりもはるかに高速なユニバーサル・インジケータの高速ハッシュ関数を書くことは、オープン・タスクである。しかし、私はインジケーターをどこからか呼び出すことには断固反対です。だから、この問題を理解しようとも思わない。


スマートなMQL5について、もう一つ考えていることがある。多くのExpert Advisorでは、各バーで同じインジケータが呼び出されますが、入力パラメータは異なります。MQL5は時間の経過とともに不要なハンドルを「撃つ」。しかし、これは普遍的な解決策です。そしてExpert Advisorでは、作者はこの責任を自分で負うことができ、自分でハンドルを殺すことができます。100のバーで100のハンドルの荷物を運ぶのは、計算資源と メモリの点で超無駄であることは明らかです。しかし、同じコドベースのEAで、このようにハンドルに釘を刺すようなEAは見たことがない。すべてが「MQL5の賢さ」に委ねられているため、作者はまったく賢くないことを余儀なくされている。


しかし、繰り返すが、インジケーターとバーは悪である。

 
fxsaber:

ユーザーが一般的な方法でこのプロセスを高速化できる確証はない。明らかに、オーバーヘッドはハッシュ関数の計算に費やされる。

このような一般的な形式のインジケータ・ハッシュ関数の1つの変形が、ここに 掲載されている。


さて、あなたは1つの記事で多くの情報を読者に投げかけたかったのだろう。しかし、あなたの方法に関しては、それは真正面からの解決策である。そして性能を比較した?