インディケータ: 重心 J. F. Ehlers

 

重心 J. F. Ehlers:

重心はジョン・エラーズによって開発され「株式&コモディティ」誌(2002年5月)で発表されたオシレータです。

図1。重心インディケータ

作者: Nikolay Kositsin

 
便利ですね! ...色変更の基準が知りたいです。
 

こんにちは、

このオシレーターは素晴らしいものですが、問題があります。

最後のローソク足で計算されるシグナルラインの 終値が表示されず、常に現在が赤で表示されます。オシレーターをリセットすると、シグナルラインの終端が表示され、一瞬は良い値が表示されるのですが、その後、赤色に戻ってしまいます(緑色を表示しなければならない場合でも)。

この問題を解決するにはどうしたらいいでしょうか?

再デバッグを試みましたが、役に立ちませんでした。

よろしく、

インフィニットデザイン

 
彼の意見では 、この インジケーターは メーホーと シンボルとタイムフレームで 機能する�
この インジケータの パラメータに 最適な値は
 

この素晴らしいインジケーターをありがとう。

旧バージョンも新バージョンと同じくらい、いや、それ以上に興味深く有用なものでした。

旧バージョンもmq5に移植していただけませんか?そうしていただけると非常にありがたいです。


よろしくお願いします!

 
この指標は非決定論的である。同じデータポイントを異なる時刻に2回求めれば、異なる答えが返ってくる。ドリフトは現在時刻に 近いほど大きくなる。不一致は3.7 x 10^-04にもなります。
 
InfiniteDesign:

こんにちは、

このオシレーターは素晴らしいものですが、問題があります。

最後のローソク足で計算されるシグナルラインの 終値が表示されず、常に現在が赤で表示されます。オシレーターをリセットすると、シグナルラインの終端が表示され、一瞬は良い値が表示されるのですが、その後、赤色に戻ってしまいます(緑色を表示しなければならない場合でも)。

この問題を解決するにはどうしたらいいでしょうか?

再デバッグを試みましたが、役に立ちませんでした。

よろしく、

インフィニットデザイン

私も同じ問題を抱えています。
 

このインジケーターからシグナルを作成しようとしましたが、できませんでした。

助けてください。


//+------------------------------------------------------------------+
//|COG.mqh
//|ブルーノ・ピオ
//|http://mql5.commql5.com
//+------------------------------------------------------------------+
#property copyright "Bruno Pio"
#property link      "http://www.mql5.com"
#property version   "1.00"
#include "..\ExpertSignal.mqh"   // CExpertSignalはExpertSignalファイルにある。
#property tester_indicator "CenterOfGravity.ex5"
// ウィザードの説明開始
//+------------------------------------------------------------------+
//| クラスの説明|
| タイトル=重心信号|
//| タイプ=シグナル・アドバンス|
| Name=My_COG|
| ShortName=CG|
| クラス=COG|
//| ページ=不要|
//| Parameter=Period_,int,10,インジケータの平均化期間。
//| Parameter=SmoothPeriod,int,3,信号線の平滑化周期。
//| パラメータ=MA_METHOD_,ENUM_MA_METHOD,MODE_EMA,信号方式|</p
//| パラメータ=AppliedPrice,int,1,価格定数
//+------------------------------------------------------------------+
// ウィザードの説明 終了
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
class COG : public CExpertSignal
  {
private:
CiCustom             m_COG;               // オブジェクトとしてのインジケータ
//--- 設定可能なモジュール・パラメーター
   int               m_Period_;           // インジケータの平均化期間
   int               m_SmoothPeriod;      // 信号線の平滑化期間 
   ENUM_MA_METHOD    m_MA_Method_;        // 信号線平均法
   int               m_AppliedPrice;      // 価格定数
public:
                     COG(void);
                    ~COG(void);
//--- 入力データの正しさをチェックする
   bool              ValidationSettings();
//--- シグナル・モジュール用のインジケータとタイムスリリーの作成
   bool              InitIndicators(CIndicators *indicators);
//--- 指標データへのアクセス
   double            CG(const int index)                 const { return(m_COG.GetData(0,index)); }
   double            Signal(const int index)             const { return(m_COG.GetData(1,index)); }   
//--- 売買条件のチェック
   virtual int       LongCondition();
   virtual int       ShortCondition();
//--- 設定方法
   void              Period_(int value)               { m_Period_=value;        }
   void              SmoothPeriod(int value)          { m_SmoothPeriod=value;   }
   void              MA_Method_(ENUM_MA_METHOD value) { m_MA_Method_=value;     }
   void              AppliedPrice(int value)          { m_AppliedPrice=value;   }
protected:
   //--- インジケーターの作成
   bool              CreateCOG(CIndicators *indicators);



  };
