//+------------------------------------------------------------------+ //| MUV_Cloud.mq5 | //| Copyright © 2008, svm-d | //| | //+------------------------------------------------------------------+ //---- авторство индикатора #property copyright "Copyright © 2008, svm-d" //---- авторство индикатора #property link "" //---- номер версии индикатора #property version "1.00" //---- отрисовка индикатора в отдельном окне #property indicator_separate_window //---- для расчёта и отрисовки индикатора использовано шесть буферов #property indicator_buffers 6 //---- использовано пять графических построений #property indicator_plots 5 //+----------------------------------------------+ //| Параметры отрисовки индикатора MUV_DIFF | //+----------------------------------------------+ //---- отрисовка индикатора 1 в виде облака #property indicator_type1 DRAW_FILLING //---- в качестве цвета бычей линии индикатора использованы #property indicator_color1 clrOrange,clrYellowGreen //---- отображение бычей лэйбы индикатора #property indicator_label1 "MUV % Down; MUV % Up" //+----------------------------------------------+ //| Параметры отрисовки бычьего индикатора | //+----------------------------------------------+ //---- отрисовка индикатора 2 в виде линии #property indicator_type2 DRAW_LINE //---- в качестве цвета бычьей линии индикатора использован Teal цвет #property indicator_color2 clrTeal //---- толщина линии индикатора 2 равна 1 #property indicator_width2 1 //---- отображение медвежьей метки индикатора #property indicator_label2 "MUV % Sma" //+----------------------------------------------+ //| Параметры отрисовки медвежьего индикатора | //+----------------------------------------------+ //---- отрисовка индикатора 3 в виде линии #property indicator_type3 DRAW_LINE //---- в качестве цвета медвежьей линии индикатора использован Red цвет #property indicator_color3 clrRed //---- толщина линии индикатора 3 равна 1 #property indicator_width3 1 //---- отображение бычьей метки индикатора #property indicator_label3 "MUV % Ema" //+----------------------------------------------+ //| Параметры отрисовки бычьего индикатора | //+----------------------------------------------+ //---- отрисовка индикатора 4 в виде символа #property indicator_type4 DRAW_ARROW //---- в качестве цвета бычьей линии индикатора использован Blue цвет #property indicator_color4 clrBlue //---- толщина линии индикатора 2 равна 4 #property indicator_width4 4 //---- отображение медвежьей метки индикатора #property indicator_label4 "MUV % Buy" //+----------------------------------------------+ //| Параметры отрисовки медвежьего индикатора | //+----------------------------------------------+ //---- отрисовка индикатора 5 в виде символа #property indicator_type5 DRAW_ARROW //---- в качестве цвета медвежьей линии индикатора использован розовый цвет #property indicator_color5 clrMagenta //---- толщина линии индикатора 3 равна 4 #property indicator_width5 4 //---- отображение бычьей метки индикатора #property indicator_label5 "MUV % Sell" //+----------------------------------------------+ //| Параметры отображения горизонтальных уровней | //+----------------------------------------------+ #property indicator_level1 +100.0 #property indicator_level2 -100.0 #property indicator_levelcolor clrGray #property indicator_levelstyle STYLE_SOLID //+----------------------------------------------+ //| объявление констант | //+----------------------------------------------+ #define RESET 0 // Константа для возврата терминалу команды на пересчёт индикатора //+----------------------------------------------+ //| Входные параметры индикатора | //+----------------------------------------------+ input uint MAPeriod=14;// период индикатора XMUV input uint KPeriod=14; // период поиска экстремумов input int Shift=0; // сдвиг индикатора по горизонтали в барах //+----------------------------------------------+ //---- объявление динамических массивов, которые будут в // дальнейшем использованы в качестве индикаторных буферов double SmaDiffBuffer[]; double EmaDiffBuffer[]; double SmaDiffBuffer_[]; double EmaDiffBuffer_[]; double BuyBuffer[]; double SellBuffer[]; //---- Объявление целых переменных для хендлов индикаторов int E_Handle,S_Handle; //---- Объявление целых переменных начала отсчёта данных int min_rates_total; //---- объявление глобальных переменных int Count[]; double SmaValue[],EmaValue[]; //+------------------------------------------------------------------+ //| Пересчет позиции самого нового элемента в массиве | //+------------------------------------------------------------------+ void Recount_ArrayZeroPos(int &CoArr[],// Возврат по ссылке номера текущего значения ценового ряда int Size) { //---- int numb,Max1,Max2; static int count=1; Max2=Size; Max1=Max2-1; count--; if(count<0) count=Max1; for(int iii=0; iiiMax1) numb-=Max2; CoArr[iii]=numb; } //---- } //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ void OnInit() { //---- Инициализация переменных начала отсчёта данных min_rates_total=int(MAPeriod+KPeriod); //---- получение хендла индикатора XMUV SMA S_Handle=iCustom(NULL,0,"XMUV",0,MAPeriod,0,0,0); if(S_Handle==INVALID_HANDLE) Print(" Не удалось получить хендл индикатора XMUV SMA"); //---- получение хендла индикатора EMUV SMA E_Handle=iCustom(NULL,0,"XMUV",1,MAPeriod,0,0,0); if(E_Handle==INVALID_HANDLE) Print(" Не удалось получить хендл индикатора XMUV EMA"); //---- распределение памяти под массивы переменных ArrayResize(Count,KPeriod); ArrayResize(SmaValue,KPeriod); ArrayResize(EmaValue,KPeriod); ArrayInitialize(Count,0); ArrayInitialize(SmaValue,0.0); ArrayInitialize(EmaValue,0.0); //---- превращение динамического массива в индикаторный буфер SetIndexBuffer(0,SmaDiffBuffer,INDICATOR_DATA); //---- индексация элементов в буфере как в таймсерии ArraySetAsSeries(SmaDiffBuffer,true); //---- превращение динамического массива в индикаторный буфер SetIndexBuffer(1,EmaDiffBuffer,INDICATOR_DATA); //---- индексация элементов в буфере как в таймсерии ArraySetAsSeries(EmaDiffBuffer,true); //---- превращение динамического массива в индикаторный буфер SetIndexBuffer(2,SmaDiffBuffer_,INDICATOR_DATA); //---- индексация элементов в буфере как в таймсерии ArraySetAsSeries(SmaDiffBuffer_,true); //---- превращение динамического массива в индикаторный буфер SetIndexBuffer(3,EmaDiffBuffer_,INDICATOR_DATA); //---- индексация элементов в буфере как в таймсерии ArraySetAsSeries(EmaDiffBuffer_,true); //---- превращение динамического массива в индикаторный буфер SetIndexBuffer(4,BuyBuffer,INDICATOR_DATA); //---- индексация элементов в буфере как в таймсерии ArraySetAsSeries(BuyBuffer,true); //---- превращение динамического массива в индикаторный буфер SetIndexBuffer(5,SellBuffer,INDICATOR_DATA); //---- индексация элементов в буфере как в таймсерии ArraySetAsSeries(SellBuffer,true); //---- осуществление сдвига индикатора 1 по горизонтали на Shift PlotIndexSetInteger(0,PLOT_SHIFT,Shift); //---- осуществление сдвига начала отсчёта отрисовки индикатора 1 на min_rates_total PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,min_rates_total); //---- установка значений индикатора, которые не будут видимы на графике PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE); //---- осуществление сдвига индикатора 1 по горизонтали на Shift PlotIndexSetInteger(1,PLOT_SHIFT,Shift); //---- осуществление сдвига начала отсчёта отрисовки индикатора 1 на min_rates_total PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,min_rates_total); //---- установка значений индикатора, которые не будут видимы на графике PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE); //---- осуществление сдвига индикатора 1 по горизонтали на Shift PlotIndexSetInteger(2,PLOT_SHIFT,Shift); //---- осуществление сдвига начала отсчёта отрисовки индикатора 1 на min_rates_total PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,min_rates_total); //---- установка значений индикатора, которые не будут видимы на графике PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,EMPTY_VALUE); //---- осуществление сдвига индикатора 1 по горизонтали на Shift PlotIndexSetInteger(3,PLOT_SHIFT,Shift); //---- осуществление сдвига начала отсчёта отрисовки индикатора 1 на min_rates_total PlotIndexSetInteger(3,PLOT_DRAW_BEGIN,min_rates_total); //---- установка значений индикатора, которые не будут видимы на графике PlotIndexSetDouble(3,PLOT_EMPTY_VALUE,EMPTY_VALUE); //---- осуществление сдвига индикатора 1 по горизонтали на Shift PlotIndexSetInteger(4,PLOT_SHIFT,Shift); //---- осуществление сдвига начала отсчёта отрисовки индикатора 1 на min_rates_total PlotIndexSetInteger(4,PLOT_DRAW_BEGIN,min_rates_total); //---- установка значений индикатора, которые не будут видимы на графике PlotIndexSetDouble(4,PLOT_EMPTY_VALUE,EMPTY_VALUE); //---- инициализации переменной для короткого имени индикатора string shortname; StringConcatenate(shortname,"MUV_DIFF %(",MAPeriod,", ",Shift,")"); //--- создание имени для отображения в отдельном подокне и во всплывающей подсказке IndicatorSetString(INDICATOR_SHORTNAME,shortname); //--- определение точности отображения значений индикатора IndicatorSetInteger(INDICATOR_DIGITS,0); //---- } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate( const int rates_total, // количество истории в барах на текущем тике const int prev_calculated,// количество истории в барах на предыдущем тике const datetime &time[], const double &open[], const double& high[], // ценовой массив максимумов цены для расчёта индикатора const double& low[], // ценовой массив минимумов цены для расчёта индикатора const double &close[], const long &tick_volume[], const long &volume[], const int &spread[] ) { //---- проверка количества баров на достаточность для расчёта if(BarsCalculated(S_Handle)rates_total || prev_calculated<=0)// проверка на первый старт расчёта индикатора limit=rates_total-min_rates_total-1; // стартовый номер для расчёта всех баров else limit=rates_total-prev_calculated; // стартовый номер для расчёта новых баров to_copy=limit+1; //---- копируем вновь появившиеся данные в массив if(CopyBuffer(S_Handle,0,0,to_copy,SDiff)<=0) return(RESET); if(CopyBuffer(E_Handle,0,0,to_copy,EDiff)<=0) return(RESET); //---- индексация элементов в массивах как в таймсериях ArraySetAsSeries(SDiff,true); ArraySetAsSeries(EDiff,true); //---- основной цикл расчёта индикатора for(bar=limit; bar>=0 && !IsStopped(); bar--) { SmaValue[Count[0]]=SDiff[bar]; EmaValue[Count[0]]=EDiff[bar]; SmaMax=SmaValue[ArrayMaximum(SmaValue,0,KPeriod)]; SmaMin=SmaValue[ArrayMinimum(SmaValue,0,KPeriod)]; SmaRange=SmaMax-SmaMin; EmaMax=EmaValue[ArrayMaximum(EmaValue,0,KPeriod)]; EmaMin=EmaValue[ArrayMinimum(EmaValue,0,KPeriod)]; EmaRange=EmaMax-EmaMin; if(SmaRange>0) SmaRes=100-200*(SmaMax-SmaValue[Count[0]])/SmaRange; else SmaRes=-100; if(EmaRange>0) EmaRes=100-200*(EmaMax-EmaValue[Count[0]])/EmaRange; else EmaRes=-100; SmaDiffBuffer[bar]=SmaRes; SmaDiffBuffer_[bar]=SmaRes; EmaDiffBuffer[bar]=EmaRes; EmaDiffBuffer_[bar]=EmaRes; if(SmaRes==+100 || EmaRes==+100) BuyBuffer[bar]=+100; else BuyBuffer[bar]=EMPTY_VALUE; if(SmaRes==-100 || EmaRes==-100) SellBuffer[bar]=-100; else SellBuffer[bar]=EMPTY_VALUE; if(bar) Recount_ArrayZeroPos(Count,KPeriod); } //---- return(rates_total); } //+------------------------------------------------------------------+