Индикаторы: YURAZ_MCCH Индикатор расчета CH%

 

YURAZ_MCCH Индикатор расчета CH%:

Индикатор рассчитывает % роста или падения относительно CLOSE, написан с применением ООП, и легко интегрируется в любой советник или иной индикатор

Автор: Yuriy Zaytsev

 

я извиняюсь! предупреждения 2  надо добавить 

#property indicator_plots   0

 и тут

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


 

 
Alexsandr San:

я извиняюсь! предупреждения 2  надо добавить 

 и тут


 

Код писался 2009 году , с тех пор столько изменилось.

Код работает как для FOREX так и для рынка АКЦИЙ.

//+------------------------------------------------------------------+
//|                                                Yuraz_CH_moex.mq5 |
//|                                             Copyright 2020,YuraZ |
//|                              https://www.mql5.com/ru/users/yuraz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020,YuraZ"
#property link      "https://www.mql5.com/ru/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; // Handl  индикатора для получения котировок с другого графика
   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;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   chmc.CreateSymbol(); // Создадим символы из окружения
//---
   EventSetMillisecondTimer(1);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTimer()
  {
   chmc.MyOnTimer();
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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();
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   chmc.DeleteSymbolFromCrafic();
  }
//+------------------------------------------------------------------+
Причина обращения: