Стратегии и роботы > Несколько входных рядов в стратегиях
-
- Сообщения: 535
- Зарегистрирован: 11 ноя 2018, 17:11
- Благодарил (а): 21 раз
- Поблагодарили: 92 раза
Несколько входных рядов в стратегиях
Бары входных данных хранятся в виде структур, где прописаны Open, High и т.д. плюс метка времени начала бара. Поэтому даже если есть пропуски данных (например, ночь, когда торгов нет), бары в списках этих структур идут подряд, там нет никаких "дыр". Поэтому, индексируя входной ряд "назад" вы просто получаете очередную структуру со своим timestamp.
То же самое и для индикаторов с той только разницей, что точки в них мы вычисляем сами, и мы на каких-то шагах можем не добавлять точку к индикатору, а на каких-то - добавлять. При этом опять же, на месте пропусков не образуется "дыра" в массиве данных. (Ведь данные хранятся не в массивах, а в списках.)
Применение, например, простого бегущего среднего к "дырявым" данным игнорирует разрывы во времени, просто берутся точки из списка по индексам. А вот при отрисовке на графике точка индикатора или входных данных рисуется не по индексу, а согласно своему timestamp, поэтому точки данных индикаторов могут отрисовываться с видимыми разрывами (например, отметки максимумов/минимумов во фрактале).
То же самое и для индикаторов с той только разницей, что точки в них мы вычисляем сами, и мы на каких-то шагах можем не добавлять точку к индикатору, а на каких-то - добавлять. При этом опять же, на месте пропусков не образуется "дыра" в массиве данных. (Ведь данные хранятся не в массивах, а в списках.)
Применение, например, простого бегущего среднего к "дырявым" данным игнорирует разрывы во времени, просто берутся точки из списка по индексам. А вот при отрисовке на графике точка индикатора или входных данных рисуется не по индексу, а согласно своему timestamp, поэтому точки данных индикаторов могут отрисовываться с видимыми разрывами (например, отметки максимумов/минимумов во фрактале).
- evge
- Администратор
- Сообщения: 1812
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 367 раз
- Контактная информация:
Re: Файловое хранилище alfadirect4.ru
Мое предположение, что ТФ торговый будет растягивать \ сжимать ТФ доп. рядов скорее всего верно.
Сделал тест запись в лог.
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
папка c:\temp должна существовать, файл inputs.txt в ней создастся сам.
Сделал тест запись в лог.
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
- Администратор
- Сообщения: 1812
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 367 раз
- Контактная информация:
Re: Несколько входных рядов в стратегиях
Интересный эффект если задаешь больший таймфрейм торгового ряда и меньших у доп рядов.
Это нужно учитывать, если в стратегии реализованы различные счетчики баров торгового ряда.
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
Это нужно учитывать, если в стратегии реализованы различные счетчики баров торгового ряда.
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
- Администратор
- Сообщения: 1812
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 367 раз
- Контактная информация:
Re: Несколько входных рядов в стратегиях
Задал 3 ряда для теста: H1, M30, M1. Один инструмент.
H1 - Торговый!
Тест за 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
H1 - Торговый!
Тест за 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()));
}
никогда такого не было и вот опять
-
- Сообщения: 30
- Зарегистрирован: 03 окт 2020, 22:38
- Благодарил (а): 12 раз
- Поблагодарили: 7 раз
Re: Несколько входных рядов в стратегиях
Я верно понимаю что "function OnUpdate()" исполняется на младшем таймфрейме, а не на торговом?
-
- Сообщения: 535
- Зарегистрирован: 11 ноя 2018, 17:11
- Благодарил (а): 21 раз
- Поблагодарили: 92 раза
Re: Несколько входных рядов в стратегиях
Это не противоречит здравому смыслу, если говорить о том, как данные хранятся.
В режиме тестирования для более длинного ТФ последняя точка (с индексом 0) - это последний закрытый бар; очередная точка будет добавлена только по истечении этого длинного ТФ.
Теперь интересно было бы взглянуть, как будут идти дела в реале, а не в тесте. В реале мы видим на графиках последнюю свечу "живой", т.е. текущие накопленные в баре данные, когда он еще не закрыт. Скажем, для основного ТФ М1 и дополнительного Н1 робот будет вызывать OnUpdate каждую минуту, при этом можно предположить, что свеча Н1 будет "живой" (неоконченной; например, в первую минуту будет просто совпадать с М1); в этом случае тут будет разбег с тестированием.
В режиме тестирования для более длинного ТФ последняя точка (с индексом 0) - это последний закрытый бар; очередная точка будет добавлена только по истечении этого длинного ТФ.
Теперь интересно было бы взглянуть, как будут идти дела в реале, а не в тесте. В реале мы видим на графиках последнюю свечу "живой", т.е. текущие накопленные в баре данные, когда он еще не закрыт. Скажем, для основного ТФ М1 и дополнительного Н1 робот будет вызывать OnUpdate каждую минуту, при этом можно предположить, что свеча Н1 будет "живой" (неоконченной; например, в первую минуту будет просто совпадать с М1); в этом случае тут будет разбег с тестированием.
-
- Сообщения: 535
- Зарегистрирован: 11 ноя 2018, 17:11
- Благодарил (а): 21 раз
- Поблагодарили: 92 раза
Re: Несколько входных рядов в стратегиях
> Я верно понимаю что "function OnUpdate()" исполняется на младшем таймфрейме, а не на торговом?
По логам Евгения так и происходит.
Забавно, по идее действительно должно вызываться по торговому.
По логам Евгения так и происходит.
Забавно, по идее действительно должно вызываться по торговому.
- evge
- Администратор
- Сообщения: 1812
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 367 раз
- Контактная информация:
Re: Несколько входных рядов в стратегиях
BugsDigger писал(а):что свеча Н1 будет "живой"
не будет, там данные по сфомированным барам.
если H1, то в текущем часе видим предыдущий, а не живой текущий.
По тестам (логам) же тоже видно что в первый час текущего дня для часовых (доп. рядов) мы видим данные прошлого дня, последнего часа.
Вообщем-то так и работало всегда, OnUpdate() на первом тике следующего бара за сформированым и в [0] мы имеем именно прошлый бар сформированный на первом тике текущего. Я не говорю про живой бар, это действительно надо проверять, что будет для доп. рядов большего ТФ чем торговый.
никогда такого не было и вот опять
- evge
- Администратор
- Сообщения: 1812
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 367 раз
- Контактная информация:
Re: Несколько входных рядов в стратегиях
BugsDigger писал(а):>Забавно, по идее действительно должно вызываться по торговому.
Лучше иметь оперативнее и больше информации, чем ожидать прихода события нового бара по ТФ торгового ряда.
Например, если ТФ торгового ряда будет больше чем доп. (H1 и M1 напимер), то на основании данных нижестоящих ТФ доп. рядов можно оперативнее принять решение по позиции. Только вопрос исполняться они тоже внутри H1 ? Если допустим там будет несколько сигналов.
Мы же ещё можем брать нижестоящий ТФ и от других инструментов.
Если так работает, то это очень даже хорошо.
никогда такого не было и вот опять
- evge
- Администратор
- Сообщения: 1812
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 367 раз
- Контактная информация:
Re: Несколько входных рядов в стратегиях
Проверил. Нет, сигналы всё равно выполняются только по 1 на торговом ТФ.
Вот код, который отправляет заявки на покупку продажу по анализу младшего ТФ, здесь он M1 (Input2 он же I2), в лог пишу событие операции.
А должны были:
из лога видно, что не 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
Вот код, который отправляет заявки на покупку продажу по анализу младшего ТФ, здесь он 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()));
}
}
А должны были:
из лога видно, что не 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
► Показать
никогда такого не было и вот опять
Вернуться в «Стратегии и роботы»
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 5 гостей