//+------------------------------------------------------------------+ //| Trend.mq5 | //| Copyright © 2008, Ramdass | //| | //+------------------------------------------------------------------+ //---- авторство индикатора #property copyright "Copyright © 2008, Ramdass" //---- ссылка на сайт автора #property link "" //---- номер версии индикатора #property version "1.00" //---- отрисовка индикатора в отдельном окне #property indicator_separate_window //---- для расчёта и отрисовки индикатора использовано два буфера #property indicator_buffers 2 //---- использовано одно графическое построение #property indicator_plots 1 //+-----------------------------------+ //| объявление констант | //+-----------------------------------+ #define RESET 0 // Константа для возврата терминалу команды на пересчёт индикатора //+-----------------------------------+ //| Параметры отрисовки заливки | //+-----------------------------------+ //---- отрисовка индикатора в виде заливки между двумя линиями #property indicator_type1 DRAW_FILLING //---- в качестве цветов заливки индикатора использованы зелёный цвет и розовый цвета #property indicator_color1 Lime, Magenta //---- отображение лэйбы индикатора #property indicator_label1 "Trend" //+-----------------------------------+ //| объявление перечислений | //+-----------------------------------+ enum MODE { MODE_MAIN=0, //Базовая линия MODE_HIGH, //Верхняя линия MODE_LOW //Нижняя линия }; //+----------------------------------------------+ //| Входные параметры индикатора | //+----------------------------------------------+ input MODE Bands_Mode=MODE_MAIN; // Линия BB для расчёта input int bands_period=20; // BB период усреднения input double bands_deviation=2.0; // BB девиация input ENUM_APPLIED_PRICE bands_price=PRICE_CLOSE; // BB цена input int power_period=13; // Период усреднения //+----------------------------------------------+ //---- объявление динамических массивов, которые будут в // дальнейшем использованы в качестве индикаторных буферов double BullsBuffer[]; double BearsBuffer[]; //---- Объявление целых переменных начала отсчёта данных int min_rates_total; //---- Объявление целых переменных для хендлов индикаторов int Bands_Handle,Bulls_Handle,Bears_Handle; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ void OnInit() { //---- Инициализация переменных начала отсчёта данных min_rates_total=MathMax(bands_period,power_period); //---- получение хендла индикатора Bands Bands_Handle=iBands(NULL,0,bands_period,0,bands_deviation,bands_price); if(Bands_Handle==INVALID_HANDLE) Print(" Не удалось получить хендл индикатора Bands"); //---- получение хендла индикатора BullsPower Bulls_Handle=iBullsPower(NULL,0,power_period); if(Bulls_Handle==INVALID_HANDLE) Print(" Не удалось получить хендл индикатора BullsPower"); //---- получение хендла индикатора BearsPower Bears_Handle=iBearsPower(NULL,0,power_period); if(Bears_Handle==INVALID_HANDLE) Print(" Не удалось получить хендл индикатора BearsPower"); //---- превращение динамического массива BullsBuffer в индикаторный буфер SetIndexBuffer(0,BullsBuffer,INDICATOR_DATA); //---- индексация элементов в буфере как в таймсерии ArraySetAsSeries(BullsBuffer,true); //---- превращение динамического массива BearsBuffer в индикаторный буфер SetIndexBuffer(1,BearsBuffer,INDICATOR_DATA); //---- индексация элементов в буфере как в таймсерии ArraySetAsSeries(BearsBuffer,true); //---- осуществление сдвига начала отсчёта отрисовки индикатора 1 на min_rates_total PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,min_rates_total); //---- инициализации переменной для короткого имени индикатора string shortname="Trend"; //--- создание имени для отображения в отдельном подокне и во всплывающей подсказке IndicatorSetString(INDICATOR_SHORTNAME,shortname); //--- определение точности отображения значений индикатора IndicatorSetInteger(INDICATOR_DIGITS,_Digits); //---- } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate( const int rates_total, // количество истории в барах на текущем тике const int prev_calculated,// количество истории в барах на предыдущем тике const int begin, // номер начала достоверного отсчёта баров const double &price[] // ценовой массив для расчёта индикатора ) { //---- проверка количества баров на достаточность для расчёта if(BarsCalculated(Bands_Handle)rates_total || prev_calculated<=0)// проверка на первый старт расчёта индикатора { limit=rates_total-1-min_rates_total-begin; // стартовый номер для расчёта всех баров //---- осуществление сдвига начала отсчёта отрисовки индикатора 1 на min_rates_total PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,min_rates_total+begin); } else limit=rates_total-prev_calculated; // стартовый номер для расчёта новых баров //---- to_copy=limit+1; //---- копируем вновь появившиеся данные в массивы if(CopyBuffer(Bands_Handle,Bands_Mode,0,to_copy,Bands)<=0) return(RESET); if(CopyBuffer(Bulls_Handle,Bands_Mode,0,to_copy,Bulls)<=0) return(RESET); if(CopyBuffer(Bears_Handle,Bands_Mode,0,to_copy,Bears)<=0) return(RESET); //---- индексация элементов в массивах как в таймсериях ArraySetAsSeries(Bands,true); ArraySetAsSeries(Bulls,true); ArraySetAsSeries(Bears,true); ArraySetAsSeries(price,true); //---- основной цикл расчёта индикатора for(bar=limit; bar>=0 && !IsStopped(); bar--) { BullsBuffer[bar]=price[bar]-Bands[bar]; BearsBuffer[bar]=-(Bears[bar]+Bulls[bar]); } //---- return(rates_total); } //+------------------------------------------------------------------+