Код:
#property copyright "Copyright 2015"
#property link "..."
#property version "1.00"
#property strict
#property indicator_chart_window
#property description "Индикатор диапазонов"
#property description "относительно предыдущего дня"
#property indicator_buffers 6 //сколько будет изображено линий
#property indicator_color1 clrLimeGreen
#property indicator_width1 2
#property indicator_color2 clrGreen
#property indicator_width2 2
#property indicator_color3 clrRed
#property indicator_width3 2
#property indicator_color4 clrMaroon
#property indicator_width4 2
#property indicator_color5 clrDarkViolet
#property indicator_width5 2
#property indicator_color6 clrBlue
#property indicator_width6 2
//параметры - после слешей - название индикатора для пользователей
input ENUM_TIMEFRAMES UpTime = PERIOD_D1;
input double Range1Percent = 20;
input double Range2Percent = 40;
input double Range3Percent = 60;
//буфферы
double bufUp1[];
double bufDown1[];
double bufUp2[];
double bufDown2[];
double bufUp3[];
double bufDown3[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
IndicatorShortName("dzRanges");
IndicatorBuffers(6);
//задаем привязку и стили
SetIndexBuffer(0, bufUp1);
SetIndexStyle(0, DRAW_LINE);
SetIndexShift(0, 0);
SetIndexDrawBegin(0, 0);
SetIndexBuffer(1, bufDown1);
SetIndexStyle(1, DRAW_LINE);
SetIndexShift(1, 0);
SetIndexDrawBegin(1, 0);
SetIndexBuffer(2, bufUp2);
SetIndexStyle(2, DRAW_LINE);
SetIndexShift(2, 0);
SetIndexDrawBegin(2, 0);
SetIndexBuffer(3, bufDown2);
SetIndexStyle(3, DRAW_LINE);
SetIndexShift(3, 0);
SetIndexDrawBegin(3, 0);
SetIndexBuffer(4, bufUp3);
SetIndexStyle(4, DRAW_LINE);
SetIndexShift(4, 0);
SetIndexDrawBegin(4, 0);
SetIndexBuffer(5, bufDown3);
SetIndexStyle(5, DRAW_LINE);
SetIndexShift(5, 0);
SetIndexDrawBegin(5, 0);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| 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[])
{
//---
int period = 1; //сюда заносим самый большой расчетный период
if(rates_total < period)
return(-1); //на графике нет достаточного количества баров
int limit = rates_total - prev_calculated;
//текущий бар всегда пересчитываем и предыдудщий
limit++;
//при первом расчете может выйти за 0, поэтому
while(limit < 0)
limit++;
//при первом расчете - отступаем слева, так как там не хватит свечей для расчета
limit = MathMin(limit, rates_total - period);
//сам рассчет
for(int i = limit; i >= 0; i--)
{
int shift = iBarShift(Symbol(), UpTime, Time);
double h = iHigh(Symbol(), UpTime, shift + 1);
double l = iLow(Symbol(), UpTime, shift + 1);
double o = iOpen(Symbol(), UpTime, shift);
bufUp1 = o + (h - l) * (1 + Range1Percent) / 100;
bufUp2 = o + (h - l) * (1 + Range2Percent) / 100;
bufUp3 = o + (h - l) * (1 + Range3Percent) / 100;
bufDown1 = o - (h - l) * (1 + Range1Percent) / 100;
bufDown2 = o - (h - l) * (1 + Range2Percent) / 100;
bufDown3 = o - (h - l) * (1 + Range3Percent) / 100;
}
//--- return value of prev_calculated for next call
return(rates_total);
}