← К каталогу
Исходный код · ID 4719

ZUP

+zup_v148_md_5.mq5
Вы автор или правообладатель?

Сообщите нам, если считаете, что материал размещён без разрешения.

Краткий обзор

О программе

Индикатор для MetaTrader 5, предназначенный для построения универсального зигзага и поиска гармонических паттернов (Gartley, Bat, Butterfly, Crab, Shark, Cypher, Dragon, 3 Drives, AB=CD и др.). Работает в окне графика, отображает линии зигзага, соединительные линии с числами Песавенто, уровни Фибоначчи, зоны развития точки D и монитор найденных паттернов.

Поддерживается несколько алгоритмов расчёта зигзага (стандартный, Алекс, Ensign, tauber, свинги Ганна, Talex, SQZZ, wellx, DT-зигзаги с внешних индикаторов). Режим ExtIndicator=11 включает сканер паттернов с перебором параметров зигзага в заданных диапазонах.

Индикатор выводит информацию о найденных паттернах на график, в комментарий, в глобальные переменные терминала, а также может сохранять данные в файлы XML/CSV и делать снимки графика. Есть оповещения и отправка сообщений на email при появлении нового луча зигзага или паттерна.

Настройки программы

НастройкаОписание
______________0_____________ Заголовок группы параметров зигзага.
ExtIndicator Выбор варианта зигзага для построения паттернов: 0 — стандартный, 1 — Алекса, 2 — Ensign, 3 — Ensign с переменным minBars, 4 — tauber, 5 — свинги Ганна, 6–8, 10 — DT-зигзаги, 11 — режим поиска паттернов, 12 — Talex, 13 — SQZZ, 14 — wellx.
ParametresZZforDMLEWA Задаёт набор параметров minBars и ExtBackstep для режимов ExtIndicator=0 и 6 в тактике DML&EWA: 1–8 — фиксированные наборы, 0 — значения задаются параметрами minBars и ExtBackstep.
minBars Фильтр по количеству баров для зигзага.
minSize Фильтр по количеству пунктов для зигзага.
ExtDeviation Параметр Deviation зигзага из MT4.
ExtBackstep Параметр Backstep стандартного зигзага, унаследованный от версии для MT4.
noBackstep Отключает использование параметра ExtBackstep в алгоритме стандартного зигзага для режимов ExtIndicator=0, 6 и 11.
RecoverFiltr Режим восстановления экстремумов, удалённых параметром ExtBackstep.
GrossPeriod Таймфрейм в минутах, данные с которого используются для построения DT-зигзага.
minPercent Процентный фильтр для зигзага. При использовании процентов minSize должен быть равен 0.
ExtPoint Количество точек зигзага для зигзага Talex.
StLevel Первый уровень зигзага wellx (в пунктах).
BigLevel Второй уровень зигзага wellx (в пунктах).
auto Автоматический расчёт уровней StLevel и BigLevel для зигзага wellx.
minBar Значение в процентах для расчёта StLevel при автоматическом режиме.
ExtStyleZZ Стиль линий зигзага: true — линии через вкладку цвета, false — точки у экстремумов.
ExtMaxBar Количество баров, участвующих в расчёте зигзага. 0 — вся история.
ExtMinBar Минимальный номер бара, до которого рассчитывается зигзаг.
ExtNumberPeak Включает нумерацию переломов зигзага начиная с 1.
ExtNumberPeak10 Разрешает вывод номеров только у первых 10 переломов.
ExtNumberPeakLow Вывод номеров только у минимумов или у максимумов и минимумов.
ExtNumberPeakColor Цвет номеров переломов.
ExtNumberPeakFontSize Размер шрифта номеров переломов.
______________1_____________ Заголовок группы параметров уровней Фибоначчи.
ExtFiboDinamic Разрешает вывод динамических уровней Фибоначчи на первом луче зигзага.
ExtFiboStatic Разрешает вывод статических уровней Фибоначчи.
ExtFiboStaticNum Номер луча зигзага для вывода статических уровней Фибоначчи (от 2 до 9).
ExtFiboCorrectionExpansion Режим уровней Фибоначчи: false — коррекция, true — расширение.
ExtFiboD Цвет динамических уровней Фибоначчи.
ExtFiboS Цвет статических уровней Фибоначчи.
ExtFiboStyle Стиль линий уровней Фибоначчи.
ExtFiboWidth Толщина линий уровней Фибоначчи.
______________2_____________ Заголовок группы параметров паттернов Песавенто.
ExtPPWithBars Какую информацию выводить у паттернов Песавенто: 0 — значение ретресмента, 1 — количество баров между точками, 2 — количество баров для первого и второго лучей, 3 — временной ретресмент по барам, 4 — временной ретресмент по времени, 7 — скорость лучей, 8 — отношение длин лучей, 9 — процент изменения
ExtHidden Режим отображения оснастки паттернов Песавенто: 0 — линии и числа скрыты, 1 — все линии с ретресментом в диапазоне, 2 — только линии с числами Песавенто, 3 — числа и соответствующие линии, 4 — числа не Песавенто и линии, 5 — скрыть всё кроме зигзага и Gartley.
ExtFractal Количество экстремумов, от которых строятся соединительные линии к другим экстремумам.
ExtFractalEnd Количество экстремумов, до которого строятся соединительные линии. 0 — до максимального числа экстремумов, минимум 1.
ExtFiboChoice Выбор набора чисел для построения паттернов Песавенто (от 0 до 11).
ExtFiboZigZag Разрешает вывод зигзага Фибоначчи.
ExtDelta Допуск для сравнения текущего ретресмента с ближайшим числом Песавенто. Задаёт величину потенциальной разворотной зоны, должен быть в диапазоне от 0 до 1.
ExtDeltaType Способ расчёта допуска: 0 — проценты восстановления как есть с округлением до 2 знаков, 1 — абсолютная разница с числом Песавенто, 2 — относительная разница, 3 — проценты с округлением до 3 знаков.
ExtSizeTxt Размер шрифта для вывода чисел.
ExtLine Цвет соединительных линий.
ExtLine886 Цвет соединительных линий с числами Песавенто.
ExtNotFibo Цвет всех остальных чисел, не относящихся к Фибоначчи.
ExtPesavento Цвет чисел Песавенто.
ExtGartley886 Цвет числа 0.886 и других дополнительных чисел.
______________3_____________ Заголовок группы параметров паттернов Gartley.
AlgorithmSearchPatterns Выбор алгоритма сканера поиска паттернов в режиме ExtIndicator=11: 0 — стандартный зигзаг, 1 — зигзаг Алекса с размером луча в пунктах, 2 — зигзаг Алекса с размером в процентах, 3 — Ensign, 4 — tauber, 5 — свинги Ганна, 6 — Talex.
PotencialsLevels_retXD Вывод уровней ретресмента XD потенциальных пятиточечных паттернов: 0 — отключён, 1 — совместно с паттернами при ExtGartleyOnOff=true, 2 — только уровни без паттернов.
visibleLevelsABCD Варианты показа уровней потенциальной точки D: 0 — без дополнительных уровней, 1 — все уровни ретресмента BD, 2 — все уровни AB=CD, 3 — совместно BD и AB=CD.
maxDepth Максимальное значение Depth (minBars), до которого может изменяться параметр Depth зигзага при сканировании паттернов Gartley.
minDepth Минимальное значение Depth для поиска паттернов Gartley.
FiboStep Включает расчёт параметра Backstep по формуле Backstep = Depth * 1.618 при поиске паттернов.
IterationStepDepth Шаг изменения параметра Depth зигзага при поиске паттернов Gartley.
maxSize_ Максимальное значение размера луча в пунктах для сканера паттернов.
minSize_ Минимальное значение размера луча в пунктах для сканера паттернов.
IterationStepSize Шаг изменения параметра Size зигзага при поиске паттернов Gartley.
maxPercent_ Максимальное значение процента для расчёта зигзага Алекса в сканере.
minPercent_ Минимальное значение процента для расчёта зигзага Алекса в сканере.
IterationStepPercent Шаг в процентах изменения параметра Percent зигзага Алекса при поиске.
DirectionOfSearchMaxMin Направление перебора параметров зигзага при сканировании: false — от минимального значения к максимальному, true — от максимального к минимальному.
SelectPattern Группы пятиточечных паттернов для поиска: 0 — все, 1 — классические, 2 — классические и антиклассические, 3 — экзотические, 4 — только антипаттерны, 5 — все кроме TOTAL, 6 — только TOTAL, 7 — произвольный выбор через visiblePattern, 8 — отключить поиск.
visiblePattern Строка из нулей и единиц, задающая, какие паттерны искать при SelectPattern=7.
NumberPattern Номер паттерна, по которому калибруется зигзаг и параметры которого выводятся через InfoTF. 0 — зигзаг с параметрами как в режиме ExtIndicator=0.
ExtGartleyTypeSearch Режим поиска паттернов: 0 — остановка после первого найденного, 1 — вывод всех паттернов на участке maxBarToD с повторным поиском, 2 — вывод всех паттернов однократно.
ExtHiddenPP Режим отображения зигзага в режиме ExtIndicator=11: 0 — только точки вершин без паттернов Песавенто, 1 — зигзаг, откалиброванный паттерном NumberPattern, 2 — только точки вершин с паттернами Песавенто для вершин Gartley.
ExtGartleyOnOff Включает показ паттернов Gartley вне режима сканера.
maxBarToD Максимальное количество баров от нулевого до точки D паттерна.
patternInfluence Учёт влияния паттерна: 0 — паттерны с точкой D не далее maxBarToD баров, 1 — учитывается влияние паттерна с отменой maxBarToD, 2 — поиск на всей разметке зигзага.
patternTrue Фильтр паттернов по условию отсутствия выхода цены за рамку зоны развития точки D на участке от точки D до нулевого бара.
AllowedBandPatternInfluence Коэффициент, задающий расстояние от точки D до предполагаемой границы влияния паттерна, рассчитываемый от расстояния между точками X и D.
RangeForPointD Разрешает показ зоны развития точки D.
OldNewRangeForPointD Выбор варианта построения зоны развития точки D паттерна.
ExtColorRangeForPointD Цвет рамки зоны развития точки D.
VectorOfAMirrorTrend 1 — выводится вектор тренда, 2 — выводится вектор зеркального тренда.
VectorOfAMirrorTrendColor Цвет линии обратного тренда.
VectorOfAMirrorTrendStyle Стиль линии обратного тренда.
shortNamePatterns Разрешает вывод коротких наименований паттернов.
visibleLineOrTriangle Разрешает вывод паттернов в виде линий или треугольников, кроме AB=CD.
PatternLineStyle Стиль линий пятиточечных паттернов и ABCD.
PatternLineWidth Толщина линий пятиточечных паттернов и ABCD.
ExtColorPatterns Цвет линий паттернов.
ExtColorPatternList Список цветов через запятую для закраски крыльев паттернов Gartley. При ошибке в названии цвета используется красный.
ExtDeltaGartley Допуск на отклонение цены при поиске паттернов Gartley (по умолчанию 0.09).
ExtDeltaGartleyPRZ Специальный допуск для построения рамки развития точки D паттерна.
levelD Включает вывод на график уровней ретресментов XD возможных вариантов точных паттернов для текущей комбинации.
colorLevelD Цвет уровней ретресментов XD.
Equilibrium Включает отображение линий Equilibrium, Reaction1 и Reaction2.
ReactionType Задаёт тип линий реакции.
EquilibriumStyle Стиль линий Equilibrium и Reaction.
EquilibriumWidth Толщина линий Equilibrium и Reaction.
ColorEquilibrium Цвет линии Equilibrium.
ColorReaction Цвет линий Reaction1 и Reaction2.
Ext_3Drives Разрешает поиск и отображение паттерна 3 Drives.
Ext_xO Коэффициент для поиска 7-точечного паттерна 3 Drives.
Dragon Разрешает поиск и отображение паттерна Dragon.
PeakZZDragon Номер экстремума зигзага, до которого производится поиск паттерна Dragon.
Ext_4PointPattern Разрешает поиск 4-точечного паттерна продолжения.
Получить полный код

Поиск по коду файла

#property stacksize 65535
#property indicator_chart_window
#property indicator_buffers 6
#property indicator_color1 clrMagenta //clrRed 

#property indicator_color2 clrGreen
#property indicator_color3 clrOrange
#property indicator_color4 clrLightSkyBlue
#property indicator_color5 clrLemonChiffon

#property indicator_color6 clrMagenta //clrYellow

#property version "2.148"
#property description "ZigZag универсальный с паттернами Песавенто"
#property description " "
#property description "Версия для поиск паттернов"

#define pi  3.14159265
#define phi 1.6180339887

extern string ______________0_____________ = "Parameters for ZigZag";
extern int    ExtIndicator            = 11; 
extern int    ParametresZZforDMLEWA   = 6;
extern int    minBars                 = 8;
extern int    minSize                 = 50;

extern int    ExtDeviation            = 5;
extern int    ExtBackstep             = 3;
extern bool   noBackstep              = false;
extern bool   RecoverFiltr            = false;

extern int    GrossPeriod             = 240;

extern double minPercent              = 0.0;      // 0.08
extern int    ExtPoint=11; // количество точек зигзага для зигзага Talex 

extern int    StLevel                 = 28;
extern int    BigLevel                = 32; 
extern bool   auto                    = true;
extern double minBar=38.2, maxBar=61.8;

extern bool   ExtStyleZZ              = true;

extern int    ExtMaxBar               = 1400;     // Количество баров обсчёта (0-все)
extern int    ExtMinBar               = 0;

extern bool   ExtNumberPeak           = false;
extern bool   ExtNumberPeak10         = true;
extern bool   ExtNumberPeakLow        = true;
extern color  ExtNumberPeakColor      = clrRed;
extern int    ExtNumberPeakFontSize   = 11;

extern string ______________1_____________ = "Parameters for fibo Levels";
extern bool   ExtFiboDinamic          = false;
extern bool   ExtFiboStatic           = false;
extern int    ExtFiboStaticNum        = 2;
extern bool   ExtFiboCorrectionExpansion = false;
extern color  ExtFiboD                = clrSienna;
extern color  ExtFiboS                = clrTeal;
extern int    ExtFiboStyle            = 2;
extern int    ExtFiboWidth            = 0;

extern string ______________2_____________ = "Parameters for Pesavento Patterns";
extern int    ExtPPWithBars           = 0;
extern int    ExtHidden               = 1;
extern int    ExtFractal              = 7;
extern int    ExtFractalEnd           = 7;
extern int    ExtFiboChoice           = 2;
extern bool   ExtFiboZigZag           = false;
extern double ExtDelta                = 0.04;
extern int    ExtDeltaType            = 2;
extern int    ExtSizeTxt              = 7;
extern color  ExtLine                 = clrDarkBlue;
extern color  ExtLine886              = clrPurple;
extern color  ExtNotFibo              = clrSlateGray;
extern color  ExtPesavento            = clrFireBrick; // Yellow; Цвета для белого фона. Убрал цвета для черного фона 
extern color  ExtGartley886           = clrRed; // GreenYellow;
       color  colorPPattern;

extern string ______________3_____________ = "Parameters for Gartley Patterns";
extern int    AlgorithmSearchPatterns = 0;
extern int    PotencialsLevels_retXD  = 1;
extern int    visibleLevelsABCD       = 3;

extern int    maxDepth                = 5;
extern int    minDepth                = 3;
extern bool   FiboStep                = true; //false;
extern int    IterationStepDepth      = 2;

extern int    maxSize_                = 150;
extern int    minSize_                = 15;
extern int    IterationStepSize       = 3;

extern double maxPercent_             = 10.0;
extern double minPercent_             = 0.4;
extern double IterationStepPercent    = 15;

