ピボット平均オシレータの開発:累積移動平均の新規インジケータ

29 1月 2020, 13:57
Marco Calabrese
0
719

もくじ

イントロダクション: なぜもう一つのオシレーター?

オシレータは、一般的に中央線の上下または事前定義されたセットレベル内で変動するインジケータのサブクラスを表します。 例えば、中央線がクロスしたり、一定の閾値を超えた場合など、トレードイベントのジェネレータとしてテクニカル分析に広く使用されています。 人気のオシレータは、MACD、RSI、CCI、価格の変化率(モメンタムとも呼ばれる)で、反転を予想しようとする、または主なトレンドを検索するなどの特性を持ちます。

一般に、2つの瞬間的な価格の乖離を計算するオシレータは価格を先行する動作 (RSI、CCI など) を示し、平均に基づくオシレータは遅延動作を示します。 関連する例を挙げて、MACDは2つの平均の間の差を計算するので、先行とラグの両方の特性を示していると考えることができます。このような差のプロットはヒストグラムとして描き、中心線のクロスと相違を見つけやすくします。

にもかかわらず、 すべてのオシレータを使用することには、ダマシシグナルを増加させる相場条件 (特に主要なオシレータの場合) またはリスク/報酬比の大部分を歪める可能性のある急速な相違 (遅延オシレータに対して頻繁に起こるため) があるため、すべてのオシレータを使用するには長所と短所があります。 経験則として、トレーダーは、トレーディングシグナルのより独立した確認だけで、一度に複数のオシレータを見る方が賢明です。

この記事では、ピボット平均オシレータは、オシレータの広大なパノラマを持ち込む試みとして、累積移動平均(CMA)の使用に直接由来する新関数を紹介します。


CMA の側面

統計では、単純MA とも呼ばれる移動平均(MA) は、時系列の直近のn個のデータを平均化した計算結果です。 新しい値が下がると、ファーストインファーストアウト (FIFO) ポリシーに従って最も古い値が削除されます。MAレベルは、下落相場でのサポートや上昇相場でのレジスタンスと解釈できるため、金融設定に役立ちます。

MA は 固定メモリーryバッファに対して、最後に使用可能なデータムよりも古いデータ (および結果的に情報の断片) を破棄する概念的に動作します。 理想的には、このようなバッファを無限に拡張して、現在のデータまでのすべてのデータが計算で考慮されるようにする場合、CMAとなります。

幸いなことに、実際のアプリケーションでは、各単一のデータムを格納するための無限のメモリを割り当てる必要はありません! 実際、CMA は、変数の数を少なくして計算できます (再帰的な定式化が使用されているかどうかによって、詳細については次の図を参照してください)。 

表1

表1:CMAの2つの公式。


CMA 式の 2 番目の興味深い点は、カウンタが 1 単位ずつ増加する点です。 次の CMA 値が、完全に予測可能で、他の情報と補完される要素によって部分的に構成され、予測目的で使用できることを意味します。 例えば、横向きの相場状況では、価格はCMA値に向かってドリフトする傾向があります。   

CMAは、以下に提示されるPMOの基本成分です。


PM と PMO の定義

PMO は、直近のデータムと CMA の間の分数として計算される Pivot Mean (PM) と呼ばれる正規化インデックスの上に構築されます。

PM は CMA からの価格の距離を素早く数値的に理解できます。 これは、PMがスプレッドの尺度と考えられることを意味します。 たとえば、PM 値が 1.0035 の場合、現在の値は CMA より 0.35% 高く、PM が 1 に等しい場合は、現在の値が CMA と完全に一致することを意味します。

PM 計算はデータポイントごとに繰り返すことができるため、すべての時系列を PM シグナルに変換できることを意味します。 最終的に、PMO は PM シグナルに適用される 2 つの MA の差として定義されます。 要するに、PMOは2つのスプレッド間の相違の尺度を提供するので、そのアプリケーションをトレード設定に見ると便利です。

