Работает только на таймфрейме M1.
Параметры
Period - период вышестоящего таймфрейма в минутах
Примеры работы
Исходный текст индикатора (версия 1)
Код: Выделить всё
function Initialize()
{
   IndicatorName = "BarFrame";   
   AddInput("Input", Inputs.Candle);   
   PriceStudy = false;
   
   AddSeries("Bull", DrawAs.Custom, Color.Green, AxisType.Default, true, Axes.Parent);
   AddSeries("Bear", DrawAs.Custom, Color.Red, AxisType.Default, true, Axes.Parent);
   AddSeries("BullHi", DrawAs.Custom, Color.Transparent, AxisType.Default, true, Axes.Parent);
   AddSeries("BearLo", DrawAs.Custom, Color.Transparent, AxisType.Default, true, Axes.Parent);
   
   AddParameter("Period", 5); 
   AddGlobalVariable("H", Types.Double, 0.0); // High последнего бара вышестоящего ТФ
   AddGlobalVariable("L", Types.Double, 0.0); // Low последнего бара вышестоящего ТФ
   AddGlobalVariable("Last", Types.Int, 0);     // последний бар 1 - бычий, -1 - медвежий
   AddGlobalVariable("C", Types.Int, 0);      // Счетчик неотрисованного последнего бара вышестоящего ТФ
   AddGlobalVariable("BT", Types.Double, 0);      // кол-во минут бара отсчета
}
function Evaluate()
{
// evge 06.04.2016 http://alfadirect4.ru
// Только на минутном ТФ
if ( (BarTime(0)-BarTime(1)) == AsTime(0, 1, 0) || (BarTime(1)-BarTime(2)) == AsTime(0, 1, 0) )
if ((Math.IEEERemainder(BarTime(0).TotalMinutes, Period) == 0) || 
    ( BT !=0 && (BarTime(0).TotalMinutes - BT) >= Period) ) 
{
var P = Period;
// Если начало сессии, берем количество баров из счетчика для периода
if ( BarTime(0) == AsTime(10, 0, 0) ) P = C;
L = Input.Low[1];
H = Input.High[1];
for (var x = 1; x <= P; x++) {
   if ((BarTime(1).TotalMinutes - BarTime(x).TotalMinutes) >= P) break; 
   if ((Math.IEEERemainder(BarTime(x - 1).TotalMinutes, Period) == 0) && x > 1) break;
   if (Input.Low[x] < L) L = Input.Low[x];
   if (Input.High[x] > H) H = Input.High[x];
}
if (Input.Open[P] < Input.Close[1]) Last = 1; else Last = -1;
for (var x = 1; x <= P; x++) {
   if ((BarTime(1).TotalMinutes - BarTime(x).TotalMinutes) >= P) break; 
   if ((Math.IEEERemainder(BarTime(x - 1).TotalMinutes, Period) == 0) && x > 1) break;
   if (Last == 1) 
      {
      Bull[x] = L; 
      BullHi[x] = H;
      } else
      {
      BearLo[x] = L; 
      Bear[x] = H;
      }
}
C = 0; BT = BarTime(0).TotalMinutes;
} // ieee
Bull.DrawHistogram(BullHi);
Bear.DrawHistogram(BearLo);
C++; // :)
}
Скачать исходный текст
Исходный текст индикатора (версия 2, с OHLC сериями вышестоящего ТФ)
Код: Выделить всё
function Initialize()
{
   IndicatorName = "BarFrame";   
   AddInput("Input", Inputs.Candle);   
   PriceStudy = false;
   
   AddSeries("Bull", DrawAs.Custom, Color.Green, AxisType.Default, true, Axes.Parent);
   AddSeries("Bear", DrawAs.Custom, Color.Red, AxisType.Default, true, Axes.Parent);
   AddSeries("BullHi", DrawAs.Custom, Color.Transparent, AxisType.Default, true, Axes.Parent);
   AddSeries("BearLo", DrawAs.Custom, Color.Transparent, AxisType.Default, true, Axes.Parent);
   AddSeries("CL", DrawAs.Line, Color.Transparent, AxisType.Default, true, Axes.Parent); //Close вышестоящего бара
   AddSeries("OP", DrawAs.Line, Color.Transparent, AxisType.Default, true, Axes.Parent); //Open вышестоящего бара
   AddSeries("HI", DrawAs.Line, Color.Transparent, AxisType.Default, true, Axes.Parent); //High вышестоящего бара
   AddSeries("LO", DrawAs.Line, Color.Transparent, AxisType.Default, true, Axes.Parent); //Low вышестоящего 
   
   AddParameter("Period", 5); 
   AddGlobalVariable("H", Types.Double, 0.0); // High последнего бара вышестоящего ТФ
   AddGlobalVariable("L", Types.Double, 0.0); // Low последнего бара вышестоящего ТФ
   AddGlobalVariable("Last", Types.Int, 0);     // последний бар 1 - бычий, -1 - медвежий
   AddGlobalVariable("C", Types.Int, 0);      // Счетчик неотрисованного последнего бара вышестоящего ТФ
   AddGlobalVariable("BT", Types.Double, 0);      // кол-во минут бара отсчета
}
function Evaluate()
{
// evge 06.04.2016 http://alfadirect4.ru
// version 2 от 15.04.2016  
//      Добавлены серии CL, OP, HI, LO сохраняющие Close, Open, High, Low вышестоящих ТФ
// Только на минутном ТФ
if ( (BarTime(0)-BarTime(1)) == AsTime(0, 1, 0) || (BarTime(1)-BarTime(2)) == AsTime(0, 1, 0) )
if ( ((BarTime(0).TotalMinutes % Period) == 0) || 
    ( BT !=0 && (BarTime(0).TotalMinutes - BT) >= Period) ) 
{
var P = Period;
// Если начало сессии берем количество баров из счетчика для периода
if ( BarTime(0) == AsTime(10, 0, 0) ) P = C + 1;
// Поиск мин / макс . L(ow), H(high)
L = Input.Low[1]; 
H = Input.High[1];
int Lx = 1, Hx = 1; // для сохранения позиции L и H вышестоящего ТФ
int PP = 0;        // для сохранения макс P
for (var x = 1; x <= P; x++) {
   if ((BarTime(1).TotalMinutes - BarTime(x).TotalMinutes) >= P) break; 
   if (((BarTime(x - 1).TotalMinutes % Period) == 0) && x > 1) break;
   if (Input.Low[x] < L) { L = Input.Low[x]; Lx = x; }
   if (Input.High[x] > H) { H = Input.High[x]; Hx = x; }
   PP++;
}
if (Input.Open[PP] < Input.Close[1]) Last = 1; else Last = -1;
for (var x = 1; x <= PP; x++) {
   if (((BarTime(x - 1).TotalMinutes % Period) == 0) && x > 1) break;
   if (Last == 1) 
      {
      Bull[x] = L; 
      BullHi[x] = H;
      } else
      {
      BearLo[x] = L; 
      Bear[x] = H;
      }
   CL[x] = Input.Close[1];  // Сохраняем CL(ose) вышестоящего ТФ в серии CL
   OP[x] = Input.Open[PP];   // Сохраняем OP(en) вышестоящего ТФ в серии OP
   HI[x] = Input.High[Hx]; // Сохраняем HI(gh) вышестоящего ТФ в серии HI
   LO[x] = Input.Low[Lx]; // Сохраняем LO(w) вышестоящего ТФ в серии LO
}
CL[0] = Input.Close[1];  // Сохраняем CL(ose) вышестоящего ТФ в серии CL
OP[0] = Input.Open[PP];   // Сохраняем OP(en) вышестоящего ТФ в серии OP
HI[0] = Input.High[Hx]; // Сохраняем HI(gh) вышестоящего ТФ в серии HI
LO[0] = Input.Low[Lx]; // Сохраняем LO(w) вышестоящего ТФ в серии LO
C = 0; BT = BarTime(0).TotalMinutes;
} // ieee
else {
if (CL[1] > 0) CL[0] = CL[1];
if (OP[1] > 0) OP[0] = OP[1];
if (HI[1] > 0) HI[0] = HI[1];
if (LO[1] > 0) LO[0] = LO[1];
}
Bull.DrawHistogram(BullHi);
Bear.DrawHistogram(BearLo);
C++; // :)
}
Скачать исходный текст

 
  . ++ увеличиваем значение переменной C на 1.
. ++ увеличиваем значение переменной C на 1.