Navigation:Home > Content >

ZUP_RSI_v48(2).mq4

Time: 2015-05-24 | Download file:ZUP_RSI_v48(2).mq4

//+----------------------------------------------------------------------+
//|ZigZag универсальный с паттернами Песавенто                           |
//|----------------------------------------------------------------------+
//|                                                                      |
//|ExtIndicator - выбор варианта индикатора, на основе которого          |
//|               строятся паттерны Песавенто                            |
//|           0 - Zigzag из метатрейдера, стандартный                    |
//|           1 - Zigzag Алекса,                                         |
//|           2 - индикатор подобный встроенному в Ensign                |
//|           3 - ZigZag Ensign с переменным значением minBars           |
//|           4 - ZigZag, разработал tauber                              |
//|           5 - вариация на тему свингов Ганна                         |
//|           6 - DT-ZigZag с внешним ZigZag_new_nen3.mq4                |
//|           7 - DT-ZigZag с внешним DT_ZZ.mq4 (разработал klot)        |
//|           8 - DT-ZigZag с внешним CZigZag.mq4 (разработал Candid)    |
//|           9 - режим работы в окне под графиком с индикатором RSI     |
//|                                                                      |
//|minBars - фильтр баровый (задается количество баров)                  |
//|minSize - фильтр по количеству пунктов (задается количество пунктов)  |
//|                                                                      |
//|Price - выбор цены, по которой строится RSI для режима RSI            |
//|                                                                      |
//|PRICE_CLOSE    0 Цена закрытия                                        |
//|PRICE_OPEN     1 Цена открытия                                        |
//|PRICE_HIGH     2 Максимальная цена                                    |
//|PRICE_LOW      3 Минимальная цена                                     |
//|PRICE_MEDIAN   4 Средняя цена, (high+low)/2                           |
//|PRICE_TYPICAL  5 Типичная цена, (high+low+close)/3                    |
//|PRICE_WEIGHTED 6 Взвешенная цена закрытия, (high+low+close+close)/4   |
//|                                                                      |
//|ExtDeviation и ExtBackstep - параметры оставшиеся от ZigZag из MT4    |
//|                                                                      |
//|minPercent - процентный фильтр (задается процент, например 0.5)       |
//|             Если используются проценты - ставите число, а minSize=0; |
//|GrossPeriod - значение таймфрейма, выраженное в минутах (число минут),|
//| данные с которого берутся для построения ZigZag в режиме DT-ZigZag   |
//|ZigZagHighLow - задает, от каких точек делать построение              |
//|                паттернов Песавенто, вил Эндрюса и т.д.               |
//|true - от экстремумов баров                                           |
//|false - от переломов ZigZag, когда они висят в "воздухе"              |
//|----------------------------------------------------------------------|
//|ExtHidden - 0 - линии и числа паттернов Песавенто скрыты.             |
//|            1 - показывает все линии между фракталами, у которых      |
//|                процент восстановления >0.14 и <5.                    |
//|            2 - показывает только те  линии, где процент восстано-    |
//|                вления равен числам Песавенто (и 0.447, 0.886, 2.236, |
//|                3.14, 3,618 для построения паттернов Gartley)         |
//|            3 - показывает числа, перечисленные в пункте 2            |
//|                и соответствующие линии                               |
//|            4 - показывает числа не Песавенто и соответствующие линии |
//|            5 - скрывает всю оснастку. Остается только ZigZag         |
//|                                                                      |
//|ExtFiboZigZag - разрешает вывод "ZiaZag Fibonacci"                    |
//|                                                                      |
//|ExtFractal - количество фракталов (максимумов, минимумов),            |
//|             от которых идут линии к другим фракталам                 |
//|                                                                      |
//|ExtFractalEnd - количество фракталов, к которым идут линии            |
//|                дальше этого фрактала соединяющих линий не будет      |
//|                Если ExtFractalEnd=0 то последний фрактал равен       |
//|                максимальному числу фракталов.                        |
//|                Минимальное значение ExtFractalEnd=1                  |
//|                                                                      |
//|ExtDelta - (допуск) отклонение в расчете. Задает величину             |
//|           потенциальной разворотной зоны.                            |
//|                  должно быть 0 0 (=1) выводятся динамические вилы Эндрюса от   |
//|             последних двух экстремумов ZigZag                        |
//|             =2 50% медиана                                           |
//|             =3 50% вилы                                              |
//|             =4 линии Шиффа                                           |
//|                                                                      |
//|ExtPitchforkStatic > 0 (=1) выводятся статические вилы Эндрюса от     |
//|             экстремума ZigZag с номером ExtPitchforkStaticNum        |
//|             =2 50% медиана                                           |
//|             =3 50% вилы                                              |
//|             =4 линии Шиффа                                           |
//|                                                                      |
//|32 и <=9 статические расширения Фибоначчи            |
//|                                                                      |
//|ExtFiboExpansionColor - задает цвет линий расширений Фибоначчи        |
//|----------------------------------------------------------------------|
//|ExtVLStaticColor - включает Versum Levels статические выбором цвета   |
//|ExtVLDinamicColor - включае Versum Levels динамические выбором цвета  |
//|                                                                      |
//|ExtVLStaticNum - задает номер вершины, от которой выводятся           |
//|                 Versum Levels                                        |
//|----------------------------------------------------------------------|
//|ExtBack - задает вывод всех объектов в виде фона                      |
//|ExtSave - разрешает сохранение комплекта статических вил и            |
//|          Fibo Time                                                   |
//|                                                                      |
//|ExtAlert - разрешает вывод сообщения и звукового сигнала при          |
//|           возникновении нового луча ZigZag                           |
//|                                                                      |
//|ExtStyleZZ - = true - задает стиль линий ZigZag через вкладку ЦВЕТА   |
//|             = false - Zigzag выводится точками у экстремумов         |
//|                                                                      |
//|ExtComplekt - задает номер индикатора. При выводе на график нескольких|
//|              индикаторов через этот параметр задается номер копии.   |
//|              При этом все копии индикатора будут работать корректно. |
//+----------------------------------------------------------------------+
#property copyright "nen"
#property link      "http://onix-trade.net/forum/index.php?s=&showtopic=118&view=findpost&p=129958"
// описание http://onix-trade.net/forum/index.php?s=&showtopic=373&view=findpost&p=72865

