iMTF_DivergencesSearchForDifferentIndicators

Author: Copyright 2016, Artem A. Trishkin, Skype artmedia70
Price Data Components
Indicators Used
Bill Williams Awesome oscillatorMACD Histogram
Miscellaneous
It issuies visual alerts to the screen
1 Views
0 Downloads
0 Favorites
iMTF_DivergencesSearchForDifferentIndicators
//+------------------------------------------------------------------+
//|              MTF Divergences search for different Indicators.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_plots   4
//--- plot AoUP
#property indicator_label1  "AO Sell Signal"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot AoDN
#property indicator_label2  "AO Buy Signal"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrDodgerBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- plot MacdUP
#property indicator_label3  "MACD Sell Signal"
#property indicator_type3   DRAW_ARROW
#property indicator_color3  clrRed
#property indicator_style3  STYLE_SOLID
#property indicator_width3  1
//--- plot MacdDN
#property indicator_label4  "MACD Buy Signal"
#property indicator_type4   DRAW_ARROW
#property indicator_color4  clrDodgerBlue
#property indicator_style4  STYLE_SOLID
#property indicator_width4  1

//--- indicator buffers
double         BufferAoUP[];
double         BufferAoDN[];
double         BufferMacdUP[];
double         BufferMacdDN[];

//+------------------------------------------------------------------+
//|  Enums                                                           |
//+------------------------------------------------------------------+
enum enumYN
  {
   enYes=1, // Äà
   enNo=0,  // Íåò
  };
enum enumModeLINE
  {
   enMdMain=MODE_MAIN,  // Main
   enMdSign=MODE_SIGNAL,// Signal
  };
enum enumCoincidence
  {
   enCoinAccurate=1,    // Òî÷íûé
   enCoinApproximate=0, // Ïðèáëèæåííûé
  };
//+------------------------------------------------------------------+
//|  Input Variables                                                 |
//+------------------------------------------------------------------+
extern string  Div_Params = "-- Ïàðàìåòðû ïîèñêà äèâåðãåíöèé --";//======================================
sinput   ENUM_TIMEFRAMES   PeriodForWork=PERIOD_H4;               // Òàéìôðåéì, íà êîòîðîì èñêàòü äèâåðãåíöèè
ENUM_TIMEFRAMES periodForWork; // Òàéìôðåéì, íà êîòîðîì èñêàòü äèâåðãåíèöèè
sinput   enumCoincidence   SearchAccuracy=enCoinApproximate;      // Ðåæèì ïîèñêà ñîâïàäåíèé ýêñòðåìóìîâ èíäèêàòîðà è öåíû
input    int               NumBarAccuracy=3;                      // Äèàïàçîí áàðîâ ïîèñêà ýêñòðåìóìîâ èíäèêàòîðà è öåíû 
int numBarAccuracy; // Êîëè÷åñòâî áàðîâ íåòî÷íîñòè ïîèñêà ïèêîâ
input    int               KoeffDistanceBetween=5;                // Êîýôôèöèåíò "ðàçíèöû" ìåæäó ýêñòðåìóìàìè
double koeffForDistanceBetween; // Êîýôôèöèåíò "ðàçíèöû" ìåæäó ýêñòðåìóìàìè
sinput   int               WidthChartLine=1;                      // Òîëùèíà ëèíèé íà ãðàôèêå öåíû
int widthChartLine; // Òîëùèíà ëèíèé íà ãðàôèêå öåíû
sinput   ENUM_LINE_STYLE   StyleChartLine=STYLE_SOLID;            // Ñòèëü ëèíèé íà ãðàôèêå öåíû
sinput   int               WidthIndicatorsLine=1;                 // Òîëùèíà ëèíèé â îêíå èíäèêàòîðîâ
int widthIndicatorsLine; // Òîëùèíà ëèíèé â îêíå èíäèêàòîðîâ
sinput   ENUM_LINE_STYLE   StyleIndicatorsLine=STYLE_SOLID;       // Ñòèëü ëèíèé â îêíå èíäèêàòîðîâ

//--- èñïîëüçóåìûå èíäèêàòîðû
extern string  AO_Params = "-- Ïàðàìåòðû AO --";//======================================
sinput   enumYN            UseAO=enYes;                           // Èñêàòü äèâåðãåíöèè íà AO
sinput   color             ColorUpperAO=clrRed;                   // Öâåò âåðõíèõ ëèíèé äèâåðãåíöèé AO
sinput   color             ColorLowerAO=clrBlue;                  // Öâåò íèæíèõ ëèíèé äèâåðãåíöèé AO

extern string  MACD_Params = "-- Ïàðàìåòðû MACD --"; //======================================
sinput   enumYN            UseMACD=enNo;                          // Èñêàòü äèâåðãåíöèè íà MACD
input    enumModeLINE      ModeLineMACD=enMdMain;                 // Èñêàòü äèâåðãåíöèè ïî ëèíèè MACD:
input    int               FastEMA_MACD=12;                       // Áûñòðàÿ EMA MACD
int fastEMA_MACD; // Áûñòðîå EMA MACD
input    int               SlowEMA_MACD=26;                       // Ìåäëåííàÿ EMA MACD
int slowEMA_MACD; // Ìåäëåííîå EMA MACD
input    int               PeriodSignalMACD=9;                    // Ïåðèîä ñèãíàëüíîé SMA MACD
int periodSignalMACD; // Ïåðèîä ñèãíàëüíîé SMA MACD
input    ENUM_APPLIED_PRICE AppledPriceMACD=PRICE_CLOSE;          // Ïðèìåíèòü ê:
sinput   color             ColorUpperMACD=clrRed;                 // Öâåò âåðõíèõ ëèíèé äèâåðãåíöèé MACD
sinput   color             ColorLowerMACD=clrBlue;                // Öâåò íèæíèõ ëèíèé äèâåðãåíöèé MACD

//+------------------------------------------------------------------+
//|  Global Variables                                                |
//+------------------------------------------------------------------+
string Prefix, symbol;
int    number_ao;       // íîìåð îêíà AO
int    number_macd;     // íîìåð îêíà MACD

