Общие вопросы по разработке > Несколько вопросов по разработке

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

Несколько вопросов по разработке

Непрочитанное сообщение nordseven » 29 окт 2017, 13:20

Всем добрый день.
Возникли вот какие вопросы.
Почитал форум, пару файлов прикрепленных к форуму (за что огромное СПАСИБО), попробовал пару индикаторов и возникли следующие вопросы...
Верно ли, что в стратегии я не могу работать с текущим баром пока он не закрылся?
Работают ли стратегии с временными интервалами меньше минуты?
Есть ли возможность программно определить цену деления графика? В NinjaTrader это называется TickSize.

Далее вот из документации попробовал
AddLevel(70, Color.Red, LineStyles.Dot, 1, "Last"); // задание типа и толщины линии
Levels[0].Level = 12.0;
Возник вопрос как отобразить последнюю цену уровня "Last" на графике? И можно ли получить эту цену в стратегии?
Ну и самый последний вопрос возможно ли всё это хозяйство прицепить к VisualStudio для удобства программирования?
Заранее благодарен за ответы.

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

Re: Несколько вопросов по разработке

Непрочитанное сообщение evge » 29 окт 2017, 13:54

nordseven писал(а):Верно ли, что в стратегии я не могу работать с текущим баром пока он не закрылся?


Верно, но исполнение внутри баров заявок поданных ранее возможно. Это заявки типа EnterLongLimit и EnterLongStop. Но анализ текущего состояния проводить можно только после закрытий баров.

nordseven писал(а):Работают ли стратегии с временными интервалами меньше минуты?


Работают

nordseven писал(а):Есть ли возможность программно определить цену деления графика? В NinjaTrader это называется TickSize.


GetPriceStep() - возвращает шаг цены

nordseven писал(а):Возник вопрос как отобразить последнюю цену уровня "Last" на графике? И можно ли получить эту цену в стратегии?


Присвоить уровню значение Input[0] или Input.Close[0] (зависит от того как описали в Initialize() входной ряд, Inputs.Price или Inputs.Candle)

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

AddSeries() или AddShadowSeries()

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

nordseven писал(а):Ну и самый последний вопрос возможно ли всё это хозяйство прицепить к VisualStudio для удобства программирования?


Для АД4 это лишнее. Всё можно делать и во встроенном редакторе. Отладку и прочие прелести, используя VS, всё равно не получите.
А как редактор и встроенный в АД4 подойдёт.

Скрипты в АД4 сильно ограничены. Например, вы даже свои функции не сможете реализовать в коде скриптов.
никогда такого не было и вот опять

nordseven
Сообщения: 39
Зарегистрирован: 05 мар 2016, 19:39
Благодарил (а): 6 раз
Поблагодарили: 1 раз

Re: Несколько вопросов по разработке

Непрочитанное сообщение nordseven » 29 окт 2017, 20:21

Evge, спасибо большое. Ваш форум лучше любой документации. Замечательно описано да с примерами! Экономите нам самый ценный ресурс :)

nordseven
Сообщения: 39
Зарегистрирован: 05 мар 2016, 19:39
Благодарил (а): 6 раз
Поблагодарили: 1 раз

Re: Несколько вопросов по разработке

Непрочитанное сообщение nordseven » 02 ноя 2017, 00:06

Evge, добрый вечер.
Есть ли способ отрисовывать уровни по мере нахождения значений, не задавая их в Initialize()?
Я не знаю необходимого количества уровней.

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

Re: Несколько вопросов по разработке

Непрочитанное сообщение evge » 02 ноя 2017, 07:25

Способ есть.

Недокументированная возможность :)

Методом "научного тыка" у меня получилось сделать это.

В документации этого нет, но код создания уровня динамически в теле индикатора (function Evaluate() {...}) такой:

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

Levels.Add(new AdsLevel(Уровень, Цвет, Стиль линии, Ширина));


Пример:

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

Levels.Add(new AdsLevel(100, Color.Red, LineStyles.Solid, 5));


Создали новый уровень с значением 100, красным цветом, сплошной линией, ширина линии 5.

Обращаться к нему можно будет, как обычно, Levels[0].Level = xxx; так же и к другим свойствам линии. Можно их так же менять, считывать.

Создавая следующий уровень, мы получим уровень с номером индекса в массиве Levels равным 1 и так далее.

Сколько всего уровней создано можно узнать через Levels.Count

Например это может понадобится, если надо будет обойти их все циклом

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

for (int x = 0; x < Levels.Count; x++) 
{
 Levels[x].Level = x * 100; //...
}


Пример для инструмента SRZ7. Хотя не важно для какого, просто пример строит заданное количество уровней в параметре Num, от 19500 с шагом 100.

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

function Initialize()
{
IndicatorName = "LVL_test";
PriceStudy = true;
AddInput("Input", Inputs.Price);
AddSeries("A", DrawAs.Line, Color.Red);

AddParameter("Num", 5);   
}