#property indicator_separate_window
#property indicator_buffers 6
#property indicator_color1 Aqua 
#property indicator_color2 Green
#property indicator_color3 Orange
#property indicator_color4 LightSkyBlue
#property indicator_color5 LemonChiffon
#property indicator_color6 Yellow
//===================================
//---- indicator parameters
extern int    ExtIndicator = 9;
extern int    minBars = 6;
extern int    minSize = 55;
// Переменные от ZigZag из МТ
extern int    ExtDeviation = 3;
extern int    ExtBackstep = 3;
// Переменная для nen-ZigZag
extern int    GrossPeriod=240;
extern int    Price = 0;
//----
extern double minPercent = 5;
//----
extern int    ExtHidden = 1;
extern bool   ZigZagHighLow=true;
extern bool   ExtFiboZigZag = false;
extern int    ExtFractal = 7;
extern int    ExtFractalEnd = 7;
extern double ExtDelta = 0.04;
extern int    ExtDeltaType = 2;
extern int    ExtPPWithBars = 0;
//-------------------------------------
extern bool   ExtFiboType = true;
extern bool   ExtFiboCorrectionExpansion = false;
extern bool   ExtFiboDinamic = false;
extern bool   ExtFiboStatic = false;
extern int    ExtFiboStaticNum = 2;
extern int    ExtSizeTxt = 7;
extern color  ExtLine = DarkBlue;
extern color  ExtNotFibo = SlateGray;
extern color  ExtPesavento = Yellow;
extern color  ExtGartley886 = GreenYellow;
extern color  ExtFiboS = Teal;
extern color  ExtFiboD = Sienna;
//----------------------------------------------------------------------
// Комплект инструментов, работающих совместно с вилами Эндрюса. Начало.
//----------------------------------------------------------------------
// Переменные для вил Эндрюса
extern int    ExtPitchforkDinamic = 0;
extern int    ExtPitchforkStatic = 0;
extern int    ExtPitchforkStaticNum = 3;
extern color  ExtLinePitchforkS = MediumBlue;
extern color  ExtLinePitchforkD = MediumSlateBlue;
extern color  ExtPitchforkStaticColor = CLR_NONE;
extern int    ExtPitchforkStyle = 1;
// Переменные для фибовееров
extern bool   ExtFiboFanDinamic = true;  // может выводиться самостоятельно
extern bool   ExtFiboFanStatic = false;   // выводится только совместно со статическими вилами
extern bool   ExtFiboFanExp=false;
extern bool   ExtFiboFanHidden = true;
extern color  ExtFiboFanS = Teal;
extern color  ExtFiboFanD = Sienna;

extern color  ExtFiboFanMedianaStaticColor = CLR_NONE;
extern color  ExtFiboFanMedianaDinamicColor = CLR_NONE;

// Временные зоны Фибо
extern bool   ExtFiboTime1 = false;
extern bool   ExtFiboTime2 = false;
extern color  ExtFiboTime1C = Teal;
extern color  ExtFiboTime2C = Sienna;
//extern color  ExtPivotZoneColor = CLR_NONE; //|ExtPivotZoneColor - задает цвет закраски Pivot Zone                   |

// Включение предупреждающих и контрольных линий
extern bool   ExtUTL = false;
extern bool   ExtLTL = false;
extern bool   ExtUWL = false;
extern bool   ExtLWL = false;

// Включение линий реакции
extern bool   ExtRLine = true;
extern bool   ExtRLineBase =true;
//----------------------------------------------------------------------
extern bool     ExtPitchforkCandle = false;
extern bool     ExtPitchfork_1_HighLow = true;
extern datetime ExtDateTimePitchfork_1 = D'11.07.2006 00:00';
extern datetime ExtDateTimePitchfork_2 = D'19.07.2006 00:00';
extern datetime ExtDateTimePitchfork_3 = D'09.08.2006 00:00';
//----------------------------------------------------------------------
// Комплект инструментов, работающих совместно с вилами Эндрюса. Конец.
//----------------------------------------------------------------------
// Фибовееры дополнительные
extern int    ExtFiboFanNum = 0;
extern color  ExtFiboFanColor = CLR_NONE;
// Расширения Фибоначчи
extern int    ExtFiboExpansion = 0;
extern color  ExtFiboExpansionColor = Yellow;
//--------------------------------------
extern int    ExtVLStaticNum = 0;
extern color  ExtVLStaticColor = CLR_NONE;
extern color  ExtVLDinamicColor = CLR_NONE;
//--------------------------------------
extern bool   chHL = false;
extern bool   PeakDet = false;
// Переменные для i-vts
extern bool   chHL_PeakDet_or_vts = true;
extern int    NumberOfBars = 1000;     // Количество баров обсчёта (0-все)
extern int    NumberOfVTS  = 13;
extern int    NumberOfVTS1 = 1;
// --------------------------------
// Дополнительные финкции
extern bool   infoTF = false;
// Вывод объектов в виде фона
extern bool   ExtBack = true;
// Сохранение статических вил Эндрюса, Fibo Time
extern bool   ExtSave = false;
extern bool   ExtStyleZZ = true;
extern bool   ExtAlert = false;
extern int    ExtComplekt=111;

// ST 2050

extern bool ShowFiboFansDescriptions = false;


//===================================

// Массивы для ZigZag 
// Массив для отрисовки ZigZag
double zz[];
// Массив минимумов ZigZag
double zzL[];
// Массив максимумов ZigZag
double zzH[];
// Массивы для nen-ZigZag
double nen_ZigZag[];
// Массив для оптимизированного ZigZag
//double TempBuffer[1],ZigZagBuffer[1];
// Переменные для оснавстки
// Массив чисел Песавенто (Фибы и модифицированные Фибы)
double fi[]={0.382, 0.447, 0.5, 0.618, 0.707, 0.786, 0.841, 0.886, 1.0, 1.128, 1.272, 1.414, 1.5, 1.618, 2.0, 2.236, 2.414, 2.618, 3.14, 3.618, 4.0};
string fitxt[]={".382", ".447", ".5", ".618", ".707", ".786", ".841", ".886", "1.0", "1.128", "1.272", "1.414", "1.5", "1.618", "2.0", "2.236", "2.414", "2.618", "3.14", "3.618", "4.0"};
double fi1[]={0.146, 0.236, 0.382, 0.5, 0.618, 0.764, 0.854, 1.0, 1.236, 1.618};
string fitxt1[]={"0.146", "0.236", ".382", ".5", ".618", ".764", ".854", "1.0", "1.236", "1.618"};
string nameObj,nameObjtxt,save;
// 
bool descript_b=false;
// PPWithBars - текст, выводимый у соединительной линии
// descript - описание объектов
string PPWithBars, descript;
// Матрица для поиска исчезнувших баров afr - массив значений времени пяти последних фракталов и отрисовки динамических и статических фиб
// afrl - минимумы, afrh - максимумы
int afr[]={0,0,0,0,0,0,0,0,0,0};
double afrl[]={0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0}, afrh[]={0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0};
// Параметры таймфрймов
double openTF[]={0.0,0.0,0.0,0.0,0.0}, closeTF[]={0.0,0.0,0.0,0.0,0.0}, lowTF[]={0.0,0.0,0.0,0.0,0.0}, highTF[]={0.0,0.0,0.0,0.0,0.0};
double close_TF=0;
string TF[]={"MN","W1","D1","H4","H1"};
bool afrm=true;
double ExtHL;
double HL,HLp,kk,kj,Angle;
// LowPrim,HighPrim,LowLast,HighLast - значения минимумов и максимумов баров
double LowPrim,HighPrim,LowLast,HighLast;
// numLowPrim,numHighPrim,numLowLast,numHighLast -номера баров
int numLowPrim,numHighPrim,numLowLast,numHighLast,k,k1,k2,ki,kiPRZ=0,countLow1,countHigh1,shift,shift1;
// Время свечи с первым от нулевого бара фракталом
int timeFr1new;
// Счетчик фракталов
int countFr;
// Бар, до которого надо рисовать соединительные линии от нулевого бара
int countBarEnd=0,TimeBarEnd;
// Бар, до которого надо пересчитывать от нулевого бара
int numBar=0;
// Номер объекта
int numOb;
// flagFrNew=true - образовался новый фрактал или первый фрактал сместился на другой бар. =false - по умолчанию.
bool flagFrNew=false;
// Период текущего графика
int perTF;
bool Demo;