string name_ao="";
string name_macd="";
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,BufferAoUP);          // Áóôåð òî÷åê ýêñòðåìóìîâ "Âåðõ" AO
   SetIndexBuffer(1,BufferAoDN);          // Áóôåð òî÷åê ýêñòðåìóìîâ "Íèç" AO
   SetIndexBuffer(2,BufferMacdUP);        // Áóôåð òî÷åê ýêñòðåìóìîâ "Âåðõ" MACD
   SetIndexBuffer(3,BufferMacdDN);        // Áóôåð òî÷åê ýêñòðåìóìîâ "Íèç" MACD
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
   //--- mql5
   PlotIndexSetInteger(0,PLOT_ARROW,234); // Ñòðåëêà "Âíèç" äëÿ ñèãíàëà äèâ. AO
   PlotIndexSetInteger(1,PLOT_ARROW,233); // Ñòðåëêà "Ââåðõ" äëÿ ñèãíàëà äèâ. AO
   PlotIndexSetInteger(2,PLOT_ARROW,234); // Ñòðåëêà "Âíèç" äëÿ ñèãíàëà äèâ. MACD
   PlotIndexSetInteger(3,PLOT_ARROW,233); // Ñòðåëêà "Ââåðõ" äëÿ ñèãíàëà äèâ. MACD
   //--- mql4
   SetIndexArrow(0,242);                  // Ñòðåëêà "Âíèçõ" äëÿ ñèãíàëà äèâ. AO
   SetIndexArrow(1,241);                  // Ñòðåëêà "Ââåðõ" äëÿ ñèãíàëà äèâ. AO
   SetIndexArrow(2,248);                  // Ñòðåëêà "Âíèç" äëÿ ñèãíàëà äèâ. MACD
   SetIndexArrow(3,246);                  // Ñòðåëêà "Ââåðõ" äëÿ ñèãíàëà äèâ. MACD
   //--- èíèöèàëèçàöèÿ áóôåðîâ
   ArrayInitialize(BufferAoDN,EMPTY_VALUE);
   ArrayInitialize(BufferAoUP,EMPTY_VALUE);
   ArrayInitialize(BufferMacdDN,EMPTY_VALUE);
   ArrayInitialize(BufferMacdUP,EMPTY_VALUE);
   //--- èìåíà
   symbol=Symbol();
   Prefix="MTFdiv";                      // Ïðåôèêñ èì¸í îáúåêòîâ
   IndicatorSetString(INDICATOR_SHORTNAME,Prefix); // Êîðîòêîå èìÿ èíäèêàòîðà
   //--- êîððåêòèðîâêà ââåä¸ííûõ çíà÷åíèé MACD
   fastEMA_MACD=(FastEMA_MACD<1)?1:FastEMA_MACD;                           // åñëè áûñòðîå ÅÌÀ ìåíüøå 1, òî 1, èíà÷å ïðèíÿòü ââåä¸ííîå
   slowEMA_MACD=(SlowEMA_MACD<=fastEMA_MACD)?fastEMA_MACD+1:SlowEMA_MACD;  // åñëè ìåäëåííîå ÅÌÀ ìåíüøå, ëèáî ðàâíî áûñòðîìó ÅÌÀ (÷åãî áûòü íå äîëæíî), òî ñäåëàòü ÁûñòðîåÅÌÀ+1, èíà÷å ïðèíÿòü ââåä¸ííîå
   periodSignalMACD=(PeriodSignalMACD<1)?1:PeriodSignalMACD;
   //--- ïðèáëèæ¸ííîñòü ïîèñêà
   numBarAccuracy=(NumBarAccuracy<0)?0:NumBarAccuracy;
   if(SearchAccuracy) numBarAccuracy=1;
   // Êîððåêòèðîâêà êîýôôèöèåíòà "ðàçíèöû" ìåæäó ýêñòðåìóìàìè
   koeffForDistanceBetween=(KoeffDistanceBetween<0)?0:KoeffDistanceBetween*Point();
   //--- ïðîâåðêà ðàáî÷åãî ïåðèîäà è åãî ñìåíà, åñëè âûáðàí ðàáî÷èé ïåðèîä ìåíüøå òåêóùåãî
   periodForWork=PeriodForWork;
   if(Period()>periodForWork) {
      Alert("Âûáðàí íå êîððåêòíûé ïåðèîä: ",GetNameTF(PeriodForWork),"\nÌåíÿþ ðàáî÷èé ïåðèîä íà ",GetNameTF(Period()));
      periodForWork=PERIOD_CURRENT;//GetTFasEnum(Period());
      }
   //--- ïàðàìåòðû ëèíèé
   widthChartLine=(WidthChartLine<1)?1:WidthChartLine;
   widthIndicatorsLine=(WidthIndicatorsLine<1)?1:WidthIndicatorsLine;
   //--- íîìåðà èíäèêàòîðîâ
   number_ao=0;
   number_macd=1;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- delete graphics
   ObjectsDeleteAll(0,Prefix);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//---
   if(rates_total<koeffForDistanceBetween*2) return(0);
   //---
   double ao_a, ao_b, ao_c;
   double macd_a, macd_b, macd_c;
   int limit=rates_total-prev_calculated;
   if(limit>1) {
      limit=rates_total-4;
      }
   name_ao="AO";
   name_macd="MACD("+(string)fastEMA_MACD+","+(string)slowEMA_MACD+","+(string)periodSignalMACD+")";
   
   int wnd_ao=GetWindowNumber(name_ao);      // Íîìåð ïîäîêíà èíäèêàòîðà AO
   int wnd_macd=GetWindowNumber(name_macd);  // Íîìåð ïîäîêíà èíäèêàòîðà MACD

   int periodSeconds=PeriodSeconds(periodForWork); // Êîëè÷åñòâî ñåêóíä â ðàáî÷åì ïåðèîäå
   static datetime lastTime=0;
   //--- îñíîâíîé öèêë èíäèêàòîðà
   for(int i=limit; i>=0; i--) {
      datetime timePeriod=GetTimeOpen(symbol,periodForWork,i); // âðåìÿ îòêðûòèÿ áàðà íà ðàáî÷åì ïåðèîäå, ñîîòâåòñòâóþùåå âðåìåíè áàðà i íà òåêóùåì ïåðèîäå
      if(timePeriod>0 && timePeriod>lastTime) {  // åñëè íàøëè îòêðûòèå íîâîãî áàðà íà ðàáî÷åì òàéìôðåéìå (òåêóùåå âðåìÿ áîëüøå ïðîøëîãî)
         //---
         int bar_a=GetBarShift(symbol,periodForWork,timePeriod-2*periodSeconds); // áàð îòêðûòèÿ ëåâîé òî÷êè ýêñòðåìóìà íà ðàáî÷åì òàéìôðåéìå
         int bar_b=GetBarShift(symbol,periodForWork,timePeriod-periodSeconds);   // áàð îòêðûòèÿ öåíòðàëüíîé òî÷êè ýêñòðåìóìà íà ðàáî÷åì òàéìôðåéìå
         int bar_c=GetBarShift(symbol,periodForWork,timePeriod);                 // áàð îòêðûòèÿ ïðàâîé òî÷êè ýêñòðåìóìà íà ðàáî÷åì òàéìôðåéìå
         
         datetime time_a=GetTimeOpen(symbol,periodForWork,i+2);                  // âðåìÿ îòêðûòèÿ ëåâîé òî÷êè ýêñòðåìóìà íà ðàáî÷åì òàéìôðåéìå
         datetime time_b=GetTimeOpen(symbol,periodForWork,i+1);                  // âðåìÿ îòêðûòèÿ öåíòðàëüíîé òî÷êè ýêñòðåìóìà íà ðàáî÷åì òàéìôðåéìå
         datetime time_c=GetTimeOpen(symbol,periodForWork,i);                    // âðåìÿ îòêðûòèÿ ïðàâîé òî÷êè ýêñòðåìóìà íà ðàáî÷åì òàéìôðåéìå
         
         //+------------------------------------------------------------------+
         //| - Áëîê ðàáîòû ñ èíäèêàòîðîì AO                                   |
         //+------------------------------------------------------------------+
         if(UseAO) {
            ao_a=GetDataAO(symbol,periodForWork,bar_a);           // çíà÷åíèå ÀÎ íà áàðå À
            ao_b=GetDataAO(symbol,periodForWork,bar_b);           // çíà÷åíèå ÀÎ íà áàðå B
            ao_c=GetDataAO(symbol,periodForWork,bar_c);           // çíà÷åíèå ÀÎ íà áàðå C
            //--- ïðîâåðêà ÀÎ íà íàëè÷èå ýêñòðåìóìà íà òð¸õ áàðàõ ðàáî÷åãî ïåðèîäà
            int extrAO=GetDirectionExtremum(ao_a,ao_b,ao_c);
            //--- ïåðåìåííûå äëÿ ïîèñêà ýêñòðåìóìîâ è äèâåðãåíöèé AO è öåíû
            static double     lastUpAO_extrValue=0;            // çíà÷åíèå ïðîøëîãî âåðõíåãî ýêñòðåìóìà AO (äëÿ ïîèñêà íóæíûõ ýêñòðåìóìîâ)
            static double     lastDnAO_extrValue=0;            // çíà÷åíèå ïðîøëîãî íèæíåãî ýêñòðåìóìà AO (äëÿ ïîèñêà íóæíûõ ýêñòðåìóìîâ)
            //---
            static double     leftAO_UP=0;                     // çíà÷åíèå ëåâîãî âåðõíåãî ýêñòðåìóìà AO â ïàòòåðíå äèâåðãåíöèè
            static double     leftAO_DN=0;                     // çíà÷åíèå ëåâîãî íèæíåãî ýêñòðåìóìà AO â ïàòòåðíå äèâåðãåíöèè
            static datetime   leftAO_tUP=0;                    // âðåìÿ ëåâîãî âåðõíåãî ýêñòðåìóìà AO â ïàòòåðíå äèâåðãåíöèè
            static datetime   leftAO_tDN=0;                    // âðåìÿ ëåâîãî íèæíåãî ýêñòðåìóìà AO â ïàòòåðíå äèâåðãåíöèè
            //---
            static double     lastUpPrcAO_extrValue=0;         // çíà÷åíèå ïðîøëîãî âåðõíåãî ýêñòðåìóìà öåíû äëÿ AO
            static datetime   lastUpPrcAO_extrTime=0;          // âðåìÿ ïðîøëîãî âåðõíåãî ýêñòðåìóìà öåíû äëÿ AO
            static double     lastDnPrcAO_extrValue=0;         // çíà÷åíèå ïðîøëîãî íèæíåãî ýêñòðåìóìà öåíû äëÿ AO
            static datetime   lastDnPrcAO_extrTime=0;          // âðåìÿ ïðîøëîãî íèæíåãî ýêñòðåìóìà öåíû äëÿ AO
            //--- åñëè âíèçó åñòü ýêñòðåìóì AO (íà ïîêóïêó)
            if(extrAO==OP_BUY) {
               //--- åñëè öåíòðàëüíàÿ òî÷êà ýêñòðåìóìà AO íèæå íîëÿ, íàéä¸ì ýêñòðåìóìû è äèâåðãåíöèè
               if(ao_b<0) {
                  FindAndSetDivergence(symbol,periodForWork,OP_BUY,ao_b,bar_b,wnd_ao,time_b,time,i,leftAO_tUP,leftAO_UP,leftAO_tDN,leftAO_DN,lastUpAO_extrValue,lastDnAO_extrValue,lastUpPrcAO_extrValue,lastUpPrcAO_extrTime,lastDnPrcAO_extrValue,lastDnPrcAO_extrTime,rates_total,BufferAoUP,BufferAoDN);
                  }
               lastDnAO_extrValue=ao_b;  // ñîõðàíèì çíà÷åíèå "ïîñëåäíåãî" íèæíåãî ýêñòðåìóìà AO äëÿ ïîñëåäóþùåãî ñðàâíåíèÿ ñ âåðõíèì ýêñòðåìóìîì AO (òîëüêî äëÿ ïîèñêà ýêñòðåìóìîâ)
               }
            //--- åñëè ñâåðõó åñòü ýêñòðåìóì AO (íà ïðîäàæó)
            if(extrAO==OP_SELL) {
               //--- åñëè öåíòðàëüíàÿ òî÷êà ýêñòðåìóìà AO âûøå íîëÿ, íàéä¸ì ýêñòðåìóìû è äèâåðãåíöèè
               if(ao_b>0) {
                  FindAndSetDivergence(symbol,periodForWork,OP_SELL,ao_b,bar_b,wnd_ao,time_b,time,i,leftAO_tUP,leftAO_UP,leftAO_tDN,leftAO_DN,lastUpAO_extrValue,lastDnAO_extrValue,lastUpPrcAO_extrValue,lastUpPrcAO_extrTime,lastDnPrcAO_extrValue,lastDnPrcAO_extrTime,rates_total,BufferAoUP,BufferAoDN);
                  }
               lastUpAO_extrValue=ao_b;  // ñîõðàíèì çíà÷åíèå "ïîñëåäíåãî" âåðõíåãî ýêñòðåìóìà AO äëÿ ïîñëåäóþùåãî ñðàâíåíèÿ ñ íèæíèì ýêñòðåìóìîì AO (òîëüêî äëÿ ïîèñêà ýêñòðåìóìîâ)
               }
            }  //--- êîíåö áëîêà AO
         
         //+------------------------------------------------------------------+
         //| - Áëîê ðàáîòû ñ èíäèêàòîðîì MACD                                 |
         //+------------------------------------------------------------------+
         if(UseMACD) {
            macd_a=GetDataMACD(symbol,periodForWork,ModeLineMACD,bar_a);         // çíà÷åíèå MACD íà áàðå À
            macd_b=GetDataMACD(symbol,periodForWork,ModeLineMACD,bar_b);         // çíà÷åíèå MACD íà áàðå B
            macd_c=GetDataMACD(symbol,periodForWork,ModeLineMACD,bar_c);         // çíà÷åíèå MACD íà áàðå C
            //--- ïðîâåðêà MACD íà íàëè÷èå ýêñòðåìóìà íà òð¸õ áàðàõ ðàáî÷åãî ïåðèîäà
            int extrMACD=GetDirectionExtremum(macd_a,macd_b,macd_c);
            //--- ïåðåìåííûå äëÿ ïîèñêà ýêñòðåìóìîâ è äèâåðãåíöèé MACD è öåíû
            static double     lastUpMACD_extrValue=0;          // çíà÷åíèå ïðîøëîãî âåðõíåãî ýêñòðåìóìà MACD (äëÿ ïîèñêà íóæíûõ ýêñòðåìóìîâ)
            static double     lastDnMACD_extrValue=0;          // çíà÷åíèå ïðîøëîãî íèæíåãî ýêñòðåìóìà MACD (äëÿ ïîèñêà íóæíûõ ýêñòðåìóìîâ)
            //---
            static double     leftMACD_UP=0;                   // çíà÷åíèå ëåâîãî âåðõíåãî ýêñòðåìóìà MACD â ïàòòåðíå äèâåðãåíöèè
            static double     leftMACD_DN=0;                   // çíà÷åíèå ëåâîãî íèæíåãî ýêñòðåìóìà MACD â ïàòòåðíå äèâåðãåíöèè
            static datetime   leftMACD_tUP=0;                  // âðåìÿ ëåâîãî âåðõíåãî ýêñòðåìóìà MACD â ïàòòåðíå äèâåðãåíöèè
            static datetime   leftMACD_tDN=0;                  // âðåìÿ ëåâîãî íèæíåãî ýêñòðåìóìà MACD â ïàòòåðíå äèâåðãåíöèè
            //---
            static double     lastUpPrcMACD_extrValue=0;       // çíà÷åíèå ïðîøëîãî âåðõíåãî ýêñòðåìóìà öåíû äëÿ MACD
            static datetime   lastUpPrcMACD_extrTime=0;        // âðåìÿ ïðîøëîãî âåðõíåãî ýêñòðåìóìà öåíû äëÿ MACD
            static double     lastDnPrcMACD_extrValue=0;       // çíà÷åíèå ïðîøëîãî íèæíåãî ýêñòðåìóìà öåíû äëÿ MACD
            static datetime   lastDnPrcMACD_extrTime=0;        // âðåìÿ ïðîøëîãî íèæíåãî ýêñòðåìóìà öåíû äëÿ MACD
            //--- åñëè âíèçó åñòü ýêñòðåìóì MACD (íà ïîêóïêó)
            if(extrMACD==OP_BUY) {
               //--- åñëè öåíòðàëüíàÿ òî÷êà ýêñòðåìóìà MACD íèæå íîëÿ, íàéä¸ì ýêñòðåìóìû è äèâåðãåíöèè
               if(macd_b<0) {
                  FindAndSetDivergence(symbol,periodForWork,OP_BUY,macd_b,bar_b,wnd_macd,time_b,time,i,leftMACD_tUP,leftMACD_UP,leftMACD_tDN,leftMACD_DN,lastUpMACD_extrValue,lastDnMACD_extrValue,lastUpPrcMACD_extrValue,lastUpPrcMACD_extrTime,lastDnPrcMACD_extrValue,lastDnPrcMACD_extrTime,rates_total,BufferMacdUP,BufferMacdDN);
                  }
               lastDnMACD_extrValue=macd_b;  // ñîõðàíèì çíà÷åíèå "ïîñëåäíåãî" íèæíåãî ýêñòðåìóìà MACD äëÿ ïîñëåäóþùåãî ñðàâíåíèÿ ñ âåðõíèì ýêñòðåìóìîì MACD (òîëüêî äëÿ ïîèñêà ýêñòðåìóìîâ)
               }
            //--- åñëè ñâåðõó åñòü ýêñòðåìóì MACD (íà ïðîäàæó)
            if(extrMACD==OP_SELL) {
               //--- åñëè öåíòðàëüíàÿ òî÷êà ýêñòðåìóìà MACD âûøå íîëÿ, íàéä¸ì ýêñòðåìóìû è äèâåðãåíöèè
               if(macd_b>0) {
                  FindAndSetDivergence(symbol,periodForWork,OP_SELL,macd_b,bar_b,wnd_macd,time_b,time,i,leftMACD_tUP,leftMACD_UP,leftMACD_tDN,leftMACD_DN,lastUpMACD_extrValue,lastDnMACD_extrValue,lastUpPrcMACD_extrValue,lastUpPrcMACD_extrTime,lastDnPrcMACD_extrValue,lastDnPrcMACD_extrTime,rates_total,BufferMacdUP,BufferMacdDN);
                  }
               lastUpMACD_extrValue=macd_b;  // ñîõðàíèì çíà÷åíèå "ïîñëåäíåãî" âåðõíåãî ýêñòðåìóìà MACD äëÿ ïîñëåäóþùåãî ñðàâíåíèÿ ñ íèæíèì ýêñòðåìóìîì MACD (òîëüêî äëÿ ïîèñêà ýêñòðåìóìîâ)
               }
            }  //--- êîíåö áëîêà MACD
         
         //--- êîíåö îáðàáîòêè òåêóùåãî áàðà
         lastTime=timePeriod; // çàïîìíèì ïðîøëîå âðåìÿ äëÿ äàëüíåéøåãî ñðàâíåíèÿ ñ âðåìåíåì ñëåäóþùåãî áàðà
         }
      //--- êîíåö öèêëà èíäèêàòîðà
      }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Functions                                                        |
