Общие вопросы по разработке > Как задавать и определять временные интервалы и тайм-фреймы в индикаторе

Общие вопросы по разработке в Альфа-Директ 4. Обсуждение разработки пользовательских индикаторов, стратегий.
VDV
Сообщения: 6
Зарегистрирован: 11 май 2016, 18:42
Благодарил (а): 1 раз

Как задавать и определять временные интервалы и тайм-фреймы в индикаторе

Непрочитанное сообщение VDV » 11 май 2016, 19:12

Добрый день.

Так и не понял, из предлагаемой документации, как задавать период расчета индикатора и тайм-фрейм индикатора?
Как в индикаторе определить в каком тайм-фрейме он выполняется в данный момент, что бы адаптировать результат?
Как, например, разделить в расчете дневную и вечерние сессии ( с 10:00 до 18:45 и с 19:00 до 23:50 )?
Как вызвать внешний индикатор с тайм-фреймом отличным от текущего?

Что означает запись, применительно к периоду или тайм-фрейму:
AddParameter("Period", 20, 1);
или
AddParameter("Period", 14);

Спасибо.

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

Re: Как задавать и определять временные интервалы и тайм-фреймы в индикаторе

Непрочитанное сообщение evge » 11 май 2016, 19:38

VDV писал(а):Так и не понял, из предлагаемой документации, как задавать период расчета индикатора и тайм-фрейм индикатора?


VDV писал(а):Как в индикаторе определить в каком тайм-фрейме он выполняется в данный момент, что бы адаптировать результат?


Задавать на сегодня никак. Индикаторы работают в заданном таймфрейме графика / стратегии. Обещали в будущем реализовать.
Получать текущий ТФ загляните в местный FAQ, конечно не очень красиво, но можно использовать.

VDV писал(а):Как, например, разделить в расчете дневную и вечерние сессии ( с 10:00 до 18:45 и с 19:00 до 23:50 )?


Аналогично из FAQ. Что-то подобное:

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

BarTime(0) >= AsTime(10, 0, 0) && BarTime(0) <= AsTime(18, 45, 0)


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

BarTime(0) >= AsTime(19, 0, 0) && BarTime(0) <= AsTime(23, 50, 0)


VDV писал(а):Как вызвать внешний индикатор с тайм-фреймом отличным от текущего?


Пока никак. Только в текущем ТФ.

VDV писал(а):Что означает запись, применительно к периоду или тайм-фрейму:
AddParameter("Period", 20, 1);
или
AddParameter("Period", 14);


Ответ есть в FAQ.

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

AddParameter("A", 500, 1); //загрузит не менее 500 точек истории
AddParameter("A", 500, 2); //загрузит не менее 1000 точек истории


т.е. это принудительно загрузит историю инструмента для расчетов, равную значению параметра2 * параметр3
никогда такого не было и вот опять

VDV
Сообщения: 6
Зарегистрирован: 11 май 2016, 18:42
Благодарил (а): 1 раз

Re: Как задавать и определять временные интервалы и тайм-фреймы в индикаторе

Непрочитанное сообщение VDV » 11 май 2016, 23:11

Сравнение объектов времени понятно:

> BarTime(0) >= AsTime(10, 0, 0)

Дата бара возвращается функцией BarDate(n).
Функция AsDate - существует или только AsTime? В документе AsDate нет.

> BarDate(0) >= AsDate(ГГ,ММ,ДД) ???

Какие свойства существуют для объектов времени и даты?
Они делятся на объекты Время и Дата или это все один объект DateTime?
> DateTime.???
>>> DateTime.Today
>>> DateTime.DayOfWeek
>>> ...
Это же не полный список?
Как из DateTime/AsTime получить значение ГОД, МЕСЯЦ, ДЕНЬ, ЧАСЫ, МИНУТЫ, СЕКУНДЫ?
Часы в каком формате отдаются (12/24 часа) и можно ли его выбрать?


При вызове индикатора ему передаются параметры:

> var sEMA = MY.MYEMA(Input, 10);

Input - это копия ряда данных, который получен в текущей длине ТФ и это базовый функционал?
Если параметр Input не указан, то какой ряд и в каком ТФ индикатор получит или может загрузить самостоятельно?
Если это тот ряд который будет загружен по ссылке Inputs.Candle или Inputs.Price в индикаторе, то как отреагирует движок АД, если тип переданного ряда, не совпадет с типом ожидаемого?

10 - это что за параметр и как его получить, для обработки, в вызываемом индикаторе из функции Initialize() или Evaluate()?
Или это тоже обязательный и базовый параметр который только для движка АД? Тогда, что он подразумевает?