int counted_bars, cbi, iBar;

int timeFirstBar=0;

// Переменные для ZigZag Алекса и индикатора подобного встроенному в Ensign
double ha[],la[],hi,li,si,sip,di,hm,lm,ham[],lam[],him,lim,lLast=0,hLast=0;
int fs=0,fsp,countBar;
int ai,aip,bi,bip,ai0,aip0,bi0,bip0;
datetime tai,tbi,taip,tbip,ti;
// fcount0 - при обнулении счетчика пропущенных баров на 0 баре fcount0=true.
// На следующем баре =false и можно определять точку перелома
bool fh=false,fl=false,fcount0;

// Переменные для Свингов Ганна
double lLast_m=0, hLast_m=0;
int countBarExt; // счетчик внешних баров
int countBarl,countBarh;

// Переменные для nen-ZigZag
bool hi_nen;
bool init_zz=true;

// Переменные для расширенного режима работы индикатора
int mFibo[]={0,0}, mPitch[]={0,0,0}, mFan[]={0,0}, mExpansion[]={0,0,0}, mVL[]={0,0,0};
// Переменные для построения вил Эндрюса по свечам
int mPitchTime[]={0,0,0};
double mPitchCena[]={0.0,0.0,0.0};

// переменные для vts
double ms[2];
// переменные для режима RSI
string name_ZUP="ZUP_RSI_v48";
int NumWindow=0;
double HL_RSI;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   string aa,aa1;
   int aa2;

   IndicatorBuffers(8);

   if (ExtStyleZZ) {SetIndexStyle(0,DRAW_SECTION);}
   else {SetIndexStyle(0,DRAW_ARROW); SetIndexArrow(0,159);}
   SetIndexLabel(0,"ZUP"+ExtComplekt+" (zz"+ExtIndicator+")");
   if (ExtIndicator==6) SetIndexLabel(5,"ZUP"+ExtComplekt+" DT6_"+minBars+"/"+ExtDeviation+"/"+ExtBackstep+"/GP"+GrossPeriod+"");
   else if (ExtIndicator==7) SetIndexLabel(5,"ZUP"+ExtComplekt+" DT7_"+minBars+"/GP"+GrossPeriod+"");
   else if (ExtIndicator==8) SetIndexLabel(5,"ZUP"+ExtComplekt+" DT8_"+minBars+"/"+ExtDeviation+"/GP"+GrossPeriod+"");
   if (chHL_PeakDet_or_vts)
     {
      SetIndexLabel(1,"ZUP"+ExtComplekt+" zz"+ExtIndicator+" H_PeakDet");
      SetIndexLabel(2,"ZUP"+ExtComplekt+" zz"+ExtIndicator+" L_PeakDet");
      SetIndexLabel(3,"ZUP"+ExtComplekt+" zz"+ExtIndicator+" H_chHL");
      SetIndexLabel(4,"ZUP"+ExtComplekt+" zz"+ExtIndicator+" L_chHL");
     }
   else
     {
      SetIndexLabel(1,"ZUP"+ExtComplekt+" zz"+ExtIndicator+" H_vts");
      SetIndexLabel(2,"ZUP"+ExtComplekt+" zz"+ExtIndicator+" L_vts");
      SetIndexLabel(3,"ZUP"+ExtComplekt+" zz"+ExtIndicator+" H_vts1");
      SetIndexLabel(4,"ZUP"+ExtComplekt+" zz"+ExtIndicator+" L_vts1");
     }

   SetIndexBuffer(0,zz);
   SetIndexBuffer(5,nen_ZigZag);
   SetIndexBuffer(6,zzL);
   SetIndexBuffer(7,zzH);

   SetIndexStyle(5,DRAW_ARROW);
   SetIndexArrow(5,159);
// Уровни предыдущих пиков
   SetIndexStyle(1,DRAW_LINE,STYLE_DOT);
   SetIndexStyle(2,DRAW_LINE,STYLE_DOT); 
   SetIndexBuffer(1,ham);
   SetIndexBuffer(2,lam);
// Уровни подтверждения
   SetIndexStyle(3,DRAW_LINE,STYLE_DOT);
   SetIndexStyle(4,DRAW_LINE,STYLE_DOT);
   SetIndexBuffer(3,ha);
   SetIndexBuffer(4,la);

   SetIndexEmptyValue(0,0.0);
   SetIndexEmptyValue(1,0.0);
   SetIndexEmptyValue(2,0.0);
   SetIndexEmptyValue(3,0.0);
   SetIndexEmptyValue(4,0.0);
   SetIndexEmptyValue(5,0.0);
   SetIndexEmptyValue(6,0.0);
   SetIndexEmptyValue(7,0.0);

   if (timeFirstBar==0) timeFirstBar=Time[Bars-1];

   if (ExtIndicator==1) if (minSize!=0) di=minSize*Point/2;
   if (ExtIndicator==2) {di=minSize*Point; countBar=minBars;}
   if (ExtIndicator==3) {countBar=minBars;}

// Проверка правильности введенных внешних переменных
   if (ExtDelta<=0) ExtDelta=0.001;
   if (ExtDelta>1) ExtDelta=0.999;

   if (ExtHidden<0) ExtHidden=0;
   if (ExtHidden>5) ExtHidden=5;
 
   if (ExtDeltaType<0) ExtDeltaType=0;
   if (ExtDeltaType>3) ExtDeltaType=3;

   if (ExtFractalEnd>0)
     {
      if (ExtFractalEnd<1) ExtFractalEnd=1;
     }

   if (ExtPitchforkStatic>4) ExtPitchforkStatic=4;
   if (ExtPitchforkDinamic>4) ExtPitchforkDinamic=4;