extern bool   DirectionOfSearchMaxMin = true;
extern int    SelectPattern           = 0;
extern string visiblePattern          = "000000000000000000000000000000000";
extern int    NumberPattern           = 1;  // Номер паттерна, по которому калибруется зигзаг и параметры которого выводятся через InfoTF
extern int    ExtGartleyTypeSearch    = 0;
extern int    ExtHiddenPP             = 1;
extern bool   ExtGartleyOnOff         = true;

extern int    maxBarToD               = 15;
extern int    patternInfluence        = 1; //2;
extern bool   patternTrue             = true;
extern double AllowedBandPatternInfluence = 1.618;
extern bool   RangeForPointD          = true;
extern bool   OldNewRangeForPointD    = false;
extern color  ExtColorRangeForPointD  = clrRed;
extern int    VectorOfAMirrorTrend    = 2;
extern color  VectorOfAMirrorTrendColor  = clrLawnGreen;
extern int    VectorOfAMirrorTrendStyle  = STYLE_DASH;
extern bool   shortNamePatterns       = false;
extern bool   visibleLineOrTriangle   = true;
extern int    PatternLineStyle        = 0;
extern int    PatternLineWidth        = 2;
extern color  ExtColorPatterns        = clrBlue;
extern string ExtColorPatternList     = "clrBlue,clrDarkGreen,clrFireBrick,clrDeepPink,clrRoyalBlue,clrSienna,clrDodgerBlue,clrCornflowerBlue,clrTomato,clrSlateBlue,clrMediumSlateBlue,clrSlateGray,clrBlueViolet";

extern double ExtDeltaGartley         = 0.09;
extern double ExtDeltaGartleyPRZ      = 0.02;

extern int    levelD                  = 1;
extern color  colorLevelD             = clrRed;

extern bool   Equilibrium             = true;
extern bool   ReactionType            = false;
extern int    EquilibriumStyle        = 1;
extern int    EquilibriumWidth        = 0;
extern color  ColorEquilibrium        = clrRed;
extern color  ColorReaction           = clrTomato;

extern bool   Ext_3Drives             = true;
extern double Ext_xO                  = 1.618;

extern bool   Dragon                  = true;
extern int    PeakZZDragon            = 7;

extern bool   Ext_4PointPattern       = true;
extern double _maxXB                  = 0.618;

extern int    ABCD                    = 2; 
extern bool   searchABCDAlternate     = false;
extern string ABCDAlternate           = "0.618,0.786,0.886,1.128,1.272,1.618,2.618";
extern bool   visibleABCDrayZZ        = true;

extern bool   Ext_noname              = false;

extern int    CustomPattern           = 0; // 0 - не выводится пользовательский паттерн 

extern string NameCustomPattern       = "Custom";
extern double minXB                   = 0.67; // 0.382;  //0.5;
extern double maxXB                   = 0.67; // 0.942;  //0.618;
extern double minAC                   = 0.618; // 0.447;  //0.382;
extern double maxAC                   = 0.618; // 0.942;  //0.618;
extern double minBD                   = 2.46; // 1.144;  //1.128;
extern double maxBD                   = 2.46; // 2.128;  //1.272;
extern double minXD                   = 1.272; // 0.5;    //0.618;
extern double maxXD                   = 1.272; // 0.942;  //0.886;

extern bool   filtrEquilibrium           = true;

extern int    readFromFileListPatterns   = 0;
extern string NameFileListPatterns       = "listpatterns";
extern bool   writeToFileListPatterns    = false;
extern bool   picture                    = false;
extern int    writeInfoPatternsToFileXML = 0;
extern int    writeInfoPatternsToFileCSV = 0;
extern bool   namefileSymbolPeriod       = false;

extern bool   InfoPointD                 = false;

extern bool   MonitorPatterns            = true;
extern int    TextSize                   = 10;

extern bool   ExtGlobalVariableSet       = false;

extern string ______________4_____________ = "Parameters Exp";
extern bool   chHL                = false;
extern bool   PeakDet             = false;
extern bool   chHL_PeakDet        = true;
extern int    ExtLabel            = 0;
extern int    ExtCodLabel         = 116;

extern string ______________5_____________ = "Common Parameters";

extern int    ExtFiboType       = 1;
extern string ExtFiboTypeFree  = "0,0.382,0.618,0.764,1,1.236,1.618"; // пользовательские уровни фибо 
extern color  ExtObjectColor    = clrNONE;
extern int    ExtObjectStyle    = 1;
extern int    ExtObjectWidth    = 0; 

extern bool   ExtDinamic        = false; //true; //
extern string ExtVisibleDinamic = "01";
extern bool   RefreshStaticNewRayZZ =true;

extern bool   ZigZagHighLow     = true;

extern bool   ExtSendMail       = false;
extern bool   ExtAlert          = false;
extern bool   ExtPlayAlert      = false;
extern string AlertText         = "появился новый Паттерн";

extern bool   ExtBack           = true;

extern bool   ExtSave           = false;
extern string info_comment      = "0011";
extern bool   infoMerrillPattern= false;
extern bool   infoTF            = true;

extern bool   bigText           = false;
extern int    bigTextSize       = 16;
extern color  bigTextColor      = clrBlue;
extern color  bigTextColorBearish = clrRed;
extern int    bigTextX          = 50;
extern int    bigTextY          = 50;
extern bool   ExtVisible        = true;
extern int    ExtComplekt       = 3;

double zz[];

double zzL[];

double zzH[];

double nen_ZigZag[];

int    _maxbarZZ; // количество баров, участвующих в расчете зигзагов.

int _ExtBackstep, _minBars, _minSize;

double fi[];
string fitxt[];
string fitxt100[];
int    Sizefi=0,Sizefi_1=0;

color  ExtLine_;

double number[64];
string numbertxt[64];
int    numberFibo[64];
int    numberPesavento[64];
int    numberGartley[64];
int    numberMix[64];
int    numberGilmorQuality[64];
int    numberGilmorGeometric[64];
int    numberGilmorHarmonic[64];
int    numberGilmorArithmetic[64];
int    numberGilmorGoldenMean[64];
int    numberSquare[64];
int    numberCube[64];
int    numberRectangle[64];
int    numberExt[64];

string nameObj="", nameObjtxt="", save="";

bool descript_b=false;

string PPWithBars="", descript="";

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}, afrx[]={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};
string TF[]={"MN","W1","D1","H4","H1","m30","m15","m5","m1"};
string Period_tf="";
bool   afrm=true;
double ExtHL;
double HL,HLp,kk,kj,Angle;

double LowPrim,HighPrim,LowLast,HighLast;

int numLowPrim,numHighPrim,numLowLast,numHighLast,k1,k2,countLow1,countHigh1,shift1,shift2,shift3;
string txtkk="", txtRet="";

int timeFr1new,timeFr2new,timeFr3new;

int countFr;

int countBarEnd=0,TimeBarEnd;

int numBar=0;

int numOb;

bool flagFrNew=false;

bool newRay=true;

bool flagGartley=false;

int perTF;
bool Demo;

bool   first=true;
int    NewBarTime=0, countbars=0;
int    realcnt=0;

double int_to_d=0, int_to_d1=0, int_to_d2=0;

int counted_bars, cbi, iBar;

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,bi,ai0,bi0,aim,bim;
datetime tai,tbi,ti,tmh,tml;

bool fh=false,fl=false,fcount0,PeakDetIni;

/*

double lLast_m=0, hLast_m=0;
int countBarExt; // счетчик внешних баров
int countBarl,countBarh;
*/

bool hi_nen;
bool init_zz=true;

int mFibo[]={0,0};

double   hBar, lBar;
datetime tiZZ;

string   vBullBear    = ""; // переменная для обозначения бычий или медвежий паттерн
string   vNamePattern = ""; // переменная для обозначения наименования паттерна
string   vBullBearToNumberPattern    = "";
string   vNamePatternToNumberPattern = "";
string   _InfoPointD                 = "";
bool     vPatOnOff = false, vPatNew = false, saveParametersZZ=false;
bool     vWriteToFilePattern = false, vpicture=false;

datetime TimeForDmin  = 0, TimeForDminToNumberPattern;
datetime TimeForDmax  = 0, TimeForDmaxToNumberPattern;
double   LevelForDmin = 0, LevelForDminToNumberPattern;
double   LevelForDmax = 0, LevelForDmaxToNumberPattern;
double   save_cenaPointD;
datetime save_timePointD_0;
double   PeakCenaX[1],PeakCenaA[1],PeakCenaB[1],PeakCenaC[1],PeakCenaD[1];
datetime PeakTimeX[1],PeakTimeA[1],PeakTimeB[1],PeakTimeC[1],PeakTimeD[1];
string   __NamePatterns[1][2];
int      __D[1][4];
color    __PatColor[1];
int      countGartley = 0;      // Счетчик паттернов
int      minBarsToNumberPattern;
int      minSizeToNumberPattern;
int      vBackstepToNumberPattern;
double   minPercentToNumberPattern;
color    ColorList[];
int      ColorSize;
int      countColor   = 0;
bool     flagExtGartleyTypeSearch2=false; // сигнал выключения поиска паттернов в режиме китайская игрушка
int      minBarsSave, minBarsX;

bool     CustomPat_[33];

string namepatterns[33]=
{"Gartley","Bat","Alternate Bat","Butterfly","Crab","Deep Crab","Leonardo","Shark","Cypher","Nen STAR","5-0",
"A Gartley","A Bat","A Alternate Bat","A Butterfly","A Crab","A Deep Crab","A Leonardo","A Shark","A Cypher","A Nen STAR","A 5-0",
"Black Swan","White Swan","Navarro 200","max Bat","max Gartley","max Butterfly","TOTAL 1","TOTAL 2","TOTAL 3","TOTAL 4","TOTAL"};

int countPat;
int typepatterns[33];

double pp[33][16]=                                                 // priznakipatterns=pp
{0.618,0.618,0.382,0.886,1.128,1.618,0.786,0.786,0,0,0,0,0,0,0,1,
0.382,0.5,0.382,0.886,1.618,2.618,0.886,0.886,0,0,0,0,1.272,0,0,1,
0.382,0.382,0.382,0.886,2.0,4.236,1.128,1.128,0,0,0,0,1.618,0,0,1,
0.786,0.786,0.382,0.886,1.618,2.618,1.272,1.618,0,0,0,0,1.272,0,0,1,
0.382,0.618,0.382,0.886,2.236,4.236,1.618,1.618,0,0,0,0,0,0,0,1,
0.886,0.886,0.382,0.886,2.618,4.236,1.618,1.618,0,0,0,0,0,0,0,1,
0.5,0.5,0.382,0.886,1.128,2.618,0.786,0.786,0,0,0,0,0,0,0,1,
0,0,1.128,1.618,1.618,2.236,0.886,1.128,0,0,0,0,0,0,0,1,
0.382,0.618,0,0,0,0,0.786,0.786,1.272,1.414,0,0,0,0,0,1,
0.382,0.618,0,0,0,0,1.272,1.272,1.272,1.414,0,0,0,0,0,1,
1.128,1.618,1.618,2.236,0.5,0.5,0,0,0,0,0,0,0,0,0,0,
0.618,0.886,1.128,2.618,1.618,1.618,1.272,1.272,0,0,0,0,0,0,0,1,
0.382,0.618,1.128,2.618,2.0,2.618,1.128,1.128,0,0,0,0,0,0.786,0,1,
0.236,0.5,1.128,2.618,2.618,2.618,0.886,0.886,0,0,0,0,0,0.618,0,1,
0.382,0.618,1.128,2.618,1.272,1.272,0.618,0.786,0,0,0,0,0,0.786,0,1,
0.236,0.447,1.128,2.618,1.128,2.618,0.618,0.618,0,0,0,0,0,0,0,1,
0.236,0.382,1.128,2.618,1.128,1.128,0.618,0.618,0,0,0,0,0,0,0,1,
0.382,0.886,1.128,2.618,2.0,2.0,1.272,1.272,0,0,0,0,0,0,0,1,
0.447,0.618,0.618,0.886,0,0,0.886,1.128,0,0,0,0,0,0,0,1,
0,0,0,0,1.618,2.618,1.272,1.272,0,0,1.272,1.414,0,0,0,0,
0,0,0,0,1.618,2.618,0.786,0.786,0,0,1.272,1.414,0,0,0,1,
2.0,2.0,0.447,0.618,0.618,0.886,0,0,0,0,0,0,0,0,0,0,
1.382,2.618,0.236,0.5,1.128,2.0,1.128,2.618,0,0,0,0,0,0,0,0,
0.382,0.724,2.0,4.236,0.5,0.886,0.382,0.886,0,0,0,0,0,0,0,0,
0.786,0.786,0.886,1.128,0,0,0.886,1.128,0,0,0,0,0,0,1,0,
0.382,0.618,0.382,0.886,1.272,2.618,0.886,0.886,0,0,0,0,1.272,0,0,1,
0.382,0.618,0.382,0.886,1.128,2.236,0.618,0.786,0,0,0,0,0,0,0,1,
0.618,0.886,0.382,0.886,1.272,2.618,1.272,1.618,0,0,0,0,1.272,0,0,1,
0.382,0.786,0.382,0.886,1.272,2.618,0.786,0.886,0,0,0,0,0,0,0,1,
0.382,0.786,0.382,0.886,1.618,4.236,1.128,1.618,0,0,0,0,0,0,0,1,
0.236,0.618,1.128,2.618,1.272,2.618,0.618,0.886,0,0,0,0,0,0,0,1,
0.382,0.786,1.128,2.618,1.618,2.618,1.128,1.272,0,0,0,0,0,0,0,1,
0.236,0.786,0.382,2.618,1.272,4.236,0.618,1.618,0,0,0,0,0,0,0,1};

int retresmentXD[][2], retresmentBD[][2], arrXD_BD[2];

double minXB_[33], maxXB_[33], minAC_[33], maxAC_[33], minBD_[33], maxBD_[33], minXD_[33], maxXD_[33], minXXA_[33], maxXXA_[33], minXCD_[33], maxXCD_[33], minXAB_[33], maxXDC_[33];

int      levelXD[32,2];   // номер паттерна, код уровня
double   level_D[32];     // значение цены потенциального уровня точки D паттерна
string   level_nameD[32]; // наименование потенциального уровня точки D паттерна

double   deltapatterns[3][20][2];

double   retpatterns[20]={0.146,0.236,0.382,0.447,0.5,0.618,0.707,0.786,0.886,1.0,1.128,1.272,1.414,1.618,2.0,2.236,2.618,3.1416,3.618,4.236};
string   retpatternstxt[20]={".146",".236",".382",".447",".5",".618",".707",".786",".886","1.0","1.128","1.272","1.414","1.618","2.0","2.236","2.618","3.14","3.618","4.236"};
double   min_DeltaGartley, max_DeltaGartley;
int      ret[5][2]; // XD-XB-AC-BD, во втором измерении для ExtDeltaGartley - 2, для ExtDelta - 1, для ExtDeltaGartleyPRZ - 0

double   _ABCDtype[];
string   _ABCDtypetxt[];
int      _ABCDsize;

int f=1; // для alerta

double   mPeak0[5][2]={0,5,0,4,0,3,0,2,0,1}, mPeak1[5][2]={0,5,0,4,0,3,0,2,0,1};
string   mMerrillPatterns[32][3]=
{"21435", "M1", "DownTrend",
"21453", "M2", "InvertedHeadAndShoulders",
"24135", "M3", "DownTrend",
"24153", "M4", "InvertedHeadAndShoulders",
"42135", "M5", "Broadening",
"42153", "M6", "InvertedHeadAndShoulders",
"24315", "M7", "*",
"24513", "M8", "InvertedHeadAndShoulders",
"42315", "M9", "*",
"42513", "M10", "InvertedHeadAndShoulders",
"45213", "M11", "InvertedHeadAndShoulders",
"24351", "M12", "*",
"24531", "M13", "Triangle",
"42351", "M14", "*",
"42531", "M15", "UpTrend",
"45231", "M16", "UpTrend",
"13245", "W1", "DownTrend",
"13524", "W2", "DownTrend",
"15324", "W3", "*",
"13224", "W4", "Triangle",
"15342", "W5", "*",
"31254", "W6", "HeadAndShoulders",
"42513", "W7", "HeadAndShoulders",
"51324", "W8", "*",
"31542", "W9", "HeadAndShoulders",
"51324", "W10", "*",
"35124", "W11", "HeadAndShoulders",
"53124", "W12", "Broadening",
"35142", "W13", "HeadAndShoulders",
"53142", "W14", "UpTrend",
"35412", "W15", "HeadAndShoulders",
"53412", "W16", "UpTrend"};