//+------------------------------------------------------------------+
void FindAndSetDivergence(string symbol_name, ENUM_TIMEFRAMES work_period, int direct_extr,
                          double ind_b, int bar_b, int wnd, datetime time_b, const datetime &time[], int index,
                          datetime &left_time_up, double &left_point_up, datetime &left_time_dn, double &left_point_dn,
                          double &last_up_ind, double &last_dn_ind, double &last_up_prc_val, datetime &last_up_prc_tm, double &last_dn_prc_val, datetime &last_dn_prc_tm,
                          const int &rates_total, double &BufferUP[], double &BufferDN[]) {
   
   string name_ind=(wnd==GetWindowNumber(name_ao)?"AO":"MACD");
   if(direct_extr==OP_BUY) {
      //--- ïîñ÷èòàåì äèñòàíöèþ ìåæäó ïðîøëûì âåðõíèì ýêñòðåìóìîì è òåêóùèì íèæíèì
      double distance=fabs(last_up_ind-ind_b);
      //--- åñëè äèñòàíöèÿ ìåæäó ýêñòðåìóìàìè áîëüøå êîýôôèöèåíòà ðàçíèöû
      if(NormalizeDouble(distance-koeffForDistanceBetween,Digits()+1)>0) {
         //--- íàéä¸ì ýêñòðåìóì öåíû
         int bar_extr=EMPTY;  // áàð íàéäåííîãî ýêñòðåìóìà öåíû
         datetime time_extr=0;// âðåìÿ íàéäåííîãî ýêñòðåìóìà öåíû
         double price_extr=0; // öåíà íàéäåííîãî ýêñòðåìóìà öåíû
         MqlRates array[];    // ìàññèâ äëÿ õðàíåíèÿ öåí è âðåìåíè ýêñòðåìóìîâ
         int num_extr=GetExtremumsLower(symbol_name,work_period,rates_total,bar_b,array);
         //--- åñëè ýêñòðåìóìû íàéäåíû
         if(num_extr>0) {
            price_extr=array[0].low;
            time_extr=array[0].time;
            //--- íàéä¸ì ìèíèìàëüíóþ öåíó èç âñåõ íàéäåííûõ ýêñòðåìóìîâ
            for(int k=1; k<num_extr; k++) {
               if(array[k].low<price_extr && array[k].low>0) {
                  price_extr=array[k].low;
                  time_extr=array[k].time;
                  }
               }
            }
         //--- åñëè íàéäåí ýêñòðåìóì öåíû
         if(price_extr>0) {
            //--- åñëè ïåðèîä ãðàôèêà íå ðàâåí ðàáî÷åìó ïåðèîäó, íàéä¸ì íóæíóþ ñâå÷ó
            if(work_period!=Period()) {
               datetime timeStart=time_extr; // âðåìÿ íà÷àëà áàðà ðàáî÷åãî òàéìôðåéìà
               //--- ïðåäïîëîæèòåëüíîå âðåìÿ ïîñëåäíåãî áàðà íà òåêóùåì òàéìôðåéìå
               datetime timeStop=timeStart+PeriodSeconds(work_period)-PeriodSeconds(PERIOD_CURRENT);
               MqlRates rt[];
               int sz=CopyRates(symbol_name,PERIOD_CURRENT,timeStart,timeStop,rt);
               //--- ïîèñê âðåìåíè ýêñòðåìóìà 
               for(int k=0; k<sz; k++) {
                  if(NormalizeDouble(rt[k].low-price_extr,8)==0) {
                     time_extr=rt[k].time;
                     break;
                     }
                  }
               }
            //--- åñëè åñòü ðàñõîæäåíèå âçàèìíîãî ðàñïîëîæåíèÿ òî÷åê èíäèêàòîðà è öåíû (äèâåðãåíöèÿ)
            if(last_dn_prc_val<price_extr && left_point_dn>ind_b) {
               SetDivergenceDN(symbol_name,work_period,wnd,name_ind,"Äèâåðãåíöèÿ",time,index,left_time_dn,left_point_dn,time_b,ind_b,last_dn_prc_tm,last_dn_prc_val,time_extr,price_extr,BufferDN);
               }
            //--- åñëè åñòü ñõîæäåíèå âçàèìíîãî ðàñïîëîæåíèÿ òî÷åê èíäèêàòîðà è öåíû (êîíâåðãåíöèÿ)
            if(last_dn_prc_val>price_extr && left_point_dn<ind_b) {
               SetDivergenceDN(symbol_name,work_period,wnd,name_ind,"Êîíâåðãåíöèÿ",time,index,left_time_dn,left_point_dn,time_b,ind_b,last_dn_prc_tm,last_dn_prc_val,time_extr,price_extr,BufferDN);
               }
            last_dn_prc_val=price_extr; // ñîõðàíèì çíà÷åíèå ïðîøëîãî ýêñòðåìóìà öåíû
            last_dn_prc_tm=time_extr;   // ñîõðàíèì âðåìÿ ïðîøëîãî ýêñòðåìóìà öåíû
            }
         //--- çàïîìíèì íîâóþ ëåâóþ íèæíþþ òî÷êó èíäèêàòîðà
         left_point_dn=ind_b;
         left_time_dn=time_b;
         }
      }
   //--- åñëè ñâåðõó åñòü ýêñòðåìóì (íà ïðîäàæó)
   if(direct_extr==OP_SELL) {
      //--- ïîñ÷èòàåì äèñòàíöèþ ìåæäó ïðîøëûì íèæíèì ýêñòðåìóìîì è òåêóùèì âåðõíèì
      double distance=fabs(last_dn_ind-ind_b);
      //--- åñëè äèñòàíöèÿ ìåæäó ýêñòðåìóìàìè áîëüøå êîýôôèöèåíòà ðàçíèöû
      if(NormalizeDouble(distance-koeffForDistanceBetween,Digits()+1)>0) {
         //--- íàéä¸ì ýêñòðåìóì öåíû
         int bar_extr=EMPTY;  // áàð íàéäåííîãî ýêñòðåìóìà
         datetime time_extr=0;// âðåìÿ íàéäåííîãî ýêñòðåìóìà
         double price_extr=0; // öåíà íàéäåííîãî ýêñòðåìóìà
         MqlRates array[];
         int num_extr=GetExtremumsUpper(symbol_name,work_period,rates_total,bar_b,array);
         if(num_extr>0) {
            price_extr=array[0].high;
            time_extr=array[0].time;
            for(int k=1; k<num_extr; k++) {
               if(array[k].high>price_extr) {
                  price_extr=array[k].high;
                  time_extr=array[k].time;
                  }
               }
            }
         //--- åñëè íàéäåí ýêñòðåìóì öåíû
         if(price_extr>0) {
            //--- åñëè ïåðèîä ãðàôèêà íå ðàâåí ðàáî÷åìó ïåðèîäó, íàéä¸ì íóæíóþ ñâå÷ó
            if(work_period!=Period()) {
               datetime timeStart=time_extr; // âðåìÿ íà÷àëà áàðà ðàáî÷åãî òàéìôðåéìà
               //--- ïðåäïîëîæèòåëüíîå âðåìÿ ïîñëåäíåãî áàðà íà òåêóùåì òàéìôðåéìå
               datetime timeStop=timeStart+PeriodSeconds(work_period)-PeriodSeconds(PERIOD_CURRENT);
               MqlRates rt[];
               int sz=CopyRates(symbol_name,PERIOD_CURRENT,timeStart,timeStop,rt);
               ArraySetAsSeries(rt,true);
               //--- ïîèñê âðåìåíè ýêñòðåìóìà 
               for(int k=0; k<sz; k++) {
                  if(NormalizeDouble(rt[k].high-price_extr,8)==0) {
                     time_extr=rt[k].time;
                     break;
                     }
                  }
               }
            //--- åñëè åñòü ðàñõîæäåíèå âçàèìíîãî ðàñïîëîæåíèÿ òî÷åê èíäèêàòîðà è öåíû (äèâåðãåíöèÿ)
            if(last_up_prc_val<price_extr && left_point_up>ind_b) {
               SetDivergenceUP(symbol_name,work_period,wnd,name_ind,"Äèâåðãåíöèÿ",time,index,left_time_up,left_point_up,time_b,ind_b,last_up_prc_tm,last_up_prc_val,time_extr,price_extr,BufferUP);
               }
            if(last_up_prc_val>price_extr && left_point_up<ind_b) {
               SetDivergenceUP(symbol_name,work_period,wnd,name_ind,"Êîíâåðãåíöèÿ",time,index,left_time_up,left_point_up,time_b,ind_b,last_up_prc_tm,last_up_prc_val,time_extr,price_extr,BufferUP);
               }
            last_up_prc_val=price_extr; // ñîõðàíèì çíà÷åíèå ïðîøëîãî ýêñòðåìóìà öåíû
            last_up_prc_tm=time_extr;   // ñîõðàíèì âðåìÿ ïðîøëîãî ýêñòðåìóìà öåíû
            }
         //--- çàïîìíèì íîâóþ ëåâóþ âåðõíþþ òî÷êó èíäèêàòîðà
         left_point_up=ind_b;
         left_time_up=time_b;
         }
      }
}
//+------------------------------------------------------------------+
void SetDivergenceDN(string symbol_name, int work_period, int wnd, string name_ind, string pattern, const datetime &time[], int index,
                     datetime left_time, double left_point, datetime time_b, double ind_b, 
                     datetime last_prc_tm, double last_prc_val, datetime time_extr, double price_extr, double &Buffer[]) {
   color line_color=clrNONE;
   string nm="", gv_name="";
   line_color=(name_ind=="AO"?ColorLowerAO:ColorLowerMACD);
   //--- ïîñòàâèì ñèãíàëüíóþ ñòðåëêó íà ãðàôèê öåíû
   int bar_extr=GetBarShift(symbol_name,PERIOD_CURRENT,time_extr);
   Buffer[bar_extr]=GetPriceLow(symbol_name,PERIOD_CURRENT,bar_extr);
   //--- ñîåäèíèì ëèíèåé áëèæàéøèå òî÷êè ýêñòðåìóìîâ öåíû
   int last_bar_extr=GetBarShift(symbol_name,PERIOD_CURRENT,last_prc_tm);
   nm=Prefix+"P"+name_ind+"divLower"+TimeToString(time_b);
   SetTLine(0,nm,line_color,0,last_prc_tm,last_prc_val,time_extr,price_extr,widthChartLine,pattern+" "+name_ind+(work_period==Period()?"":"\níà ïåðèîäå "+GetNameTF(work_period)),StyleChartLine);
   //--- åñëè åñòü îêíî èíäèêàòîðà, ñîåäèíèì ëèíèåé áëèæàéøèå òî÷êè ýêñòðåìóìîâ èíäèêàòîðà
   if(wnd>0) {
      nm=Prefix+name_ind+"divLower"+TimeToString(time_b);
      SetTLine(0,nm,line_color,wnd,left_time,left_point,time_b,ind_b,widthIndicatorsLine,pattern+" "+(work_period==Period()?"":"\níà ïåðèîäå "+GetNameTF(work_period)),StyleIndicatorsLine);
      }
}
//+------------------------------------------------------------------+
void SetDivergenceUP(string symbol_name, int work_period, int wnd, string name_ind, string pattern, const datetime &time[], int index,
                     datetime left_time, double left_point, datetime time_b, double ind_b, 
                     datetime last_prc_tm, double last_prc_val, datetime time_extr, double price_extr, double &Buffer[]) {
   color line_color=clrNONE;
   string nm="", gv_name="";
   line_color=(name_ind=="AO"?ColorUpperAO:ColorUpperMACD);
   //--- ïîñòàâèì ñèãíàëüíóþ ñòðåëêó íà ãðàôèê öåíû
   int bar_extr=GetBarShift(symbol_name,PERIOD_CURRENT,time_extr);
   Buffer[bar_extr]=GetPriceHigh(symbol_name,PERIOD_CURRENT,bar_extr);
   //--- ñîåäèíèì ëèíèåé áëèæàéøèå òî÷êè ýêñòðåìóìîâ öåíû
   int last_bar_extr=GetBarShift(symbol_name,PERIOD_CURRENT,last_prc_tm);
   nm=Prefix+"P"+name_ind+"divUpper"+TimeToString(time_b);
   SetTLine(0,nm,line_color,0,last_prc_tm,last_prc_val,time_extr,price_extr,widthChartLine,pattern+" "+name_ind+(work_period==Period()?"":"\níà ïåðèîäå "+GetNameTF(work_period)),StyleChartLine);
   //--- åñëè åñòü îêíî èíäèêàòîðà, ñîåäèíèì ëèíèåé áëèæàéøèå òî÷êè ýêñòðåìóìîâ èíäèêàòîðà
   if(wnd>0) {
      nm=Prefix+name_ind+"divUpper"+TimeToString(time_b);
      SetTLine(0,nm,line_color,wnd,left_time,left_point,time_b,ind_b,widthIndicatorsLine,pattern+" "+(work_period==Period()?"":"\níà ïåðèîäå "+GetNameTF(work_period)),StyleIndicatorsLine);
      }
}
//+------------------------------------------------------------------+
double GetDataAO(string symbol_name, int timeframe, int shift) {
   return(iAO(symbol_name,timeframe,shift));
}
//+------------------------------------------------------------------+
double GetDataMACD(string symbol_name, int timeframe, int mode, int shift) {
   return(iMACD(symbol_name,timeframe,fastEMA_MACD,slowEMA_MACD,periodSignalMACD,AppledPriceMACD,mode,shift));
}
//+------------------------------------------------------------------+
int GetExtremumsUpper(string symbol_name, ENUM_TIMEFRAMES timeframe, const int &total, int bar_b, MqlRates &array[]) {
   int bars=Bars(symbol_name,timeframe);
   int total_tf=fmin(total,bars);
   int begin=bar_b-numBarAccuracy;     // íîìåð áàðà, ñ êîòîðîãî íà÷èíàåì ïîèñê ýêñòðåìóìà öåíû
   if(begin<1) begin=1;                // êîððåêòèðóåì çíà÷åíèå begin äëÿ ïðåäîòâðàùåíèÿ âûõîäà çà ïðåäåëû èñòîðè÷åñêèõ äàííûõ
   int end=begin+numBarAccuracy*2;     // íîìåð áàðà, íà êîòîðîì çàêàí÷èâàåì ïîèñê ýêñòðåìóìà öåíû
   if(end>total_tf-2) end=total_tf-2;  // êîððåêòèðóåì çíà÷åíèå end äëÿ ïðåäîòâðàùåíèÿ âûõîäà çà ïðåäåëû èñòîðè÷åñêèõ äàííûõ
   int count=end-begin;                // êîëè÷åñòâî áàðîâ, íà êîòîðûõ èñêàòü ýêñòðåìóì öåíû
   //---
   int n=0;
   ArrayResize(array,n,numBarAccuracy*2);
   //--- ïîèùåì ýêñòðåìóìû è çàïîëíèì íàéäåííûìè ìàññèâ array
   for(int j=begin; j<=end; j++) {
      if(j>total_tf-2) break;
      double a=GetPriceHigh(symbol_name,timeframe,j+1);
      double b=GetPriceHigh(symbol_name,timeframe,j);
      double c=GetPriceHigh(symbol_name,timeframe,j-1);
      int extr=GetDirectionExtremum(a,b,c);
      if(extr==OP_SELL) {
         n++; ArrayResize(array,n);
         array[n-1].high=b;
         array[n-1].close=GetPriceClose(symbol_name,timeframe,j);
         array[n-1].time=GetTimeOpen(symbol_name,timeframe,j);
         }
      }
   //--- åñëè íè îäèí ýêñòðåìóì öåíû íå íàéäåí, íàéä¸ì ïðîñòî ìàêñèìàëüíóþ öåíó íà èñêîìîì ïðîìåæóòêå count
   if(ArraySize(array)==0) {
      ArrayResize(array,1);   // ñäåëàåì ðàçìåð ìàññèâà array ðàâíûì 1
      MqlRates data[];        // ñþäà áóäåì çàïèñûâàòü âñå äàííûå çà èñêîìûé ïðîìåæóòîê áàðîâ count
      if(CopyRates(symbol_name,timeframe,begin,count,data)>0) {
         double max=data[0].high;
         datetime t=data[0].time;
         for(int j=1; j<ArraySize(data); j++) {
            if(data[j].high>max) {
               max=data[j].high;
               t=data[j].time;
               }
            }
         array[0].high=max;
         array[0].time=t;
         }
      }
   return(ArraySize(array));
}
//+------------------------------------------------------------------+
int GetExtremumsLower(string symbol_name, ENUM_TIMEFRAMES timeframe, const int &total, int bar_b, MqlRates &array[]) {
   int bars=Bars(symbol_name,timeframe);
   int total_tf=fmin(total,bars);
   int begin=bar_b-numBarAccuracy;     // íîìåð áàðà, ñ êîòîðîãî íà÷èíàåì ïîèñê ýêñòðåìóìà öåíû
   if(begin<1) begin=1;                // êîððåêòèðóåì çíà÷åíèå begin äëÿ ïðåäîòâðàùåíèÿ âûõîäà çà ïðåäåëû èñòîðè÷åñêèõ äàííûõ
   int end=begin+numBarAccuracy*2;     // íîìåð áàðà, íà êîòîðîì çàêàí÷èâàåì ïîèñê ýêñòðåìóìà öåíû
   if(end>total_tf-2) end=total_tf-2;  // êîððåêòèðóåì çíà÷åíèå end äëÿ ïðåäîòâðàùåíèÿ âûõîäà çà ïðåäåëû èñòîðè÷åñêèõ äàííûõ
   int count=(end-begin)+1;            // êîëè÷åñòâî áàðîâ, íà êîòîðûõ èñêàòü ýêñòðåìóì öåíû
   //---
   int n=0;
   ArrayResize(array,n,numBarAccuracy*2);
   for(int j=begin; j<=end; j++) {
      if(j>total_tf-2) break;
      double a=GetPriceLow(symbol_name,timeframe,j+1);
      double b=GetPriceLow(symbol_name,timeframe,j);
      double c=GetPriceLow(symbol_name,timeframe,j-1);
      int extr=GetDirectionExtremum(a,b,c);
      if(extr==OP_BUY) {
         n++; ArrayResize(array,n);
         array[n-1].low=b;
         array[n-1].close=GetPriceClose(symbol_name,timeframe,j);
         array[n-1].time=GetTimeOpen(symbol_name,timeframe,j);
         }
      }
   //--- åñëè íè îäèí ýêñòðåìóì öåíû íå íàéäåí, íàéä¸ì ïðîñòî ìèíèìàëüíóþ öåíó íà èñêîìîì ïðîìåæóòêå count
   if(ArraySize(array)==0) {
      ArrayResize(array,1);   // ñäåëàåì ðàçìåð ìàññèâà array ðàâíûì 1
      MqlRates data[];        // ñþäà áóäåì çàïèñûâàòü âñå äàííûå çà èñêîìûé ïðîìåæóòîê áàðîâ count
      if(CopyRates(symbol_name,timeframe,begin,count,data)>0) {
         double min=data[0].low;
         datetime t=data[0].time;
         for(int j=1; j<ArraySize(data); j++) {
            if(data[j].low<min) {
               min=data[j].low;
               t=data[j].time;
               }
            }
         array[0].low=min;
         array[0].time=t;
         }
      }
   return(ArraySize(array));
}
//+------------------------------------------------------------------+
int GetDirectionExtremum(double a, double b, double c, bool null_flag=true) {
   //--- åñëè åñòü íóëåâàÿ ëèíèÿ â èíäèêàòîðå
   if(null_flag) {
      if((a-b)*(b-c)<0) {
         if(c>b) return(OP_BUY);
         if(c<b) return(OP_SELL);
         }
      }
   //--- åñëè íåò íóëåâîé ëèíèè â èíäèêàòîðå
   else {
      if((a>b && b<=c)/* || (a>=b && b<c)*/) return(OP_BUY);
      if((a<b && b>=c)/* || (a<=b && b>c)*/) return(OP_SELL);
      }
   return(EMPTY);
}
//+------------------------------------------------------------------+
int GetWindowNumber(string name="") {
   return(WindowFind(name));
}
//+------------------------------------------------------------------+
void SetTLine(const long chart_id, const string name, color line_color, const int sub_window,
              datetime line_time1, double line_price1, datetime line_time2, double line_price2, int line_width=1,
              string tooltip="\n", int line_style=STYLE_SOLID, bool line_ray_right=false, bool line_ray_left=false, 
              string line_text="", bool selection=false, bool hidden=true) {
   
   if(ObjectFind(chart_id,name)<0) ObjectCreate(chart_id, name, OBJ_TREND, sub_window, 0, 0, 0, 0);
   ObjectSetInteger(chart_id,name,OBJPROP_TIME1,line_time1);
   ObjectSetDouble(chart_id,name,OBJPROP_PRICE1,line_price1);
   ObjectSetInteger(chart_id,name,OBJPROP_TIME2,line_time2);
   ObjectSetDouble(chart_id,name,OBJPROP_PRICE2,line_price2);
   ObjectSetInteger(chart_id,name,OBJPROP_COLOR,line_color);
   ObjectSetInteger(chart_id,name,OBJPROP_RAY_RIGHT,line_ray_right);
   ObjectSetInteger(chart_id,name,OBJPROP_RAY_LEFT,line_ray_left);
   ObjectSetInteger(chart_id,name,OBJPROP_STYLE,line_style);
   ObjectSetInteger(chart_id,name,OBJPROP_WIDTH,line_width);
   ObjectSetString(chart_id,name,OBJPROP_TEXT,line_text);
   ObjectSetString(chart_id,name,OBJPROP_FONT,"Tahoma");
   ObjectSetInteger(chart_id,name,OBJPROP_SELECTABLE,selection);
   ObjectSetInteger(chart_id,name,OBJPROP_SELECTED,selection);
   ObjectSetInteger(chart_id,name,OBJPROP_HIDDEN,hidden);
   ObjectSetString(chart_id,name,OBJPROP_TOOLTIP,tooltip);
}
//+------------------------------------------------------------------+
datetime GetTimeOpen(string symbol_name, ENUM_TIMEFRAMES timeframe, int index) {
   datetime array[1]={-1};
   ResetLastError();
   if(CopyTime(symbol_name,timeframe,index,1,array)==1) return(array[0]);
   Print(__FUNCTION__," > Îøèáêà ïîëó÷åíèÿ âðåìåíè áàðà ",GetLastError());
   return(-1);
}
//+------------------------------------------------------------------+
double GetPriceOpen(string symbol_name, ENUM_TIMEFRAMES timeframe, int index) {
   double array[1]={-1};
   ResetLastError();
   if(CopyOpen(symbol_name,timeframe,index,1,array)==1) return(array[0]);
   Print(__FUNCTION__," > Îøèáêà ïîëó÷åíèÿ öåíû Open ",GetLastError());
   return(-1);
}
//+------------------------------------------------------------------+
double GetPriceHigh(string symbol_name, ENUM_TIMEFRAMES timeframe, int index) {
   double array[1]={-1};
   ResetLastError();
   if(CopyHigh(symbol_name,timeframe,index,1,array)==1) return(array[0]);
   Print(__FUNCTION__," > Îøèáêà ïîëó÷åíèÿ öåíû High ",GetLastError());
   return(-1);
}
//+------------------------------------------------------------------+
double GetPriceLow(string symbol_name, ENUM_TIMEFRAMES timeframe, int index) {
   double array[1]={-1};
   ResetLastError();
   if(CopyLow(symbol_name,timeframe,index,1,array)==1) return(array[0]);
   Print(__FUNCTION__," > Îøèáêà ïîëó÷åíèÿ öåíû Low ",GetLastError());
   return(-1);
}
//+------------------------------------------------------------------+
double GetPriceClose(string symbol_name, ENUM_TIMEFRAMES timeframe, int index) {
   double array[1]={-1};
   ResetLastError();
   if(CopyClose(symbol_name,timeframe,index,1,array)==1) return(array[0]);
   Print(__FUNCTION__," > Îøèáêà ïîëó÷åíèÿ öåíû Close ",GetLastError());
   return(-1);
}
//+------------------------------------------------------------------+
int GetBarShift(const string symbol_name, const ENUM_TIMEFRAMES timeframe, const datetime time) {
   int res=-1;
   datetime last_bar;
   if(SeriesInfoInteger(symbol_name,timeframe,SERIES_LASTBAR_DATE,last_bar)) {
      if(time>last_bar) res=0;
      else {
         const int shift=Bars(symbol_name,timeframe,time,last_bar);
         if(shift>0) res=shift-1;
         }
      }
   return(res);
}
//+------------------------------------------------------------------+
string GetNameTF(int timeframe=PERIOD_CURRENT) {
   if(timeframe==PERIOD_CURRENT) timeframe=Period();
   switch(timeframe) {
      //--- MQL4
      case 1: return("M1");
      case 5: return("M5");
      case 15: return("M15");
      case 30: return("M30");
      case 60: return("H1");
      case 240: return("H4");
      case 1440: return("D1");
      case 10080: return("W1");
      case 43200: return("MN");
      //--- MQL5
      case 2: return("M2");
      case 3: return("M3");
      case 4: return("M4");      
      case 6: return("M6");
      case 10: return("M10");
      case 12: return("M12");
      case 16385: return("H1");
      case 16386: return("H2");
      case 16387: return("H3");
      case 16388: return("H4");
      case 16390: return("H6");
      case 16392: return("H8");
      case 16396: return("H12");
      case 16408: return("D1");
      case 32769: return("W1");
      case 49153: return("MN");      
      default: return("UnknownPeriod");
   }
}
//+------------------------------------------------------------------+

Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---