便利ですね! ...色変更の基準が知りたいです。
この素晴らしいインジケーターをありがとう。
旧バージョンも新バージョンと同じくらい、いや、それ以上に興味深く有用なものでした。
旧バージョンもmq5に移植していただけませんか?そうしていただけると非常にありがたいです。
よろしくお願いします!
このインジケーターからシグナルを作成しようとしましたが、できませんでした。
助けてください。
//+------------------------------------------------------------------+ //|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); }
戦闘状態でのアルゴリズムを決定する必要がある。
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); } //+------------------------------------------------------------------+
取引の機会を逃しています。
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索


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