죄송합니다! 두 가지 경고를 추가하겠습니다.
#property indicator_plots 0
그리고 여기
//+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ void OnDeinit(const int reason) {
Alexsandr San:
죄송합니다! 두 가지 경고를 추가하겠습니다.
그리고 여기
이 코드는 2009년에 작성되었지만 그 이후로 많은 변화가 있었습니다.
이 코드는 외환과 주식 시장 모두에서 작동합니다.
//+------------------------------------------------------------------+ //|Yuraz_CH_moex.mq5 | //|저작권 2020,유라즈 | //| https://www.mql5.com/ko/users/yuraz | //+------------------------------------------------------------------+ #property copyright "Copyright 2020,YuraZ" #property link "https://www.mql5.com/ko/users/yuraz" #property version "1.02" #property indicator_chart_window #property indicator_plots 1 #property indicator_buffers 1 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 클래스 계산 CH% // struct SymbolStruct { // bool 작업; string sSymbol; int y; int x; double CH; int HandleInd; // 다른 차트에서 시세를 가져오는 표시기 처리하기 long chart_id; }; //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ class CChmcYZ { public: SymbolStruct sSymb[]; color lColorSym; color lColorChPlus; color lColorChMinus; color lColorCH; int indicatorWindow; // 메인 창에서 작업 void CChmcYZ() { indicatorWindow=0; lColorSym=Aqua; lColorCH=White; lColorChPlus =LimeGreen; lColorChMinus =Red; } // 생성자 void CreateSymbol(void); void DeleteSymbolFromCrafic(void); void MyOnCalculate(void); void MyOnTimer(); private: void RCH(int iPos, string sSymbol,datetime DATEBEG,datetime DATEEND); void RCHsay(int iPos, string sSym,datetime db,datetime de,int X,int Y); // 한 쌍의 계산을 완료하고 표시합니다. color lColor; double dClose[3]; // 최대 가격 복사용 배열 int i_SymbolsTotal; }; //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ void CChmcYZ::CreateSymbol(void) { i_SymbolsTotal =SymbolsTotal(true); // 거짓 - 모든 기호 , 참 - 마켓워치의 기호만 int i; int yPos=12; ArrayResize(sSymb,i_SymbolsTotal+1,i_SymbolsTotal+1); // 마켓워치의 심볼로 배열을 채웁니다. for(i=0; i<i_SymbolsTotal; i++) { sSymb[i].sSymbol = SymbolName(i, true); Sleep(1000); chmc.RCHsay(i, sSymb[i].sSymbol,TimeCurrent()-86400*5,TimeCurrent(),5,16+yPos); // CH% 일 계산 yPos += 12; } long id_ChartFirst = ChartFirst(); long idC = ChartFirst(); } //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ void CChmcYZ::MyOnTimer(void) { MyOnCalculate(); } //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ void CChmcYZ::MyOnCalculate(void) { int yPos=12; for(int i=0; i<i_SymbolsTotal; i++) { chmc.RCHsay(i, sSymb[i].sSymbol,TimeCurrent()-86400*5,TimeCurrent(),5,16+yPos); // CH% 일 계산 yPos += 12; } } //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ void CChmcYZ::DeleteSymbolFromCrafic(void) { int i=ObjectsTotal(0,-1,-1); while(i>0) { string sObjYZ = ObjectName(0,i); if(StringSubstr(sObjYZ,0,3)=="oYZ") // 차트에서 개체만 삭제 { ObjectDelete(0,sObjYZ); } i--; } ChartRedraw(); } void CChmcYZ::RCH(int iPos, string sSymbol,datetime DATEBEG,datetime DATEEND) { sSymb[iPos].CH=0; int CountBar; // DATEBEG = StringToTime( TimeToString(DATEBEG,TIME_DATE)); DATEEND = StringToTime( TimeToString(DATEEND,TIME_DATE)); CountBar= CopyClose(sSymb[iPos].sSymbol,PERIOD_D1,DATEEND,2,dClose); if(CountBar>=0) { if(NormalizeDouble(dClose[1],5)!=0.0 && NormalizeDouble(dClose[0],5)!=0.0) { sSymb[iPos].CH=(dClose[1]*100)/dClose[0]-100; } } } //+------------------------------------------------------------------+ //|| 출력으로 계산 //+------------------------------------------------------------------+ void CChmcYZ::RCHsay(int iPos, string sSym,datetime db,datetime de,int XD,int YD) // 한 쌍만 전체 계산 { RCH(iPos, sSym,db,de); if(ObjectFind(indicatorWindow,"oYZ"+sSym)==-1) { ObjectCreate(indicatorWindow,"oYZ"+sSym,OBJ_LABEL,indicatorWindow,0,0); ObjectSetInteger(indicatorWindow,"oYZ"+sSym,OBJPROP_XDISTANCE,XD); ObjectSetInteger(indicatorWindow,"oYZ"+sSym,OBJPROP_YDISTANCE,YD); ObjectSetInteger(indicatorWindow,"oYZ"+sSym,OBJPROP_CORNER,CORNER_LEFT_UPPER); ObjectSetString(indicatorWindow,"oYZ"+sSym,OBJPROP_TEXT,sSym); ObjectSetString(indicatorWindow,"oYZ"+sSym,OBJPROP_FONT,"Arial"); ObjectSetInteger(indicatorWindow,"oYZ"+sSym,OBJPROP_FONTSIZE,7); ObjectSetInteger(indicatorWindow,"oYZ"+sSym,OBJPROP_COLOR,lColorSym); ObjectSetInteger(indicatorWindow,"oYZ"+sSym,OBJPROP_SELECTABLE,true); } if(ObjectFind(indicatorWindow,"oYZ_"+sSym)==-1) { ObjectCreate(indicatorWindow,"oYZ_"+sSym,OBJ_LABEL,indicatorWindow,0,0); ObjectSetInteger(indicatorWindow,"oYZ_"+sSym,OBJPROP_XDISTANCE,XD+45); ObjectSetInteger(indicatorWindow,"oYZ_"+sSym,OBJPROP_YDISTANCE,YD); ObjectSetInteger(indicatorWindow,"oYZ_"+sSym,OBJPROP_CORNER,CORNER_LEFT_UPPER); ObjectSetString(indicatorWindow,"oYZ_"+sSym,OBJPROP_TEXT,sSym); ObjectSetString(indicatorWindow,"oYZ_"+sSym,OBJPROP_FONT,"Arial"); ObjectSetInteger(indicatorWindow,"oYZ_"+sSym,OBJPROP_FONTSIZE,7); ObjectSetInteger(indicatorWindow,"oYZ_"+sSym,OBJPROP_COLOR,lColorCH); ObjectSetInteger(indicatorWindow,"oYZ_"+sSym,OBJPROP_SELECTABLE,true); } YD=YD+11; lColor=lColorCH; if(sSymb[iPos].CH>=0) { lColor=lColorChPlus; ObjectSetString(indicatorWindow,"oYZ_"+sSym,OBJPROP_TEXT," "+DoubleToString(sSymb[iPos].CH,2)); ObjectSetInteger(indicatorWindow,"oYZ_"+sSym,OBJPROP_XDISTANCE,XD+45); } if(sSymb[iPos].CH<0) { lColor=lColorChMinus; ObjectSetString(indicatorWindow,"oYZ_"+sSym,OBJPROP_TEXT,DoubleToString(sSymb[iPos].CH,2)); ObjectSetInteger(indicatorWindow,"oYZ_"+sSym,OBJPROP_XDISTANCE,XD+46); } ObjectSetInteger(indicatorWindow,"oYZ_"+sSym,OBJPROP_COLOR,lColor); } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// CChmcYZ chmc; //+------------------------------------------------------------------+ //| 사용자 지정 표시기 초기화 기능 | //+------------------------------------------------------------------+ int OnInit() { //--- 표시기 버퍼 매핑 chmc.CreateSymbol(); // 환경에서 심볼 생성 //--- EventSetMillisecondTimer(1); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ void OnTimer() { chmc.MyOnTimer(); } //+------------------------------------------------------------------+ //| 사용자 지정 표시기 반복 함수 | //+------------------------------------------------------------------+ 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[]) { chmc.MyOnCalculate(); //--- 다음 호출을 위한 prev_calculated의 반환 값 return(rates_total); } //+------------------------------------------------------------------+ //| 차트 이벤트 함수| //+------------------------------------------------------------------+ void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) { //--- } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ void OnDeinit(const int reason) { chmc.DeleteSymbolFromCrafic(); } //+------------------------------------------------------------------+
YURAZ_MCCH:
이 인디케이터는 종가를 기준으로 상승 또는 하락을 계산하고, OOP를 사용하여 작성되며, 모든 Expert Advisor 또는 다른 인디케이터에 쉽게 통합할 수 있습니다.
Author: Yuriy Zaytsev