static int    endbar = 0;
static double endpr  = 0;

bool   tik1 = true;

int init()
  {
      // код доступен только после оплаты
   }

int deinit()
  {
   ObjectDelete(StringConcatenate("fiboS",ExtComplekt,"_"));

   ObjectDelete(StringConcatenate("LinePivotZZ","1",ExtComplekt,"_"));
   ObjectDelete(StringConcatenate("LinePivotZZ","2",ExtComplekt,"_"));
   ObjectDelete(StringConcatenate("#_TextPattern_#",ExtComplekt,"_"));
   ObjectDelete(StringConcatenate("#_TextPatternMP_#",ExtComplekt,"_"));

   delete_objects_dinamic();
   delete_objects1();
   delete_objects3();
   delete_objects4();
   delete_objects_number();
   delete_objects_monitor();

   if (infoTF) Comment("");
   return(0);
  }

int start()
  {
      // код доступен только после оплаты
   } // start

void countFractal()
  {
   int shift;
   countLow1=0;
   countHigh1=0;
   if (flagFrNew && !flagGartley)
     {
      for(shift=0; shift<=numBar; shift++)
        {
         if (zzL[shift]>0.0) {countLow1++;}
         if (zzH[shift]>0.0) {countHigh1++;}    
        }

      numBar=0;  
      counted_bars=Bars-4;
     }
   else
     {
      if (flagGartley)  {counted_bars=0;}
      for(shift=0; shift<=countBarEnd; shift++)
        {
         if (zzL[shift]>0.0) {countLow1++;}
         if (zzH[shift]>0.0) {countHigh1++;}
        }
     }
  }

void matriza()
  {
   if (afrm && ExtHidden<5)
     {
      afrm=false;

      int shift,k,m;
      double kl=0,kh=0;

      if (ExtMaxBar>0) cbi=ExtMaxBar; else cbi=Bars;

      k=0; m=0;
      for (shift=0; shift<cbi && k<10; shift++)
        {
         if (zz[shift]>0)
           {
            afrx[k]=zz[shift];
            afr[k]=Time[shift];
            if (zz[shift]==zzL[shift])
              {
               kl=zzL[shift];
               if (ZigZagHighLow) afrl[k]=Low[shift]; 
               else
                 {
                  if (k==0) afrl[k]=Low[shift]; else  afrl[k]=zzL[shift];
                 }
               afrh[k]=0.0;
              }

            if (zz[shift]==zzH[shift])
              {
               kh=zzH[shift];
               if (ZigZagHighLow) afrh[k]=High[shift]; 
               else
                 {
                  if (k==0) afrh[k]=High[shift]; else afrh[k]=zzH[shift];
                 }
               afrl[k]=0.0;
              }
            k++;

            if (infoMerrillPattern)
              {
               if (m<6)
                 {
                  if (m<5)
                    {
                     mPeak0[m][0]=zz[shift];
                    }
                  if (m>0)
                    {
                     mPeak1[m-1][0]=zz[shift];
                    }
                  m++;
                 }
              }
           }
        }

      if (infoMerrillPattern)
        {
         ArraySort(mPeak1,5,0,MODE_ASCEND);
         ArraySort(mPeak0,5,0,MODE_ASCEND);
        }

      if (PeakDet && chHL_PeakDet)
        {

         for (k=shift; k>0; k--)
           {
            if (zzH[k]>0) {kh=zzH[k];}
            if (zzL[k]>0) {kl=zzL[k];}

            if (kl>0) lam[k]=kl;
            if (kh>0) ham[k]=kh;
           }
        }

      if (ExtFiboStatic)
        {
         if (newRay && mFibo[1]>0) screenFiboS();
         if (mFibo[1]==0) screenFiboS();
        }
      if (ExtFiboDinamic) screenFiboD();

      search_Gartley();

     _Monitor();

      bigTextPattern_etc();

      ExtSave=false;
     }
   if (newRay && ExtNumberPeak) NumberPeak();
   newRay=false;
  }

void search_Gartley()
  {
   if (ExtGartleyOnOff || PotencialsLevels_retXD>0)
     {
      switch (ExtIndicator )
        {
         case 0     : {_Gartley(StringConcatenate("ExtIndicator=0_",_minBars,"/",_ExtBackstep),_minBars);break;}
         case 1     : {_Gartley(StringConcatenate("ExtIndicator=1_",minSize,"/",minPercent),0);break;}
         case 2     : {_Gartley(StringConcatenate("ExtIndicator=2_",minBars,"/",minSize),minSize);break;}
         case 3     : {_Gartley(StringConcatenate("ExtIndicator=3_",minBars),0);break;}
         case 4     : {_Gartley(StringConcatenate("ExtIndicator=4_",minSize),0);break;}
         case 5     : {_Gartley(StringConcatenate("ExtIndicator=5_",minBars),0);break;}
         case 6     : {_Gartley(StringConcatenate("ExtIndicator=6_",minBars,"/",ExtBackstep),0);break;}
         case 7     : {_Gartley(StringConcatenate("ExtIndicator=7_",minBars),0);break;}
         case 8     : {_Gartley(StringConcatenate("ExtIndicator=8_",minBars,"/",ExtDeviation),0);break;}
         case 10    : {_Gartley(StringConcatenate("ExtIndicator=10_",minBars),0);break;}
         case 12    : {_Gartley(StringConcatenate("ExtIndicator=12_",minBars),0);break;}
         case 13    : {_Gartley(StringConcatenate("ExtIndicator=13_",minBars,"/",minSize),0);break;}
         case 14    : {_Gartley(StringConcatenate("ExtIndicator=14_",minBars),0);break;}
        }

      if (vPatOnOff && !vPatNew)
        {
         vPatNew=true;
         if (ExtSendMail) _SendMail("There was a pattern",StringConcatenate("on  ",Symbol()," ",Period()," pattern ",vBullBear," ",vNamePattern));
        }
      else if (!vPatOnOff && vPatNew) vPatNew=false;
     }
  }

void NumberPeak()
  {
   int n=0,i,endNumber;
   string txt="";
   if (ExtNumberPeak10) endNumber=iBarShift(Symbol(),Period(),afr[9]); else endNumber=Bars-minBars;

   delete_objects_number();

   for (i=iBarShift(Symbol(),Period(),afr[0])+1;i<endNumber;i++)
     {
      if (zz[i]>0)
        {
         n++;
         if (ExtNumberPeakLow)
           {
            if (zzL[i]>0)
              {
               txt=DoubleToStr(n,0);
               nameObj=StringConcatenate("NumberPeak_",ExtComplekt,"_",n);
               ObjectCreate(nameObj,OBJ_TEXT,0,Time[i],zz[i]);
               ObjectSetText(nameObj,txt,ExtNumberPeakFontSize,"Arial",ExtNumberPeakColor);
              }
           }
         else
           {
            txt=DoubleToStr(n,0);
            nameObj=StringConcatenate("NumberPeak_",ExtComplekt,"_",n);
            ObjectCreate(nameObj,OBJ_TEXT,0,Time[i],zz[i]);
            ObjectSetText(nameObj,txt,ExtNumberPeakFontSize,"Arial",ExtNumberPeakColor);
           }
        }
     }
   }

void screenFiboS()
  {
   nameObj=StringConcatenate("fiboS",ExtComplekt,"_");
   if (mFibo[1]>0)
     {
      if (ExtSave)
        {
         nameObj=StringConcatenate(nameObj,save);
        }
     }

   screenFibo_(ExtFiboS, "                             ", mFibo[0], mFibo[1], nameObj);
  }

void screenFiboD()
  {
   nameObj=StringConcatenate("fiboD",ExtComplekt,"_");
   screenFibo_(ExtFiboD, "", 1, 0, nameObj);
  }

void screenFibo_(color colorFibo, string otstup, int a1, int a2, string _nameObj)
  {
   double fibo_0, fibo_100, fiboPrice, fiboPrice1;

   ObjectDelete(_nameObj);

   if (!ExtFiboCorrectionExpansion)
     {
      fibo_0=afrx[a1];fibo_100=afrx[a2];
      fiboPrice=afrx[a1]-afrx[a2];fiboPrice1=afrx[a2];
     }
   else
     {
      fibo_100=afrx[a1];fibo_0=afrx[a2];
      fiboPrice=afrx[a2]-afrx[a1];fiboPrice1=afrx[a1];
     }

   if (!ExtFiboCorrectionExpansion)
     {
      ObjectCreate(_nameObj,OBJ_FIBO,0,afr[a1],fibo_0,afr[a2],fibo_100);
     }
   else
     {
      ObjectCreate(_nameObj,OBJ_FIBO,0,afr[a2],fibo_0,afr[a1],fibo_100);
     }

   ObjectSet(_nameObj,OBJPROP_LEVELCOLOR,colorFibo);

   ObjectSet(_nameObj,OBJPROP_COLOR,ExtObjectColor);
   ObjectSet(_nameObj,OBJPROP_STYLE,ExtObjectStyle);
   ObjectSet(_nameObj,OBJPROP_WIDTH,ExtObjectWidth);
   ObjectSet(_nameObj,OBJPROP_LEVELSTYLE,ExtFiboStyle);
   ObjectSet(_nameObj,OBJPROP_LEVELWIDTH,ExtFiboWidth);
   ObjectSet(_nameObj,OBJPROP_BACK,ExtBack);

   if (ExtFiboType==0)
     {
      fibo_standart(fiboPrice, fiboPrice1,"-"+Period_tf+otstup);
     }
   else if (ExtFiboType==1)
     {
      fibo_patterns(fiboPrice, fiboPrice1,"-"+Period_tf+otstup);
     }
   else if (ExtFiboType==2)
     {
      fibo_custom(fiboPrice, fiboPrice1,"-"+Period_tf+otstup);
     }
  }

void fibo_standart(double fiboPrice,double fiboPrice1,string fibo)
  {
   double   fi_1[]={0, 0.146, 0.236, 0.382, 0.5, 0.618, 0.764, 0.854, 1.0, 1.236, phi, 2.618, 4.236, 6.854};
   string   fitxt100_1[]={"0.0", "14.6", "23.6", "38.2", "50.0", "61.8", "76.4", "85.4", "100.0", "123.6", "161.8", "2.618", "423.6", "685.4"};
   int i;
   Sizefi_1=14;

   if (!ExtFiboCorrectionExpansion)
     {   
      ObjectSet(nameObj,OBJPROP_FIBOLEVELS,Sizefi_1);
      for (i=0;i<Sizefi_1;i++)
        {
         ObjectSet(nameObj,OBJPROP_FIRSTLEVEL+i,fi_1[i]);
         ObjectSetFiboDescription(nameObj, i, fitxt100_1[i]+" "+"  %$"+fibo); 
        }
     }
   else
     {
      ObjectSet(nameObj,OBJPROP_FIBOLEVELS,Sizefi_1+2);

      ObjectSet(nameObj,OBJPROP_FIRSTLEVEL,0);
      ObjectSetFiboDescription(nameObj, 0, "Fe 1 "+"  %$"+fibo); 

      ObjectSet(nameObj,OBJPROP_FIRSTLEVEL,1);
      ObjectSetFiboDescription(nameObj, 1, "Fe 0 "+"  %$"+fibo); 

      for (i=1;i<Sizefi_1;i++)
        {
         ObjectSet(nameObj,OBJPROP_FIRSTLEVEL+i+2,1+fi_1[i]);
         ObjectSetFiboDescription(nameObj, i+2, "Fe "+fitxt100_1[i]+" "+"  %$"+fibo); 
        }
     }
  }

void fibo_patterns(double fiboPrice,double fiboPrice1,string fibo)
  {
   double   fi_1[]={0.0, 0.382, 0.447, 0.5, 0.618, 0.707, 0.786, 0.854, 0.886, 1.0, 1.128, 1.272, 1.414, phi, 2.0, 2.618, 4.236};
   string   fitxt100_1[]={"0.0", "38.2", "44.7", "50.0", "61.8", "70.7", "78.6", "85.4", "88.6", "100.0", "112.8", "127.2", "141.4", "161.8", "200.0", "261.8", "423.6"};
   int i;
   Sizefi_1=17;

   if (!ExtFiboCorrectionExpansion)
     {   
      ObjectSet(nameObj,OBJPROP_FIBOLEVELS,Sizefi_1);
      for (i=0;i<Sizefi_1;i++)
        {
         ObjectSet(nameObj,OBJPROP_FIRSTLEVEL+i,fi_1[i]);
         ObjectSetFiboDescription(nameObj, i, fitxt100_1[i]+" "+"  %$"+fibo); 
        }
     }
   else
     {
      ObjectSet(nameObj,OBJPROP_FIBOLEVELS,Sizefi_1+2);

      ObjectSet(nameObj,OBJPROP_FIRSTLEVEL,0);
      ObjectSetFiboDescription(nameObj, 0, "Fe 1 "+"  %$"+fibo); 

      ObjectSet(nameObj,OBJPROP_FIRSTLEVEL,1);
      ObjectSetFiboDescription(nameObj, 1, "Fe 0 "+"  %$"+fibo); 

      for (i=1;i<Sizefi_1;i++)
        {
         ObjectSet(nameObj,OBJPROP_FIRSTLEVEL+i+2,1+fi_1[i]);
         ObjectSetFiboDescription(nameObj, i+2, "Fe "+fitxt100_1[i]+" "+"  %$"+fibo); 
        }
     }
  }

void fibo_custom(double fiboPrice,double fiboPrice1,string fibo)
  {
   int i;

   if (!ExtFiboCorrectionExpansion)
     {   
      ObjectSet(nameObj,OBJPROP_FIBOLEVELS,Sizefi);
      for (i=0;i<Sizefi;i++)
        {
         ObjectSet(nameObj,OBJPROP_FIRSTLEVEL+i,fi[i]);
         ObjectSetFiboDescription(nameObj, i, fitxt100[i]+" "+"  %$"+fibo); 
        }
     }
   else
     {
      ObjectSet(nameObj,OBJPROP_FIBOLEVELS,Sizefi+2);

      ObjectSet(nameObj,OBJPROP_FIRSTLEVEL,0);
      ObjectSetFiboDescription(nameObj, 0, "Fe 1 "+"  %$"+fibo); 

      ObjectSet(nameObj,OBJPROP_FIRSTLEVEL,1);
      ObjectSetFiboDescription(nameObj, 1, "Fe 0 "+"  %$"+fibo); 

      for (i=0;i<Sizefi;i++)
        {
         if (fi[i]>0)
           {
            ObjectSet(nameObj,OBJPROP_FIRSTLEVEL+i+2,1+fi[i]);
            ObjectSetFiboDescription(nameObj, i+2, "Fe "+fitxt100[i]+" "+"  %$"+fibo); 
           }
        }
     }
  }

void delete_objects1()
  {
   int i;
   string txt="";
   counted_bars=0;

   for (i=ObjectsTotal()-1; i>=0; i--)
     {
      txt=ObjectName(i);
      if (StringFind(txt,"_" + ExtComplekt + "pl")>-1) ObjectDelete (txt);
      if (StringFind(txt,"_" + ExtComplekt + "ph")>-1) ObjectDelete (txt);
     }
  }

void delete_objects2(string txt1)
  {
   int i;
   string txt="";

   for (i=ObjectsTotal()-1; i>=0; i--)
     {
      txt=ObjectName(i);
      if (StringFind(txt,txt1)>-1)ObjectDelete (txt);
     }
  }