PMO の 2 つの平均は、同じ PM シグナルまたは 2 つの異なるシグナルで計算できます。 本稿では、クローズ価格データと始値データから得られるPMシグナルに適用されるシンプルなMAをそれぞれ考察します。

表2

表2:PMおよびPMO式。


類似点がある一方で、ここで提示されたPMO式は、側面についてMACDとは異なります。 MACDは一般的に価格シグナルに適用され、基礎となるPMOシグナルはPMシグナルです。 さらに、MACDでは指数MAが考慮されていますが、ここではSMAに焦点を当て、PMOのより洗練された亜種をこのテーマに関する今後のタスクにします。


基本設計とコード

PMO は、その定式化から直接導出されるインプットをほとんど必要とします。 

  • 開始時刻: 開始する参照日時
  • PM終値シグナルの MA 長:終値から派生した PM シグナルの平均に対するバッファ・データ・ポイント数を表す整数
  • PM始値シグナルのMA長:始値から導出された PM シグナルの平均に対するバッファ・データ・ポイント数を表す整数

//--- input parameters
input datetime startingTime;
input int      MA_close=3;
input int      MA_open=21;

合計で、3 つのバッファを使用します。

  • PMO (表示されたインジケータバッファ) 用に 1 つ
  • 基礎となる PM シグナルの他の 2 つのシグナル

---インジケータ バッファ
double   PMOBuffer[];
double   closeBuffer[];
double   openBuffer[];  

グローバル変数に関しては、PMO 計算を可能にする終値と始値の合計を格納するためのカウンタと 2 つの変数が必要です。 また、インプット開始時刻以降のすべてのバッファで使用する最初のインデックスを追跡するために、他のサポート変数もいくつか追加します。

----グローバル変数---
int counter=1;
double sum_close=0;
double sum_open=0;
bool first_val_checked;
int first_valid_index;

PMOの2つの平均の計算をサポートするためには、MAを実装する関数を作る必要があります。 避けなければならないのは、開始時間の近くでバッファの先頭で計算が実行される場合です。 その場合、計算に使用できる十分な要素がありません。 ただし、PM定義により、開始時刻の前の値は 1 に設定されていると仮定できるので、MA の微積分にラグを設定することが可能です。 したがって、サポート関数は次のようになります。

double simpleMA(const int pos, const int avg_positions, const double &data[],int arr_tail_pos){
   double _local_sum = 0;
   for(int i=pos+avg_positions-1; i >= pos;i--){
      if(i > arr_tail_pos){
         _local_sum += 1;  // when requested data exceed buffer limit set trailing 1s
      }else{
         _local_sum += data[i];
      }
           
   }
   return _local_sum/avg_positions; 
}

提供されているすべては、最終的にプログラムのコアで見ることができます:

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
   ArraySetAsSeries(PMOBuffer,true);
   ArraySetAsSeries(closeBuffer,true);
   ArraySetAsSeries(openBuffer,true);
   ArraySetAsSeries(open,true);
   ArraySetAsSeries(high,true);
   ArraySetAsSeries(time,true);
   
   
   
//--- return value of prev_calculated for next call
   int total = rates_total - prev_calculated;
   double _tmp_sum_close,_tmp_sum_open;
    if(total > 0){
     
      for(int i=total-1;i>=0;i--){  
         if(time[i] >= startingTime){
            if(first_val_checked == false){
               first_val_checked = true;
               first_valid_index = i;
            }
            
            sum_close += close[i];
            sum_open += open[i];
            
            closeBuffer[i] = close[i] *counter / sum_close;
            openBuffer[i] = open[i]*counter / sum_open;
            
            PMOBuffer[i] = simpleMA(i,MA_close,closeBuffer,first_valid_index)-simpleMA(i,MA_open,openBuffer,first_valid_index);
 
            counter++;         
         }   
         else{
            PMOBuffer[i] = 0;
         }    
         
       
      }
 
   }else{
      _tmp_sum_close = sum_close +close[0];
      _tmp_sum_open = sum_open + open[0];
      closeBuffer[0] = close[0] *counter / _tmp_sum_close;
     
      openBuffer[0] = open[0] *counter / _tmp_sum_open;
  
      PMOBuffer[0] = simpleMA(0,MA_close,closeBuffer,first_valid_index)-simpleMA(0,MA_open,openBuffer,first_valid_index);
   }
   return(rates_total);
  }