Кумулятивный документ по функциям и их свойствам где можно посмотреть?
Очень тягостно по любому вопросу лопатить форум или другие исходники.
Особенно когда даже не знаешь как называется то, что ищешь.

.

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

Re: Как задавать и определять временные интервалы и тайм-фреймы в индикаторе

Непрочитанное сообщение evge » 12 май 2016, 09:12

VDV писал(а):Кумулятивный документ по функциям и их свойствам где можно посмотреть?
Очень тягостно по любому вопросу лопатить форум или другие исходники.
Особенно когда даже не знаешь как называется то, что ищешь.


Хотел бы уточнить один момент.
Я такой же пользователь АД4 как и Вы и официальных ответов от меня не следует ожидать.

Сам я информацию черпаю из следующих источников:


Пытаюсь многое систематизировать и выложить здесь на форуме.
Создал тему FAQ (Frequently Asked Questions) - часто задаваемые вопросы, в который собираю вопросы, подобные Вашим. Постепенно его наполняю.

Многие ответы на свои вопросы Вы найдете в ссылках выше.

Если Вы хотите ответов официальных от представителя АД, то можно задать вопрос на официальном форуме.
Обычно там оперативно отвечает Дмитрий Еремин (ox), за что ему огромное спасибо!

Этот форум предназначен для более удобного обмена информацией, в дополнение к официальному форуму от АД.

Постараюсь позже ответить на Ваши вопросы тут и перенести в FAQ.
никогда такого не было и вот опять

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

Re: Как задавать и определять временные интервалы и тайм-фреймы в индикаторе

Непрочитанное сообщение evge » 12 май 2016, 10:21

VDV писал(а):Дата бара возвращается функцией BarDate(n).
Функция AsDate - существует или только AsTime? В документе AsDate нет.

> BarDate(0) >= AsDate(ГГ,ММ,ДД) ???

Какие свойства существуют для объектов времени и даты?
Они делятся на объекты Время и Дата или это все один объект DateTime?
> DateTime.???
>>> DateTime.Today
>>> DateTime.DayOfWeek
>>> ...
Это же не полный список?
Как из DateTime/AsTime получить значение ГОД, МЕСЯЦ, ДЕНЬ, ЧАСЫ, МИНУТЫ, СЕКУНДЫ?
Часы в каком формате отдаются (12/24 часа) и можно ли его выбрать?


Дополнительно свойства и методы можно подсмотреть тут:

Для даты
DateTime - структура

Для времени
TimeSpan - структура
никогда такого не было и вот опять

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

Re: Как задавать и определять временные интервалы и тайм-фреймы в индикаторе

Непрочитанное сообщение evge » 12 май 2016, 10:43

VDV писал(а):> var sEMA = MY.MYEMA(Input, 10);

Input - это копия ряда данных, который получен в текущей длине ТФ и это базовый функционал?
Если параметр Input не указан, то какой ряд и в каком ТФ индикатор получит или может загрузить самостоятельно?
Если это тот ряд который будет загружен по ссылке Inputs.Candle или Inputs.Price в индикаторе, то как отреагирует движок АД, если тип переданного ряда, не совпадет с типом ожидаемого?


Передаваемый параметр Input должен быть того типа, что задан в запрашиваемом индикаторе. Это логично.

Передавайте туда Price или Candle вашего скрипта.

Допустип, Ваш индикатор (или скрипт стратегии) имеет на входе Inputs.Candle, а запрашиваемый индикатор ждёт от вас Inputs.Price.

Достаточно вызвать его так: MY.MYIND(Input.Close, 10)

т.е. из типа Candle мы передаем только ряд цены закрытия в индикатор. (пример есть в ответе на следующий вопрос, ниже)

А вот обратного не получится (если не ошибаюсь). Если индикатор просит Candle на вход, а Ваш индикатор работает с рядом Price, передать Candle на вход не получится, т.к. у Вас нет этой структуры.

Реакцию движка АД4 не пробовал проверять, думаю никак не среагирует. Либо будет ошибка, либо результат пустой. Попробуйте экспериментально.

VDV писал(а):10 - это что за параметр и как его получить, для обработки, в вызываемом индикаторе из функции Initialize() или Evaluate()?
Или это тоже обязательный и базовый параметр который только для движка АД? Тогда, что он подразумевает?


Это значение для параметра вызываемого индикатора, который Вы желаете передать ему на вход.
Например, для EMA Вы передаете в первом параметре ряд, вторым параметром идёт период EMA, т.к. в этом индикаторе 1 параметр на входе то на этом всё. В Вашем случае 10 это вызов EMA с периодом 10.