void delete_FiboStrongPattern()
  {
   int i;
   string txt="";
   for (i=ObjectsTotal()-1; i>=0; i--)
     {
      txt=ObjectName(i);
      if (StringFind(txt,"_"+ExtComplekt+"StrongPattern_")>-1) ObjectDelete (txt);
     }
  }

void delete_objects3()
  {
   int i;
   string txt="";

   for (i=ObjectsTotal()-1; i>=0; i--)
     {
      txt=ObjectName(i);
      if (StringFind(txt,StringConcatenate("_",ExtComplekt,"StrongPattern_"))>-1) ObjectDelete (txt);
      if (StringFind(txt,StringConcatenate("_",ExtComplekt,"Triangle"))>-1) ObjectDelete (txt);
      if (StringFind(txt,StringConcatenate("_",ExtComplekt,"ABCDzz"))>-1) ObjectDelete (txt);
      if (StringFind(txt,StringConcatenate("_",ExtComplekt,"Line"))>-1) ObjectDelete (txt);
      if (RangeForPointD)
        {
         if (StringFind(txt,StringConcatenate("_",ExtComplekt,"PointD"))>-1) ObjectDelete (txt);
        }

      if (StringFind(txt,StringConcatenate("_",ExtComplekt,"Equilibrium"))>-1) ObjectDelete (txt);
      if (StringFind(txt,StringConcatenate("_",ExtComplekt,"Reaction"))>-1) ObjectDelete (txt);
      if (StringFind(txt,StringConcatenate("_",ExtComplekt,"pg"))>-1) ObjectDelete (txt);
      if (bigText)
        {
         if (StringFind(txt,StringConcatenate("#_TextPattern_#",ExtComplekt,"_"))>-1) ObjectDelete (txt);
        }
      vBullBearToNumberPattern="";
      vNamePatternToNumberPattern="";
      if (VectorOfAMirrorTrend>0) if (StringFind(txt,StringConcatenate("_",ExtComplekt,"VectorOfAMirrorTrend"))>-1) ObjectDelete (txt);

      if (ExtGartleyTypeSearch>0)
        {
         ArrayInitialize(PeakCenaX,0);
         ArrayInitialize(PeakCenaA,0);
         ArrayInitialize(PeakCenaB,0);
         ArrayInitialize(PeakCenaC,0);
         ArrayInitialize(PeakCenaD,0);

         ArrayInitialize(PeakTimeX,0);
         ArrayInitialize(PeakTimeA,0);
         ArrayInitialize(PeakTimeB,0);
         ArrayInitialize(PeakTimeC,0);
         ArrayInitialize(PeakTimeD,0);

         __NamePatterns[0][0]="";
         __NamePatterns[0][1]="";
         ArrayInitialize(__D,0);
         ArrayInitialize(__PatColor,0);
        }
     }
  }

void delete_objects4()
  {
   int i;
   string txt="";

   for (i=ObjectsTotal()-1; i>=0; i--)
     {
      txt=ObjectName(i);
      if (StringFind(txt,StringConcatenate("_",ExtComplekt,"pg"))>-1) ObjectDelete (txt);
     }
  }

void delete_objects_monitor()
  {
   int i;
   string txt="";

   for (i=ObjectsTotal()-1; i>=0; i--)
     {
      txt=ObjectName(i);
      if (StringFind(txt,StringConcatenate("_",ExtComplekt,"_","MonitorPatterns_"))>-1) ObjectDelete(txt);
     }
  }

void delete_objects_number()
  {
   int i;
   string txt="";

   for (i=ObjectsTotal()-1; i>=0; i--)
     {
      txt=ObjectName(i);
      if (StringFind(txt,StringConcatenate("NumberPeak_",ExtComplekt,"_"))>-1) ObjectDelete (txt);
     }
  }

void delete_objects_dinamic()
  {
   ObjectDelete(StringConcatenate("fiboD",ExtComplekt,"_"));
  }

void ang_AZZ_()
 {
   int    i,n;
   bool   endCyklDirection=true;
   bool   endSearchPattern=false;
   int    vSize;
   double vPercent_, vPercent;

   if (ExtMaxBar>0) cbi=ExtMaxBar; else cbi=Bars-1;

   if (ExtIndicator==11)
     {
      if (AlgorithmSearchPatterns==1)
        {
         if (DirectionOfSearchMaxMin) vSize = maxSize_; else vSize = minSize_;
        }
      else
        {
         if (DirectionOfSearchMaxMin) vPercent_ = maxPercent_; else vPercent_ = minPercent_;
        }
     }

   while (endCyklDirection)
     {
      if (ExtIndicator==11)
        {
         if (ExtLabel>0) {ArrayInitialize(la,0.0); ArrayInitialize(ha,0.0);}
         ArrayInitialize(zz,0);ArrayInitialize(zzL,0);ArrayInitialize(zzH,0);
         ti=0; fs=0; fsp=0; tbi=0; tai=0; si=0;

         if (AlgorithmSearchPatterns==1)
           {
            if (DirectionOfSearchMaxMin)
              {
               if (vSize < minSize_)
                 {
                  if (ExtGartleyTypeSearch>0 && ExtIndicator==11 && vPatOnOff) vSize=minSizeToNumberPattern;
                  else vSize=minSize_;
                  endSearchPattern=true;
                 }

               di=vSize*Point/2;
               vSize-=IterationStepSize;
              }
            else
              {
               if (vSize > maxSize_)
                 {
                  if (ExtGartleyTypeSearch>0 && ExtIndicator==11 && vPatOnOff) vSize=minSizeToNumberPattern;
                  else vSize=minSize_;
                  endSearchPattern=true;
                 }

               di=vSize*Point/2;
               vSize+=IterationStepSize;
              }
           }
         else
           {
            if (DirectionOfSearchMaxMin)
              {
               if (vPercent_ < minPercent_)
                 {
                  if (ExtGartleyTypeSearch>0 && ExtIndicator==11 && vPatOnOff) vPercent_=minPercentToNumberPattern;
                  else vPercent_=minPercent_;
                  endSearchPattern=true;
                 }

               vPercent=vPercent_;
               vPercent_=vPercent_*(1-IterationStepPercent/100);
              }
            else
              {
               if (vPercent_ > maxPercent_)
                 {
                  if (ExtGartleyTypeSearch>0 && ExtIndicator==11 && vPatOnOff) vPercent_=minPercentToNumberPattern;
                  else vPercent_=minPercent;
                  endSearchPattern=true;
                 }

               vPercent=vPercent_;
               vPercent_=vPercent_*(1+IterationStepPercent/100);
              }
           }

         if (flagExtGartleyTypeSearch2)
           {
            endSearchPattern=true; 

            if (AlgorithmSearchPatterns==1)
              {
               vSize=minSizeToNumberPattern;
              }
            else
              {
               vPercent_=minPercentToNumberPattern;
              }
           }
        }
      else
        {
         endCyklDirection=false;
         endSearchPattern=true;
        }

      for (i=cbi; i>=ExtMinBar; i--) 
        {

         if (ti<Time[i]) {fsp=fs; sip=si;} ti=Time[i];

         if (ExtIndicator==11)
           {
            if (AlgorithmSearchPatterns==2) di=vPercent*Close[i]/2/100;
           }
         else if (minSize==0 && minPercent!=0) di=minPercent*Close[i]/2/100;

         if (High[i]>si+di && Low[i]<si-di) // Внешний бар по отношению к ценовому фильтру di
           {

            if (fs==1) si=High[i]-di;  // 
            if (fs==2) si=Low[i]+di;  // 
           } 
         else  // Не внешний бар
           {
            if (fs==1)
              {
               if (High[i]>=si+di) si=High[i]-di;   // 
               else if (Low[i]<si-di) si=Low[i]+di;   // 
              }
            if (fs==2)
              {
               if (Low[i]<=si-di) si=Low[i]+di;   // 
               else if (High[i]>si+di) si=High[i]-di;   //
              }
           }

         if (i>cbi-1) {si=(High[i]+Low[i])/2;}

         if (si>sip) fs=1; // Тренд восходящий
         if (si<sip) fs=2; // Тренд нисходящий

         if (fs==1 && fsp==2) // Тренд сменился с нисходящего на восходящий
           {
            hm=High[i];

            bi=iBarShift(Symbol(),Period(),tbi);
            zz[bi]=Low[bi];
            zzL[bi]=Low[bi];
            tai=Time[i];
            fsp=fs;
            si=High[i]-di;
            sip=si;

            if ((ExtIndicator!=11 || endSearchPattern) && ExtLabel>0)
              {
               ha[i]=High[i]; la[bi]=Low[bi]; la[i]=0;
               tmh=Time[i]; ha[i]=High[i]; la[i]=0; // простановка метки на восходящем луче
              }
           }

         if (fs==2 && fsp==1) // Тредн сменился с восходящего на нисходящий
           {
            lm=Low[i]; 

            ai=iBarShift(Symbol(),Period(),tai); 
            zz[ai]=High[ai];
            zzH[ai]=High[ai];
            tbi=Time[i];
            si=Low[i]+di;
            fsp=fs;
            sip=si;

            if ((ExtIndicator!=11 || endSearchPattern) && ExtLabel>0)
              {
               ha[ai]=High[ai]; ha[i]=0; la[i]=Low[i];
               tml=Time[i]; ha[i]=0; la[i]=Low[i]; // простановка метки на нисходящем луче
              }
           }

         if (fs==1 && High[i]>hm) {hm=High[i]; tai=Time[i]; si=High[i]-di;}
         if (fs==2 && Low[i]<lm)  {lm=Low[i]; tbi=Time[i]; si=Low[i]+di;}

         if ((ExtIndicator!=11 || endSearchPattern))
           {

            if (chHL && chHL_PeakDet && ExtLabel==0) {ha[i]=si+di; la[i]=si-di;} 

            if (i==0) 
              {
               ai0=iBarShift(Symbol(),Period(),tai); 
               bi0=iBarShift(Symbol(),Period(),tbi);
               if (fs==1)
                 {
                  for (n=bi0-1; n>=0; n--) {zzH[n]=0; zz[n]=0; if (ExtLabel>0) ha[n]=0;}
                  zz[ai0]=High[ai0]; zzH[ai0]=High[ai0]; zzL[ai0]=0; if (ExtLabel>0) ha[ai0]=High[ai0];
                 }
               if (fs==2)
                 {
                  for (n=ai0-1; n>=0; n--) {zzL[n]=0; zz[n]=0; if (ExtLabel>0) la[n]=0;}
                  zz[bi0]=Low[bi0]; zzL[bi0]=Low[bi0]; zzH[bi0]=0; if (ExtLabel>0) la[bi0]=Low[bi0];
                 }

               if (ExtLabel>0)
                 {
                  if (fs==1) {aim=iBarShift(Symbol(),0,tmh); if (aim<bi0) ha[aim]=High[aim];}
                  else if (fs==2) {bim=iBarShift(Symbol(),0,tml); if (bim<ai0) la[bim]=Low[bim];}
                 }
              }

           }
        }

      if (ExtIndicator==11)
        {

         if (endSearchPattern) return;

         _Gartley(StringConcatenate("ExtIndicator=11_",vSize,"/",vPercent), 0);

         if (saveParametersZZ)
           {
            saveParametersZZ=false;

            if (AlgorithmSearchPatterns==1) minSizeToNumberPattern=vSize;
            else minPercentToNumberPattern=vPercent;
           }

         if (ExtGartleyTypeSearch==0 && vPatOnOff) return;

        }
     }
 }

