指标: YURAZ_MCCH 计算指标

 

YURAZ_MCCH 计算指标:

此指标计算相对于收盘价的增长或下降百分比。它通过使用面向对象的编程编写,并可以很容易地与任何 EA 或其它指标集成。

作者: Yuriy Zaytsev

[删除]  

对不起!我有两个警告要补充。

#property indicator_plots   0

和这里

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
 
Alexsandr San:

对不起!我有两点警告要补充。

和这里


代码编写于 2009 年,此后发生了许多变化。

代码既适用于外汇市场,也适用于股票市场。

//+------------------------------------------------------------------+
//|Yuraz_CH_moex.mq5
//|Copyright 2020,YuraZ | |
//| https://www.mql5.com/zh/users/yuraz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020,YuraZ"
#property link      "https://www.mql5.com/zh/users/yuraz"
#property version   "1.02"
#property indicator_chart_window
#property indicator_plots   1
#property indicator_buffers 1


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 类计算 CH%
//
struct SymbolStruct
  {
   // bool work;
   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);    // false - 所有符号 , true - 仅 MarketWatch 中的符号
   int i;
   int yPos=12;
   ArrayResize(sSymb,i_SymbolsTotal+1,i_SymbolsTotal+1);   // 用 MarketWatch 的符号填充数组
   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();
  }
//+------------------------------------------------------------------+