10 - может быть не константой, а переменной.

Ничего не мешает передать туда значение настраиваемого параметра заданного в Initialize() для вашего скрипта, или глобальной переменной, или любой другой переменной рассчитанной в Evaluate().

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

function Initialize()
{
AddInput("Input", Inputs.Candle);
AddParameter("Period", 30, 1);
}

function Evaluate()
{

/* ... */
MA = EMA(Input.Close, Period); //передаем из Candle только ряд цен закрытия на вход индикатору, и период заданный в секции Initialize()
/* ... */

// пример обращения к значению EMA. 15 свечей назад,
// MA[15]
}


и вообще параметров может быть более чем 1 в индикаторе

поэтому вызов типа

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

MY.XXX(Input.Close, X1, X2, X3, ... Xn)


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

VDV
Сообщения: 6
Зарегистрирован: 11 май 2016, 18:42
Благодарил (а): 1 раз

Re: Как задавать и определять временные интервалы и тайм-фреймы в индикаторе

Непрочитанное сообщение VDV » 12 май 2016, 23:37

Спасибо.

Достаточно конкретно все разложено по пунктам.
Остался не раскрытым один вопрос, как получить (принять) переданные параметры?
Речь не о том как их передать, а как в самом Индикаторе получить эти данные?
Какие константы или функции для этого предусмотрены?

Вызвал я Индикатор:

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

var res = MY.XXX(Input.Close, X1, X2, X3, ... Xn)


Теперь в самом индикаторе как мне получить:
1. Количество параметров.
2. Значения этих параметров.

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

function Initialize()
{
  AddInput("Input", ПАРАМЕТР№1);
  AddParameter("Period", ПАРАМЕТР№2, ПАРАМЕТР№3);
}


И после обработки необходимо результирующий ряд OUTPUT, вернуть как результат и завершить выполнение.
Как это сделать внутри самого индикатора, например функция:

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

function Evaluate()
{
  /* ... */
   RETURN( OUTPUT );
}


Или предусмотрена иная конструкция?

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

Re: Как задавать и определять временные интервалы и тайм-фреймы в индикаторе

Непрочитанное сообщение evge » 13 май 2016, 07:13

VDV писал(а):Речь не о том как их передать, а как в самом Индикаторе получить эти данные?
Какие константы или функции для этого предусмотрены?


Вызывая индикатор MY.XXX(Input.Price, x1, x2, x3) Вы должны знать сколько в индикаторе входных параметров.

Эти параметры заданы в секции Initialize() вызываемого индикатора.
В случае если это MY.XXX, где MY. говорит о том что это пользовательский индикатор.

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

function Initialize()
{
  /* ... */
  AddInput("Input", Inputs.Price);
  AddParameter("x1", 10); // 10 - значение по умолчанию для параметра x1
  AddParameter("x2", 20); // 20 - значение по умолчанию для параметра x2
  AddParameter("x3", 30); // 30 - значение по умолчанию для параметра x3
  /* ... */
}


Если вызвать такой индикатор, например так MY.XXX(Input.Price, 50, 100, 150), то в функции Evaluate() будут переданы эти значения
x1 = 50, x2 = 100, x3 = 150 (вместо значений по умолчанию). Вам нужно просто логику понять, никаких функций и констант не требуется для получения списка параметров, т.к. в этом нет необходимости. Параметры задаются на стадии создания индикатора и они известны заранее их количество и последовательность. Их Вы и задаете при вызове из другого скрипта индикатора \ стратегии.

VDV писал(а):И после обработки необходимо результирующий ряд OUTPUT, вернуть как результат и завершить выполнение.
Как это сделать внутри самого индикатора, например функция:


Это описано в документации по скриптам индикаторов и стратегий.
Вам ничего не надо заполнять дополнительно, т.к. индикатор заполняет результирующую серию \ серии.
И если серия одна то обращаться к результатам очень просто:

вот так:

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

var R = MY.XXX(Input.Close, x1, x2, x3);

R[0]  // последнее значение результирующей серии индикатора;
R[10] // значение 10 точек назад результирующей серии индикатора;

// и т.д.



Если же индикатор заполняет более 1 серии, например 3-5 линий рисует, то к ним надо обращаться иначе, по имени серии. Вот так:

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

var R = MY.XXX(Input.Close, x1, x2, x3);

