//+------------------------------------------------------------------+ //| Donchian Channels - Generalized version.mq4 | //| Copyright © 2005, Luis Guilherme Damiani | //| http://www.damianifx.com.br | //+------------------------------------------------------------------+ #property copyright "Copyright © 2005, Luis Guilherme Damiani" #property link "http://www.damianifx.com.br" //---- номер версии индикатора #property version "1.00" //---- отрисовка индикатора в главном окне #property indicator_chart_window //---- количество индикаторных буферов #property indicator_buffers 3 //---- использовано три графических построения #property indicator_plots 3 //+-----------------------------------+ //| Параметры отрисовки индикатора | //+-----------------------------------+ //---- отрисовка индикатора в виде линии #property indicator_type1 DRAW_LINE //---- в качестве цвета линии индикатора использован оливковый цвет #property indicator_color1 OliveDrab //---- линия индикатора - непрерывная кривая #property indicator_style1 STYLE_SOLID //---- толщина линии индикатора равна 1 #property indicator_width1 1 //---- отображение метки индикатора #property indicator_label1 "Upper Donchian" //---- отрисовка индикатора в виде линии #property indicator_type2 DRAW_LINE //---- в качестве цвета линии индикатора использован серый цвет #property indicator_color2 Gray //---- линия индикатора - непрерывная кривая #property indicator_style2 STYLE_SOLID //---- толщина линии индикатора равна 1 #property indicator_width2 1 //---- отображение метки индикатора #property indicator_label2 "Middle Donchian" //---- отрисовка индикатора в виде линии #property indicator_type3 DRAW_LINE //---- в качестве цвета линии индикатора использован какао цвет #property indicator_color3 PaleVioletRed //---- линия индикатора - непрерывная кривая #property indicator_style3 STYLE_SOLID //---- толщина линии индикатора равна 1 #property indicator_width3 1 //---- отображение метки индикатора #property indicator_label3 "Lower Donchian" //+-----------------------------------+ //| Объявление перечисления | //+-----------------------------------+ enum Applied_Extrem //тип экстремумов { HIGH_LOW, HIGH_LOW_OPEN, HIGH_LOW_CLOSE, OPEN_HIGH_LOW, CLOSE_HIGH_LOW }; //+-----------------------------------+ //| Входные параметры индикатора | //+-----------------------------------+ input int DonchianPeriod=20; // Период усреднения input Applied_Extrem Extremes=HIGH_LOW; // Тип экстремумов input int Margins=-2; input int Shift=0; // Сдвиг индикатора по горизонтали в барах //+-----------------------------------+ //---- индикаторные буферы double UpperBuffer[]; double MiddleBuffer[]; double LowerBuffer[]; //+------------------------------------------------------------------+ //| Searching index of the highest bar | //+------------------------------------------------------------------+ int iHighest(const double &array[],// массив для поиска индекса максимального элемента int count, // число элементов массива (в направлении от текущего бара в сторону убывания индекса), // среди которых должен быть произведен поиск int startPos) // индекс (смещение относительно текущего бара) начального бара, // с которого начинается поиск наибольшего значения { //---- int index=startPos; //---- проверка стартового индекса на корректность if(startPos<0) { Print("Неверное значение в функции iHighest, startPos = ",startPos); return(0); } //---- проверка значения startPos на корректность if(startPos-count<0) count=startPos; //---- double max=array[startPos]; //---- поиск индекса for(int i=startPos; i>startPos-count; i--) { if(array[i]>max) { index=i; max=array[i]; } } //---- возврат индекса наибольшего бара return(index); } //+------------------------------------------------------------------+ //| Searching index of the lowest bar | //+------------------------------------------------------------------+ int iLowest(const double &array[],// массив для поиска индекса минимального элемента int count, // число элементов массива (в направлении от текущего бара в сторону убывания индекса), // среди которых должен быть произведен поиск int startPos) // индекс (смещение относительно текущего бара) начального бара, // с которого начинается поиск наименьшего значения { //---- int index=startPos; //---- проверка стартового индекса на корректность if(startPos<0) { Print("Неверное значение в функции iLowest, startPos = ",startPos); return(0); } //---- проверка значения startPos на корректность if(startPos-count<0) count=startPos; //---- double min=array[startPos]; //---- поиск индекса for(int i=startPos; i>startPos-count; i--) { if(array[i]