//+------------------------------------------------------------------+ //| Aroon Horn.mq4 | //| tonyc2a@yahoo.com | //+------------------------------------------------------------------+ #property copyright "tonyc2a@yahoo.com" #property link "mailto:tonyc2a@yahoo.com" //---- отрисовка индикатора в отдельном окне #property indicator_separate_window //---- количество индикаторных буфферов #property indicator_buffers 2 //---- цвета индикатора #property indicator_color1 Blue #property indicator_color2 Red //---- параметры горизонтальных уровней индикатора #property indicator_level1 40 #property indicator_level2 -40 #property indicator_levelcolor Gold #property indicator_levelstyle 4 //---- ВХОДНЫЕ ПАРАМЕТРЫ ИНДИКАТОРА extern int Aroon_Period=9; //---- индикаторные буфферы double UpBuffer[]; double DnBuffer[]; //+------------------------------------------------------------------+ //| Aroon Horn initialization function | //+------------------------------------------------------------------+ int init() { //---- стили изображения индикатора SetIndexStyle(0,DRAW_LINE); SetIndexStyle(1,DRAW_LINE); //---- Установка формата точности (количество знаков после десятичной точки) для визуализации значений индикатора IndicatorDigits(0); //---- установка номера бара, начиная с которого будет отрисовываться индикатор SetIndexDrawBegin(0,Aroon_Period+1); SetIndexDrawBegin(1,Aroon_Period+1); //---- 2 индикаторных буффера использованы для счёта SetIndexBuffer(0,UpBuffer); SetIndexBuffer(1,DnBuffer); //---- имена для окон данных и лэйбы для субъокон IndicatorShortName("Aroon("+Aroon_Period+")"); SetIndexLabel(0,"UP_Aroon"); SetIndexLabel(1,"DOWN_Aroon"); //---- коррекция недопустимого значения Aroon_Period if(Aroon_Period<1) Aroon_Period=1; //---- завершение инициализации return(0); } //+------------------------------------------------------------------+ //| Aroon Horn iteration function | //+------------------------------------------------------------------+ int start() { int MaxBar=Bars-Aroon_Period; //---- проверка количества баров на достаточность для расчёта if (MaxBar<0)return(0); //---- double HighestBar,LowestBar,aroonUp,aroonDn; //---- введение целых переменных и получение уже подсчитанных баров int limit,bar,counted_bars=IndicatorCounted(); //---- проверка на возможные ошибки if (counted_bars<0)return(-1); //---- последний подсчитанный бар должен быть пересчитан if (counted_bars>0) counted_bars--; //---- определение номера самого старого бара, начиная с которого будет произедён пересчёт новых баров limit=Bars-counted_bars-1; //---- инициализация нуля if(limit>MaxBar) { limit=MaxBar; for(bar=Bars-1;bar>=MaxBar;bar--) UpBuffer[bar]=0.0; for(bar=Bars-1;bar>=MaxBar;bar--) DnBuffer[bar]=0.0; } //---- ВЫЧИСЛЕНИЕ ИНДИКАТОРА for( bar=limit; bar>=0; bar--) { HighestBar = iHighest(NULL,0,MODE_HIGH,Aroon_Period,bar); LowestBar = iLowest (NULL,0,MODE_LOW, Aroon_Period,bar); //---- aroonUp = 100 - ((HighestBar - bar) / Aroon_Period) * 250; aroonDn = 100 - ((LowestBar - bar) / Aroon_Period) * 250; //---- if(aroonUp == 0) { aroonUp = 0.0000001; } if(aroonDn == 0) { aroonDn = 0.0000001; } //---- UpBuffer[bar]=aroonUp; DnBuffer[bar]=aroonDn; } //---- return(0); } //+------------------------------------------------------------------+