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

 
Aleksey Vyazmikin #:
記事を読んでもよくわからなかったのですが、クラス・インジケータにはバーが見つからない場合の保護機能があるのでしょうか?例えば、5小節間接続が切れていて、その後履歴が読み込まれた場合、class-indicatorはバッファの最後の値だけを補充するのでしょうか、それとも完全な再計算を行うのでしょうか?

標準のインジケーター・クラスを見ると、データを更新する際にCopyBuffer関数を使用しています。つまり、端末の履歴の一部ではなく、バッファ全体を埋めます。

bool CIndicatorBuffer::Refresh(const int handle,const int num)
  {
//--- チェック
   if(handle==INVALID_HANDLE)
     {
      SetUserError(ERR_USER_INVALID_HANDLE);
      return(false);
     }
//---
   m_data_total=CopyBuffer(handle,num,-m_offset,m_size,m_data);
//---
   return(m_data_total>0);
  }
 
Dmitriy Gizlyk #:

標準のインジケーター・クラスを見ると、データを更新する際にCopyBuffer関数を使用している。つまり、端末の履歴の一部ではなく、バッファ全体を埋めます。

そして、新しいバーのたびに履歴全体を再計算するのですか?

それではコストがかかりすぎませんか?最後に計算を行った日付を特定し、この特定の時間のデータをコピーするのはどうでしょう?

 
Aleksey Vyazmikin #:

新しい小節が増えるたびに、すべてのストーリーを計算し直すのか?

それではコストがかかりすぎるのでは?最後に計算した日を特定し、この特定の時間帯のデータをコピーしてはどうだろう?


記事では、インジケータはCalculateメソッドで計算されます。ここでは、まず前回の再計算からバーの数を決定し、残りの部分のみを再計算します。

  • cur_date - 現在の時刻;
  • m_last_calculate - 直近の再計算時刻。

bool CMA::Calculate(void)
  {
   datetime cur_date=(datetime)SeriesInfoInteger(m_Symbol,m_Timeframe,SERIES_LASTBAR_DATE);
   if(m_last_calculate==cur_date && ArraySize(m_source_data)==m_history_len)
      return true;
//---
   if(!LoadHistory())
      return false;
//---
   int shift=Bars(m_Symbol,m_Timeframe,m_last_calculate,cur_date)-1;
 
Dmitriy Gizlyk #:


記事では、インジケータはCalculateメソッドで計算されます。ここでは、まず前回の再計算からバーの数を決定し、残りの部分のみを再計算します。

  • cur_date - 現在の時刻;
  • m_last_calculate - 直近の再計算時刻。

分かりやすい説明をありがとう!

 

ありがとうございます。

非常に素晴らしいコンセプトですが、複数の価格(高値、安値、終値、始値)を持つプライスアクションインジケータを書きたい場合、例えば高値と安値の差に基づいてインジケータの 値を計算する 場合、データの配列(CIndicatorクラスのm_source_data)が1つしかないという問題があります。これを回避する方法はありますか?それともCIndicatorクラスを修正して、m_source_dataを(mqlRatesまたはCArrayBuffer ,...)の配列にすることをお勧めしますか?

 
Mehrdad Sarrafi インジケータの 値を計算する 場合、データの配列(CIndicatorクラスのm_source_data)が1つしかないという問題があります。これを回避する方法はありますか?それともCIndicatorクラスを修正して、m_source_dataを(mqlRatesまたはCArrayBuffer ,...)の配列にすることをお勧めしますか?

はい、CIndicatorを修正してm_source_dataをMqlRatesの配列にすることができます。他の方法では、異なる配列のデータを同期させるアクションが必要になるので、MqlRatesをお勧めします。