지표: 엘러스 무게 중심 - 무게 중심 J. F. Ehlers

 

엘러스 무게 중심 - 무게 중심 J. F. Ehlers:

중력의 중심은 존 엘러스가 개발한 오실레이터로, 2002년 5월호 주식 및 상품에 소개된 바 있습니다.

엘러스 무게 중심 - 무게 중심 J. F. Ehlers

Author: Nikolay Kositsin

 
유용합니다! ...색상 변경 기준을 알고 싶습니다.
 

안녕하세요,

이 오실레이터는 훌륭한 오실레이터이지만 문제가 있습니다.

마지막 캔들에 의해 계산되는 신호선의 끝이 표시되지 않으므로 현재 시간에 항상 빨간색으로 표시됩니다. 오실레이터를 재설정하면 신호선이 끝날 때 잠시 동안 좋은 값을 표시하지만 다시 빨간색으로 전환됩니다(녹색으로 표시되어야 하는 경우에도).

이 문제를 해결하려면 어떻게 해야 하나요?

다시 디버깅을 시도했지만 도움이 되지 않았습니다.

안녕하세요,

InfiniteDesign

 
그의 의견으로는이 지표는 mehor와 기호 및 기간과 함께 작동합니다.
지표의 매개변수에 가장 적합한 값은 무엇인가요 ?
 

이 훌륭한 지표에 대해 많은 감사를 드립니다.

이전 버전도 새 버전만큼이나 흥미롭고 유용하거나 사실 더 유용하다는 것을 알았습니다.

이전 버전도 mq5로 포팅해 주실 수 있나요? 가능하다면 정말 감사하겠습니다.


건배, 그리고 미리 감사드립니다 !!!

 
이 지표는 비결정적입니다. 동일한 데이터 포인트를 서로 다른 시간에 두 번 요청하면 서로 다른 답변을 얻을 수 있습니다. 드리프트는 현재 시간에 가까울수록 커집니다. 불일치는 3.7 x 10^-04까지 커질 수 있습니다.
 
InfiniteDesign:

안녕하세요,

이 오실레이터는 훌륭한 오실레이터이지만 문제가 있습니다.

마지막 캔들에 의해 계산되는 신호선의 끝이 표시되지 않으므로 현재 시간에 항상 빨간색으로 표시됩니다. 오실레이터를 재설정하면 신호선이 끝날 때 잠시 동안 좋은 값을 표시하지만 다시 빨간색으로 전환됩니다(녹색으로 표시되어야 하는 경우에도).

이 문제를 해결하려면 어떻게 해야 하나요?

다시 디버깅을 시도했지만 도움이 되지 않았습니다.

안녕하세요,

InfiniteDesign

저도 같은 문제가 있습니다...
 

이 인디케이터에서 신호를 만들려고 했지만 실패했습니다...

도움이 필요하신가요?


//+------------------------------------------------------------------+
//|COG.mqh |
//|브루노 피오 |
//| http://www.mql5.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|
//| Class=COG|
//| 페이지=필요 없음|
//| Parameter=Period_,int,10,지표 평균 기간 |
//| 파라미터=스무드 주기,int,3,신호선 평활화 주기 |
//| 파라미터=MA_Method_,ENUM_MA_METHOD,MODE_EMA,신호 방법 |
//| Parameter=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()
  {
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| 입력 매개변수를 확인하고 모든 것이 정상인 경우 참을 반환합니다.
//+------------------------------------------------------------------+
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 평활화 유형은 열거형의 네 가지 값 중 하나여야 합니다.
   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);
//--- 마지막에 형성된 막대 하나만 남긴 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);
  }
//+------------------------------------------------------------------+
//| 매도 신호의 강도를 반환합니다.|
//+------------------------------------------------------------------+
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);
//--- 마지막에 형성된 막대 하나만 남긴 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 |
//|                      저작권 © 2007, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "저작권 © 2007, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
//---- 지표 버전
#property version   "1.00"
//---- 별도의 창에 표시기를 그리는 중
#property indicator_separate_window
//---- 지표의 계산 및 그리기에 세 개의 버퍼가 사용됩니다.
#property indicator_buffers 3
//---- 두 개의 그래프가 사용됩니다
#property indicator_plots   2
//+----------------------------------------------+
//|  지표 그리기 매개변수                |
//+----------------------------------------------+
//---- 표시기 1을 3가지 색상의 선으로 그리기
#property indicator_type1 DRAW_COLOR_LINE
//---- 세 가지 색상의 선 색상으로 사용됨
#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_HIGH_,          //PRICE_HIGH
   PRICE_LOW_,           //PRICE_LOW
   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)이 적용되어야 함 - 원래 적용되던 것
//---- ticknél은 실수로 항상 변하는 “first1”(즉, 현재 스파크 플러그 인덱스)을 가리키고 있었다
//---- 처리된 캔들 데이터와 모든 실시간 틱 데이터가 일치하는 경우, 다음을 혼합하여
//---- 벨소 시미토 클래스의 “데이터가 언제까지 신뢰할 수 있는가”라는 논리 — 이 때문에 불안정하거나 오류가 발생했다
//---- a jelvonal의 현재 값이며, 이 때문에 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);
  }
//+------------------------------------------------------------------+