Общие вопросы по разработке > Как узнать в индикаторе номер свечи открытия дня?

Общие вопросы по разработке в Альфа-Директ 4. Обсуждение разработки пользовательских индикаторов, стратегий.
Владимир
Сообщения: 84
Зарегистрирован: 14 ноя 2016, 02:17
Благодарил (а): 3 раза
Поблагодарили: 5 раз

Как узнать в индикаторе номер свечи открытия дня?

Непрочитанное сообщение Владимир » 06 апр 2017, 21:31

Добрый день! Подскажите как узнать в индикаторе номер свечи открытия дня?
Имеется ввиду не цену открытия и т.п.

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

if (BarDate() > BarDate(-1))
{A = Input.Open[0];}
или
if (BarTime() == AsTime(10, 00, 00))
A = Input.Open[0];


Побывал

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

int Ox=0;
int Hx=0;
int Lx=0;
int Cx=0;
// закончился дневной бар и начался новый
// сохраняем дневные данные в списках
if (BarDate(0).Day != BarDate(1).Day)
{
   // новый бар
   O.Insert(0, Input.Open[0]);
   H.Insert(0, Input.High[0]);
   L.Insert(0, Input.Low[0]);
   C.Insert(0, Input.Low[0]);
    // лишнее удаляем
  var CN = O.Count;
   if (O.Count > 0)
   {
  Ox=(int)(O.Count);
  Hx=(int)(H.Count);
  Lx=(int)(L.Count);
  Cx=(int)(C.Count);
 }
   LogData ( " // Ox - " + Convert.ToString(Ox) +" // Hx - " + Convert.ToString(Hx) +" // Lx - " + Convert.ToString(Lx) +" // Cx - " + Convert.ToString(Cx) , IndicatorName);

   if (CN > Period)
   {
      O.RemoveAt(CN - 1);
      H.RemoveAt(CN - 1);
      L.RemoveAt(CN - 1);
      C.RemoveAt(CN - 1);
   }
}
}

в лог попадает какая то ерунда
2017.04.06 21:13:07.927 // Ox - 1 // Hx - 1 // Lx - 1 // Cx - 1
2017.04.06 21:13:08.207 // Ox - 1 // Hx - 1 // Lx - 1 // Cx - 1
2017.04.06 21:13:16.002 // Ox - 1 // Hx - 1 // Lx - 1 // Cx - 1
2017.04.06 21:13:16.002 // Ox - 2 // Hx - 2 // Lx - 2 // Cx - 2
2017.04.06 21:13:16.002 // Ox - 3 // Hx - 3 // Lx - 3 // Cx - 3
2017.04.06 21:13:16.002 // Ox - 4 // Hx - 4 // Lx - 4 // Cx - 4
2017.04.06 21:13:16.002 // Ox - 5 // Hx - 5 // Lx - 5 // Cx - 5
2017.04.06 21:13:16.002 // Ox - 6 // Hx - 6 // Lx - 6 // Cx - 6
2017.04.06 21:13:16.002 // Ox - 7 // Hx - 7 // Lx - 7 // Cx - 7
2017.04.06 21:13:16.002 // Ox - 8 // Hx - 8 // Lx - 8 // Cx - 8
2017.04.06 21:13:16.002 // Ox - 9 // Hx - 9 // Lx - 9 // Cx - 9
2017.04.06 21:13:16.002 // Ox - 10 // Hx - 10 // Lx - 10 // Cx - 10
2017.04.06 21:13:16.002 // Ox - 11 // Hx - 11 // Lx - 11 // Cx - 11

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

Re: Как узнать в индикаторе номер свечи открытия дня?

Непрочитанное сообщение evge » 07 апр 2017, 06:13

Если Вы определили бар открытия дня, сохраняйте его индекс (например, в глоб. переменной)

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

A = CurrentIndex;

В дальнейшем, к данным этого бара в истории можно будет обратится так:

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

Input.Close[CurrentIndex - A];


CurrentIndex - A - это смещение относительно текущего бара
никогда такого не было и вот опять

Владимир
Сообщения: 84
Зарегистрирован: 14 ноя 2016, 02:17
Благодарил (а): 3 раза
Поблагодарили: 5 раз

Re: Как узнать в индикаторе номер свечи открытия дня?

Непрочитанное сообщение Владимир » 07 апр 2017, 09:25

Добрый день! Евгений, можно пример подробней описать пробую не получается

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

   int Ax1=0;    int Ax2=0;    int Ax3=0;
    if (BarTime() == AsTime(10, 00, 00))
      {  Ax1 = CurrentIndex;

      LogData ("Ax1 - " + Convert.ToString(Ax1), IndicatorName);
      }
   if (BarDate() > BarDate(-1))
      {  Ax2 = CurrentIndex;

      LogData ("Ax2 - " + Convert.ToString(Ax2), IndicatorName);
      }
 if (BarDate(0).Day != BarDate(1).Day)
       {  Ax3 = CurrentIndex;

      LogData ("Ax3 - " + Convert.ToString(Ax3), IndicatorName);
      }

