記事"任意のインジケータの計算部分をEAのコードに転送する方法"についてのディスカッション

 

新しい記事 任意のインジケータの計算部分をEAのコードに転送する方法 はパブリッシュされました:

インジケータコードをEAに転送する理由は様々です。しかし、このアプローチの長所と短所はどのように評価するべきでしょうか?この記事では、インジケータコードをEAに転送する技術をご紹介します。EAの動作スピードを評価するためにいくつかの実験を行いました。

私たちは4つの別々のEAを作成します。

  1. 標準で、関数を実行しない空のEA。これは相場の履歴選別する為に、ターミナル自体が費やす時間の評価に役立ちます。
  2. インジケータクラスで値を計算することでデータを受け取るEA。
  3. iMAインディケーターからデータを受け取るEA。
  4. カスタムインジケータからデータを受け取るEA。

その後、ストラテジーテスターの11回のパスで最適化を開始し、1回のパスの平均時間を比較します。

EAの計算を使用すると、時間を節約できるという結果になりました。最も時間のかかる作業は、カスタムインジケータからデータを取得することでした。

作者: Dmitriy Gizlyk

 

ありがとう。

bool CIndicator::LoadHistory(void)
  {
   datetime cur_date=(datetime)SeriesInfoInteger(m_Symbol,m_Timeframe,SERIES_LASTBAR_DATE);
   if(m_last_load>=cur_date && ArraySize(m_source_data)>=m_history_len)
      return true;

このコードから、ティックでの再計算は行われないことがわかりました。新しいバーの 出現時のみです。それとも、私が実装をよく理解していなかったのでしょうか?

 
fxsaber:

ありがとう。

このコードから、ティックでの再計算は行われないことがわかりました。新しいバーの 出現時のみです。それとも、私が実装をよく理解していなかったのでしょうか?

そうですね、記事にはすぐに、計算は閉じたローソク足で行われると書いてあります。各ティックで計算するには、コードから新しいバーが開いたかどうかのチェックを外し、現在のように「1」からではなく「0」バーから履歴をコピーする必要があります。
 
Dmitriy Gizlyk:
そうです、記事にはすぐに、計算は閉じたローソク足に基づいていると書かれています。各ティックで計算するには、コードから新しいバーの開始チェックを削除し、現在のように「1」からではなく「0」バーから履歴をコピーする必要があります。

ティック・モードでの比較を行わなかったのは残念だ。

加えて、このモードでは、「インジケータ」を正しく動作させるために、実装にCopyTicksがなくてはならない。

 
fxsaber:

ポティックで比較しなかったのは残念だ。

付け加えると、このモードでは、「インジケーター」を正しく動作させるために、実装にCopyTicksがないとできません。

どのインジケーターについて話しているのかわかりません。しかし通常、インジケータはバー価格によって動作し、最後のバーを再描画します。この場合、CopyTicksをロードすることはできませんが、ヒストリカルデータを 同じようにロードすることが できます。ただし、この場合、最後の値の再計算をクラスに追加する必要があります。

 
Dmitriy Gizlyk:

どのインジケーターについて話しているのかわかりません。しかし、通常インジケーターはバー・プライスで動作し、最後のバーを再描画します。この場合、CopyTicksをロードするのではなく、ヒストリカルデータを 同じようにロードする ことができます。ただし、この場合、最後の値の再計算をクラスに追加する必要があります。

Expert Advisorに組み込まれたインジケータは、ティックをスキップします。これを防ぐには、OnTick や OnTimer などの呼び出しの間にティックを取得する CopyTicks が必要です。

そうしないと、情報を失うことになります。

取引注文(1分間に数回)と標準動作モードで100ミリ秒のpingを使用すると、ティックの~5%が失われます。

 
fxsaber:

EAに組み込まれたインジケーターはティックをスキップします。これを防ぐには、OnTick や OnTimer などの隣接するコール間でティックを取得する CopyTicks が必要です。

そうしないと、情報を失うことになります。

そう、ティック情報を失うリスクは大きい。しかし、問題はこの情報がストラテジーにとってどの程度の価値があるかということです。結局のところ、(記事で紹介したような)通常のインジケータはティックではなくバーを計算します。そして最終的には、最終的なローソク足データのみが使用され、中間ティックは単に「上書き」されます。もう一つの疑問は、ティック情報をインジケータに保存して使用する場合、つまり、バーではなくティックでインジケータを構築する場合です。

 

こんにちは! 記事をありがとうございました。

インジケータコードの冒頭で、他のプログラムとのデータ交換のための配列バッファが宣言されています。これらの配列は時系列で、その要素は価格バーと関連しています。この接続は、端末が直接サポート します。インジケータは計算結果をこれらの配列に保存し、新しいローソク足が表示されたときに配列のサイズを変更したりデータを転送したりすることは気にしません。このような配列はExpert Advisorには存在しないため、インジケータコードをExpert Advisorに転送する際には、この配列を作成する必要があります。計算部分だけでなく、 配列 要素とチャート上のバーの接続を整理する必要が あります。

残念ながら、テスト例では、配列要素とチャート上のバーの接続の整理が 明確でなく、見えません。チャート上に必要なポイント(またはシンボル)を配置して見るには、具体的にどうすればよいのでしょうか?この点を明確にしたいと思います。ありがとうございました!

 
そういうものを探していたんだ。ありがとうございました。素晴らしい記事だ。
 
IuriiPrugov:

こんにちは。

インジケーター・コードの冒頭で、他のプログラムとのデータ交換のためのバッファー配列が宣言されています。これらの配列は時系列で、その要素は価格バーと関連しています。この接続は、端末が直接サポート します。インジケータは計算結果をこれらの配列に保存し、新しいローソク足が表示されたときに配列のサイズを変更したりデータを転送したりすることは気にしません。このような配列はExpert Advisorには存在しないため、インジケータコードをExpert Advisorに転送する際には、この配列を作成する必要があります。計算部分だけでなく、 配列 要素とチャート上のバーの接続を整理する必要が あります。

残念ながら、テスト例では、配列要素とチャート上のバーの間の接続の整理が 明確でなく、見えません。チャート上に必要なポイント(またはシンボル)を配置して見るには、具体的にどうすればよいのでしょうか?この点を明確にしたいと思います。ありがとうございました!


まず、返信が遅れたことをお詫びします。MQLでは、時系列にアクセスする場合、現在のバーをインデックス "0 "とみなすのが通例で、過去のデータはインデックスが増えていきます。詳しくはリンク先のドキュメントを ご覧ください。インジケータの計算データにアクセスする際も、同様のアプローチを採用しています。つまり、最後に閉じたローソク足のデータにアクセスするときは、いつでもインデックス「1」を指定します。

 

こんにちは。

簡単な質問があります。

ある記事で、バッファが1つのインジケーターが使われていました。1つ以上のバッファを持つインジケータはどうすればいいのでしょうか?それぞれのインジケータにCArrayBuffer クラスを作成する必要があるのでしょうか?

何か例はありますか?

ありがとうございました。