//+-------------------------------------------------------------------------------------+ //| VolatilityBounce.mq4 | //| Scriptong | //| scriptong@mail.ru | //+-------------------------------------------------------------------------------------+ #property copyright "Scriptong" #property link "scriptong@mail.ru" #property indicator_separate_window // индикатор отображается в отдельном окне #property indicator_buffers 4 // Количество индикаторных буферов - 4 #property indicator_color1 DodgerBlue #property indicator_color2 Red #property indicator_color3 Blue #property indicator_color4 Red extern int ATRPeriod = 24; // период ATR extern int Range = 5; // Количество свечей, среди которых // сигнальная свеча должна быть экстремумом double ATRBuf[], // Индикаторный буфер, отображающий значения стандартного ATR CurrBuf[], // Индикаторный буфер, отображающий волатильность текущей свечи UpArr[], // Индикаторный буфер, отображающий сигналы к покупке DnArr[]; // Индикаторный буфер, отображающий сигналы к продаже //+-------------------------------------------------------------------------------------+ //| Custom indicator initialization function | //+-------------------------------------------------------------------------------------+ int init() { SetIndexBuffer(0, ATRBuf);//Индикаторный буфер, отображающий значения стандартного ATR SetIndexStyle(0, DRAW_LINE); // Индикатор отображается в виде линии SetIndexBuffer(1, CurrBuf); // Индикаторный буфер, отображающий волатильность текущей // свечи SetIndexStyle(1, DRAW_LINE); // Индикатор отображается в виде линии SetIndexBuffer(2, UpArr); // Индикаторный буфер, отображающий сигналы к покупке SetIndexStyle(2, DRAW_ARROW, STYLE_DOT, 2); // Индикатор отображается в виде стрелок SetIndexArrow(2, 241); // стрелка указывает вверх SetIndexBuffer(3, DnArr); // Индикаторный буфер, отображающий сигналы к продаже SetIndexStyle(3, DRAW_ARROW, STYLE_DOT, 2); // Индикатор отображается в виде стрелок SetIndexArrow(3, 242); // стрелка указывает вниз return(0); } //+-------------------------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+-------------------------------------------------------------------------------------+ int deinit() { return(0); } //+-------------------------------------------------------------------------------------+ //| Custom indicator iteration function | //+-------------------------------------------------------------------------------------+ int start() { // - 1 - =========================== Подготовка данных для цикла ======================== int cb = IndicatorCounted(); if (cb > 0) cb--; int limit = Bars - cb; // - 1 - ================================= Окончание блока ============================== // - 2 - ======================== Вычисление значений индикаторных буферов ============== for (int i = limit; i >= 0; i--) // Пересчитываются значения только новых свечей { ATRBuf[i] = iATR(NULL, 0, ATRPeriod, i); // Стандартный ATR CurrBuf[i] = High[i] - Low[i]; // Волатильность одной свечи if (CurrBuf[i+1] > ATRBuf[i+1] && // Свеча может стать сигнальной, если ее CurrBuf[i+2] < ATRBuf[i+2] && // волатильность выше, чем средняя волатильность, CurrBuf[i+3] <= ATRBuf[i+3]) // причем до этого волатильность одной свечи была { // ниже среднего значения if (Open[i+1] < Close[i+1] && // свеча бычья Close[i+1] > (High[i+1] + Low[i+1])/2) // закрытие выше середины if (iHighest(NULL, 0, MODE_HIGH, Range, i+1) == i+1 && // свеча - локальный Low[i+1] > Low[i+2]) // максимум, с минимумом, выше предыдущего минимума DnArr[i] = 1.3*ATRBuf[i]; // Отображение стрелки вниз - сигнал продажи if (Open[i+1] > Close[i+1] && // свеча медвежья Close[i+1] < (High[i+1] + Low[i+1])/2) // закрытие ниже середины if (iLowest(NULL, 0, MODE_LOW, Range, i+1) == i+1 && // свеча - локальный High[i+1] < High[i+2])// минимум, с максимумом, ниже предыдущего максимума UpArr[i] = 0.7*ATRBuf[i]; // Отображение стрелки вверх - сигнал покупки } } // - 2 - ================================= Окончание блока ============================== return(0); }