function Evaluate()
{

   for (int x = 0; x < Num; x++)
   {
      Levels.Add(new AdsLevel(0, Color.Red));
   
      Levels[x].Level = 19500 + x * 100;
      Levels[x].Color = Color.Red;
      Levels[x].Style = LineStyles.Solid;
      Levels[x].Width = 1;            
   }

}


Вот этот код

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

      Levels[x].Level = 19500 + x * 100;
      Levels[x].Color = Color.Red;
      Levels[x].Style = LineStyles.Solid;
      Levels[x].Width = 1;            


Это как пример изменения уже созданного уровня.
Его можно было в цикле и не прописывать и сразу прописать в конструкторе new AdsLevel(...) требуемые параметры уровня при его создании.

Параметры такие же как у и функции AddLevel() в инициализации:

AddLevel (Value, Color, LineStyle, LineWidth, SeriesName)
– создание уровня. Может быть несколько уровней.
Параметры:
Value – значение по умолчанию
Color – цвет уровня (значения стандартные для MicroSoft)
LineStyle – стиль линии
LineWidth – толщина линии
SeriesName – имя ряда, к которому привязана линия (требуется для определения области, где будет размещена линия)

код создания Num уровней мог быть такой

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

   for (int x = 0; x < Num; x++)
   {
      Levels.Add(new AdsLevel(19500 + x * 100, Color.Red, LineStyles.Solid, 1));   
   }


результат работы:

lvl-01.png
lvl-01.png (38.27 КБ) 20731 просмотр
никогда такого не было и вот опять

nordseven
Сообщения: 39
Зарегистрирован: 05 мар 2016, 19:39
Благодарил (а): 6 раз
Поблагодарили: 1 раз

Re: Несколько вопросов по разработке

Непрочитанное сообщение nordseven » 02 ноя 2017, 09:56

Вот казалось бы решение на поверхности, а сам не додумался...
Гениально и просто. Спасибо! :)
Evge, а как вы многомерные массивы данных передаете в стратегию?
Я так понял есть рабочий вариант через файл, а Базы Данных вы подключать не пробовали?

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

Re: Несколько вопросов по разработке

Непрочитанное сообщение evge » 02 ноя 2017, 11:06

nordseven писал(а):Evge, а как вы многомерные массивы данных передаете в стратегию?


многомерные массивы? Ну например в стратегии, вызвав индикатор, можно его ряды напрямую читать. Файлы и базы тут не нужны.

например так,

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

// Stochastic Oscillator
var S = SO(5,3,3);

S["D"][0]
S["Signal"][20]


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

nordseven писал(а):а Базы Данных вы подключать не пробовали?


Пробовал год назад, например, SQLite. Не получилось, ограничения в АД4, не все доступно.
никогда такого не было и вот опять

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

Re: Несколько вопросов по разработке

Непрочитанное сообщение evge » 02 ноя 2017, 12:00

По поводу уровней.

Желательно проверять созданы ли они уже, а то насоздает триллион уровней, скушает всю память и зависнет АД4 :)
Как произошло у меня.

так что проверочку такую желательно:

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

if (Levels.Count < Num)
   for (int x = 0; x < Num; x++)
   {
      Levels.Add(new AdsLevel(19500 + x * 100, Color.Red, LineStyles.Solid, 1));   
   }


или лучше так:

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

function Initialize()
{
IndicatorName = "LVL_test";
PriceStudy = true;
AddInput("Input", Inputs.Price);
AddSeries("A", DrawAs.Line, Color.Red);

AddParameter("Start", 19000);   
AddParameter("Num", 5);   
}

function Evaluate()
{
   int x = 0;
   while (Levels.Count < Num)
   {      
      Levels.Add(new AdsLevel(Start + x * 100, Color.Red, LineStyles.Solid, 1));
      x++;
   }
}
никогда такого не было и вот опять

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

Re: Несколько вопросов по разработке

Непрочитанное сообщение evge » 02 ноя 2017, 12:28

С уровнями не всё так гладко.

Динамически они создаются на каком то этапе и всё.

В процессе уже нет.
никогда такого не было и вот опять

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

Re: Несколько вопросов по разработке

Непрочитанное сообщение evge » 02 ноя 2017, 12:38

Это можно увидеть по коду.

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

function Initialize()
{
IndicatorName = "LVL_test";
PriceStudy = true;
AddInput("Input", Inputs.Price);
AddSeries("A", DrawAs.Line, Color.Red);

AddParameter("Start", 19000);   

AddGlobalVariable("Last", Types.Double, 0);
}

function Evaluate()
{
      Levels.Add(new AdsLevel(Start + Last * 100, Color.Red, LineStyles.Solid, 1));
      Last++;      
}


Казалось бы он должен создавать постоянно всё новые и новые уровни с шагом 100.

Но нет. Появится только 1 уровень.
Т.е. есть какой-то момент инициализации, рисующий все объявленные уровни за раз.

Пока вижу выход в создании сразу нужного кол-ва уровней циклом за один проход и дальше работать в коде с ограниченным массивом Levels.

Может есть какая-то команда обновления (отрисовки) всех уровней, но я не знаю такой.
никогда такого не было и вот опять


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

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

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