Стратегии и роботы > Несколько входных рядов в стратегиях

Обсуждение, описание стратегий и роботов, идеи для стратегий
BugsDigger
Сообщения: 518
Зарегистрирован: 11 ноя 2018, 17:11
Благодарил (а): 21 раз
Поблагодарили: 87 раз

Несколько входных рядов в стратегиях

Непрочитанное сообщение BugsDigger » 10 апр 2021, 11:26

Бары входных данных хранятся в виде структур, где прописаны Open, High и т.д. плюс метка времени начала бара. Поэтому даже если есть пропуски данных (например, ночь, когда торгов нет), бары в списках этих структур идут подряд, там нет никаких "дыр". Поэтому, индексируя входной ряд "назад" вы просто получаете очередную структуру со своим timestamp.

То же самое и для индикаторов с той только разницей, что точки в них мы вычисляем сами, и мы на каких-то шагах можем не добавлять точку к индикатору, а на каких-то - добавлять. При этом опять же, на месте пропусков не образуется "дыра" в массиве данных. (Ведь данные хранятся не в массивах, а в списках.)

Применение, например, простого бегущего среднего к "дырявым" данным игнорирует разрывы во времени, просто берутся точки из списка по индексам. А вот при отрисовке на графике точка индикатора или входных данных рисуется не по индексу, а согласно своему timestamp, поэтому точки данных индикаторов могут отрисовываться с видимыми разрывами (например, отметки максимумов/минимумов во фрактале).

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

Re: Файловое хранилище alfadirect4.ru

Непрочитанное сообщение evge » 10 апр 2021, 12:27

Мое предположение, что ТФ торговый будет растягивать \ сжимать ТФ доп. рядов скорее всего верно.

Сделал тест запись в лог.

2 ряда у стратегии. Оба на GAZP (но это не так важо).
Input1 - M1 - торговый ряд
Input2 - H1 - доп. ряд

В лог я писал дату и время бара для каждого из рядов, 2 строки одна за другой:

Тест стратегии за 1 день 9.04.2021.

Первая запись

Input1: BarDate:09.04.2021 0:00:00 BarTime:10:00:00
Input2: BarDate:08.04.2021 0:00:00 BarTime:18:00:00

Видим, что стратегия в OnUpdate() получила первый завершенный минутный бар Input1 и первый завершенный (ВЧЕРА) бар Input2.

И так до 11 часов,

Input1: BarDate:09.04.2021 0:00:00 BarTime:10:01:00
Input2: BarDate:08.04.2021 0:00:00 BarTime:18:00:00

Input1: BarDate:09.04.2021 0:00:00 BarTime:10:02:00
Input2: BarDate:08.04.2021 0:00:00 BarTime:18:00:00

Input1: BarDate:09.04.2021 0:00:00 BarTime:10:03:00
Input2: BarDate:08.04.2021 0:00:00 BarTime:18:00:00
...

когда появляется первый закрытый часовой бар для Input2 и появляются данные для Input2 текущего дня.

Input1: BarDate:09.04.2021 0:00:00 BarTime:10:58:00
Input2: BarDate:08.04.2021 0:00:00 BarTime:18:00:00

Input1: BarDate:09.04.2021 0:00:00 BarTime:10:59:00
Input2: BarDate:09.04.2021 0:00:00 BarTime:10:00:00


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

function Initialize()
{
   StrategyName = "Inputs";
   AddInput("Input1", Inputs.Candle, 1, true, "GAZP=МБ ЦК");
   AddInput("Input2", Inputs.Candle, 60, false, "GAZP=МБ ЦК");
}

function OnUpdate()
{

   WriteLine("c:\\temp\\inputs.txt", String.Format("Input1: BarDate:{0} BarTime:{1}",  Input1.BarDate(), Input1.BarTime()));

   WriteLine("c:\\temp\\inputs.txt", String.Format("Input2: BarDate:{0} BarTime:{1}",  Input2.BarDate(), Input2.BarTime()));

}


папка c:\temp должна существовать, файл inputs.txt в ней создастся сам.
никогда такого не было и вот опять

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

Re: Несколько входных рядов в стратегиях

Непрочитанное сообщение evge » 10 апр 2021, 12:38

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

Input1 (торговый) - H1
Input2 (доп. ряд) - M1