void GannSwing()
 {
   int    i,n;
   int    vBars  = minBars;
   bool   endCyklDirection=true;
   bool   endSearchPattern=false;

   double lLast_m=0, hLast_m=0;
   int    countBarExt=0; // счетчик внешних баров
   int    countBarl=0,countBarh=0;
   fs=0; ti=0;

   if (ExtMaxBar>0) cbi=ExtMaxBar; else cbi=Bars-1;

   if (ExtIndicator==11)
     {
      if (DirectionOfSearchMaxMin) vBars = minBars; else vBars = 0;
     }

   while (endCyklDirection)
     {
      if (ExtLabel>0) {ArrayInitialize(la,0.0); ArrayInitialize(ha,0.0);}
      ArrayInitialize(zz,0);ArrayInitialize(zzL,0);ArrayInitialize(zzH,0);

      if (ExtIndicator==11)
        {
         lLast=0; lLast_m=0; hLast_m=0; fs=0; ti=0;

         if (DirectionOfSearchMaxMin)
           {
            if (vBars < 0)
              {
               if (ExtGartleyTypeSearch>0 && ExtIndicator==11 && vPatOnOff) vBars=minBarsToNumberPattern;
               else vBars=minBars;
               endSearchPattern=true;
              }

            vBars--;
           }
         else
           {
            if (vBars > minBars)
              {
               if (ExtGartleyTypeSearch>0 && ExtIndicator==11 && vPatOnOff) vBars=minBarsToNumberPattern;
               else vBars=minBars;
               endSearchPattern=true;
              }

            vBars++;
           }

         if (flagExtGartleyTypeSearch2)
           {
            endSearchPattern=true; 
            vBars=minSizeToNumberPattern;
           }
        }
      else
        {
         vBars=minBars;
         endCyklDirection=false;
         endSearchPattern=true;
        }

      for (i=cbi; i>=ExtMinBar; i--) 
        {

         if (lLast==0) {lLast=Low[i]; hLast=High[i]; ai=i; bi=i;}
         if (ti!=Time[i])
           {
            ti=Time[i];
            if (lLast_m==0 && hLast_m==0)
              {
               if (lLast>Low[i] && hLast<High[i]) // Внешний бар
                 {
                  lLast=Low[i];hLast=High[i];lLast_m=Low[i];hLast_m=High[i];countBarExt++;
                  if (fs==1) {countBarl=countBarExt; ai=i; tai=Time[i];}
                  else if (fs==2) {countBarh=countBarExt; bi=i; tbi=Time[i];}
                  else {countBarl++;countBarh++;}
                 }
               else if (lLast<=Low[i] && hLast<High[i]) // Тенденция на текущем баре восходящая
                 {
                  lLast_m=0;hLast_m=High[i];countBarl=0;countBarExt=0;
                  if (fs!=1) countBarh++;
                  else {lLast=Low[i]; hLast=High[i]; lLast_m=0; hLast_m=0; ai=i; tai=Time[i];}
                 }
               else if (lLast>Low[i] && hLast>=High[i]) // Тенденция на текущем баре нисходящая
                 {
                  lLast_m=Low[i];hLast_m=0;countBarh=0;countBarExt=0;
                  if (fs!=2) countBarl++;
                  else {lLast=Low[i]; hLast=High[i]; lLast_m=0; hLast_m=0; bi=i; tbi=Time[i];}
                 }
              }
            else  if (lLast_m>0 && hLast_m>0) // Внешний бар (предыдущий)
              {
               if (lLast_m>Low[i] && hLast_m<High[i]) // Внешний бар
                 {
                  lLast=Low[i];hLast=High[i];lLast_m=Low[i];hLast_m=High[i];countBarExt++;
                  if (fs==1) {countBarl=countBarExt; ai=i; tai=Time[i];}
                  else if (fs==2) {countBarh=countBarExt; bi=i; tbi=Time[i];}
                  else {countBarl++;countBarh++;}
                 }
               else if (lLast_m<=Low[i] && hLast_m<High[i]) // Тенденция на текущем баре восходящая
                 {
                  lLast_m=0;hLast_m=High[i];countBarl=0;countBarExt=0;
                  if (fs!=1) countBarh++;
                  else {lLast=Low[i]; hLast=High[i]; lLast_m=0; hLast_m=0; ai=i; tai=Time[i];}
                 }
               else if (lLast_m>Low[i] && hLast_m>=High[i]) // Тенденция на текущем баре нисходящая
                 {
                  lLast_m=Low[i];hLast_m=0;countBarh=0;countBarExt=0;
                  if (fs!=2) countBarl++;
                  else {lLast=Low[i]; hLast=High[i]; lLast_m=0; hLast_m=0; bi=i; tbi=Time[i];}
                 }
              }
            else  if (lLast_m>0)
              {
               if (lLast_m>Low[i] && hLast<High[i]) // Внешний бар
                 {
                  lLast=Low[i];hLast=High[i];lLast_m=Low[i];hLast_m=High[i];countBarExt++;
                  if (fs==1) {countBarl=countBarExt; ai=i; tai=Time[i];}
                  else if (fs==2) {countBarh=countBarExt; bi=i; tbi=Time[i];}
                  else {countBarl++;countBarh++;}
                 }
               else if (lLast_m<=Low[i] && hLast<High[i]) // Тенденция на текущем баре восходящая
                 {
                  lLast_m=0;hLast_m=High[i];countBarl=0;countBarExt=0;
                  if (fs!=1) countBarh++;
                  else {lLast=Low[i]; hLast=High[i]; lLast_m=0; hLast_m=0; ai=i; tai=Time[i];}
                 }
               else if (lLast_m>Low[i] && hLast>=High[i]) // Тенденция на текущем баре нисходящая
                 {
                  lLast_m=Low[i];hLast_m=0;countBarh=0;countBarExt=0;
                  if (fs!=2) countBarl++;
                  else {lLast=Low[i]; hLast=High[i]; lLast_m=0; hLast_m=0; bi=i; tbi=Time[i];}
                 }
              }
            else  if (hLast_m>0)
              {
               if (lLast>Low[i] && hLast_m<High[i]) // Внешний бар
                 {
                  lLast=Low[i];hLast=High[i];lLast_m=Low[i];hLast_m=High[i];countBarExt++;
                  if (fs==1) {countBarl=countBarExt; ai=i; tai=Time[i];}
                  else if (fs==2) {countBarh=countBarExt; bi=i; tbi=Time[i];}
                  else {countBarl++;countBarh++;}
                 }
               else if (lLast<=Low[i] && hLast_m<High[i]) // Тенденция на текущем баре восходящая
                 {
                  lLast_m=0;hLast_m=High[i];countBarl=0;countBarExt=0;
                  if (fs!=1) countBarh++;
                  else {lLast=Low[i]; hLast=High[i]; lLast_m=0; hLast_m=0; ai=i; tai=Time[i];}
                 }
               else if (lLast>Low[i] && hLast_m>=High[i]) // Тенденция на текущем баре нисходящая
                 {
                  lLast_m=Low[i];hLast_m=0;countBarh=0;countBarExt=0;
                  if (fs!=2) countBarl++;
                  else {lLast=Low[i]; hLast=High[i]; lLast_m=0; hLast_m=0; bi=i; tbi=Time[i];}
                 }
              }

            if (fs==0)
              {
               if (lLast<lLast_m && hLast>hLast_m) // внутренний бар
                 {
                  lLast=Low[i]; hLast=High[i]; ai=i; bi=i; countBarl=0;countBarh=0;countBarExt=0;
                 }

               if (countBarh>countBarl && countBarh>countBarExt && countBarh>vBars)
                 {
                  lLast=Low[i]; hLast=High[i]; lLast_m=0; hLast_m=0;
                  fs=1;countBarh=0;countBarl=0;countBarExt=0;
                  zz[bi]=Low[bi];
                  zzL[bi]=Low[bi];
                  zzH[bi]=0;
                  ai=i;
                  tai=Time[i];
                 }
               else if (countBarl>countBarh && countBarl>countBarExt && countBarl>vBars)
                 {
                  lLast=Low[i]; hLast=High[i]; lLast_m=0; hLast_m=0;
                  fs=2;countBarl=0;countBarh=0;countBarExt=0;
                  zz[ai]=High[ai];
                  zzH[ai]=High[ai];
                  zzL[ai]=0;
                  bi=i;
                  tbi=Time[i];
                 }
              }
            else
              {
               if (lLast_m==0 && hLast_m==0)
                 {
                  countBarl=0;countBarh=0;countBarExt=0;
                 }

               if (fs==1)
                 {
                  if (countBarl>countBarh && countBarl>countBarExt && countBarl>vBars) // Определяем точку смены тенденции.
                    {

                     ai=iBarShift(Symbol(),Period(),tai); 
                     fs=2;
                     countBarl=0;

                     zz[ai]=High[ai];
                     zzH[ai]=High[ai];
                     zzL[ai]=0;
                     bi=i;
                     if ((ExtIndicator!=11 || endSearchPattern) && ExtLabel>0)
                       {
                        ha[ai]=High[ai]; la[ai]=0; // простановка меток на максимумах
                        tml=Time[i]; ha[i]=0; la[i]=Low[i]; // простановка метки на нисходящем луче
                       }
                     tbi=Time[i];

                     lLast=Low[i]; hLast=High[i]; lLast_m=0; hLast_m=0;

                     for (n=0;countBarExt<vBars;n++) 
                       {
                        if (lLast<Low[i+n+1] && hLast>High[i+n+1]) {countBarExt++; countBarh++; lLast=Low[i+n+1]; hLast=High[i+n+1]; hLast_m=High[i];}
                        else break;
                       }

                     lLast=Low[i]; hLast=High[i];

                    }
                 }

               if (fs==2)
                 {
                  if (countBarh>countBarl && countBarh>countBarExt && countBarh>vBars) // Определяем точку смены тенденции.
                    {

                     bi=iBarShift(Symbol(),Period(),tbi);
                     fs=1;
                     countBarh=0;

                     zz[bi]=Low[bi];
                     zzL[bi]=Low[bi];
                     zzH[bi]=0;
                     ai=i;
                     if ((ExtIndicator!=11 || endSearchPattern) && ExtLabel>0)
                       {
                        ha[bi]=0; la[bi]=Low[bi];  // простановка меток на минимумах
                        tmh=Time[i]; ha[i]=High[i]; la[i]=0; // простановка метки на восходящем луче
                       }
                     tai=Time[i];

                     lLast=Low[i]; hLast=High[i]; lLast_m=0; hLast_m=0;

                     for (n=0;countBarExt<vBars;n++) 
                       {
                        if (lLast<Low[i+n+1] && hLast>High[i+n+1]) {countBarExt++; countBarl++; lLast=Low[i+n+1]; hLast=High[i+n+1]; lLast_m=Low[i];}
                        else break;
                       }

                     lLast=Low[i]; hLast=High[i];

                    }
                 }
              } 
           } 

         if ((ExtIndicator!=11 || endSearchPattern))
           {
            if (i==0)
              {
               if (hLast<High[i] && fs==1) // Тенденция на текущем баре восходящая
                 {
                  ai=i; tai=Time[i]; zz[ai]=High[ai]; zzH[ai]=High[ai]; zzL[ai]=0;
                  if ((ExtIndicator!=11 || endSearchPattern) && ExtLabel>0) {ha[ai]=High[ai]; la[ai]=0;} // гуляющая метка
                 }
               else if (lLast>Low[i] && fs==2) // Тенденция на текущем баре нисходящая
                 {
                  bi=i; tbi=Time[i]; zz[bi]=Low[bi]; zzL[bi]=Low[bi]; zzH[bi]=0;
                  if ((ExtIndicator!=11 || endSearchPattern) && ExtLabel>0) {la[bi]=Low[bi]; ha[bi]=0;} // гуляющая метка
                 }

               ai0=iBarShift(Symbol(),Period(),tai); 
               bi0=iBarShift(Symbol(),Period(),tbi);

               if (bi0>1) if (fs==1)
                 {
                  for (n=bi0-1; n>=0; n--) {zzH[n]=0.0; zz[n]=0.0; if (ExtLabel>0) ha[n]=0;}
                  zz[ai0]=High[ai0]; zzH[ai0]=High[ai0]; zzL[ai0]=0.0; if (ExtLabel>0) ha[ai0]=High[ai0];
                 }
               if (ai0>1) if (fs==2)
                 {
                  for (n=ai0-1; n>=0; n--) {zzL[n]=0.0; zz[n]=0.0; if (ExtLabel>0) la[n]=0;} 
                  zz[bi0]=Low[bi0]; zzL[bi0]=Low[bi0]; zzH[bi0]=0.0; if (ExtLabel>0) la[bi0]=Low[bi0];
                 }

               if (ExtLabel>0)
                 {
                  if (fs==1) {aim=iBarShift(Symbol(),0,tmh); if (aim<bi0) ha[aim]=High[aim];}
                  else if (fs==2) {bim=iBarShift(Symbol(),0,tml); if (bim<ai0) la[bim]=Low[bim];}
                 }

               if (ti<Time[1]) i=2;

              }
           }
        }

      if (ExtIndicator==11)
        {

         if (endSearchPattern) return;

         _Gartley(StringConcatenate("ExtIndicator=11_",vBars), 0);

         if (saveParametersZZ)
           {
            saveParametersZZ=false;
            minBarsToNumberPattern=vBars;
           }

         if (ExtGartleyTypeSearch==0 && vPatOnOff) return;

        }
     }

 }

/*------------------------------------------------------------------+
|  ZigZag_Talex, ищет точки перелома на графике. Количество точек   |
|  задается внешним параметром ExtPoint.                            |
+------------------------------------------------------------------*/
void ZZTalex()
  {
   int    i,j,k,zzbarlow,zzbarhigh,curbar,curbar1,curbar2,EP,Mbar[];
   double curpr,Mprice[];
   bool   flag,fd;
   int    vBars  = minBars;
   bool   endCyklDirection=true;
   bool   endSearchPattern=false;

   if (DirectionOfSearchMaxMin) vBars = maxDepth; else vBars = minDepth;
   ArrayResize(Mbar,ExtPoint);
   ArrayResize(Mprice,ExtPoint);

   while (endCyklDirection)
     {
      ArrayInitialize(zz,0);ArrayInitialize(zzL,0);ArrayInitialize(zzH,0);
      ArrayInitialize(Mbar,0);ArrayInitialize(Mprice,0);
      if (ExtIndicator==11)
        {
         if (DirectionOfSearchMaxMin)
           {
            if (vBars < 0)
              {
               if (ExtGartleyTypeSearch>0 && ExtIndicator==11 && vPatOnOff) vBars=minBarsToNumberPattern;
               else vBars=minBars;
               endSearchPattern=true;
              }

            vBars-=IterationStepDepth;
           }
         else
           {
            if (vBars > minBars)
              {
               if (ExtGartleyTypeSearch>0 && ExtIndicator==11 && vPatOnOff) vBars=minBarsToNumberPattern;
               else vBars=minBars;
               endSearchPattern=true;
              }

            vBars+=IterationStepDepth;
           }

         if (flagExtGartleyTypeSearch2)
           {
            endSearchPattern=true; 
            vBars=minSizeToNumberPattern;
           }
        }
      else
        {
         vBars=minBars;
         endCyklDirection=false;
         endSearchPattern=true;
        }

      EP=ExtPoint;
      zzbarlow=iLowest(NULL,0,MODE_LOW,vBars,0);        
      zzbarhigh=iHighest(NULL,0,MODE_HIGH,vBars,0);     

      if(zzbarlow<zzbarhigh) {curbar=zzbarlow; curpr=Low[zzbarlow];}
      if(zzbarlow>zzbarhigh) {curbar=zzbarhigh; curpr=High[zzbarhigh];}
      if(zzbarlow==zzbarhigh){curbar=zzbarlow;curpr=funk1(zzbarlow, vBars);}

      j=0;
      endpr=curpr;
      endbar=curbar;
      Mbar[j]=curbar;
      Mprice[j]=curpr;

      EP--;
      if(curpr==Low[curbar]) flag=true;
      else flag=false;
      fl=flag;

      i=curbar+1;
      while(EP>0)
        {
         if(flag)
           {
            while(i<=Bars-1)
              {
               curbar1=iHighest(NULL,0,MODE_HIGH,vBars,i); 
               curbar2=iHighest(NULL,0,MODE_HIGH,vBars,curbar1); 
               if(curbar1==curbar2){curbar=curbar1;curpr=High[curbar];flag=false;i=curbar+1;j++;break;}
               else i=curbar2;
              }

            Mbar[j]=curbar;
            Mprice[j]=curpr;
            EP--;
           }

         if(EP==0) break;

         if(!flag) 
           {
            while(i<=Bars-1)
              {
               curbar1=iLowest(NULL,0,MODE_LOW,vBars,i); 
               curbar2=iLowest(NULL,0,MODE_LOW,vBars,curbar1); 
               if(curbar1==curbar2){curbar=curbar1;curpr=Low[curbar];flag=true;i=curbar+1;j++;break;}
               else i=curbar2;
              }

            Mbar[j]=curbar;
            Mprice[j]=curpr;
            EP--;
           }
        }

      /* исправление вершин */
      if(Mprice[0]==Low[Mbar[0]])fd=true; else fd=false;
      for(k=0;k<=ExtPoint-1;k++)
        {
         if(k==0)
           {
            if(fd==true)
              {
               Mbar[k]=iLowest(NULL,0,MODE_LOW,Mbar[k+1]-Mbar[k],Mbar[k]);Mprice[k]=Low[Mbar[k]];endbar=vBars;
              }
            if(fd==false)
              {
               Mbar[k]=iHighest(NULL,0,MODE_HIGH,Mbar[k+1]-Mbar[k],Mbar[k]);Mprice[k]=High[Mbar[k]];endbar=vBars;
              }
           }
         if(k<ExtPoint-2)
           {
            if(fd==true)
              {
               Mbar[k+1]=iHighest(NULL,0,MODE_HIGH,Mbar[k+2]-Mbar[k]-1,Mbar[k]+1);Mprice[k+1]=High[Mbar[k+1]];
              }
            if(fd==false)
              {
               Mbar[k+1]=iLowest(NULL,0,MODE_LOW,Mbar[k+2]-Mbar[k]-1,Mbar[k]+1);Mprice[k+1]=Low[Mbar[k+1]];
              }
           }
         if(fd==true)fd=false;else fd=true;

         /* постройка ZigZag'a */
         zz[Mbar[k]]=Mprice[k];
         if (k==0)
           {
            if (Mprice[k]>Mprice[k+1])
              {
               zzH[Mbar[k]]=Mprice[k];
              }
            else
              {
               zzL[Mbar[k]]=Mprice[k];
              }
           }
         else
           {
            if (Mprice[k]>Mprice[k-1])
              {
               zzH[Mbar[k]]=Mprice[k];
              }
            else
              {
               zzL[Mbar[k]]=Mprice[k];
              }

           }
        }

      if (ExtIndicator==11)
        {

         if (endSearchPattern) return;

         _Gartley(StringConcatenate("ExtIndicator=11_",vBars), 0);

         if (saveParametersZZ)
           {
            saveParametersZZ=false;
            minBarsToNumberPattern=vBars;
          }

         if (ExtGartleyTypeSearch==0 && vPatOnOff) return;

        }
     }

  } 

/*-------------------------------------------------------------------+
/ Фунция для поиска у первого бара (если он внешний) какой экстремум |
/ будем использовать в качестве вершины. Для ZigZag_Talex.           |
/-------------------------------------------------------------------*/
double funk1(int zzbarlow, int ExtDepth)
{
 double pr;
 int fbarlow,fbarhigh;

 fbarlow=iLowest(NULL,0,MODE_LOW,ExtDepth,zzbarlow);  
 fbarhigh=iHighest(NULL,0,MODE_HIGH,ExtDepth,zzbarlow);

 if(fbarlow>fbarhigh) pr=High[zzbarlow];
 if(fbarlow<fbarhigh) pr=Low[zzbarlow];
 if(fbarlow==fbarhigh)
 {
  fbarlow=iLowest(NULL,0,MODE_LOW,2*ExtDepth,zzbarlow);  
  fbarhigh=iHighest(NULL,0,MODE_HIGH,2*ExtDepth,zzbarlow);
  if(fbarlow>fbarhigh) pr=High[zzbarlow];
  if(fbarlow<fbarhigh) pr=Low[zzbarlow];
  if(fbarlow==fbarhigh)
  {
   fbarlow=iLowest(NULL,0,MODE_LOW,3*ExtDepth,zzbarlow);  
   fbarhigh=iHighest(NULL,0,MODE_HIGH,3*ExtDepth,zzbarlow);
   if(fbarlow>fbarhigh) pr=High[zzbarlow];
   if(fbarlow<fbarhigh) pr=Low[zzbarlow];
  }
 }
 return(pr);
}

