Общие вопросы по разработке > Несколько вопросов по разработке
-
- Сообщения: 39
- Зарегистрирован: 05 мар 2016, 19:39
- Благодарил (а): 6 раз
- Поблагодарили: 1 раз
Несколько вопросов по разработке
Всем добрый день.
Возникли вот какие вопросы.
Почитал форум, пару файлов прикрепленных к форуму (за что огромное СПАСИБО), попробовал пару индикаторов и возникли следующие вопросы...
Верно ли, что в стратегии я не могу работать с текущим баром пока он не закрылся?
Работают ли стратегии с временными интервалами меньше минуты?
Есть ли возможность программно определить цену деления графика? В NinjaTrader это называется TickSize.
Далее вот из документации попробовал
AddLevel(70, Color.Red, LineStyles.Dot, 1, "Last"); // задание типа и толщины линии
Levels[0].Level = 12.0;
Возник вопрос как отобразить последнюю цену уровня "Last" на графике? И можно ли получить эту цену в стратегии?
Ну и самый последний вопрос возможно ли всё это хозяйство прицепить к VisualStudio для удобства программирования?
Заранее благодарен за ответы.
Возникли вот какие вопросы.
Почитал форум, пару файлов прикрепленных к форуму (за что огромное СПАСИБО), попробовал пару индикаторов и возникли следующие вопросы...
Верно ли, что в стратегии я не могу работать с текущим баром пока он не закрылся?
Работают ли стратегии с временными интервалами меньше минуты?
Есть ли возможность программно определить цену деления графика? В 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: Несколько вопросов по разработке
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 сильно ограничены. Например, вы даже свои функции не сможете реализовать в коде скриптов.
никогда такого не было и вот опять
-
- Сообщения: 39
- Зарегистрирован: 05 мар 2016, 19:39
- Благодарил (а): 6 раз
- Поблагодарили: 1 раз
Re: Несколько вопросов по разработке
Evge, спасибо большое. Ваш форум лучше любой документации. Замечательно описано да с примерами! Экономите нам самый ценный ресурс
-
- Сообщения: 39
- Зарегистрирован: 05 мар 2016, 19:39
- Благодарил (а): 6 раз
- Поблагодарили: 1 раз
Re: Несколько вопросов по разработке
Evge, добрый вечер.
Есть ли способ отрисовывать уровни по мере нахождения значений, не задавая их в Initialize()?
Я не знаю необходимого количества уровней.
Есть ли способ отрисовывать уровни по мере нахождения значений, не задавая их в Initialize()?
Я не знаю необходимого количества уровней.
- evge
- Администратор
- Сообщения: 1812
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 367 раз
- Контактная информация:
Re: Несколько вопросов по разработке
Способ есть.
Недокументированная возможность
Методом "научного тыка" у меня получилось сделать это.
В документации этого нет, но код создания уровня динамически в теле индикатора (function Evaluate() {...}) такой:
Пример:
Создали новый уровень с значением 100, красным цветом, сплошной линией, ширина линии 5.
Обращаться к нему можно будет, как обычно, Levels[0].Level = xxx; так же и к другим свойствам линии. Можно их так же менять, считывать.
Создавая следующий уровень, мы получим уровень с номером индекса в массиве Levels равным 1 и так далее.
Сколько всего уровней создано можно узнать через Levels.Count
Например это может понадобится, если надо будет обойти их все циклом
Пример для инструмента SRZ7. Хотя не важно для какого, просто пример строит заданное количество уровней в параметре Num, от 19500 с шагом 100.
Вот этот код
Это как пример изменения уже созданного уровня.
Его можно было в цикле и не прописывать и сразу прописать в конструкторе new AdsLevel(...) требуемые параметры уровня при его создании.
Параметры такие же как у и функции AddLevel() в инициализации:
AddLevel (Value, Color, LineStyle, LineWidth, SeriesName)
– создание уровня. Может быть несколько уровней.
Параметры:
• Value – значение по умолчанию
• Color – цвет уровня (значения стандартные для MicroSoft)
• LineStyle – стиль линии
• LineWidth – толщина линии
• SeriesName – имя ряда, к которому привязана линия (требуется для определения области, где будет размещена линия)
код создания Num уровней мог быть такой
результат работы:
Недокументированная возможность
Методом "научного тыка" у меня получилось сделать это.
В документации этого нет, но код создания уровня динамически в теле индикатора (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));
}
результат работы:
никогда такого не было и вот опять
-
- Сообщения: 39
- Зарегистрирован: 05 мар 2016, 19:39
- Благодарил (а): 6 раз
- Поблагодарили: 1 раз
Re: Несколько вопросов по разработке
Вот казалось бы решение на поверхности, а сам не додумался...
Гениально и просто. Спасибо!
Evge, а как вы многомерные массивы данных передаете в стратегию?
Я так понял есть рабочий вариант через файл, а Базы Данных вы подключать не пробовали?
Гениально и просто. Спасибо!
Evge, а как вы многомерные массивы данных передаете в стратегию?
Я так понял есть рабочий вариант через файл, а Базы Данных вы подключать не пробовали?
- evge
- Администратор
- Сообщения: 1812
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 367 раз
- Контактная информация:
Re: Несколько вопросов по разработке
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: Несколько вопросов по разработке
По поводу уровней.
Желательно проверять созданы ли они уже, а то насоздает триллион уровней, скушает всю память и зависнет АД4
Как произошло у меня.
так что проверочку такую желательно:
или лучше так:
Желательно проверять созданы ли они уже, а то насоздает триллион уровней, скушает всю память и зависнет АД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
- Администратор
- Сообщения: 1812
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 367 раз
- Контактная информация:
Re: Несколько вопросов по разработке
Это можно увидеть по коду.
Казалось бы он должен создавать постоянно всё новые и новые уровни с шагом 100.
Но нет. Появится только 1 уровень.
Т.е. есть какой-то момент инициализации, рисующий все объявленные уровни за раз.
Пока вижу выход в создании сразу нужного кол-ва уровней циклом за один проход и дальше работать в коде с ограниченным массивом Levels.
Может есть какая-то команда обновления (отрисовки) всех уровней, но я не знаю такой.
Код: Выделить всё
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 гостей