OnUpdate() получает управление по минимальному ТФ

Input1: BarDate:08.04.2021 0:00:00 BarTime:18:00:00
Input2: BarDate:09.04.2021 0:00:00 BarTime:10:00:00

Input1: BarDate:08.04.2021 0:00:00 BarTime:18:00:00
Input2: BarDate:09.04.2021 0:00:00 BarTime:10:01:00

Input1: BarDate:08.04.2021 0:00:00 BarTime:18:00:00
Input2: BarDate:09.04.2021 0:00:00 BarTime:10:02:00

Input1: BarDate:08.04.2021 0:00:00 BarTime:18:00:00
Input2: BarDate:09.04.2021 0:00:00 BarTime:10:03:00
никогда такого не было и вот опять

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

Re: Несколько входных рядов в стратегиях

Непрочитанное сообщение evge » 10 апр 2021, 12:42

Задал 3 ряда для теста: H1, M30, M1. Один инструмент.

H1 - Торговый!

Inputs-01.png
Inputs-01.png (11.64 КБ) 9727 просмотров


Тест за 09.04.2021

в лог пишу 3 строки подряд за итерацию

Input1: BarDate:08.04.2021 0:00:00 BarTime:18:00:00
Input2: BarDate:08.04.2021 0:00:00 BarTime:18:30:00
Input3: BarDate:09.04.2021 0:00:00 BarTime:10:00:00

Input1: BarDate:08.04.2021 0:00:00 BarTime:18:00:00
Input2: BarDate:08.04.2021 0:00:00 BarTime:18:30:00
Input3: BarDate:09.04.2021 0:00:00 BarTime:10:01:00

Input1: BarDate:08.04.2021 0:00:00 BarTime:18:00:00
Input2: BarDate:08.04.2021 0:00:00 BarTime:18:30:00
Input3: BarDate:09.04.2021 0:00:00 BarTime:10:02:00

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

function Initialize()
{
   StrategyName = "Inputs";
   AddInput("Input1", Inputs.Candle, 60, true, "GAZP=МБ ЦК");
   AddInput("Input2", Inputs.Candle, 30, false, "GAZP=МБ ЦК");
   AddInput("Input3", Inputs.Candle, 1, false, "GAZP=МБ ЦК");
}

