//+------------------------------------------------------------------+ //| Donchian Channels - Generalized version.mq5 | //| 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 //+-----------------------------------+ //| Параметры отрисовки индикатора 1 | //+-----------------------------------+ //---- отрисовка индикатора в виде линии #property indicator_type1 DRAW_LINE //---- в качестве цвета линии индикатора использован оливковый цвет #property indicator_color1 clrOliveDrab //---- линия индикатора - непрерывная кривая #property indicator_style1 STYLE_SOLID //---- толщина линии индикатора равна 1 #property indicator_width1 1 //---- отображение метки индикатора #property indicator_label1 "Upper Donchian" //+-----------------------------------+ //| Параметры отрисовки индикатора 2 | //+-----------------------------------+ //---- отрисовка индикатора в виде линии #property indicator_type2 DRAW_LINE //---- в качестве цвета линии индикатора использован серый цвет #property indicator_color2 clrGray //---- линия индикатора - непрерывная кривая #property indicator_style2 STYLE_SOLID //---- толщина линии индикатора равна 1 #property indicator_width2 1 //---- отображение метки индикатора #property indicator_label2 "Middle Donchian" //+-----------------------------------+ //| Параметры отрисовки индикатора 3 | //+-----------------------------------+ //---- отрисовка индикатора в виде линии #property indicator_type3 DRAW_LINE //---- в качестве цвета линии индикатора использован какао цвет #property indicator_color3 clrPaleVioletRed //---- линия индикатора - непрерывная кривая #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]