//+------------------------------------------------------------------+ //| Negative_Volume_Index.mq5 | //| Copyright © 2011, Nikolay Kositsin | //| Khabarovsk, farria@mail.redcom.ru | //+------------------------------------------------------------------+ //--- авторство индикатора #property copyright "Copyright © 2011, Nikolay Kositsin" //--- ссылка на сайт автора #property link "farria@mail.redcom.ru" #property description "Индекс отрицательного объема (Negative Volume Index - NVI)" //--- номер версии индикатора #property version "1.01" //--- отрисовка индикатора в отдельном окне #property indicator_separate_window //--- для расчета и отрисовки индикатора использовано два буфера #property indicator_buffers 1 //--- использовано два графических построения #property indicator_plots 1 //+----------------------------------------------+ //| Параметры отрисовки индикатора | //+----------------------------------------------+ //--- отрисовка индикатора 1 в виде линии #property indicator_type1 DRAW_LINE //--- в качестве цвета бычей линии индикатора использован красный цвет #property indicator_color1 clrRed //--- линия индикатора 1 - непрерывная кривая #property indicator_style1 STYLE_SOLID //--- толщина линии индикатора 1 равна 1 #property indicator_width1 1 //--- отображение бычей метки индикатора #property indicator_label1 "Negative Volume Index" //+----------------------------------------------+ //| Входные параметры индикатора | //+----------------------------------------------+ input ENUM_APPLIED_VOLUME VolumeType=VOLUME_TICK; //объем input int Shift = 0; // сдвиг индикатора по горизонтали в барах //+----------------------------------------------+ //--- объявление динамических массивов, которые будут в // дальнейшем использованы в качестве индикаторных буферов double NVIBuffer[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ void OnInit() { //--- превращение динамического массива PVIBuffer в индикаторный буфер SetIndexBuffer(0,NVIBuffer,INDICATOR_DATA); //--- осуществление сдвига индикатора 1 по горизонтали на Shift PlotIndexSetInteger(0,PLOT_SHIFT,Shift); //--- осуществление сдвига начала отсчета отрисовки индикатора 1 на 1 PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,1); //--- установка значений индикатора, которые не будут видимы на графике PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0); //--- создание имени для отображения в отдельном подокне и во всплывающей подсказке IndicatorSetString(INDICATOR_SHORTNAME,"Negative Volume Index"); //--- определение точности отображения значений индикатора IndicatorSetInteger(INDICATOR_DIGITS,_Digits); //--- } //+------------------------------------------------------------------+ //| 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(rates_total<2) return(0); //--- объявления локальных переменных int first,bar; long Vol0,Vol1; //--- расчет стартового номера first для цикла пересчета баров if(prev_calculated>rates_total || prev_calculated<=0) // проверка на первый старт расчета индикатора { first=1; // стартовый номер для расчета всех баров NVIBuffer[0]=1.0; } else first=prev_calculated-1; // стартовый номер для расчета новых баров //--- основной цикл расчета индикатора for(bar=first; bar