2017.04.07 09:16:05.117 Ax1 - 1048
2017.04.07 09:16:05.117 Ax2 - 1048
2017.04.07 09:16:05.117 Ax3 - 1048
2017.04.07 09:16:05.117 Ax1 - 1210
2017.04.07 09:16:05.117 Ax2 - 1210
2017.04.07 09:16:05.117 Ax3 - 1210

таймфрейм 5 минут, значение должно быть 162

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

Re: Как узнать в индикаторе номер свечи открытия дня?

Непрочитанное сообщение evge » 07 апр 2017, 09:44

1210 - 1048 = 162
никогда такого не было и вот опять

Владимир
Сообщения: 84
Зарегистрирован: 14 ноя 2016, 02:17
Благодарил (а): 3 раза
Поблагодарили: 5 раз

Re: Как узнать в индикаторе номер свечи открытия дня?

Непрочитанное сообщение Владимир » 07 апр 2017, 09:48

Евгений выкладываю лог
Я просто не понимаю как это будет выглядеть "1210 - 1048 = 162" программно
Вложения
EmulatorTimeFrame.log
(6.34 КБ) 2579 скачиваний
Последний раз редактировалось Владимир 07 апр 2017, 09:54, всего редактировалось 2 раза.

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

Re: Как узнать в индикаторе номер свечи открытия дня?

Непрочитанное сообщение evge » 07 апр 2017, 09:53

По логу всё отлично, выкидываем первые значения, так как мы не уверены с какой точки история загрузилась :) это скорее всего не было началом дня. А значит разницу между первой точкой и точкой далее смысла высчитывать нет (в случае если мы ждём ~160 баров), а в целом смысл есть :). Вот далее всё ок ~160 баров.

2017.04.07 09:38:29.440 Ax1 - 84

2017.04.07 09:38:29.440 Ax1 - 245

245 - 84 = 161

2017.04.07 09:38:29.441 Ax1 - 406

406 - 245 = 161

2017.04.07 09:38:29.441 Ax1 - 566

566 - 406 = 160

2017.04.07 09:38:29.441 Ax1 - 725

725 - 566 = 159

2017.04.07 09:38:29.441 Ax1 - 887

887 - 725 = 162
никогда такого не было и вот опять

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

Re: Как узнать в индикаторе номер свечи открытия дня?

Непрочитанное сообщение evge » 07 апр 2017, 09:57

повторю, хранить индекс начала последнего дня лучше в глоб переменной или списке (для всех дней), объявленной в initialize() {...}
т.к. необходимо иметь возможно получить это значение в последующих вызовах Evaluate() {...}
Для вычисления индекса смещения относительно текущего бара.

У вас в примере объявлены локальные переменные их же вы и пишите в лог. Разницу (смещение) вы не высчитаете в этом случае.
никогда такого не было и вот опять

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

Re: Как узнать в индикаторе номер свечи открытия дня?

Непрочитанное сообщение evge » 07 апр 2017, 10:18

Пример

DayBar-01.png
DayBar-01.png (31.67 КБ) 44281 просмотр


Параметром передаем сколько мы хотим хранить индексов начала бара дней.
Для примера, в серию выводим смещение относительно текущего бара до последнего индекса бара начала дня, т.е. сколько баров прошло от начала текущего дня (дня видимо последнего бара графика) :)

Ничего не мешает использовать весь список для анализа т.е. D[0], D[1], ... D[D.Count-1] - в нём хранятся значения индекса бара начала предыдущих дней.
Чтобы получить, например, цену открытия 5 дней назад код такой

Input.Open(CurrentIndex - D[4]);

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

function Initialize()
{
IndicatorName = "DayBar";
PriceStudy = false;
AddInput("Input", Inputs.Candle);
AddSeries("Shift", DrawAs.Histogram, Color.Red);

AddParameter("Days", 20); // размерность списка (сколько индексов баров начала дня сохранять в список)

AddGlobalVariable("D", Types.IntList); //Список индексов начала дня
}

function Evaluate()
{

//Новый день
if (BarDate(0) != BarDate(1))
{
   D.Insert(0, CurrentIndex);
   if (D.Count > Days) D.RemoveAt(D.Count - 1);
}


if (D.Count > 0)
{
   Shift = CurrentIndex - D[0];
}

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

Владимир
Сообщения: 84
Зарегистрирован: 14 ноя 2016, 02:17
Благодарил (а): 3 раза
Поблагодарили: 5 раз

Re: Как узнать в индикаторе номер свечи открытия дня?

Непрочитанное сообщение Владимир » 07 апр 2017, 10:28

Евгений спасибо! работает

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

Re: Как узнать в индикаторе номер свечи открытия дня?

Непрочитанное сообщение evge » 07 апр 2017, 10:34

ещё момент!
обратите внимание на подгружаемую историю
если не ставить в параметре 3ый параметр :) то история будет выбрана автоматом, например от начала видимой части графика.
чтоб принудительно подгрузить нужную историю надо добавить ещё один параметр, или в Days указать третий параметр (множитель)

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

AddParameter("History", 2000, 1); //загружаем историю не менее 2000 баров
никогда такого не было и вот опять


Вернуться в «Общие вопросы по разработке»

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

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