//+------------------------------------------------------------------+


ユーロドルに関する実験

ここでは、EURUSDチャート上でPMOを実行して得られた実験に関する結果とコメントを提供します。 2 つの主要なトピックについて説明します。

  1. PMOの使用に関するトレードの側面
  2. PMO値の分析

トレード面

図が示すように、PMOとRSIの間には強い類似性があります。つまり、2つのシグナルはほぼ一致します。 ただし、いくつか違いもあります。 9月の主要な上昇に近い。 2019年12月(欧州中央銀行の公式通信)に、RSIシグナルと基礎となるEURUSD価格でPMOの"M"メリルパターンを観察することができます。 これは、価格の上昇が9月に起こったという事実によるものです。 CMAに対して相対的に12位は、翌日に観測されたものよりも高かった。 この情報は、2 番目の天井の後にショート ポジションを取る場合に役立つ可能性があります。

RSIとの類似性により、天井とトラフの周りの反転を買われ過ぎや売られ過ぎの条件として考慮することができ、したがってトレード戦略の初期のシグナルとすることができます。 PMOはRSIとして境界付けされていませんが、ゼロ中央線の直線クロスは、トレンドのさらなる確認として考えることができます。 導入で述べたように、一度に複数のシグナルを組み合わせて使用することは、トレードの成功に繋がります。


図1

図1: PMO(3,21)とRSI(14)の類似点


PMOとのトレードの基本的でシンプル化されたIF THENルールのセットをスケッチすることができ、PMOベースのEAの未来の開発により洗練された戦略を残すことができます。

  • ゼロラインを下回る正の反転の場合、早期買いアラート
  • ゼロラインを上回るマイナス反転の場合、早期売りアラート
  • もし上向きのゼロラインが続く場合は、買い
  • 下向きのゼロラインの場合は、売り

相場の変化する状況に対する迅速な対応は、トレードの成功の重要な要因です。MAを使用するとき、シグナルがスムーズであればあるほど、遅延がおおきくなります。 PMO(m,n)を使用する場合、mはオシレータのラグを占め、nは中央線を横切る際のラグに関連します。 もちろん、PMO で最も速い応答は PMO(1,1) を使用して取得します。 妥協としては、最も速い応答と遅すゼロクロスを保証するn小さい(例えば5)を使用してPMO(1,n)を使用することです。


PMO 値の分析

中心線ゼロの周囲の PMO 値の分布を見ると便利です。 この記事で定義されているように PMO はRSIのように制限されないので、PM 値が特定の閾値を超えるまたは下回る確率を分析するのは興味深いかもしれません。

下の図に、2019年の最初の8ヶ月間に及ぶH1時間枠を持つEURUSDチャートでPMO(3,21)を実行した結果を示します。 PMO 値は、ベル型の分布に従ってゼロを中心に中心に配置されます。 わずかな左のスキューは、おそらく過去数ヶ月でEURUSDによって蓄積されたショート条件によるものです。 にもかかわらず、ゼロの周りの対称性の優位性は、短い動きと長い動きの間に一般的なバランスがあることを推測してみましょう。


図2

図2:鐘状曲線に似たPMO(3,21)値の分布。 予測目的に役立つ準ガウス統計モデルを考慮


