유용합니다! ...색상 변경 기준을 알고 싶습니다.
이 훌륭한 지표에 대해 많은 감사를 드립니다.
이전 버전도 새 버전만큼이나 흥미롭고 유용하거나 사실 더 유용하다는 것을 알았습니다.
이전 버전도 mq5로 포팅해 주실 수 있나요? 가능하다면 정말 감사하겠습니다.
건배, 그리고 미리 감사드립니다 !!!
이 인디케이터에서 신호를 만들려고 했지만 실패했습니다...
도움이 필요하신가요?
//+------------------------------------------------------------------+ //|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); }
흥미로운 점은... 전투 조건에서 알고리즘을 결정해야 한다는 것입니다.
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); } //+------------------------------------------------------------------+


엘러스 무게 중심 - 무게 중심 J. F. Ehlers:
중력의 중심은 존 엘러스가 개발한 오실레이터로, 2002년 5월호 주식 및 상품에 소개된 바 있습니다.
Author: Nikolay Kositsin