//+------------------------------------------------------------------+
//| コンストラクタ|
//+------------------------------------------------------------------+
COG::COG(void) :           m_Period_(10),                // インジケータの平均化期間
                           m_SmoothPeriod(3),            // 信号線の平滑化期間 
                           m_MA_Method_(MODE_EMA),       // 信号線平均法
                           m_AppliedPrice(1)             // 価格定数
  {
  }
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
COG::~COG()
  {
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| 入力パラメータをチェックし、問題がなければtrueを返す。
//+------------------------------------------------------------------+
bool COG:: ValidationSettings()
  {
   //--- ベースクラスのメソッドを呼び出す
   if(!CExpertSignal::ValidationSettings())  return(false);
   //--- チェック期間、MA計算のためのバー数 >=1
   if(m_Period_<1)
     {
      PrintFormat("Incorrect value set for one of the period! Period_=%d",
                  m_Period_);
      return false;
     }
//--- チェック期間、MA計算のためのバー数 >=1
   if(m_SmoothPeriod<1)
     {
      PrintFormat("Incorrect value set for one of the period! m_SmoothPeriod=%d",
                  m_SmoothPeriod);
      return false;
     }
//--- 高速MAスムージングタイプは、列挙の4つの値のうちの1つでなければならない。
   if(m_MA_Method_!=MODE_SMA && m_MA_Method_!=MODE_EMA && m_MA_Method_!=MODE_SMMA && m_MA_Method_!=MODE_LWMA)
     {
      PrintFormat("Invalid type of smoothing of the fast MA!");
      return false;
     }
//--- m_AppliedPrice は有効でなければならない。
   if(m_AppliedPrice<1 || m_AppliedPrice>11) 
     {
      PrintFormat("Invalid type of Price!");
      return false;
     }
//--- すべてのチェックが完了し、問題なし
   return true;
  }
//+------------------------------------------------------------------+
//| インジケータの作成|
//| 入力: インジケータのコレクションへのポインタ。
//| 出力:成功すれば真、そうでなければ偽
//+------------------------------------------------------------------+
bool COG::InitIndicators(CIndicators *indicators)
  {
//--- インジケータのコレクションがNULLかどうかの標準チェック
   if(indicators==NULL) return(false);
//--- 追加フィルターでインジケーターとタイムスリリーを初期化する
   if(!CExpertSignal::InitIndicators(indicators)) return(false);
//--- インジケーターの作成
   if(!CreateCOG(indicators))                  return(false);   
//--- この部分に到達したので、関数は成功した。
   return(true);
  }
//+------------------------------------------------------------------+
//| COG "インジケーターを作成する。|
//+------------------------------------------------------------------+
bool COG::CreateCOG(CIndicators *indicators)
  {
//--- ポインタのチェック
   if(indicators==NULL) return(false);
//--- コレクションにオブジェクトを追加する
   if(!indicators.Add(GetPointer(m_COG)))
     {
      printf(__FUNCTION__+": Error adding an object of the COG");
      return(false);
     }
//--- COGのパラメータ設定
   MqlParam parameters[5];
//---
   parameters[0].type=TYPE_STRING;
   parameters[0].string_value="CenterOfGravity.ex5";
   parameters[1].type=TYPE_INT;
   parameters[1].integer_value=m_Period_;                 // 期間
   parameters[2].type=TYPE_INT;
   parameters[2].integer_value=m_SmoothPeriod;            // 信号線の平滑化期間
   parameters[3].type=TYPE_INT;
   parameters[3].integer_value=m_MA_Method_;              // 信号線平均法
   parameters[4].type=TYPE_INT;
   parameters[4].integer_value=m_AppliedPrice;            // 価格定数
//--- オブジェクトの初期化 
   if(!m_COG.Create(m_symbol.Name(),0,IND_CUSTOM,5,parameters))
     {
      printf(__FUNCTION__+": Error initializing the object of the COG");
      return(false);
     }
//--- バッファ数
   if(!m_COG.NumBuffers(2)) return(false);
//--- この部分に到達したので、関数は成功した。
   return(true);
  }
//+------------------------------------------------------------------+
//| 買いシグナルの強さを返す。|
//+------------------------------------------------------------------+
int COG::LongCondition()
  {
   int signal=0;
//--- ティックによる操作の場合 idx=0、形成されたバーによる操作の場合 idx=1
   int idx=StartIndex();
//--- 最後に形成されたバーでのCOGの値
   double last_fast_value=CG(idx);
   double last_slow_value=Signal(idx);
//--- 最後に形成された1本以外のバーのCOGの値
   double prev_fast_value=CG(idx+1);
   double prev_slow_value=Signal(idx+1);   
//--CG > Signal && CG-1 < Signal-1の場合
   if((last_fast_value>last_slow_value) && (prev_fast_value<prev_slow_value))
     {
      signal=100; // 買いのシグナルあり
     }
//--- シグナル値を返す
   return(signal);
  }
//+------------------------------------------------------------------+
//| 売りシグナルの強さを返す。|
//+------------------------------------------------------------------+
int COG::ShortCondition()
  {
   int signal=0;
//--- ティックによる操作の場合 idx=0、形成されたバーによる操作の場合 idx=1
   int idx=StartIndex();
//--- 最後に形成されたバーでのCOGの値
   double last_fast_value=CG(idx);
   double last_slow_value=Signal(idx);
//--- 最後に形成された1本以外のバーのCOGの値
   double prev_fast_value=CG(idx+1);
   double prev_slow_value=Signal(idx+1);   
//--CG < シグナル && CG-1 > シグナル-1の場合
   if((last_fast_value<last_slow_value) && (prev_fast_value>prev_slow_value))
     {
      signal=100; // 売りシグナルあり
     }
//--- シグナル値を返す
   return(signal);
  }
 
戦闘状態でのアルゴリズムを決定する必要がある。
 

インジケーターはエラーなしでコンパイルされています:

そして動作します。

------------------

固定されたsmoothalgorithms.mqhファイルを使用する必要があります


Indicators: T3Taotra_HTF
Indicators: T3Taotra_HTF
  • 2016.06.30
  • www.mql5.com
T3Taotra_HTF: Author: Nikolay Kositsin...
 
Bruno Pio #:
私も同じ問題を抱えています…
コミュニティから本当にたくさんの貴重なものをいただいたので、何かお返しをしたいと思っています。

これは(より大きなトレンドも考慮すれば)素晴らしいインジケーターです。改良版を送ります。末尾が単に赤色になるだけでなく、ライブチャート上でも正しく更新されるようになりました。

コードを挿入する 際は 「CODEボタン(Alt-S) を使用してください

今回はモデレーターが書式を修正しました。今後はコードの書式を正しく設定してください。書式が不適切なコードを含む投稿は削除される場合があります。

/*
 * SmoothAlgorithms.mqh ファイルは、
 * terminal_data_folder\MQL5\Include ディレクトリに配置する必要があります。
 */
//+------------------------------------------------------------------+
//|                                            Center of Gravity.mq4 |
//|                      Copyright © 2007, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net|
//+------------------------------------------------------------------+
#property copyright 「Copyright © 2007, MetaQuotes Software Corp.」
#property link      "http://www.metaquotes.net"
//---- インジケーターのバージョン
#property version   "1.00"
//---- 別のウィンドウにインジケーターを描画する
#property indicator_separate_window
//---- 指標の計算と描画には3つのバッファが使用されます
#property indicator_buffers 3
//---- 2つのプロットを使用しています
#property indicator_plots   2
//+----------------------------------------------+
//|  インジケーターの描画パラメータ                |
//+----------------------------------------------+
//---- インジケーター1を3色の線として描画する
#property indicator_type1 DRAW_COLOR_LINE
//---- 3色の線色として使用
#property indicator_color1 Gray,Lime,Red
//---- インジケーター1の線は連続した曲線である
#property indicator_style1  STYLE_SOLID
//---- インジケーター1の線の太さは1に等しい
#property indicator_width1  1
//---- インジケータラベル 1 の表示
#property indicator_label1  "Center of Gravity"
//+----------------------------------------------+
//|  インジケーターの描画パラメータ                |
//+----------------------------------------------+
//---- インジケーター2を線として描画する
#property indicator_type2   DRAW_LINE
//---- インジケーター線の色には青色が使用されています
#property indicator_color2  Blue
//---- インジケーター2の線は連続した曲線です
#property indicator_style2  STYLE_SOLID
//---- インジケーター2の線の太さは1に等しい
#property indicator_width2  1
//---- インジケーターラインのラベル 2 の表示
#property indicator_label2  "Signal Line"
//---- 線のスタイルは点線と実線の組み合わせの曲線です
#property indicator_style2 STYLE_DASHDOTDOT
//+-----------------------------------+
//|  インジケータの入力パラメータ      |
//+-----------------------------------+
enum Applied_price_ //定数の種類
  {
   PRICE_CLOSE_ = 1,     //PRICE_CLOSE
   PRICE_OPEN_,          //PRICE_OPEN
   PRICE_HIGH_,          //PRICE_HIGH
   PRICE_LOW_,           //PRICE_LOW
   PRICE_MEDIAN_,        //PRICE_MEDIAN
   PRICE_TYPICAL_,       //標準価格
   PRICE_WEIGHTED_,      //価格加重
   PRICE_SIMPLE_,//PRICE_SIMPLE_
   PRICE_QUARTER_,       //PRICE_QUARTER_
   PRICE_TRENDFOLLOW0_,  //PRICE_TRENDFOLLOW0_
   PRICE_TRENDFOLLOW1_   //PRICE_TRENDFOLLOW1_
  };
input int Period_=10;                          // インジケーターの平均化期間
input int SmoothPeriod=3;                      // 信号線の平滑化期間
input ENUM_MA_METHOD MA_Method_=MODE_SMA;      // 信号線の平均化手法
input Applied_price_ AppliedPrice=PRICE_CLOSE_;// 価格定数
/* 指標の算出に使用される(1-終値、2-始値、3-高値、 4-LOW、
  5-MEDIAN、6-TYPICAL、7-WEIGHTED、8-SIMPLE、9-QUARTER、10-TRENDFOLLOW、11-0.5 * TRENDFOLLOW。) */
//+-----------------------------------+
//---- さらに、動的配列の宣言
//---- インジケーターバッファとして使用されます
double Ext1Buffer[];
double Ext2Buffer[];
double ColorExt2Buffer[];
//---- データ計算の開始に向けた整数変数の宣言
int StartBar;
//+------------------------------------------------------------------+
//| iPriceSeries 関数の説明                                |
//| Moving_Average クラスの説明                                 | 
//+------------------------------------------------------------------+ 
#include <SmoothAlgorithms.mqh> 
//+------------------------------------------------------------------+
//| カスタムインジケーターの初期化関数                         |
//+------------------------------------------------------------------+ 
void OnInit()
  {
//---- 定数の初期化
   StartBar=Period_;
//---- MAMABuffer ダイナミック配列をインジケータバッファとして設定する
   SetIndexBuffer(0,Ext1Buffer,INDICATOR_DATA);
//---- DataWindowに表示するラベルを作成する
   PlotIndexSetString(0,PLOT_LABEL,"Center of Gravity");
//---- インジケーターの描画開始位置をずらす
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,StartBar);
//---- 動的配列をカラーインデックスバッファに変換する  
   SetIndexBuffer(1,ColorExt2Buffer,INDICATOR_COLOR_INDEX);
//---- インジケーターの描画開始位置をずらす
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,StartBar+1);