function OnUpdate()
{

   WriteLine("c:\\temp\\inputs.txt", String.Format("Input1: BarDate:{0} BarTime:{1}",  Input1.BarDate(), Input1.BarTime()));

   WriteLine("c:\\temp\\inputs.txt", String.Format("Input2: BarDate:{0} BarTime:{1}",  Input2.BarDate(), Input2.BarTime()));

   WriteLine("c:\\temp\\inputs.txt", String.Format("Input3: BarDate:{0} BarTime:{1}",  Input3.BarDate(), Input3.BarTime()));

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

Jude_Masson
Сообщения: 30
Зарегистрирован: 03 окт 2020, 22:38
Благодарил (а): 12 раз
Поблагодарили: 7 раз

Re: Несколько входных рядов в стратегиях

Непрочитанное сообщение Jude_Masson » 10 апр 2021, 14:20

Я верно понимаю что "function OnUpdate()" исполняется на младшем таймфрейме, а не на торговом?

BugsDigger
Сообщения: 518
Зарегистрирован: 11 ноя 2018, 17:11
Благодарил (а): 21 раз
Поблагодарили: 87 раз

Re: Несколько входных рядов в стратегиях

Непрочитанное сообщение BugsDigger » 10 апр 2021, 14:24

Это не противоречит здравому смыслу, если говорить о том, как данные хранятся.

В режиме тестирования для более длинного ТФ последняя точка (с индексом 0) - это последний закрытый бар; очередная точка будет добавлена только по истечении этого длинного ТФ.

Теперь интересно было бы взглянуть, как будут идти дела в реале, а не в тесте. В реале мы видим на графиках последнюю свечу "живой", т.е. текущие накопленные в баре данные, когда он еще не закрыт. Скажем, для основного ТФ М1 и дополнительного Н1 робот будет вызывать OnUpdate каждую минуту, при этом можно предположить, что свеча Н1 будет "живой" (неоконченной; например, в первую минуту будет просто совпадать с М1); в этом случае тут будет разбег с тестированием.

BugsDigger
Сообщения: 518
Зарегистрирован: 11 ноя 2018, 17:11
Благодарил (а): 21 раз
Поблагодарили: 87 раз

Re: Несколько входных рядов в стратегиях

Непрочитанное сообщение BugsDigger » 10 апр 2021, 14:26

> Я верно понимаю что "function OnUpdate()" исполняется на младшем таймфрейме, а не на торговом?

По логам Евгения так и происходит.
Забавно, по идее действительно должно вызываться по торговому.

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

Re: Несколько входных рядов в стратегиях

Непрочитанное сообщение evge » 10 апр 2021, 14:33

BugsDigger писал(а):что свеча Н1 будет "живой"

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

Вообщем-то так и работало всегда, OnUpdate() на первом тике следующего бара за сформированым и в [0] мы имеем именно прошлый бар сформированный на первом тике текущего. Я не говорю про живой бар, это действительно надо проверять, что будет для доп. рядов большего ТФ чем торговый.
никогда такого не было и вот опять

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

Re: Несколько входных рядов в стратегиях

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

BugsDigger писал(а):>Забавно, по идее действительно должно вызываться по торговому.


Лучше иметь оперативнее и больше информации, чем ожидать прихода события нового бара по ТФ торгового ряда.

Например, если ТФ торгового ряда будет больше чем доп. (H1 и M1 напимер), то на основании данных нижестоящих ТФ доп. рядов можно оперативнее принять решение по позиции. Только вопрос исполняться они тоже внутри H1 ? Если допустим там будет несколько сигналов.

Мы же ещё можем брать нижестоящий ТФ и от других инструментов.

Если так работает, то это очень даже хорошо.
никогда такого не было и вот опять

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

Re: Несколько входных рядов в стратегиях

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

Проверил. Нет, сигналы всё равно выполняются только по 1 на торговом ТФ.

Вот код, который отправляет заявки на покупку продажу по анализу младшего ТФ, здесь он M1 (Input2 он же I2), в лог пишу событие операции.

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

function Initialize()
{
   StrategyName = "Inputs01";
   AddInput("Input1", Inputs.Candle, 60, true, "GAZP=МБ ЦК");
   AddInput("Input2", Inputs.Candle, 1, false, "GAZP=МБ ЦК");
}

А результат всего 2 операции за день:

function OnUpdate()
{
   var I1 = Input1;
   var I2 = Input2;

   if (I2.Close[0] > I2.High[1])
      {
      EnterLong();
      WriteLine("c:\\temp\\inputs.txt", String.Format("BUY: Input2: BarDate:{0} BarTime:{1}",  Input2.BarDate(), Input2.BarTime()));      
      }
   if (I2.Close[0] < I2.Low[1])
      {
      EnterShort();
      WriteLine("c:\\temp\\inputs.txt", String.Format("SELL: Input2: BarDate:{0} BarTime:{1}",  Input2.BarDate(), Input2.BarTime()));         
      }

}


Inputs-02.png
Inputs-02.png (22.29 КБ) 9637 просмотров


Inputs-03.png
Inputs-03.png (15.03 КБ) 9637 просмотров


Inputs-04.png
Inputs-04.png (18.88 КБ) 9627 просмотров

А должны были:

из лога видно, что не 2 :)
т.е. режет операции по торговому ТФ только одна операция в рамках одного бара этого ТФ

BUY: Input2: BarDate:09.04.2021 0:00:00 BarTime:10:00:00
SELL: Input2: BarDate:09.04.2021 0:00:00 BarTime:10:02:00
SELL: Input2: BarDate:09.04.2021 0:00:00 BarTime:10:07:00
BUY: Input2: BarDate:09.04.2021 0:00:00 BarTime:10:15:00
SELL: Input2: BarDate:09.04.2021 0:00:00 BarTime:10:17:00
SELL: Input2: BarDate:09.04.2021 0:00:00 BarTime:10:18:00
SELL: Input2: BarDate:09.04.2021 0:00:00 BarTime:10:20:00
BUY: Input2: BarDate:09.04.2021 0:00:00 BarTime:10:22:00
► Показать
никогда такого не было и вот опять


Вернуться в «Стратегии и роботы»

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

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