Пользовательские индикаторы > BarFrame - бары вышестоящего таймфрейма

Дополнительные индикаторы от пользователей Альфа-Директ 4. Готовые решения от пользователей.
Аватара пользователя
evge
Администратор
Сообщения: 1641
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 64 раза
Поблагодарили: 294 раза
Контактная информация:

BarFrame - бары вышестоящего таймфрейма

Непрочитанное сообщение evge » 06 апр 2016, 23:21

Индикатор BarFrame позволяет выводить на графике бары вышестоящего таймфрейма.

Работает только на таймфрейме M1.

Параметры

Period - период вышестоящего таймфрейма в минутах

Примеры работы

BarFrame-02.png
Два индикатора BarFrame с Period = 5 и 15
BarFrame-02.png (29.46 КБ) 12629 просмотров

BarFrame-01.png
Индикатор BarFrame с Period = 5
BarFrame-01.png (26.78 КБ) 12629 просмотров

BarFrame-03.png
Два индикатора BarFrame с Period = 5 и 30
BarFrame-03.png (23.57 КБ) 12620 просмотров

BarFrame-04.png
Три индикатора BarFrame с Period = 5, 30, 60

BarFrame-05.png
BarFrame версии 2, с периодом 15. Демонстрация вывода Open, Close линии вышестоящего ТФ и использования Close линии в качестве входящей серии для стандартного индикатора SMA (период 750 = периоду 50 для М15)


Исходный текст индикатора (версия 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++; // :)

}


Скачать исходный текст

BarFrame.zip
(1.4 КБ) 575 скачиваний


Исходный текст индикатора (версия 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++; // :)

}


Скачать исходный текст

BarFrame.v2.zip
(1.75 КБ) 552 скачивания
никогда такого не было и вот опять

Владимир Валерьевич
Сообщения: 36
Зарегистрирован: 27 мар 2016, 22:16
Благодарил (а): 9 раз

Re: BarFrame - бары вышестоящего таймфрейма

Непрочитанное сообщение Владимир Валерьевич » 08 апр 2016, 11:41

Большой респект!!!
Есть вопросы по применению
Как использовать BarFrame большего ТФ (например 1час)?
1. Достаточно H>МойИндюк или MY.BarFrame(Input,60).GetValue("H")>МойИндюк?
2. Low предыдущей часовой свечи: L[-1] или MY.BarFrame(Input,60).GetValue("L")[-1]?
3. Если надо построить например, часовую SMA (пусть по LOW), есть возможность использовать встроенный индикатор или писать свою ?
Вопросы по коду, если не затруднит ЛикБез:
1. Math.IEEERemainder - это что? С++ или что-то встроенное?
2. .TotalMinutes - ?
3. C++; - ?

Аватара пользователя
evge
Администратор
Сообщения: 1641
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 64 раза
Поблагодарили: 294 раза
Контактная информация:

Re: BarFrame - бары вышестоящего таймфрейма

Непрочитанное сообщение evge » 08 апр 2016, 12:13

Владимир Валерьевич писал(а):1. Достаточно H>МойИндюк или MY.BarFrame(Input,60).GetValue("H")>МойИндюк?


Использовать можно будет если немного доработать, вывести в отдельную серию последние значения L и H и тогда код вида

Код: Выделить всё

MY.BarFrame(Input,60).GetValue("H", 0)

будет работать

Доработка эта небольшая. Главное что основной расчет есть.

Владимир Валерьевич писал(а):Low предыдущей часовой свечи: L[-1] или MY.BarFrame(Input,60).GetValue("L")[-1]?


Как и в прежнем ответе. Но получить LOW конкретной свечи вышестоящего ТФ по индексу это [номер свечи * период]?

Владимир Валерьевич писал(а):Если надо построить например, часовую SMA (пусть по LOW), есть возможность использовать встроенный индикатор или писать свою ?


Возможно будет работать стандартная, если появится то что написано в ответе на первый и второй вопрос, и в качестве входящего параметра SMA будет выбрана эта серия.
Об этом я уже думал и хотел реализовать и протестировать позже.
Это следующий шаг.

Владимир Валерьевич писал(а):Math.IEEERemainder - это что? С++ или что-то встроенное?


Это старенькое - Возвращает остаток от деления одного указанного числа на другое указанное число.

Владимир Валерьевич писал(а):TotalMinutes - ?


TotalMinutes - Возвращает значение текущей структуры TimeSpan, выраженное как целое и дробное количество минут.

Владимир Валерьевич писал(а):C++;


Всего лишь совпадение :). ++ увеличиваем значение переменной C на 1.
никогда такого не было и вот опять

Аватара пользователя
evge
Администратор
Сообщения: 1641
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 64 раза
Поблагодарили: 294 раза
Контактная информация:

Re: BarFrame - бары вышестоящего таймфрейма

Непрочитанное сообщение evge » 08 апр 2016, 12:35