//---- FAMABufferの動的配列をインジケータ配列として設定する
   SetIndexBuffer(2,Ext2Buffer,INDICATOR_DATA);
//---- DataWindowに表示するラベルを作成する
   PlotIndexSetString(2,PLOT_LABEL,"Signal Line");
//---- インジケーターの描画開始位置をずらす
   PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,StartBar+1);

//---- インジケーターの短縮名用の変数の初期化
   string shortname;
   StringConcatenate(shortname,"Center of Gravity(",Period_,")");
//---- 別のサブウィンドウやツールチップに表示するための名前を作成する
   IndicatorSetString(INDICATOR_SHORTNAME,shortname);
//---- インジケーター値の表示精度を設定する
   IndicatorSetInteger(INDICATOR_DIGITS,0);
//----
  }
//+------------------------------------------------------------------+
//| カスタムインジケータの反復処理関数                              |
//+------------------------------------------------------------------+
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[])
  {
//---- 計算に十分な小節数があるか確認する
   if(rates_total<StartBar) return(0);

//---- 浮動小数点型の変数の宣言 
   double price_,sma,lwma;
//---- 整数変数の宣言
   int first1,first2,first3,bar;

//---- OnCalculate() ブロック内でのインジケーターの初期化
   if(prev_calculated>rates_total || prev_calculated<=0)// 指標の計算が最初に開始されたかどうかを確認する
     {
      first1=0; // 最初のループのすべての小節を計算するための開始番号
      first2=Period_+1; // すべての信号ラインのバーを計算するための開始番号
      first3=Period_+SmoothPeriod+3; // すべてのカラーリングループバーの計算を開始するための開始番号
     }
   else // 新しいバーの計算開始番号
     {
      first1=prev_calculated-1;
      first3=first1;
     }

//---- 修正(追加):jelvonal(シグナルライン)のMASeries呼び出しにおいて、「begin」パラメータは常に
//---- 同じ「固定」信頼性閾値 (Period_+1) である必要がある - 当初は有効
//---- 誤って、常に変化する「first1」(実際にはその時点のキャンドルインデックス)を指定していました
//---- 処理済みのキャンドルとすべてのライブティックで一致するものが設定され、以下が混同された
//---- ベルソのシミトクラスにおける「データがいつまで信頼できるか」というロジック — これが原因で不安定/不具合が生じていた
//---- これはジェルヴォナルの現在の値であり、このため「改善された」のは、TFの切り替え(完全な再計算)の後になってからである。
   first2=Period_+1;

//---- Moving_Average クラスの変数の宣言
   static CMoving_Average MA,LWMA,SIGN;

//---- チャネル中心線の計算のメインサイクル
   for(bar=first1; bar<rates_total; bar++)
     {
      //---- 入力価格「Series」を取得するために、PriceSeries関数を呼び出します
      price_=PriceSeries(AppliedPrice,bar,open,low,high,close);

      sma=MA.MASeries(0,prev_calculated,rates_total,Period_,MODE_SMA,price_,bar,false);
      lwma=LWMA.MASeries(0,prev_calculated,rates_total,Period_,MODE_LWMA,price_,bar,false);

      Ext1Buffer[bar]=sma*lwma/_Point;
      Ext2Buffer[bar]=SIGN.MASeries(first2,prev_calculated,rates_total,SmoothPeriod,MA_Method_,Ext1Buffer[bar],bar,false);
     }

//---- 信号線の着色のメインループ
   for(bar=first3; bar<rates_total; bar++)
     {
      ColorExt2Buffer[bar]=0;
      if(Ext1Buffer[bar]<Ext2Buffer[bar])
         ColorExt2Buffer[bar]=2;
      else ColorExt2Buffer[bar]=1;
     }
//----   
   return(rates_total);
  }
//+------------------------------------------------------------------+