Страница 1 из 4

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

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

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

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

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

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

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

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 в ней создастся сам.

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

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

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

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

Добавлено: 10 апр 2021, 12:42
evge
Задал 3 ряда для теста: H1, M30, M1. Один инструмент.

H1 - Торговый!

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


Тест за 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()));

}

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

Добавлено: 10 апр 2021, 14:20
Jude_Masson
Я верно понимаю что "function OnUpdate()" исполняется на младшем таймфрейме, а не на торговом?

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

Добавлено: 10 апр 2021, 14:24
BugsDigger
Это не противоречит здравому смыслу, если говорить о том, как данные хранятся.

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

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

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

Добавлено: 10 апр 2021, 14:26
BugsDigger
> Я верно понимаю что "function OnUpdate()" исполняется на младшем таймфрейме, а не на торговом?

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

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

Добавлено: 10 апр 2021, 14:33
evge
BugsDigger писал(а):что свеча Н1 будет "живой"

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

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

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

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


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

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

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

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

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

Добавлено: 10 апр 2021, 15:22
evge
Проверил. Нет, сигналы всё равно выполняются только по 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 КБ) 18473 просмотра


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


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

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

из лога видно, что не 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
► Показать