void ZigZag_tauber()
  {
   int    shift, lasthighpos,lastlowpos;
   double res;
   double curlow,curhigh,lasthigh,lastlow;
   int    vSize;
   bool   endCyklDirection=true;
   bool   endSearchPattern=false;

   int    metka=0; // =0 - до первого перелома ZZ. =1 - ищем метки максимумов. =2 - ищем метки минимумов.
   double peak, wrpeak;

   if (ExtIndicator==11)
     {
      if (DirectionOfSearchMaxMin) vSize = maxSize_; else vSize = minSize_;
     }

   while (endCyklDirection)
     {
      if (ExtLabel>0) {ArrayInitialize(la,0.0); ArrayInitialize(ha,0.0);}
      ArrayInitialize(zz,0);ArrayInitialize(zzL,0);ArrayInitialize(zzH,0);

      if (ExtIndicator==11)
        {
         if (DirectionOfSearchMaxMin)
           {
            if (vSize < minSize_)
              {
               if (ExtGartleyTypeSearch>0 && ExtIndicator==11 && vPatOnOff) vSize=minSizeToNumberPattern;
               else vSize=minSize_;
               endSearchPattern=true;
              }

            di=minSize*Point;
            vSize-=IterationStepSize;
           }
         else
           {
            if (vSize > maxSize_)
              {
               if (ExtGartleyTypeSearch>0 && ExtIndicator==11 && vPatOnOff) vSize=minSizeToNumberPattern;
               else vSize=minSize_;
               endSearchPattern=true;
              }

            di=minSize*Point;
            vSize+=IterationStepSize;
           }

         if (flagExtGartleyTypeSearch2)
           {
            endSearchPattern=true; 
            vSize=minSizeToNumberPattern;
           }
        }
      else
        {
         vSize=minSize;
         endCyklDirection=false;
         endSearchPattern=true;
        }

      GetHigh(0,Bars,0.0,0,vSize);

      lasthigh=-1; lasthighpos=-1;
      lastlow=-1;  lastlowpos=-1;

      for(shift=Bars; shift>=0; shift--)
        {
         curlow=zzL[shift];
         curhigh=zzH[shift];
         if((curlow==0)&&(curhigh==0)) continue;

         if(curhigh!=0)
           {
           if(lasthigh>0) 
              {
               if(lasthigh<curhigh) zzH[lasthighpos]=0;
               else zzH[shift]=0;
              }

            if(lasthigh<curhigh || lasthigh<0)
              {
               lasthigh=curhigh;
               lasthighpos=shift;
              }
            lastlow=-1;
           }

         if(curlow!=0)
           {
            if(lastlow>0)
              {
               if(lastlow>curlow) zzL[lastlowpos]=0;
               else zzL[shift]=0;
             }

            if((curlow<lastlow)||(lastlow<0))
              {
               lastlow=curlow;
               lastlowpos=shift;
              } 
            lasthigh=-1;
           }
        }

      for(shift=Bars-1; shift>=0; shift--)
        {
         zz[shift]=zzL[shift];
         res=zzH[shift];
         if(res!=0.0) zz[shift]=res;
        }

      if ((ExtIndicator!=11 || endSearchPattern) && ExtLabel>0)  // расставляем метки
        {
         for(shift=Bars-1; shift>=0; shift--)
           {

            if (zz[shift]>0)
              {
               if (zzH[shift]>0)
                 {
                  peak=High[shift]; wrpeak=Low[shift];
                  ha[shift]=High[shift]; la[shift]=0;
                  metka=2; shift--;
                 }
               else
                 {
                  peak=Low[shift]; wrpeak=High[shift];
                  la[shift]=Low[shift]; ha[shift]=0;
                  metka=1; shift--;
                 }
              }

            if (metka==1)
              {
               if (wrpeak<High[shift])
                 {
                  if (High[shift]-peak>minSize*Point) {metka=0;  ha[shift]=High[shift];}
                 }
               else
                 {
                  wrpeak=High[shift];
                 }
              }
            else if (metka==2)
              {
               if (wrpeak>Low[shift])
                 {
                  if (peak-Low[shift]>minSize*Point) {metka=0;  la[shift]=Low[shift];}
                 }
               else
                 {
                  wrpeak=Low[shift];
                 }
              }
           }
        }

      if (ExtIndicator==11)
        {

         if (endSearchPattern) return;

         _Gartley(StringConcatenate("ExtIndicator=11_",AlgorithmSearchPatterns), 0);

         if (saveParametersZZ)
           {
            saveParametersZZ=false;
            minSizeToNumberPattern=vSize;
           }

         if (ExtGartleyTypeSearch==0 && vPatOnOff) return;
        }
     }
  }

void GetHigh(int start, int end, double price, int step, int vSize)
  {
   int count=end-start;
   if (count<=0) return;
   int i=iHighest(NULL,0,MODE_HIGH,count+1,start);
   double val=High[i];
   if ((val-price)>(vSize*Point))
     { 
      zzH[i]=val;
      if (i==start) {GetLow(start+step,end-step,val,1-step,vSize); if (zzL[start-1]>0) zzL[start]=0; return;}     
      if (i==end) {GetLow(start+step,end-step,val,1-step,vSize); if (zzL[end+1]>0) zzL[end]=0; return;} 
      GetLow(start,i-1,val,0,vSize);
      GetLow(i+1,end,val,0,vSize);
     }
  }

void GetLow(int start, int end, double price, int step, int vSize)
  {
   int count=end-start;
   if (count<=0) return;
   int i=iLowest(NULL,0,MODE_LOW,count+1,start);
   double val=Low[i];
   if ((price-val)>(vSize*Point))
     {
      zzL[i]=val; 
      if (i==start) {GetHigh(start+step,end-step,val,1-step,vSize); if (zzH[start-1]>0) zzH[start]=0; return;}     
      if (i==end) {GetHigh(start+step,end-step,val,1-step,vSize); if (zzH[end+1]>0) zzH[end]=0; return;}   
      GetHigh(start,i-1,val,0,vSize);
      GetHigh(i+1,end,val,0,vSize);
     }
  }

void Ensign_ZZ()
 {
   int  i,n;
   int  vSize;
   bool endCyklDirection=true;
   bool endSearchPattern=false;

   if (ExtMaxBar>0) cbi=ExtMaxBar; else cbi=Bars-1;

   if (ExtIndicator==11)
     {
      if (DirectionOfSearchMaxMin) vSize = maxSize_; else vSize = minSize_;
     }

   while (endCyklDirection)
     {
      if (ExtIndicator==11)
        {
         if (ExtLabel>0) {ArrayInitialize(la,0.0); ArrayInitialize(ha,0.0);}
         ArrayInitialize(zz,0);ArrayInitialize(zzL,0);ArrayInitialize(zzH,0);
         ti=0; fs=0; tbi=0; tai=0; si=0;

         if (DirectionOfSearchMaxMin)
           {
            if (vSize < minSize_)
              {
               if (ExtGartleyTypeSearch>0 && ExtIndicator==11 && vPatOnOff) vSize=minSizeToNumberPattern;
               else vSize=minSize_;
               endSearchPattern=true;
              }

            di=vSize*Point;
            vSize-=IterationStepSize;
           }
         else
           {
            if (vSize > maxSize_)
              {
               if (ExtGartleyTypeSearch>0 && ExtIndicator==11 && vPatOnOff) vSize=minSizeToNumberPattern;
               else vSize=minSize_;
               endSearchPattern=true;
              }

            di=vSize*Point;
            vSize+=IterationStepSize;
           }

         if (flagExtGartleyTypeSearch2)
           {
            endSearchPattern=true; 
            vSize=minSizeToNumberPattern;
           }
        }
      else
        {
         endCyklDirection=false;
         endSearchPattern=true;
        }

      for (i=cbi; i>=ExtMinBar; i--) 
        {

         if (lLast==0) {lLast=Low[i];hLast=High[i]; if (ExtIndicator==3) di=hLast-lLast;}

         if (fs==0)
           {
            if (lLast<Low[i] && hLast<High[i]) {fs=1; hLast=High[i]; si=High[i]; ai=i; tai=Time[i]; if (ExtIndicator==3) di=High[i]-Low[i];}  // тренд восходящий
            if (lLast>Low[i] && hLast>High[i]) {fs=2; lLast=Low[i]; si=Low[i]; bi=i; tbi=Time[i]; if (ExtIndicator==3) di=High[i]-Low[i];}  // тренд нисходящий
           }

           {

            ti=Time[i];

            ai0=iBarShift(Symbol(),Period(),tai); 
            bi0=iBarShift(Symbol(),Period(),tbi);

            fcount0=false;
            if ((fh || fl) && countBar>0) {countBar--; if (i==0 && countBar==0) fcount0=true;}

            if (fs==1)
              {
               if (hLast>High[i] && !fh) fh=true;

               if (i==0)
                 {
                  if (Close[i+1]<lLast && fh) {fs=2; countBar=minBars; fh=false;}
                  if (countBar==0 && si-di>Low[i+1] && High[i+1]<hLast && ai0>i+1 && fh && !fcount0) {fs=2; countBar=minBars; fh=false;}

                  if (fs==2) // Тредн сменился с восходящего на нисходящий на предыдущем баре
                    {
                     zz[ai0]=High[ai0];
                     zzH[ai0]=High[ai0];
                     lLast=Low[i+1];
                     if (ExtIndicator==3) di=High[i+1]-Low[i+1];
                     si=Low[i+1];
                     bi=i+1;
                     tbi=Time[i+1];
                     if ((ExtIndicator!=11 || endSearchPattern) && ExtLabel>0)
                       {
                        ha[ai0]=High[ai0];
                        tml=Time[i+1]; ha[i+1]=0; la[i+1]=Low[i+1]; // простановка метки на нисходящем луче
                       }

                    }
                 }
               else
                 {
                  if (Close[i]<lLast && fh) {fs=2; countBar=minBars; fh=false;}
                  if (countBar==0 && si-di>Low[i] && High[i]<hLast && fh) {fs=2; countBar=minBars; fh=false;}

                  if (fs==2) // Тредн сменился с восходящего на нисходящий
                    {
                     zz[ai]=High[ai];
                     zzH[ai]=High[ai];
                     lLast=Low[i];
                     if (ExtIndicator==3) di=High[i]-Low[i];
                     si=Low[i];
                     bi=i;
                     tbi=Time[i];
                     if ((ExtIndicator!=11 || endSearchPattern) && ExtLabel>0)
                       {
                        ha[ai]=High[ai];
                        tml=Time[i]; ha[i]=0; la[i]=Low[i]; // простановка метки на нисходящем луче
                       }

                    }
                 }
              }
            else // fs==2
              {
               if (lLast<Low[i] && !fl) fl=true;

               if (i==0)
                 {
                  if (Close[i+1]>hLast && fl) {fs=1; countBar=minBars; fl=false;}
                  if (countBar==0 && si+di<High[i+1] && Low[i+1]>lLast && bi0>i+1 && fl && !fcount0) {fs=1; countBar=minBars; fl=false;}

                  if (fs==1) // Тредн сменился с нисходящего на восходящий на предыдущем баре
                    {
                     zz[bi0]=Low[bi0];
                     zzL[bi0]=Low[bi0];
                     hLast=High[i+1];
                     if (ExtIndicator==3) di=High[i+1]-Low[i+1];
                     si=High[i+1];
                     ai=i+1;
                     tai=Time[i+1];
                     if ((ExtIndicator!=11 || endSearchPattern) && ExtLabel>0)
                       {
                        la[bi0]=Low[bi0];
                        tmh=Time[i+1]; ha[i+1]=High[i+1]; la[i+1]=0; // простановка метки на восходящем луче
                       }

                    }
                 }
               else
                 {
                  if (Close[i]>hLast && fl) {fs=1; countBar=minBars; fl=false;}
                  if (countBar==0 && si+di<High[i] && Low[i]>lLast && fl) {fs=1; countBar=minBars; fl=false;}

                  if (fs==1) // Тредн сменился с нисходящего на восходящий
                    {
                     zz[bi]=Low[bi];
                     zzL[bi]=Low[bi];
                     hLast=High[i];
                     if (ExtIndicator==3) di=High[i]-Low[i];
                     si=High[i];
                     ai=i;
                     tai=Time[i];
                     if ((ExtIndicator!=11 || endSearchPattern) && ExtLabel>0)
                       {
                        la[bi]=Low[bi];
                        tmh=Time[i]; ha[i]=High[i]; la[i]=0; // простановка метки на восходящем луче
                       }

                    }
                 }
              }
           } 

         if (fs==1 && High[i]>si) {ai=i; tai=Time[i]; hLast=High[i]; si=High[i]; countBar=minBars; fh=false; if (ExtIndicator==3) di=High[i]-Low[i];}
         if (fs==2 && Low[i]<si) {bi=i; tbi=Time[i]; lLast=Low[i]; si=Low[i]; countBar=minBars; fl=false; if (ExtIndicator==3) di=High[i]-Low[i];}

         if ((ExtIndicator!=11 || endSearchPattern))
           {

            if (chHL && chHL_PeakDet && ExtLabel==0)
              {
               if (fs==1) {ha[i]=si; la[i]=si-di;}
               if (fs==2) {ha[i]=si+di; la[i]=si;}
              } 

            if (i==0) 
              {
               ai0=iBarShift(Symbol(),Period(),tai); 
               bi0=iBarShift(Symbol(),Period(),tbi);

               if (fs==1)
                 {
                  for (n=bi0-1; n>=0; n--) {zzH[n]=0; zz[n]=0; if (ExtLabel>0) ha[n]=0;} 
                  zz[ai0]=High[ai0]; zzH[ai0]=High[ai0]; zzL[ai0]=0; if (ExtLabel>0) ha[ai0]=High[ai0];
                 }
               if (fs==2)
                 {
                  for (n=ai0-1; n>=0; n--) {zzL[n]=0; zz[n]=0; if (ExtLabel>0) la[n]=0;} 
                  zz[bi0]=Low[bi0]; zzL[bi0]=Low[bi0]; zzH[bi0]=0; if (ExtLabel>0) la[bi0]=Low[bi0];
                 }

               if (ExtLabel>0)
                 {
                  if (fs==1) {aim=iBarShift(Symbol(),0,tmh); if (aim<bi0) ha[aim]=High[aim];}
                  else if (fs==2) {bim=iBarShift(Symbol(),0,tml); if (bim<ai0) la[bim]=Low[bim];}
                 }
              }

           }
        }

      if (ExtIndicator==11)
        {

         if (endSearchPattern) return;

         _Gartley(StringConcatenate("ExtIndicator=11_",minBars,"/",vSize), 0);

         if (saveParametersZZ)
           {
            saveParametersZZ=false;
            minSizeToNumberPattern=vSize;
          }

         if (ExtGartleyTypeSearch==0 && vPatOnOff) return;
        }
     }
 }