R.GetValue(“Low”, 0); // последнее значение результирующей серии Low индикатора;
R.GetValue(“High”, 0); // последнее значение результирующей серии High индикатора;
R.GetValue(“Low”, 10); // значение 10 точек назад результирующей серии Low индикатора;
R.GetValue(“High”, 10); // значение 10 точек назад результирующей серии High индикатора;

// и т.д.



т.е. в этом индикаторе XXX задано 2 результирующие серии (или более) Low и High
никогда такого не было и вот опять

VDV
Сообщения: 6
Зарегистрирован: 11 май 2016, 18:42
Благодарил (а): 1 раз

Re: Как задавать и определять временные интервалы и тайм-фреймы в индикаторе

Непрочитанное сообщение VDV » 16 май 2016, 18:19

Гадать, всегда не благодарное занятие.

В официальной документации, есть только одно упоминание по функции:

AddParameter(Name, Value) или AddParameter(Name, Value, Length) – функция добавление в индикатор параметра, который можно задавать через форму настройки.
ОЧЕНЬ неопределенная формулировка.

И ни слова про то, что она используется для выборки параметров, которые передаются при ее вызове.

В конструкции:

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

function Initialize()
{
  /* ... */
  AddInput("Input", Inputs.Price);
  AddParameter("x1", 10); // 10 - значение по умолчанию для параметра x1
  AddParameter("x2", 20); // 20 - значение по умолчанию для параметра x2
  AddParameter("x3", 30); // 30 - значение по умолчанию для параметра x3
  /* ... */
}


Вызов:

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

AddInput("Input", Inputs.Price); // <== ЯВЛЯЕТСЯ ОБЯЗАТЕЛЬНЫМ?


Он принимает входной ряд, который в свою очередь передается всегда первым?

Это подразумевается из вызова Индикатора:

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

var R = MY.XXX(Input.Close, x1, x2, x3);


И если поменять последовательность вызова, то могут быть проблемы?
Например так:

Вызываем Индикатор:

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

var R = MY.XXX(Input.Close, x1, x2, x3);


Запускаем:

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

function Initialize()
{
  /* ... */
  AddParameter("x1", 10); // 10 - значение по умолчанию для параметра x1
  AddParameter("x2", 20); // 20 - значение по умолчанию для параметра x2
  AddInput("Input", Inputs.Price);
  AddParameter("x3", 30); // 30 - значение по умолчанию для параметра x3
  /* ... */
}


Это уже не сработает?

И как в этой конструкции понять какие результирующие ряды принимаются, для отображения нескольких линий?

Если же индикатор заполняет более 1 серии, например 3-5 линий рисует, то к ним надо обращаться иначе, по имени серии. Вот так:

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

var R = MY.XXX(Input.Close, x1, x2, x3);

R.GetValue(“Low”, 0); // последнее значение результирующей серии Low индикатора;
R.GetValue(“High”, 0); // последнее значение результирующей серии High индикатора;
R.GetValue(“Low”, 10); // значение 10 точек назад результирующей серии Low индикатора;
R.GetValue(“High”, 10); // значение 10 точек назад результирующей серии High индикатора;


// и т.д.


Если индикатор заполнил несколько рядов, то в какой последовательности они передаются?
В последовательности в которой объявлялись?

.

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

Re: Как задавать и определять временные интервалы и тайм-фреймы в индикаторе

Непрочитанное сообщение evge » 16 май 2016, 20:24

VDV писал(а):Гадать, всегда не благодарное занятие.

В официальной документации, есть только одно упоминание по функции:

AddParameter(Name, Value) или AddParameter(Name, Value, Length) – функция добавление в индикатор параметра, который можно задавать через форму настройки.
ОЧЕНЬ неопределенная формулировка.

И ни слова про то, что она используется для выборки параметров, которые передаются при ее вызове.


Возможно. Но мне было достаточно что бы понять.

VDV писал(а):AddInput("Input", Inputs.Price); // <== ЯВЛЯЕТСЯ ОБЯЗАТЕЛЬНЫМ?


Этим вы инициализируете нужный Вам тип ряда под именем "Input".
Он является обязательным, т.к. без входных данных что вы собираетесь анализировать?

VDV писал(а):И если поменять последовательность вызова, то могут быть проблемы?


нет, ничего не изменится в Вашем примере. А вот если параметры местами поменять изменится.

Input к ним не относится.

VDV писал(а):И как в этой конструкции понять какие результирующие ряды принимаются, для отображения нескольких линий?


по имени выходного ряда AddSeries("Name",...) вызываемого индикатора.

VDV писал(а):Если индикатор заполнил несколько рядов, то в какой последовательности они передаются?
В последовательности в которой объявлялись?


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


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

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

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