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

Re: Как в индикаторах и стратегиях получать данные вышестоящих таймфреймов?!

Добавлено: 01 июн 2018, 21:32
Victor
И еще один... как тут свой метод то написать?
Он оборачивается коментами с фразой
//----------- Код, оказавшийся вне методов -----------//

Re: Как в индикаторах и стратегиях получать данные вышестоящих таймфреймов?!

Добавлено: 01 июн 2018, 22:29
AP_Bor
Victor писал(а):И еще один... как тут свой метод то написать?
Он оборачивается коментами с фразой
//----------- Код, оказавшийся вне методов -----------//

Примерно так.
► Показать

Re: Как в индикаторах и стратегиях получать данные вышестоящих таймфреймов?!

Добавлено: 02 июн 2018, 08:07
evge
Victor писал(а):1) функция эвалуейт сама вызывается на какой-то эвент? или ее нужно вызвать?


Терминал 4.0. Скрипты пользовательских индикаторов и стратегий

Evaluate() – функция расчета служит для вычисления одной точки индикатора, которая исполняется на каждом новом баре и при изменении последней цены .

Victor писал(а):2) что значит "заполнить данные"? то-есть нужно чтобы бот все это время работал, и заполнял эти данные сам?


Находясь в нижестоящем таймфрейме данные в списке O,H,L,C на первых порах отсутсвуют. Т.е. прежде чем использовать нужно проверять есть ли что-то в списке.

Представьте, что это первые бары истории и это начало первого бара суток и ещё нет информации о его High, Low, Close. Open конечно уже мы знаем, но этого мало.

Когда исполнится условие

if (BarDate(0).Day != BarDate(1).Day)

и только в этот момент данные о первом дне попадут в списки O, H, L, C и мы сможем их далее использовать (на втором, третьем дне и т.д.)

поэтому, прежде чем обратится, например, за High предыдущего дня в H[0], надо проверить вообще списки пустые эти или нет? Для этого достаточно одной проверки (все проверять нет смысла)

Например,

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

if (O.Count > 0) { ... }


значит хотя бы 1 запись во всех списках есть и можно анализировать.

Victor писал(а):Мне нужно при запуске бота (в, допустим, минутном таймфрейме) как-то получить несколько последних дневных баров. Сразу при запуске. Как это сделать?


как то так:

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

// когда списки пусты, производим
// первоначальное заполнение 5 предыдущих дней относительно таймфрейма минутного
if (O.Count == 0)
for (int x = 1; x < 4100; x++)
{
if (BarDate(x) != BarDate(x+1))
{
   O.Insert(0, Open); H.Insert(0, Max); L.Insert(0, Min); C.Insert(0, Input.Close[x+1]);
   var CN = O.Count;
   if (CN > Period) { O.RemoveAt(CN - 1); H.RemoveAt(CN - 1); L.RemoveAt(CN - 1); C.RemoveAt(CN - 1); }
   Min = Double.MaxValue; Max = 0.0; Open = Input.Open[x];
}
if (Input.Low[x] < Min) Min = Input.Low[x];
if (Input.High[x] > Max) Max = Input.High[x];
}

// здесь мы продолжаем наполнять новыми данными списки при переходе через новый день
if (BarDate(0) != BarDate(1))
{
   O.Insert(0, Open); H.Insert(0, Max); L.Insert(0, Min); C.Insert(0, Input.Close[1]);
   var CN = O.Count;
   if (CN > Period) { O.RemoveAt(CN - 1); H.RemoveAt(CN - 1); L.RemoveAt(CN - 1); C.RemoveAt(CN - 1); }
   Min = Double.MaxValue; Max = 0.0; Open = Input.Open[0];
}
if (Input.Low[0] < Min) Min = Input.Low[0];
if (Input.High[0] > Max) Max = Input.High[0];



Всё это будет неактуально, когда в АД4 реализуют получение данных от других ТФ и желательно с возможностью чтения других инструментов из одной стратегии.

Но пока этого нет :(

Re: Как в индикаторах и стратегиях получать данные вышестоящих таймфреймов?!

Добавлено: 04 июн 2018, 12:09
Victor
Да.. спасибо AP_Bor, evge, oxi. Все менее круто чем я ожидал :) Не знаете как отправить им фича реквест? Нужно как-то запилить возможность свой хелпер(хотябы статический) писать.

Re: Как в индикаторах и стратегиях получать данные вышестоящих таймфреймов?!

Добавлено: 04 июн 2018, 13:09
evge

Re: Как в индикаторах и стратегиях получать данные вышестоящих таймфреймов?!

Добавлено: 04 июн 2018, 14:28
Victor
Написал :) Нужно еще идею про интелисенс закинуть. Чувствую себя инвалидом.

В документе описано что делает Evaluate(), примеры есть, все ок. Но не написано почему Evaluate() заворачивается в коментарий при попытке сохранить стратегию... Или эта штука только для "индикаторов" и они редактируются где-то в другом меню? - Сам себе ответил :) А где это меню, кстати?

Народ, как вы дебажите это? Пишите в файл?

Re: Как в индикаторах и стратегиях получать данные вышестоящих таймфреймов?!

Добавлено: 28 авг 2020, 17:26
star
evge писал(а):Пока не реализован в АД4 доступ к более чем одному входным рядам, приходится "извращаться" в получении данных вышестоящих таймфреймов.


А на сегодня 28.08.2020 реализовали?

Re: Как в индикаторах и стратегиях получать данные вышестоящих таймфреймов?!

Добавлено: 28 авг 2020, 17:32
evge
Скорее нет, чем да. Не было такой информации об обновлениях.

Re: Как в индикаторах и стратегиях получать данные вышестоящих таймфреймов?!

Добавлено: 28 авг 2020, 18:08
star
evge писал(а):Скорее нет, чем да. Не было такой информации об обновлениях.


1. При переключении с таймфрейма на таймфрейм, можно ли узнать какой именно текущий тайм фрейм?
2. Глобальные переменные сохраняют ли свое значение после переключений с таймфрейма на таймфрейм?

Идея такая: пощелкать по таймфреймам (Mon, W, D); один раз сохранить в глобальных переменных значения OCHL, потом чертить по ним уровни на всех таймфреймах

Re: Как в индикаторах и стратегиях получать данные вышестоящих таймфреймов?!

Добавлено: 28 авг 2020, 19:22
evge
между перерисовками они инициализируются заново, в стратегиях (роботах) хранятся всю их жизнь.

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

function Initialize()
{
IndicatorName = "ReDraw";
PriceStudy = true;
AddInput("Input", Inputs.Price);
AddSeries("A", DrawAs.Line, Color.Red);
AddGlobalVariable("x", Types.Boolean, false);
}

function Evaluate()
{
if (!x) { ShowMessage("ReDraw, Initialize, Timeframe = " + Input.Timeframe); x = true; }
}


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

про таймфрейм здесь

Поведение только странное у Input.TimeFrame. По умолчанию 1 минута = 1, даже если на графике другой ТФ, например часовой H1.
Но если сменить таймфрейм, то Input.TimeFrame меняет значение на правильное и при смене обратно тоже сменит на верное, например на H1, уже показывать будет = 60