void ZigZag_()
  {

   int    shift, back, lasthighpos, lastlowpos,lastpos;
   double val;
   double curlow,curhigh,lasthigh,lastlow;
   int    vDepth = 0, Depth;
   int    vBackstep = ExtBackstep; 
   bool   endCyklDirection=true;
   bool   endSearchPattern=false;
   int    i;

   if (ExtMaxBar>0) _maxbarZZ=ExtMaxBar; else _maxbarZZ=Bars;

   if (ExtIndicator==11)
     {
      Depth    = minDepth;

     }
   else
     {
      Depth    = _minBars;
      minDepth = _minBars;
      maxDepth = _minBars;
      vBackstep = _ExtBackstep;
     }

   if (DirectionOfSearchMaxMin) vDepth = maxDepth; else vDepth = minDepth;

   while (endCyklDirection)
     {
      if (ExtIndicator==11)
        {
         if (ExtLabel>0) {ArrayInitialize(la,0.0); ArrayInitialize(ha,0.0);}
         ArrayInitialize(zz,0);ArrayInitialize(zzL,0);ArrayInitialize(zzH,0);

         if (DirectionOfSearchMaxMin)
           {
            if (vDepth < minDepth || endSearchPattern)
              {
               if (NumberPattern==0) {vDepth=_minBars; vBackstep=_ExtBackstep;}
               else
                 {
                  if (ExtGartleyTypeSearch>0 && ExtIndicator==11 && vPatOnOff) {vDepth=minBarsToNumberPattern; vBackstep=vBackstepToNumberPattern;}
                  else {vDepth+=IterationStepDepth; if (FiboStep && vBackstep!=ExtBackstep) {vBackstep=vDepth*1.618;}}
                 }
               endSearchPattern=true;
              }

            Depth = vDepth;
            vDepth-=IterationStepDepth;
           }
         else
           {
            if (vDepth > maxDepth || endSearchPattern)
              {
               if (NumberPattern==0) {vDepth=_minBars; vBackstep=_ExtBackstep;}
               else
                 {
                  if (ExtGartleyTypeSearch>0 && ExtIndicator==11 && vPatOnOff) {vDepth=minBarsToNumberPattern; vBackstep=vBackstepToNumberPattern;}
                  else {vDepth-=IterationStepDepth; if (FiboStep && vBackstep!=ExtBackstep) {vBackstep=vDepth*1.618;}}
                 }
               endSearchPattern=true;
              }

            Depth = vDepth;
            vDepth+=IterationStepDepth;
           }

         if (flagExtGartleyTypeSearch2) {endSearchPattern=true; Depth=minBarsToNumberPattern;}
        }
      else
        {
         endCyklDirection=false;
        }

      minBarsX=Depth;

      for(shift=_maxbarZZ-Depth; shift>=ExtMinBar; shift--)
        {
         i=iLowest(NULL,0,MODE_LOW,Depth,shift);
         if (i==shift)
           {
            val=Low[i];
            if (!noBackstep)
              {
               if(val==lastlow) val=0.0;
               else 
                 { 
                  lastlow=val; 
                  for(back=1; back<=vBackstep; back++)
                    {
                     if(val<zzL[shift+back]) zzL[shift+back]=0.0; 
                    }
                 } 
              }
             zzL[shift]=val;
             if (ExtLabel>0) la[shift]=val;
            }

          i=iHighest(NULL,0,MODE_HIGH,Depth,shift);
          if (i==shift)
            {
             val=High[i];
            if (!noBackstep)
              {
                if(val==lasthigh) val=0.0;
                else 
                  {
                   lasthigh=val;
                   for(back=1; back<=vBackstep; back++)
                     {
                      if(val>zzH[shift+back]) zzH[shift+back]=0.0; 
                     }
                  }
               }
             zzH[shift]=val;
             if (ExtLabel>0) ha[shift]=val;
            }
        }

      lasthigh=-1; lasthighpos=-1;
      lastlow=-1;  lastlowpos=-1;

      for(shift=_maxbarZZ-Depth; shift>=ExtMinBar; shift--)
        {
         curlow=zzL[shift];
         curhigh=zzH[shift];
         if((curlow==0)&&(curhigh==0)) continue;

         if(curhigh!=0)
           {
            if(lasthigh>0) 
              {
               if(lasthigh<curhigh) zzH[lasthighpos]=0;
               else zzH[shift]=0;
              }

            if(lasthigh<curhigh || lasthigh<0)
              {
               lasthigh=curhigh;
               lasthighpos=shift;
              }
            lastlow=-1;
           }

         if(curlow!=0)
           {
            if(lastlow>0)
              {
               if(lastlow>curlow) zzL[lastlowpos]=0;
               else zzL[shift]=0;
              }

            if((curlow<lastlow)||(lastlow<0))
              {
               lastlow=curlow;
               lastlowpos=shift;
              } 
            lasthigh=-1;
           }
        }

      lasthigh=-1; lasthighpos=-1;
      lastlow=-1;
      lastpos=-1;
      for(shift=_maxbarZZ-1; shift>=ExtMinBar; shift--)
        {
         zz[shift]=zzL[shift];
         if(shift>=_maxbarZZ-Depth) {zzH[shift]=0.0; zzL[shift]=0.0; zz[shift]=0.0;}
         else
           {
            if (!noBackstep)
              {
               if(zzH[shift]!=0.0) zz[shift]=zzH[shift];
              }
            else
              {
               if(zzH[shift]>0.0)
                 {
                  if (zz[shift]>0)
                    {
                     if (lasthigh>0 && iLow(NULL,0,shift)<iLow(NULL,0,lastpos) && iHigh(NULL,0,shift)>iHigh(NULL,0,lastpos)) zz[shift]=zzH[shift];
                    }
                  else zz[shift]=zzH[shift];
                 }
              }

            if (zz[shift]>0)
              {
               lastpos=shift;
               if (zzL[shift]==zz[shift])
                 {
                  curlow=zz[shift];
                  lasthigh=-1; curhigh=0; 
                  if (noBackstep)
                    {
                     if(lastlow>0)
                       {
                        if(lastlow>curlow) zz[lastlowpos]=0;
                        else zz[shift]=0;
                       }

                     if(curlow<lastlow || lastlow<0)
                       {
                        lastlow=curlow;
                        lastlowpos=shift;
                       } 
                    }
                  continue;
                 }
               lastlow=-1;
               curhigh=zzH[shift];
               if(lasthigh>0) 
                 {
                  if(lasthigh<curhigh) zz[lasthighpos]=0;
                  else zz[shift]=0;
                 }

               if(lasthigh<curhigh || lasthigh<0)
                 {
                  lasthigh=curhigh;
                  lasthighpos=shift;
                 }
              }
           }
        }

      if (RecoverFiltr)
        {
         lasthigh=-1;
         lastlow= -1;
         for(shift=_maxbarZZ-Depth; shift>=ExtMinBar; shift--)
           {
            if (zz[shift]>0)
              {
               if (zzL[shift]==zz[shift])
                 {
                  lasthigh=-1;
                  lastlowpos=shift; lastlow=zz[shift];
                 }
               if (zzH[shift]==zz[shift])
                 {
                  lastlow=-1;
                  lasthighpos=shift; lasthigh=zz[shift];
                 }
              }

            if (lastlow>0)
              {
               if (lastlow>iLow(NULL,0,shift))
                 {
                  lastlow=iLow(NULL,0,shift);
                  zz[shift]=iLow(NULL,0,shift);
                  zz[lastlowpos]=0;
                  zzL[shift]=iLow(NULL,0,shift);
                  zzL[lastlowpos]=0;
                  lastlowpos=shift;
                 }
              }
            if (lasthigh>0)
              {
               if (lasthigh<iHigh(NULL,0,shift))
                 {
                  lasthigh=iHigh(NULL,0,shift);
                  zz[shift]=iHigh(NULL,0,shift);
                  zz[lasthighpos]=0;
                  zzH[shift]=iHigh(NULL,0,shift);
                  zzH[lasthighpos]=0;
                  lasthighpos=shift;
                 }
              }
           }
        }

      if (ExtIndicator!=11 && ExtLabel>0)  // расставляем метки на барах, где появился новый луч и на переломах зигзага
        {
         Metka();
        }

      if (ExtIndicator==11)
        {
         if (ExtLabel>0 && endSearchPattern)  // расставляем метки на барах, где появился новый луч и на переломах зигзага
           {
            Metka();
           }

         if (endSearchPattern)
           {
            if (NumberPattern!=0)
              {
               minBarsToNumberPattern=Depth;
               vBackstepToNumberPattern=vBackstep;
              }
            return;
           }

         _Gartley(StringConcatenate("ExtIndicator=11_0_",Depth,"/",vBackstep), Depth);

         if (saveParametersZZ)
           {
            saveParametersZZ=false;
            if (NumberPattern!=0)
              {
               minBarsToNumberPattern=Depth;
               vBackstepToNumberPattern=vBackstep;
              }
           }

         if (ExtGartleyTypeSearch==0 && vPatOnOff)
           {
            if (NumberPattern==0) endSearchPattern=true; //{vDepth=_minBars; vBackstep=_ExtBackstep; endSearchPattern=true;}
            else return;
           }

         if (FiboStep && !endSearchPattern) {vBackstep=vDepth*1.618;}
        }  // поиск паттернов конец
     }
  }

void Metka()
  {
   int shift, metka=0; // =0 - до первого перелома ZZ. =1 - ищем метки максимумов. =2 - ищем метки минимумов.
   for(shift=Bars-1; shift>=0; shift--)
     {
      if (zz[shift]>0)
        {
         if (zzH[shift]>0)
           {
            metka=2; la[shift]=0; shift--;
           }
         else
           {
            metka=1; ha[shift]=0; shift--;
           }
        }

      if (metka==0)
        {
         ha[shift]=0; la[shift]=0;
        }
      else if (metka==1)
        {
         if (ha[shift]>0) metka=0;
         la[shift]=0;
        }
      else if (metka==2)
        {
         if (la[shift]>0) metka=0;
         ha[shift]=0;
        }
     }
  }

void visibleLevelD(int i, string _vBullBear, int& iu, int & aXABCD[], double baza, double levelbaza, double AB, double BC, bool extremumAorC)
  {

   if (!levelD || ExtGartleyTypeSearch>0 || PotencialsLevels_retXD==0) return;

   double levelBx, levelDx, levelABCD, levelDmin, levelDmax;
   int    ii, j, m, n, savem;
   string txt;
   string vBear = "Bearish";
   double abcd[4]={1,1.272,1.618,2.618};
   string txtabcd[4]={"AB","1.272*AB","1.618*AB","2.618*AB"};
   string txtabcd1[4]={"AB=CD","1.272*AB=CD","1.618*AB=CD","2.618*AB=CD"};

   j=0; m=0;
   while (retresmentXD[j][0]<i) j++;
   while (retresmentBD[m][0]<i) m++;
   savem=m;

   while (j<arrXD_BD[0])
     {
      if (retresmentXD[j][0]==i)
        {
         levelDx=baza*retpatterns[retresmentXD[j][1]];

         if (_vBullBear==vBear)
           {
            levelDmin=levelbaza+levelDx*min_DeltaGartley;
            levelDmax=levelbaza+levelDx*max_DeltaGartley;
           }
         else
           {
            levelDmin=levelbaza+levelDx*max_DeltaGartley;
            levelDmax=levelbaza+levelDx*min_DeltaGartley;
           }
         levelDx=levelbaza+levelDx;

         if (extremumAorC)
           {

            for (ii=0;ii<4;ii++)
              {
               levelABCD=levelbaza-AB*abcd[ii]; // X*AB

               if (levelABCD>levelDmin && levelABCD<levelDmax)
                 {
                  for (n=0;n<32;n++)
                    {
                     if (level_D[n]==levelDx) break;
                     if (level_D[n]==0)
                       {
                        iu++;
                        level_D[iu]=levelDx;
                        level_nameD[iu]=StringConcatenate(namepatterns[i]," = ",retpatternstxt[retresmentXD[j][1]]);
                        break;
                       }
                    }

                  if (visibleLevelsABCD>1)
                    {
                     for (n=0;n<32;n++)
                       {
                        if (level_D[n]==levelABCD && level_nameD[n]==txtabcd[ii]) break;
                        if (level_D[n]==0)
                          {
                           iu++;
                           level_D[iu]=levelABCD;
                           level_nameD[iu]=txtabcd[ii];
                           break;
                          }
                       }
                    }
                 }

               levelABCD=zz[aXABCD[4]]-AB*abcd[ii]; // X*AB=CD

               if (levelABCD>levelDmin && levelABCD<levelDmax)
                 {
                  for (n=0;n<32;n++)
                    {
                     if (level_D[n]==levelDx) break;
                     if (level_D[n]==0)
                       {
                        iu++;
                        level_D[iu]=levelDx;
                        level_nameD[iu]=StringConcatenate(namepatterns[i]," = ",retpatternstxt[retresmentXD[j][1]]);
                        break;
                       }
                    }

                  if (visibleLevelsABCD>1)
                    {
                     for (n=0;n<32;n++)
                       {
                        if (level_D[n]==levelABCD && level_nameD[n]==txtabcd1[ii]) break;
                        if (level_D[n]==0)
                          {
                           iu++;
                           level_D[iu]=levelABCD;
                           level_nameD[iu]=txtabcd1[ii];
                           break;
                          }
                       }
                    }
                 }
              }
           }

         m=savem;
         while (m<arrXD_BD[1])
           {
            if (retresmentBD[m][0]>i) break;
            levelBx=zz[aXABCD[4]] + BC*retpatterns[retresmentBD[m][1]]; // zz[aXABCD[C]]
            if (levelBx>levelDmin && levelBx<levelDmax)
              {
               txt=StringConcatenate(namepatterns[i]," = ",retpatternstxt[retresmentXD[j][1]]);
               for (n=0;n<32;n++)
                 {
                  if (level_D[n]==levelDx && level_nameD[n]==txt) break;
                  if (level_D[n]==0)
                    {
                     iu++;
                     level_D[iu]=levelDx;
                     level_nameD[iu]=txt;
                     break;
                    }
                 }

               if (visibleLevelsABCD==1 || visibleLevelsABCD==3)
                 {
                  txt=StringConcatenate("Ret BD = ",retpatternstxt[retresmentBD[m][1]]);
                  for (n=0;n<32;n++)
                    {
                     if (level_D[n]==levelBx && level_nameD[n]==txt) break;
                     if (level_D[n]==0)
                       {
                        iu++;
                        level_D[iu]=levelBx;
                        level_nameD[iu]=txt;
                        break;
                       }
                    }
                 }
              }
            m++;
           }
        }
      else break;
      j++;
     }
  }                            

void mreadFromFileListPatterns()
  {
   int i, j, k, handle;
   string file, str;
   file=StringConcatenate("ZUP\ListPatterns\\",NameFileListPatterns,".csv");

   handle=FileOpen(file, FILE_CSV|FILE_READ);
   if (handle<0)
     {
      Print("File "+NameFileListPatterns+".csv not found");
      file="ZUP\ListPatterns\listpatternsdefault.csv";
      handle=FileOpen(file, FILE_CSV|FILE_READ);
      if (handle<0) {Print("File listpatternsdefault.csv not found"); return;}
      else Print("Read patterns from file listpatternsdefault.csv");
     }

   if (readFromFileListPatterns==1) {k=0; for (i=0;i<countPat;i++) namepatterns[i]=""; ArrayInitialize(pp,0);} // "обнуляем" массивы
   if (readFromFileListPatterns==2) {countPat=ArraySize(namepatterns); k=countPat; countPat++; ArrayResize(namepatterns,countPat); ArrayResize(pp,countPat);}

   j=0; str="0";
   while(true)
     {
      str=FileReadString(handle);
      if (j>0)
        {
         if (StringLen(str)==0) str="0";
         pp[k][j-1]=StrToDouble(str);
        }
      else
        {
         if (StringLen(str)==0)
           {
            FileClose(handle); // закрываем файл со списком паттернов
            ArrayResize(namepatterns,countPat); ArrayResize(pp,countPat);
            return;
           }
         if (k==countPat) {countPat++; ArrayResize(namepatterns,countPat); ArrayResize(pp,countPat);}
         namepatterns[k]=str;
        }
      j++;
      if (j==17) {j=0; k++;}
     }

   FileClose(handle);
  }