//--------------------------------------------
   if (ExtPitchforkStaticNum<3) ExtPitchforkStaticNum=3;
   
   if (ExtFiboStaticNum<2) ExtFiboStaticNum=2;

   if (ExtFiboStaticNum>9)
     {
      aa=DoubleToStr(ExtFiboStaticNum,0);
      aa1=StringSubstr(aa,0,1);
      mFibo[0]=StrToInteger(aa1);
      aa1=StringSubstr(aa,1,1);
      mFibo[1]=StrToInteger(aa1);
     }
   else
     {
      mFibo[0]=ExtFiboStaticNum;
      mFibo[1]=ExtFiboStaticNum-1;
     }

   if (ExtFiboFanNum<1) ExtFiboFanNum=1;

   if (ExtFiboFanNum>9)
     {
      aa=DoubleToStr(ExtFiboFanNum,0);
      aa1=StringSubstr(aa,0,1);
      mFan[0]=StrToInteger(aa1);
      aa1=StringSubstr(aa,1,1);
      mFan[1]=StrToInteger(aa1);
     }
   else
     {
      mFan[0]=ExtFiboFanNum;
      mFan[1]=ExtFiboFanNum-1;
     }

   if (ExtPitchforkStaticNum>99)
     {
      aa=DoubleToStr(ExtPitchforkStaticNum,0);
      aa1=StringSubstr(aa,0,1);
      mPitch[0]=StrToInteger(aa1);
      aa1=StringSubstr(aa,1,1);
      mPitch[1]=StrToInteger(aa1);
      aa1=StringSubstr(aa,2,1);
      mPitch[2]=StrToInteger(aa1);
     }
   else
     {
      mPitch[0]=ExtPitchforkStaticNum;
      mPitch[1]=ExtPitchforkStaticNum-1;
      mPitch[2]=ExtPitchforkStaticNum-2;
     }

   if (ExtFiboExpansion<2) ExtFiboExpansion=0;
   
   if (ExtFiboExpansion>0)
     {
      if (ExtFiboExpansion>99)
        {
         aa=DoubleToStr(ExtFiboExpansion,0);
         aa1=StringSubstr(aa,0,1);
         mExpansion[0]=StrToInteger(aa1);
         aa1=StringSubstr(aa,1,1);
         mExpansion[1]=StrToInteger(aa1);
         aa1=StringSubstr(aa,2,1);
         mExpansion[2]=StrToInteger(aa1);
        }
      else
        {
         mExpansion[0]=ExtFiboExpansion;
         mExpansion[1]=ExtFiboExpansion-1;
         mExpansion[2]=ExtFiboExpansion-2;
        }
     }

   if (ExtVLStaticNum>0)
     {
      if (ExtVLStaticNum<2) ExtVLStaticNum=2;

      if (ExtVLStaticNum>99)
        {
         aa=DoubleToStr(ExtVLStaticNum,0);
         aa1=StringSubstr(aa,0,1);
         mVL[0]=StrToInteger(aa1);
         aa1=StringSubstr(aa,1,1);
         mVL[1]=StrToInteger(aa1);
         aa1=StringSubstr(aa,2,1);
         mVL[2]=StrToInteger(aa1);
        }
      else
        {
         mVL[0]=ExtVLStaticNum;
         mVL[1]=ExtVLStaticNum-1;
         mVL[2]=ExtVLStaticNum-2;
        }
     }
   
   if (ExtPitchforkCandle)
     {
      mPitchTime[0]=ExtDateTimePitchfork_1;
      mPitchTime[1]=ExtDateTimePitchfork_2;
      mPitchTime[2]=ExtDateTimePitchfork_3;

      if (ExtPitchfork_1_HighLow)
        {
         mPitchCena[0]=High[iBarShift(Symbol(),Period(),ExtDateTimePitchfork_1)];
         mPitchCena[1]=Low[iBarShift(Symbol(),Period(),ExtDateTimePitchfork_2)];
         mPitchCena[2]=High[iBarShift(Symbol(),Period(),ExtDateTimePitchfork_3)];
        }
      else
        {
         mPitchCena[0]=Low[iBarShift(Symbol(),Period(),ExtDateTimePitchfork_1)];
         mPitchCena[1]=High[iBarShift(Symbol(),Period(),ExtDateTimePitchfork_2)];
         mPitchCena[2]=Low[iBarShift(Symbol(),Period(),ExtDateTimePitchfork_3)];
        }
     }

   if (ExtSave)
     {
      MathSrand(LocalTime());
      save=MathRand();
     }
   
   //Comment("                                                                  ");
   perTF=Period();
   Demo=IsDemo();
   delete_objects1();

   NumWindow=WindowFind(name_ZUP);

   return(0);
  }
