Работает только на таймфрейме 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++; // :)
}
Скачать исходный текст