void mwriteToFileListPatterns()
  {
   int i, handle;
   string file;
   if (readFromFileListPatterns==0) file="\\ZUP\ListPatterns\listpatternsdefault.csv";
   else if (readFromFileListPatterns==1) file="\\ZUP\ListPatterns\listpatternscustom.csv";
   else if (readFromFileListPatterns==2) file="\\ZUP\ListPatterns\listpatternsmixt.csv";

   handle=FileOpen(file,FILE_CSV|FILE_WRITE,';');

   for (i=0;i<countPat;i++)
     {
      FileSeek(handle, 0, SEEK_END);
      FileWrite(handle, namepatterns[i], pp[i][0], pp[i][1], pp[i][2], pp[i][3], pp[i][4], pp[i][5], pp[i][6], pp[i][7], pp[i][8], pp[i][9], pp[i][10],
      pp[i][11], pp[i][12], pp[i][13], pp[i][14], pp[i][15]);
     }

   FileClose(handle);
  }

string _ChartTimeFrame (int Period__)
  {
   string chartTimeFrame="";

   if(Period__==1) chartTimeFrame="M1";
   else if(Period__==5) chartTimeFrame="M5";
   else if(Period__==15) chartTimeFrame="M15";
   else if(Period__==30) chartTimeFrame="M30";
   else if(Period__==60) chartTimeFrame="H1";
   else if(Period__==240) chartTimeFrame="H4";
   else if(Period__==1440) chartTimeFrame="D1";
   else if(Period__==10080) chartTimeFrame="W1";
   else if(Period__==43200) chartTimeFrame="MN1";

   return(chartTimeFrame);
  }

void writepicture()
  {
   string txt, file;
   int k;

   if (namefileSymbolPeriod)
     {
      file=StringConcatenate(Symbol(),"_",Period(),"_Patterns");
     }
   else
     {
      k  = StringFind(txt,"*");
      if (k>=0) txt = StringConcatenate(StringSubstr(txt,0,k),StringSubstr(txt,k+1));

      file = StringConcatenate("_",Symbol(),"_",_ChartTimeFrame(Period()),"_",vBullBearToNumberPattern);
      k  = StringFind(txt,"[");
     }

   if (k>0) file=StringSubstr(txt,0,k)+file;
   else file = txt+file;

   WindowScreenShot(StringConcatenate("ZUP\PicturePatterns\\",file,".gif"),900,600); // Write picture on MT4 files repository
  }

void WriteFilePattern(string BullBear,int patternNumber, int & aXABCD[],datetime tDragonE,double cDragonE, bool yes)
  {
	int handle, k;
	string FileName = "", txt, Name;
   k=StringFind(vNamePattern,"[",0);
   if (k>=0) txt=StringSubstr(vNamePattern,0,k-1); else txt=vNamePattern;

   if (namefileSymbolPeriod)
     {
      FileName = StringConcatenate(Symbol(),"_",Period(),"_Patterns");
     }
   else
     {
      FileName = StringConcatenate(txt,"_",Symbol(),"_",_ChartTimeFrame(Period()),"_",vBullBear);

      k  = StringFind(FileName,"*");
      if (k>=0) FileName = StringConcatenate(StringSubstr(FileName,0,k),StringSubstr(FileName,k+1));
     }

   if (!yes && namefileSymbolPeriod)
     {
      if (writeInfoPatternsToFileXML>0)
        {
      	Name = StringConcatenate("ZUP\\XML\\",FileName,".xml"); 
         FileDelete(Name);
        }

      if (writeInfoPatternsToFileCSV>0)
        {
      	Name = StringConcatenate("ZUP\CSV\\",FileName,".csv"); 
         FileDelete(Name);
        }
      return;
     }

   int O=0, X=1, A=2, B=3, C=4, D=5, numbarD;
   datetime TimeX, TimeA, TimeB, TimeC, TimeD;
   double cenaD;
   TimeX=iTime(Symbol(),Period(),aXABCD[X]);
   TimeA=iTime(Symbol(),Period(),aXABCD[A]);
   TimeB=iTime(Symbol(),Period(),aXABCD[B]);
   TimeC=iTime(Symbol(),Period(),aXABCD[C]);

   if (StringFind(vNamePattern,"Dragon",0)>=0)
     {
      TimeD=tDragonE;
      cenaD=cDragonE;
     }
   else
     {
      TimeD=iTime(Symbol(),Period(),aXABCD[D]);
      cenaD=zz[aXABCD[D]];
     }

   numbarD=iBarShift(Symbol(),Period(),TimeD,false);

   if (writeInfoPatternsToFileXML>0)
     {
   	Name = StringConcatenate("ZUP\\XML\\",FileName,".xml"); 
	   handle=FileOpen(Name,FILE_CSV|FILE_WRITE,' ');

   	if(handle<1)
   	  {
   		Print("File ",Name," not found , the last error is ", GetLastError());
        }
   	else
   	  {
   		FileWrite(handle, "<Pattern>");
	     	FileWrite(handle, StringConcatenate("<Paire>",Symbol(),"</Paire>"));
		   FileWrite(handle, StringConcatenate("<TimeFrame>",_ChartTimeFrame(Period()),"</TimeFrame>"));
		   FileWrite(handle, StringConcatenate("<BullBear>",BullBear,"</BullBear>"));
   		FileWrite(handle, StringConcatenate("<Pattern>",txt,"</Pattern>"));		
   		FileWrite(handle, StringConcatenate("<X>",DoubleToStr(zz[aXABCD[X]],Digits),"</X>"));

         if (writeInfoPatternsToFileXML==1)
           {
        		FileWrite(handle, StringConcatenate("<X_Date>",TimeToStr(TimeX),"</X_Date>"));		
      		FileWrite(handle, StringConcatenate("<A>",DoubleToStr(zz[aXABCD[A]],Digits),"</A>"));
      		FileWrite(handle, StringConcatenate("<A_Date>",TimeToStr(TimeA),"</A_Date>"));		
   	    	FileWrite(handle, StringConcatenate("<B>",DoubleToStr(zz[aXABCD[B]],Digits),"</B>"));
   	     	FileWrite(handle, StringConcatenate("<B_Date>",TimeToStr(TimeB),"</B_Date>"));		
      		FileWrite(handle, StringConcatenate("<C>",DoubleToStr(zz[aXABCD[C]],Digits),"</C>"));
      		FileWrite(handle, StringConcatenate("<C_Date>",TimeToStr(TimeC),"</C_Date>"));		
      		FileWrite(handle, StringConcatenate("<D>",DoubleToStr(zz[aXABCD[D]],Digits),"</D>"));
      		FileWrite(handle, StringConcatenate("<D_Date>",TimeToStr(TimeD),"</D_Date>"));		
      		FileWrite(handle, StringConcatenate("<bar_D>",aXABCD[D],"</bar_D>"));
      		FileWrite(handle, StringConcatenate("<TimeForDmin>",TimeToStr(TimeForDmin),"</TimeForDmin>"));
      		FileWrite(handle, StringConcatenate("<LevelForDmin>",DoubleToStr(LevelForDmin,Digits),"</LevelForDmin>"));
      		FileWrite(handle, StringConcatenate("<TimeForDmax>",TimeToStr(TimeForDmax),"</TimeForDmax>"));
      		FileWrite(handle, StringConcatenate("<LevelForDmax>",DoubleToStr(LevelForDmax,Digits),"</LevelForDmax>"));
      		FileWrite(handle, "</Pattern>");
   		  }
   		else
   		  {
        		FileWrite(handle, StringConcatenate("<X_Date>",TimeX,"</X_Date>"));		
      		FileWrite(handle, StringConcatenate("<A>",DoubleToStr(zz[aXABCD[A]],Digits),"</A>"));
      		FileWrite(handle, StringConcatenate("<A_Date>",TimeA,"</A_Date>"));		
   	    	FileWrite(handle, StringConcatenate("<B>",DoubleToStr(zz[aXABCD[B]],Digits),"</B>"));
   	     	FileWrite(handle, StringConcatenate("<B_Date>",TimeB,"</B_Date>"));		
      		FileWrite(handle, StringConcatenate("<C>",DoubleToStr(zz[aXABCD[C]],Digits),"</C>"));
      		FileWrite(handle, StringConcatenate("<C_Date>",TimeC,"</C_Date>"));		
      		FileWrite(handle, StringConcatenate("<D>",DoubleToStr(zz[aXABCD[D]],Digits),"</D>"));
      		FileWrite(handle, StringConcatenate("<D_Date>",TimeD,"</D_Date>"));		
      		FileWrite(handle, StringConcatenate("<bar_D>",aXABCD[D],"</bar_D>"));
      		FileWrite(handle, StringConcatenate("<TimeForDmin>",TimeForDmin,"</TimeForDmin>"));
      		FileWrite(handle, StringConcatenate("<LevelForDmin>",DoubleToStr(LevelForDmin,Digits),"</LevelForDmin>"));
      		FileWrite(handle, StringConcatenate("<TimeForDmax>",TimeForDmax,"</TimeForDmax>"));
      		FileWrite(handle, StringConcatenate("<LevelForDmax>",DoubleToStr(LevelForDmax,Digits),"</LevelForDmax>"));
      		FileWrite(handle, "</Pattern>");
   		  }

   		FileClose(handle);
    	  }
	  }

   if (writeInfoPatternsToFileCSV>0)
     {
   	Name = StringConcatenate("ZUP\CSV\\",FileName,".csv"); 
	   handle=FileOpen(Name,FILE_CSV|FILE_WRITE,";");

   	if(handle<1)
   	  {
   		Print("File ",Name," not found, the last error is ", GetLastError());
        }
   	else
   	  {
         if (writeInfoPatternsToFileCSV==1)
           {
      		FileWrite(handle,Symbol(),patternNumber,numbarD,Period(),BullBear,txt,DoubleToStr(zz[aXABCD[X]],Digits),TimeToStr(TimeX),
   		          DoubleToStr(zz[aXABCD[A]],Digits),TimeToStr(TimeA),DoubleToStr(zz[aXABCD[B]],Digits),TimeToStr(TimeB),
   		          DoubleToStr(zz[aXABCD[C]],Digits),TimeToStr(TimeC),DoubleToStr(cenaD,Digits),TimeToStr(TimeD),aXABCD[D],
   		          TimeToStr(TimeForDmin),DoubleToStr(LevelForDmin,Digits),TimeToStr(TimeForDmax),DoubleToStr(LevelForDmax,Digits));
   		  }
   		else
   		  {
      		FileWrite(handle,Symbol(),patternNumber,numbarD,Period(),BullBear,txt,DoubleToStr(zz[aXABCD[X]],Digits),TimeX,
   		          DoubleToStr(zz[aXABCD[A]],Digits),TimeA,DoubleToStr(zz[aXABCD[B]],Digits),TimeB,
   		          DoubleToStr(zz[aXABCD[C]],Digits),TimeC,DoubleToStr(cenaD,Digits),TimeD,aXABCD[D],
   		          TimeForDmin,DoubleToStr(LevelForDmin,Digits),TimeForDmax,DoubleToStr(LevelForDmax,Digits));
   		  }

   		FileClose(handle);
        }
	  }

	return;
  }

void _Gartley(string _Depth, int Depth)
  {
   int  i, in=0, ik[2], iu, j, k, m, shift, countRet;

   double   LevelForD;
   datetime timeLineD;
   double   bartoD=10000;
   double   vlXB=0, vhXB=0, vlAC=0, vhAC=0, vlBD=0, vhBD=0, vlXD=0, vhXD=0;
   double   vl618=min_DeltaGartley * 0.618;
   double   vh786=max_DeltaGartley * 0.786;
   double   vl886=min_DeltaGartley * 0.886;
   double   vh886=max_DeltaGartley * 0.886;
   double   vl1272=min_DeltaGartley * 1.272;
   double   vh1618=max_DeltaGartley * 1.618;

   int      countDots=5;
   int      patternNumber=-1;

   int      aXABCD[6]; // номера баров с точками O-X-A-B-C-D пятиточечных паттернов
   double   retXD, retXB, retBD, retAC, retOA;
   double   xxa, xcd, xab, xdc, xxb;
   double   OX, XA, BC, XC, BD, AB, AD, CD;
   double   baza, levelbaza;
   bool     extremumAorC; // A - true, C - false
   bool     PatternNews;
   bool     NoLevelD;

   double   vDelta0 = 0.00000001;
   int      O=0, X=1, A=2, B=3, C=4, D=5;
   string   nameObj1="", nameObj2="";
   string   vBull      = "Bullish";
   string   vBear      = "Bearish";
   string   v4Point    = "4-Point Continuation";
   string   vABCD      = "AB=CD";
   string   v3Drives   = "3 Drives";
   string   vDragon    = "Dragon";
   string   txt        = "";

   bool     v50        = false;
   datetime tDragonE   = 0;
   double   cDragonE   = 0;
   int      aNumBarPeak[];
   double   tangensXB;

   color    colorPattern=0;
   bool     filtrXB_;
   int      maxPeak = 0;

   LevelForDmin = 0;
   LevelForDmax = 0;
   vBullBear    = "";
   vNamePattern = "";

   if (ExtIndicator!=11) delete_objects3();
   if (PotencialsLevels_retXD>0) delete_FiboStrongPattern();

   if ((ExtGartleyTypeSearch==0 && ExtIndicator==11) || ExtIndicator!=11) vPatOnOff = false;

   ArrayResize(aNumBarPeak, ArraySize(zz));
   for(shift=0; shift<_maxbarZZ; shift++)
     {
      if (zz[shift]>0) {aNumBarPeak[maxPeak] = shift; maxPeak++;}
     }

   ArrayResize(aNumBarPeak, maxPeak);

   if (ExtIndicator>5 && ExtIndicator<11 && GrossPeriod>Period())
     {
      bartoD=maxBarToD;
     }
   else
     {
      if (patternInfluence==1)
        {
         bartoD=AllowedBandPatternInfluence*(aNumBarPeak[4]-aNumBarPeak[0]);
        }
      else if (patternInfluence==0)
        {
         bartoD=maxBarToD;
        }
     }

   ArrayInitialize(aXABCD,-1);

   PatternNews=false;
   NoLevelD=(PatternNews && (ExtIndicator==11)) || ExtIndicator!=11;
   k = 0;
   while (k < maxPeak-6 && (aXABCD[D] < bartoD+2 || patternInfluence==2))
     {
      aXABCD[O] = aNumBarPeak[k + 5];
      aXABCD[X] = aNumBarPeak[k + 4];
      aXABCD[A] = aNumBarPeak[k + 3];
      aXABCD[B] = aNumBarPeak[k + 2];
      aXABCD[C] = aNumBarPeak[k + 1];
      if (k>=0) aXABCD[D] = aNumBarPeak[k]; else aXABCD[D] = aNumBarPeak[0];

      vBullBear    = "";
      vNamePattern = "";
      PatternNews=false;
      _InfoPointD = "";
      filtrXB_=false;
      countDots=0;
      tangensXB=(zz[aXABCD[B]]-zz[aXABCD[X]])/(aXABCD[X]-aXABCD[B]);

      if (zz[aXABCD[C]]>zz[aXABCD[D]])
        {
         vBullBear = vBull;
         if ((zz[aXABCD[B]]+(aXABCD[B]-aXABCD[D])*tangensXB)>zz[aXABCD[D]]) filtrXB_=true;
        }
      else if (zz[aXABCD[C]]<zz[aXABCD[D]])
        {
         vBullBear = vBear;
         if ((zz[aXABCD[B]]+(aXABCD[B]-aXABCD[D])*tangensXB)<zz[aXABCD[D]]) filtrXB_=true;
        }

      OX=0; XA=0; BC=0; XC=0; BD=0; AB=0; AD=0; CD=0; xxa=0;

Показано первые 50% кода (символов: 184348)

Открыть по тарифу

Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.

Разовая покупка файла

На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.

Чтобы оформить заказ, введите email и перейдите к оплате.

Стоимость полного кода
18 449₽ ≈ $226