//+------------------------------------------------------------------+ //| FineTuningMACandle.mq5 | //| Copyright © 2018, gumgum | //| | //+------------------------------------------------------------------+ #property copyright "Copyright © 2018, gumgum" #property link "" //---- номер версии индикатора #property version "1.00" //---- описание индикатора #property description "Свечной график на более тонком усреднении таймсерий" //---- отрисовка индикатора в главном окне #property indicator_chart_window //---- для расчета и отрисовки индикатора использовано пять буферов #property indicator_buffers 5 //---- использовано всего одно графическое построение #property indicator_plots 1 //+----------------------------------------------+ //| Параметры отрисовки индикатора | //+----------------------------------------------+ //---- в качестве индикатора использованы цветные свечи #property indicator_type1 DRAW_COLOR_CANDLES #property indicator_color1 clrDeepPink,clrGray,clrCornflowerBlue //---- отображение метки индикатора #property indicator_label1 "FineTuningMA Open;FineTuningMA High;FineTuningMA Low;FineTuningMA Close" //+----------------------------------------------+ //| ВХОДНЫЕ ПАРАМЕТРЫ ИНДИКАТОРА | //+----------------------------------------------+ input uint FTMA=10; input double rank1=2; input double rank2=2; input double rank3=2; input double shift1=1; input double shift2=1; input double shift3=1; input int Shift=0; // сдвиг индикатора по горизонтали в барах input int PriceShift=0; // cдвиг индикатора по вертикали в пунктах input uint Gap=10; // размер неучитываемого гэпа в пунктах //+----------------------------------------------+ //---- объявление динамических массивов, которые будут в дальнейшем использованы в качестве индикаторных буферов double ExtOpenBuffer[]; double ExtHighBuffer[]; double ExtLowBuffer[]; double ExtCloseBuffer[]; double ExtColorBuffer[]; //---- double PM[]; //---- Объявление переменной значения вертикального сдвига мувинга double dPriceShift; //---- Объявление целых переменных начала отсчёта данных int min_rates_total; //+------------------------------------------------------------------+ //| FineTuningMA indicator initialization function | //+------------------------------------------------------------------+ void OnInit() { //---- Инициализация сдвига по вертикали dPriceShift=_Point*PriceShift; //---- распределение памяти под массивы переменных ArrayResize(PM,FTMA); //---- Инициализация переменных double sum=0; for(int h=0; hrates_total || prev_calculated<=0) // проверка на первый старт расчёта индикатора first=min_rates_total; // стартовый номер для расчёта всех баров else first=prev_calculated-1; // стартовый номер для расчёта новых баров //---- Основной цикл расчёта индикатора for(bar=first; barExtCloseBuffer[bar]) ExtColorBuffer[bar]=0.0; else ExtColorBuffer[bar]=1.0; //---- сдвигаем свечи по вертикали ExtOpenBuffer[bar]+=dPriceShift; ExtHighBuffer[bar]+=dPriceShift; ExtLowBuffer[bar]+=dPriceShift; ExtCloseBuffer[bar]+=dPriceShift; } //---- return(rates_total); } //+------------------------------------------------------------------+ //| PriceSeries() function | //+------------------------------------------------------------------+ double PriceSeries ( uint applied_price,// Ценовая константа uint bar,// Индекс сдвига относительно текущего бара на указанное количество периодов назад или вперёд). const double &Open[], const double &Low[], const double &High[], const double &Close[] ) //PriceSeries(applied_price, bar, open, low, high, close) //+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+ { //---- switch(applied_price) { //---- Ценовые константы из перечисления ENUM_APPLIED_PRICE case PRICE_CLOSE: return(Close[bar]); case PRICE_OPEN: return(Open [bar]); case PRICE_HIGH: return(High [bar]); case PRICE_LOW: return(Low[bar]); case PRICE_MEDIAN: return((High[bar]+Low[bar])/2.0); case PRICE_TYPICAL: return((Close[bar]+High[bar]+Low[bar])/3.0); case PRICE_WEIGHTED: return((2*Close[bar]+High[bar]+Low[bar])/4.0); //---- case 8: return((Open[bar] + Close[bar])/2.0); case 9: return((Open[bar] + Close[bar] + High[bar] + Low[bar])/4.0); //---- case 10: { if(Close[bar]>Open[bar])return(High[bar]); else { if(Close[bar]Open[bar])return((High[bar]+Close[bar])/2.0); else { if(Close[bar]