考慮すべきもう一つの側面は、PMOとPMの対応するのではなく、終値と始値シグナルで直接計算された移動平均との関係です。 下の図で報告されているように、Rの正方形との強い相関が近い。 これは、PM シグナルに取り組んでも、基になるシグナルが歪まないことを意味します。 同時に、PM シグナルに対するタスクは、PM 計算によって実行される正規化に、異なるソース (例えば、他の通貨ペア) からの結果を比較する利点があります。

図3

図3: PMO(3,21)と非正規化バージョンとの間に相関が認められました。 得られたほぼ線形形状は、PMOで使用する正規化が、基礎となるオープンおよびクローズ価格シグナルの解釈に大きな歪みを与えないことを示唆します。 


結論とさらなるタスク


この記事では、ピボット平均(PM)の新しい概念に基づいてMetaTraderプラットフォームのトレードインジケータとして累積移動平均(CMA)の実装であるピボット平均オシレータ(PMO)を提案しました。 提案されたオシレータは、RSIやMACDのような他の有名なオシレータに似ていますが、CMAの使用から得られる特異性を有することが示されました。 他のタイプの平均に基づく亜種や、ゼロ中心線の周りのPMO値統計分布からの情報を使用するEAなど、さらなる開発の面ではまだ多くの実験が必要です。

添付ファイルを使用して独自の実験を行うことをお勧めします。


添付ファイル

ファイル 詳細
 PMO.mq4  本稿で使用されているPMOのMQL4ソースコード。
 PMO_logger.mq4  データ分析用のログ関数関数を備えたPMOのMQL4ソースコード。 data_logging (true/false フラグ) とファイル名 (文字列) の 2 つの追加インプットの実装
 PMO.mq5  PMOのMQL5ソースコード。
 PMO_logger.mq5  データ分析用のログ関数関数を備えたPMOのMQL5ソースコード。 data_logging (true/false フラグ) とファイル名 (文字列) の 2 つの追加インプットの実装




MetaQuotes Software Corp.により英語から翻訳された
元の記事: https://www.mql5.com/en/articles/7265

添付されたファイル |
PMO.mq4 (4.32 KB)
PMO_logger.mq4 (4.93 KB)
PMO.mq5 (4.5 KB)
PMO_logger.mq5 (5.06 KB)
MetaTraderプログラムを簡単かつ迅速に開発するためのライブラリ(第22部): 取引クラス - 基本取引クラス、制限の検証 MetaTraderプログラムを簡単かつ迅速に開発するためのライブラリ(第22部): 取引クラス - 基本取引クラス、制限の検証

この記事では、ライブラリベースの取引クラスの開発を開始し、最初のバージョンに取引操作を行うためのアクセス許可の初期検証を追加します。さらに、基本取引クラスの機能とコンテンツをわずかながら拡張します。

クロスプラットフォーム グリッドEAの開発(最終パート):収益性を高める方法と多様化 クロスプラットフォーム グリッドEAの開発(最終パート):収益性を高める方法と多様化

このシリーズのこれまでの記事では、多かれ少なかれ収益性の高いグリッドEAを作成するためのさまざまな方法を試しました。 今回は多様化を通じてEAの収益性を高めます。 究極の目標は、最大20% 以下のドローダウンで年間100%の利益を達成することです。

MetaTraderプログラムを簡単かつ迅速に開発するためのライブラリ(第23部): 基本取引クラス - パラメータ有効性の検証 MetaTraderプログラムを簡単かつ迅速に開発するためのライブラリ(第23部): 基本取引クラス - パラメータ有効性の検証

本稿では、取引クラスの不正な取引注文パラメータ値に対する制御と取引イベントの音声通知において開発を続けています。

連続歩行順最適化(パート1):最適化レポートの使用 連続歩行順最適化(パート1):最適化レポートの使用

最初の記事では、最適化レポートを操作するためのツールキットの作成、ターミナルからのインポート、取得したデータのフィルタリングとソートに関する説明を行います。 MetaTrader5では最適化結果のダウンロードが可能ですが、今回の目的は最適化レポートに独自のデータを追加することです。