//+------------------------------------------------------------------+
//| Деинициализация. Удаление всех трендовых линий и текстовых объектов
//+------------------------------------------------------------------+
int deinit()
  {
  int i;
   delete_objects1();
   ObjectDelete("fiboS" + ExtComplekt);ObjectDelete("fiboD" + ExtComplekt);
   ObjectDelete("fiboFanS" + ExtComplekt);ObjectDelete("fiboFanD" + ExtComplekt);
   ObjectDelete("RLineD" + ExtComplekt);ObjectDelete("RLineS" + ExtComplekt);
   ObjectDelete("pitchforkD" + ExtComplekt);ObjectDelete("pitchforkS" + ExtComplekt);
   ObjectDelete("pmedianaD" + ExtComplekt);ObjectDelete("pmedianaS" + ExtComplekt);
   ObjectDelete("1-2pmedianaD" + ExtComplekt);ObjectDelete("1-2pmedianaS" + ExtComplekt);
   ObjectDelete("fiboTime1" + ExtComplekt);ObjectDelete("fiboTime2" + ExtComplekt);
   ObjectDelete("fiboExpansion" + ExtComplekt);
   ObjectDelete("UTL" + ExtComplekt);ObjectDelete("LTL" + ExtComplekt);
   ObjectDelete("UWL" + ExtComplekt);ObjectDelete("LWL" + ExtComplekt);
   ObjectDelete("CL" + ExtComplekt);
//   ObjectDelete("PivotZoneS" + ExtComplekt);
   ObjectDelete("FanMedianaStatic" + ExtComplekt);ObjectDelete("FanMedianaDinamic" + ExtComplekt);
   ObjectDelete("FiboFan" + ExtComplekt);

   for (i=0; i<7; i++)
     {
      nameObj="VLS"+i+" " + ExtComplekt;
      ObjectDelete(nameObj);
     }

   for (i=0; i<7; i++)
     {
      nameObj="VLD"+i+" " + ExtComplekt;
      ObjectDelete(nameObj);
     }


   return(0);
  }
  
 bool BarChanged()
{
 static datetime dt = 0;

  if (dt != Time[0])
  {
   dt = Time[0];
   return(true);
  }
   return(false);
}
  
  
//********************************************************
// НАЧАЛО
int start()
  {
//  Print (NumWindow); 
   if (ExtIndicator==6 && Period()>GrossPeriod) 
     {
      for (iBar=Bars-1; iBar>0; iBar--) {zzL[iBar]=0.0; zzH[iBar]=0.0; zz[iBar]=0.0;}
      init_zz=true;
      return;
     }

   counted_bars=IndicatorCounted();
  
  
  /* Так было
   if (perTF!=Period())
     {
      delete_objects1();  
      perTF=Period();
     }

   if (Demo!=IsDemo())
     {
      delete_objects1();  
      Demo=IsDemo();
      counted_bars=0;
     }
   */
   
   
   // TS2050 Так стало
   
   if ((BarChanged()) || (perTF!=Period()) )
     {
      delete_objects1();  
      perTF=Period();
     }
   

//-----------------------------------------
//
//     1.
//
// Блок заполнения буферов. Начало. 
//-----------------------------------------   
// zz[] - буфер, данные из которого берутся для отрисовки самого ZigZag-a
// zzL[] - массив минимумов черновой
// zzH[] - массив максимумов черновой
//
//-----------------------------------------   
//
// Сюда можно вставить любой инструмент,
// который заполняет три вышеперечисленых буфера.
// Индикатор будет строиться на основе данных,
// полученных от этого инструмента.
//
// Это для тех, кто захочет модифицировать индикатор.
//
//-----------------------------------------

if (ExtIndicator>0)
  {
   if (timeFirstBar==Time[Bars-1])
     {
      if (ExtIndicator==6) 
        {
         if (Bars-IndicatorCounted()>2)
           {
            cbi=Bars-1;
            for (iBar=cbi; iBar>0; iBar--) {zzL[iBar]=0.0; zzH[iBar]=0.0; zz[iBar]=0.0;}
            init_zz=true;
           }
         else cbi=Bars-IndicatorCounted()+1;
        }
      else cbi=Bars-IndicatorCounted()-1;
     }
   else
     {
      cbi=Bars-1;
      for (iBar=cbi; iBar>0; iBar--) {zzL[iBar]=0.0; zzH[iBar]=0.0; zz[iBar]=0.0;}
      if (ExtIndicator==6) 
        {
         init_zz=true;
        }
      timeFirstBar=Time[cbi];
     }
  }


if (ExtIndicator==0) ZigZag_();
if (ExtIndicator==1) ang_AZZ_();
if (ExtIndicator==2) Ensign_ZZ();
if (ExtIndicator==3) Ensign_ZZ();
if (ExtIndicator==4) ZigZag_tauber();
if (ExtIndicator==5) GannSwing();
if (ExtIndicator==6) nenZigZag(); // DT-ZigZag - с исправленным, оптимизированным зигзагом ZigZag_new_nen3.mq4
if (ExtIndicator==7) nenZigZag(); // DT-ZigZag - вариант зигзага, который любезно предоставил klot - DT_ZZ.mq4
if (ExtIndicator==8) nenZigZag(); // DT-ZigZag - вариант зигзага, который любезно предоставил Candid - CZigZag.mq4
if (ExtIndicator==9) RSI_ZZ(); 
//if (ExtIndicator==7) ZigZag_new_nen1();


if (ExtHidden<5) // Разрешение на вывод оснастки. Начало.
  {
   if(!chHL_PeakDet_or_vts) {i_vts(); i_vts1();}
   // Инициализация матрицы
   matriza();
   if (infoTF) if (close_TF!=Close[0]) info_TF();
  }


//-----------------------------------------
// Блок заполнения буферов. Конец.
//-----------------------------------------   

if (ExtHidden>0 && ExtHidden<5) // Разрешение на вывод оснастки. Начало.
  {
//======================
//======================
//======================

//-----------------------------------------
//
//     2.
//
// Блок подготовки данных. Начало.
//-----------------------------------------   

   if (Bars - counted_bars>2 || flagFrNew)
     {

      // Поиск времени и номера бара, до которого будут рисоваться соединительные линии 
      if (countBarEnd==0)
        {
         if (ExtFractalEnd>0)
           {
            k=ExtFractalEnd;
            for (shift=0; shift0; shift++) 
              { 
               if (zz[shift]>0 && zzH[shift]>0) {countBarEnd=shift; TimeBarEnd=Time[shift]; k--;}
              }
           }
         else 
           {
            countBarEnd=Bars-3;
            TimeBarEnd=Time[Bars-3];
           }
        }
      else
        {
         countBarEnd=iBarShift(Symbol(),Period(),TimeBarEnd); 
        }

     }
//-----------------------------------------
// Блок подготовки данных. Конец.
//-----------------------------------------   


//-----------------------------------------
//
//     3.
//
// Блок проверок и удаления линий, 
// потерявших актуальность. Начало.
//-----------------------------------------   
// Коррекция соединяющих линий и чисел. Начало.

if (Bars - counted_bars<3)
  {
   // Поиск времени бара первого экстремума, считая от нулевого бара
   for (shift1=0; shift10.0 && (zzH[shift1]==zz[shift1] || zzL[shift1]==zz[shift1])) 
       {
        timeFr1new=Time[shift1];
        break;
       }
     }
   // Поиск бара, на котором первый экстремум был ранее.
   shift=iBarShift(Symbol(),Period(),afr[0]); 


   // Появился новый луч ZigZag
   if ((zzH[shift1]>0 && afrl[0]>0) || (zzL[shift1]>0 && afrh[0]>0))
     {
      ExtFiboStatic=false;
      ExtPitchforkStatic=0;
      ExtFiboExpansion=0;
      ExtFiboFanNum=0;
      
      if (ExtAlert)
       {
        Alert (Symbol(),"  ",Period(),"  появился новый луч ZigZag");
        PlaySound("alert.wav");
       }
     }

   // Сравнение текущего значения экстремума с тем, который был ранее

   // Образовался новый экстремум
   if (timeFr1new!=afr[0])
     {
      flagFrNew=true;
      if (shift>=shift1) numBar=shift; else  numBar=shift1;
      afrm=true;
     }

   // Экстремум на максимуме сдвинулся на другой бар
   if (afrh[0]>0 && zz[shift]==0.0)
     {
      flagFrNew=true;
      if (numBar0 && zz[shift]==0.0)
     {
      flagFrNew=true;
      if (numBar0)
  {
   flagFrNew=true;
   numBar=0;
   delete_objects2(afr[0]);
   afrh[0]=HL_RSI;
   if (ExtFiboDinamic) screenFiboD();
   if (ExtPitchforkDinamic>0) screenPitchforkD();
   if (ExtFiboFanDinamic) screenFiboFanD();
   if (mFibo[1]==0 && ExtFiboStatic) screenFiboS();
   if (ExtVLDinamicColor>0) VLD();
   if (mVL[2]==0 && ExtVLStaticNum>0) VLS();
   if (ExtPitchforkStatic>0)
     {
      if (ExtPitchforkCandle)
        {
         if (iBarShift(Symbol(),Period(),ExtDateTimePitchfork_3)==0) screenPitchforkS();
        }
      else
        {
         if (mPitch[2]==0) screenPitchforkS();
        }
     }
   if (mExpansion[2]==0 && ExtFiboExpansion>0) FiboExpansion();
   if (mFan[1]==0 && ExtFiboFanNum>0 && (ExtFiboFanColor!=CLR_NONE)) screenFiboFan();
  }
//============= 1 сместился максимум. Конец.
//
//============= 1 сместился минимум. Начало.
if (ExtIndicator!=9) HL_RSI=Low[shift]; else HL_RSI=iRSI(NULL,0,minBars,Price,shift);
if (afrl[0]-HL_RSI!=0 && afrl[0]>0)
  {
   flagFrNew=true;
   numBar=0;
   delete_objects2(afr[0]);
   afrl[0]=HL_RSI;
   if (ExtFiboDinamic) screenFiboD();
   if (ExtFiboFanDinamic) screenFiboFanD();
   if (mFibo[1]==0 && ExtFiboStatic) screenFiboS();
   if (ExtVLDinamicColor>0) VLD();
   if (mVL[2]==0 && ExtVLStaticNum>0) VLS();
   if (ExtPitchforkStatic>0)
     {
      if (ExtPitchforkCandle)
        {
         if (iBarShift(Symbol(),Period(),ExtDateTimePitchfork_3)==0) screenPitchforkS();
        }
      else
        {
         if (mPitch[2]==0) screenPitchforkS();
        }
     }
   if (mExpansion[2]==0 && ExtFiboExpansion>0) FiboExpansion();
   if (mFan[1]==0 && ExtFiboFanNum>0 && (ExtFiboFanColor!=CLR_NONE)) screenFiboFan();
  }
//============= 1 сместился минимум. Конец.
//-----------3 Сместился максимум или минимум, но остался на том же баре. Конец.


   // Поиск исчезнувших фракталов и удаление линий, исходящих от этих фракталов. Начало.
   countBarEnd=iBarShift(Symbol(),Period(),TimeBarEnd); 
   for (k=0; k<5; k++)
     {

      // Проверка максимумов.
      if (afrh[k]>0)
        {
         // Поиск бара, на котором был этот фрактал
         shift=iBarShift(Symbol(),Period(),afr[k]); 
         if (zz[shift]==0)
           {
            flagFrNew=true;
            if (shift>numBar) numBar=shift;
            afrm=true;
            numHighPrim=shift; numHighLast=0;HighLast=0.0;
            for (k1=shift+1; k1<=countBarEnd; k1++)
              {
               if (zzH[k1]>0) 
                 {
                  if (ExtIndicator!=9) HL_RSI=High[k1]; else HL_RSI=iRSI(NULL,0,minBars,Price,k1);
                  if (ZigZagHighLow) HighLast=HL_RSI; else HighLast=zzH[k1];
                  numHighLast=k1;

                  nameObj="" + ExtComplekt + "ph" + Time[numHighPrim] + "_" + Time[numHighLast];

                  numOb=ObjectFind(nameObj);
                  if (numOb>-1)
                    {
                     ObjectDelete(nameObj); 

                     nameObjtxt="" + ExtComplekt + "phtxt" + Time[numHighPrim] + "_" + Time[numHighLast];

                     ObjectDelete(nameObjtxt);
                    }
                 }
              }
           }
        }
      
      // Проверка минимумов.
      if (afrl[k]>0)
        {
         // Поиск бара, на котором был этот фрактал
         shift=iBarShift(Symbol(),Period(),afr[k]); 
         if (zz[shift]==0)
           {
            flagFrNew=true;
            if (shift>numBar) numBar=shift;

            afrm=true;
            numLowPrim=shift; numLowLast=0;LowLast=10000000;
            for (k1=shift+1; k1<=countBarEnd; k1++)
              {
               if (zzL[k1]>0) 
                 {
                  if (ExtIndicator!=9) HL_RSI=Low[k1]; else HL_RSI=iRSI(NULL,0,minBars,Price,k1);
                  if (ZigZagHighLow) LowLast=HL_RSI; else LowLast=zzL[k1];
                  numLowLast=k1;

                  nameObj="" + ExtComplekt + "pl" + Time[numLowPrim] + "_" + Time[numLowLast];

                  numOb=ObjectFind(nameObj);
                  if (numOb>-1)
                    {
                     ObjectDelete(nameObj); 

                     nameObjtxt="" + ExtComplekt + "pltxt" + Time[numLowPrim] + "_" + Time[numLowLast];

                     ObjectDelete(nameObjtxt);
                    }
                 }
              }
           }
        }
     }
   // Поиск исчезнувших фракталов и удаление линий, исходящих от этих фракталов. Конец.

   // Перезапись матрицы. Начало.
   matriza ();
   // Перезапись матрицы. Конец.

  }
// Коррекция соединяющих линий и чисел. Конец.
//-----------------------------------------
// Блок проверок и удаления линий, 
// потерявших актуальность. Конец.
//-----------------------------------------   


  // Подсчет количества фракталов. Начало.
  countFractal();
  // Подсчет количества фракталов. Конец.

//-----------------------------------------
//
//     4.
//
// Блок вывода соединительных линий. Начало.
//-----------------------------------------   
if (Bars - counted_bars>2)
  {
//-----------1 Отрисовка максимумов. Начало.
//+--------------------------------------------------------------------------+
//| Вывод соединяющих линий и чисел Песавенто и 0.886 для максимумов ZigZag-a
//| Отрисовка начинается от нулевого бара
//+--------------------------------------------------------------------------+

   numLowPrim=0; numLowLast=0;
   numHighPrim=0; numHighLast=0;

   LowPrim=0.0; LowLast=0.0;
   HighPrim=0.0; HighLast=0.0;
   
   Angle=-100;
   
   if (flagFrNew) countFr=1;
   else countFr=ExtFractal;

   for (k=0; (k0 && countFr>0); k++)
     {
      if (zzL[k]>0.0 && (zzL[k]0 && zzL[k]==zz[k])
        {
         if (ExtIndicator!=9) HL_RSI=Low[k]; else HL_RSI=iRSI(NULL,0,minBars,Price,k);
         if (ZigZagHighLow) LowPrim=HL_RSI; else LowPrim=zzL[k]; 
         numLowPrim=k;
        }
      if (zzH[k]>0.0 && zzH[k]==zz[k])
        {
         if (HighPrim>0) 
           {

            if (ExtIndicator!=9) HL_RSI=High[k]; else HL_RSI=iRSI(NULL,0,minBars,Price,k);
            if (ZigZagHighLow) HighLast=HL_RSI; else HighLast=zzH[k];
            numHighLast=k;

            HL=HighLast-LowPrim;
            kj=(HighPrim-HighLast)*1000/(numHighLast-numHighPrim);
            if (HL>0 && (Angle>=kj || Angle==-100))  // Проверка угла наклона линии
              {
               Angle=kj;
               // Создание линии и текстового объекта
               HLp=HighPrim-LowPrim;
               k1=MathCeil((numHighPrim+numHighLast)/2);
               kj=HLp/HL;

               
               if (ExtPPWithBars==0) PPWithBars="";
               else
                 {
                  if (ExtPPWithBars==1) PPWithBars=" ("+(numHighLast-numHighPrim)+")";
                  else if (ExtPPWithBars==2) PPWithBars=" ("+(numHighLast-numLowPrim)+"-"+(numLowPrim-numHighPrim)+")";
                 }

               if (kj>0.14 && kj<=5)
                 {
                  // Создание текстового объекта (числа Песавенто). % восстановления между максимумами
                  kk=kj;
                  k2=1;
                  if (!ExtFiboType)
                    {
                     if (ExtDeltaType==2) for (ki=kiPRZ;ki<=9;ki++) {if (MathAbs((fi1[ki]-kj)/fi1[ki])<=ExtDelta) {kk=fi1[ki]; k2=-1; break;}}
                     if (ExtDeltaType==1) for (ki=kiPRZ;ki<=9;ki++) {if (MathAbs(fi1[ki]-kj)<=ExtDelta) {kk=fi1[ki]; k2=-1; break;}}
                    }
                  else
                    {
                     if (ExtDeltaType==2) for (ki=kiPRZ;ki<=20;ki++) {if (MathAbs((fi[ki]-kj)/fi[ki])<=ExtDelta) {kk=fi[ki]; k2=-1; break;}}
                     if (ExtDeltaType==1) for (ki=kiPRZ;ki<=20;ki++) {if (MathAbs(fi[ki]-kj)<=ExtDelta) {kk=fi[ki]; k2=-1; break;}}
                    }

                  if (k2<0)
                    // процент восстановления числа Песавенто и 0.886
                    {
                    if (ExtHidden!=4)
                      {
                       nameObj="" + ExtComplekt + "phtxt" + Time[numHighPrim] + "_" + Time[numHighLast];

                       ObjectCreate(nameObj,OBJ_TEXT,NumWindow,Time[k1],(HighPrim+HighLast)/2);

                       if (kk==0.447 ||  kk==0.886 || kk==2.236 || kk==3.14 || kk==3.618) // Gartley
                         {
                          descript=fitxt[ki];
                          ObjectSetText(nameObj,fitxt[ki]+PPWithBars,ExtSizeTxt,"Arial", ExtGartley886);
                         }
                       else
                         if (!ExtFiboType)
                           {
                            descript=fitxt1[ki];
                            ObjectSetText(nameObj, fitxt1[ki]+PPWithBars,ExtSizeTxt,"Arial",ExtPesavento);
                           }
                         else
                           {
                            descript=fitxt[ki];
                            ObjectSetText(nameObj, fitxt[ki]+PPWithBars,ExtSizeTxt,"Arial",ExtPesavento);
                           }
                      }
                     }
                  else
                    // процент восстановления (не Песавенто и 0.886)
                    {
                     if (ExtHidden==1 || ExtHidden==4)
                       {
                        nameObj="" + ExtComplekt + "phtxt" + Time[numHighPrim] + "_" + Time[numHighLast];

                        ObjectCreate(nameObj,OBJ_TEXT,NumWindow,Time[k1],(HighPrim+HighLast)/2);

                        descript=DoubleToStr(kk,3);
                        ObjectSetText(nameObj,""+DoubleToStr(kk,2)+PPWithBars,ExtSizeTxt,"Arial",ExtNotFibo);
                       }
                    }

                  if ((ExtHidden==2 && k2<0) || ExtHidden!=2)
                    {
                     nameObj="" + ExtComplekt + "ph" + Time[numHighPrim] + "_" + Time[numHighLast];
                     ObjectCreate(nameObj,OBJ_TREND,NumWindow,Time[numHighPrim],HighPrim,Time[numHighLast],HighLast);

                     if (descript_b) ObjectSetText(nameObj,"ZUP"+ExtComplekt+" zz"+ExtIndicator+" PPesavento "+"Line High "+descript);
                     ObjectSet(nameObj,OBJPROP_RAY,false);
                     ObjectSet(nameObj,OBJPROP_STYLE,STYLE_DOT);
                     ObjectSet(nameObj,OBJPROP_COLOR,ExtLine);
                     ObjectSet(nameObj,OBJPROP_BACK,ExtBack);
                    }
                  if (ExtFiboZigZag) k=countBarEnd;
                 }
              }
           }
         else 
           {
            if (ExtIndicator!=9) HL_RSI=High[k]; else HL_RSI=iRSI(NULL,0,minBars,Price,k);
            if (ZigZagHighLow) HighPrim=HL_RSI; else HighPrim=zzH[k];
            numHighPrim=k;
           }
        }
       // Переход на следующий экстремум
       if (k>countBarEnd) 
         {
          k=numHighPrim+1; countHigh1--; countFr--;

          numLowPrim=0; numLowLast=0;
          numHighPrim=0; numHighLast=0;

          LowPrim=0.0; LowLast=0.0;
          HighPrim=0.0; HighLast=0.0;
   
          Angle=-100;
         }
     }
//-----------1 Отрисовка максимумов. Конец.

//-----------2 Отрисовка минимумов. Начало.
//+-------------------------------------------------------------------------+
//| Вывод соединяющих линий и чисел Песавенто и 0.886 для минимумов ZigZag-a
//| Отрисовка идет от нулевого бара
//+-------------------------------------------------------------------------+

   numLowPrim=0; numLowLast=0;
   numHighPrim=0; numHighLast=0;

   LowPrim=0.0; LowLast=0.0;
   HighPrim=0.0; HighLast=0.0;
   
   Angle=-100;

   if (flagFrNew) countFr=1;
   else countFr=ExtFractal;

   for (k=0; (k0 && countFr>0); k++)
     {
      if (zzH[k]>HighPrim && LowPrim>0)
        {
         if (ExtIndicator!=9) HL_RSI=High[k]; else HL_RSI=iRSI(NULL,0,minBars,Price,k);
         if (ZigZagHighLow) HighPrim=HL_RSI; else HighPrim=zzH[k];
         numHighPrim=k;
        }

      if (zzL[k]>0.0 && zzL[k]==zz[k]) 
        {
         if (LowPrim>0) 
           {

            if (ExtIndicator!=9) HL_RSI=Low[k]; else HL_RSI=iRSI(NULL,0,minBars,Price,k);
            if (ZigZagHighLow) LowLast=HL_RSI; else LowLast=zzL[k];
            numLowLast=k;

            // вывод соединяющих линий и процентов восстановления(чисел Песавенто)
            HL=HighPrim-LowLast;
            kj=(LowPrim-LowLast)*1000/(numLowLast-numLowPrim);
            if (HL>0 && (Angle<=kj || Angle==-100))  // Проверка угла наклона линии
              {
               Angle=kj;

               HLp=HighPrim-LowPrim;
               k1=MathCeil((numLowPrim+numLowLast)/2);
               kj=HLp/HL;

               if (ExtPPWithBars==0) PPWithBars="";
               else if (ExtPPWithBars==1) PPWithBars=" ("+(numLowLast-numLowPrim)+")";
               else if (ExtPPWithBars==2) PPWithBars=" ("+(numLowLast-numHighPrim)+"-"+(numHighPrim-numLowPrim)+")";

               if ( kj>0.14 && kj<=5)
                 {
                  // Создание текстового объекта (числа Песавенто). % восстановления между минимумами
                  kk=kj;
                  k2=1;

                  if (!ExtFiboType)
                    {
                     if (ExtDeltaType==2) for (ki=kiPRZ;ki<=9;ki++) {if (MathAbs((fi1[ki]-kj)/fi1[ki])<=ExtDelta) {kk=fi1[ki]; k2=-1; break;}}
                     if (ExtDeltaType==1) for (ki=kiPRZ;ki<=9;ki++) {if (MathAbs(fi1[ki]-kj)<=ExtDelta) {kk=fi1[ki]; k2=-1; break;}}
                    }
                  else
                    {
                     if (ExtDeltaType==2) for (ki=kiPRZ;ki<=20;ki++) {if (MathAbs((fi[ki]-kj)/fi[ki])<=ExtDelta) {kk=fi[ki]; k2=-1; break;}}
                     if (ExtDeltaType==1) for (ki=kiPRZ;ki<=20;ki++) {if (MathAbs(fi[ki]-kj)<=ExtDelta) {kk=fi[ki]; k2=-1; break;}}
                    }

                  if (k2<0)
                  // процент восстановления числа Песавенто и 0.886
                    {
                     if (ExtHidden!=4)                  
                       {
                        nameObj="" + ExtComplekt + "pltxt" + Time[numLowPrim] + "_" + Time[numLowLast];

                        ObjectCreate(nameObj,OBJ_TEXT,NumWindow,Time[k1],(LowPrim+LowLast)/2);

                        if (kk==0.447 ||  kk==0.886 || kk==2.236 || kk==3.14 || kk==3.618) // Gartley
                          {
                           descript=fitxt[ki];
                           ObjectSetText(nameObj,fitxt[ki]+PPWithBars,ExtSizeTxt,"Arial", ExtGartley886);
                          }
                        else
                          if (!ExtFiboType)
                            {
                             descript=fitxt1[ki];
                             ObjectSetText(nameObj, fitxt1[ki]+PPWithBars,ExtSizeTxt,"Arial",ExtPesavento);
                            }
                          else
                            {
                             descript=fitxt[ki];
                             ObjectSetText(nameObj, fitxt[ki]+PPWithBars,ExtSizeTxt,"Arial",ExtPesavento);
                            }
                       }
                    }
                  else 
                    // процент восстановления (не Песавенто и 0.886)
                    { 
                     if (ExtHidden==1 || ExtHidden==4)
                       {
                        nameObj="" + ExtComplekt + "pltxt" + Time[numLowPrim] + "_" + Time[numLowLast];

                        ObjectCreate(nameObj,OBJ_TEXT,NumWindow,Time[k1],(LowPrim+LowLast)/2);

                        descript=DoubleToStr(kk,3);
                        ObjectSetText(nameObj,""+DoubleToStr(kk,2)+PPWithBars,ExtSizeTxt,"Arial",ExtNotFibo);
                       }
                     }
                     
                   if ((ExtHidden==2 && k2<0) || ExtHidden!=2)
                     {
                      nameObj="" + ExtComplekt + "pl" + Time[numLowPrim] + "_" + Time[numLowLast];

                      ObjectCreate(nameObj,OBJ_TREND,NumWindow,Time[numLowPrim],LowPrim,Time[numLowLast],LowLast);

                      if (descript_b) ObjectSetText(nameObj,"ZUP"+ExtComplekt+" zz"+ExtIndicator+" PPesavento "+"Line Low "+descript);
                      ObjectSet(nameObj,OBJPROP_RAY,false);
                      ObjectSet(nameObj,OBJPROP_STYLE,STYLE_DOT);
                      ObjectSet(nameObj,OBJPROP_COLOR,ExtLine);
                      ObjectSet(nameObj,OBJPROP_BACK,ExtBack);
                     }
                   if (ExtFiboZigZag) k=countBarEnd;
                  }
               }
           }
         else
           {
            numLowPrim=k; 
            if (ExtIndicator!=9) HL_RSI=Low[k]; else HL_RSI=iRSI(NULL,0,minBars,Price,k);
            if (ZigZagHighLow) LowPrim=HL_RSI; else LowPrim=zzL[k];
           }
        }
       // Переход на следующий экстремум
       if (k>countBarEnd) 
         {
          k=numLowPrim+1; countLow1--; countFr--;

          numLowPrim=0; numLowLast=0;
          numHighPrim=0; numHighLast=0;

          LowPrim=0.0; LowLast=0.0;
          HighPrim=0.0; HighLast=0.0;
  
          Angle=-100;
         }
     }

//-----------2 Отрисовка минимумов. Конец.

  }
//-----------------------------------------
// Блок вывода соединительных линий. Конец.
//-----------------------------------------   

//======================
//======================
//======================
  } // Разрешение на вывод оснастки. Конец.
// КОНЕЦ
  } // start



//----------------------------------------------------
//  Подпрограммы и функции
//----------------------------------------------------

//--------------------------------------------------------
// Подсчет количества экстремумов. Минимумов и максимумов. Начало.
//--------------------------------------------------------
void countFractal()
  {
   int shift;
   countLow1=0;
   countHigh1=0;
   if (flagFrNew)
     {
      for(shift=0; shift<=numBar; shift++)
        {
         if (zzL[s        

Recommend