В следующей версии добавлю серии для получения OHLC свечи вышестоящего ТФ. Это чуть позже
никогда такого не было и вот опять

Владимир Валерьевич
Сообщения: 36
Зарегистрирован: 27 мар 2016, 22:16
Благодарил (а): 9 раз

Re: BarFrame - бары вышестоящего таймфрейма

Непрочитанное сообщение Владимир Валерьевич » 10 апр 2016, 15:10

Заметил вот, что:
На периоде 60, иногда бары отображаются не корректно, в основном перед последним "часовым".
5.jpg
5.jpg (61.43 КБ) 12527 просмотров

4.jpg
4.jpg (51.71 КБ) 12527 просмотров

3.jpg
3.jpg (44.63 КБ) 12527 просмотров

2.jpg
2.jpg (71.45 КБ) 12527 просмотров

1.jpg
1.jpg (53.88 КБ) 12527 просмотров

Аватара пользователя
evge
Администратор
Сообщения: 1641
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 64 раза
Поблагодарили: 294 раза
Контактная информация:

Re: BarFrame - бары вышестоящего таймфрейма

Непрочитанное сообщение evge » 10 апр 2016, 17:48

Да. Спасибо, ещё надо доработать такие моменты. Пару моментов таких я обработал, и тоже замечал местами были такие недочеты. Если проблема с ликвидностью имеется и не все свечи отрисовались за час, а так же если клиринг. Но клиринг и переход дня вроде бы как обработал, но вот неполные часы надо подумать доделать будет.

Вообще не важно какой ТФ должно это всё учитываться. Позже займусь доработками. Пока как основа этот код.
никогда такого не было и вот опять

Аватара пользователя
evge
Администратор
Сообщения: 1641
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 64 раза
Поблагодарили: 294 раза
Контактная информация:

Re: BarFrame - бары вышестоящего таймфрейма

Непрочитанное сообщение evge » 15 апр 2016, 10:36

Владимир Валерьевич писал(а):1. Math.IEEERemainder - это что? С++ или что-то встроенное?


Этот метод можно было заменить просто на %

Вот новая версия 2 индикатора, где уже рисуются OHLC серии для вышестоящего бара, их можно использовать на входе в других индикаторах, например в SMA можно указать входящую серию не CLOSE свечи, а CL индикатора и будет отрисована SMA по Close вышестоящего ТФ.

Вот скриншот, где выводится BarFrame с периодом 15, указал цвет линии Close (CL) и линии Open (OP) (для примера), которые показываются для вышестоящих баров. По CL рисуется SMA с периодом 50 - красным цветом.

BarFrame-05.png
Деомнстрация SMA по CL индикатора BarFrame


По умолчанию, OHLC вышестоящего ТФ не рисуются, т.к. указан прозрачный цвет. Можно задать свой цвет в настройках индикатора и будет отображаться как на скриншоте. Например, на скриншоте: Желтый цвет - OP(en), Черный цвет - CL(ose) вышестоящего ТФ.

Видно в заголовке скриншота
SMA(BarFrame(SRM6=ФОРТС).CL, 750)
, что задана входящая серия для SMA как значение CL индикатора BarFrame, т.е. это 50 * 15 = 750 (SMA(50) для M15)

ещё один SMA с периодом 50 (синим цветом) выведен на график для сравнения, который рисуется по CLOSE свечи

код индикатора (версия 2)

Код: Выделить всё

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++; // :)

}
никогда такого не было и вот опять

Аватара пользователя
evge
Администратор
Сообщения: 1641
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 64 раза
Поблагодарили: 294 раза
Контактная информация:

Re: BarFrame - бары вышестоящего таймфрейма

Непрочитанное сообщение evge » 15 апр 2016, 15:06

Заменил код в версии 2, т.к. нашёл пару ошибок по формированию мин \ макс (HI, LO) серий. Исправлено.
никогда такого не было и вот опять

Владимир Валерьевич
Сообщения: 36
Зарегистрирован: 27 мар 2016, 22:16
Благодарил (а): 9 раз

Re: BarFrame - бары вышестоящего таймфрейма

Непрочитанное сообщение Владимир Валерьевич » 15 апр 2016, 17:35

Вот огромное СПАСИБО!!!!!
Хотел только уточнить, что при обращении 0-я свеча - это последняя полностью сформированная
Вложения
1.jpg

Владимир Валерьевич
Сообщения: 36
Зарегистрирован: 27 мар 2016, 22:16
Благодарил (а): 9 раз

Re: BarFrame - бары вышестоящего таймфрейма

Непрочитанное сообщение Владимир Валерьевич » 15 апр 2016, 17:53

Вот еще заметил особенность:
при обращении, например вот так:
MY.BarFrame(Input,Period).GetValue("HI", 2*Period); (Period=60)
виден сдвиг.
Или я неправильно вызываю BarFrame?
Вложения
1.jpg


Вернуться в «Пользовательские индикаторы»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 4 гостя