• Demo счет NinjaTrader, регистрируется в брокерской компании NinjaTrader Brokerage . NinjaTrader™, LLC
    Ссылка на демо счет NinjaTrader
    Фид на соединении Continuum/CQG.
    Для справки: Continuum - это брэнд CQG, и ни чем они не отличаются друг от друга.
  • Сколько я реально плачу комиссии?
    Подробнее по ссылке

Торговать из индикатора или вызов стратегии из индикатора

NoName

Member
NinjaTrader
#1
Почему если в индикаторе в функции OnBarUpdate() выставлять ордер таким образом:
Strategy.EnterShortLimit(0, true, 1, PRICE_VOLUME - 1 * TickSize, "sell"); - то он не работает, в отладчике просто выбивает на этой строке. Можно ли как-то по другому из индикатора выставить ордер?
Или можно ли как-то при определенных условиях в индикаторе вызывать стратегию и в ней уже выставлять ордера?
 
#2
Вы вызываете нестатическую функцию класса не имея объекта этого класса, естественно, это приведет к крашу. Существует несколько методов работы с ордерами из индикатора, поищите по ключевому слову Order в метаданных основных классов NT7.
 

NoName

Member
NinjaTrader
#3
Не это ли Вы имели ввиду?

"Вы вызываете нестатическую функцию класса не имея объекта этого класса" - это да, понял ошибку, спасибо.
"..поищите по ключевому слову Order в метаданных основных классов NT7." - можно подробнее где это искать? Или пример неплохо бы.. С платформой знаком недавно, да и с программированием туговато.
 
#4
Нет, не это. Вы хотите использовать unsupported features of NinjaTrader не зная платформы и языка - это будет непросто. Я бы рекомендовал начать с простых вещей. Установите VS 2013, разберитесь, как смотреть метаданные классов из DLL. Затем посмотрите на классы из DLL, включенных в поставку NT. Обратите внимание на класс Account - там и будут интересующие вас методы.

Данный подход поможет вам в написании нестандартного кода. Именно метаданные позволяют понять - какую функциональность можно "наловить" с помощью недокументированных классов, благо разработчики NT в целом следовали best practices & code standards.

А лучше всего начните с более простых вещей. Скорее всего, вам не нужно программировать ордера из индикатора, скорее всего ваша задача может быть переформулирована/решена в более простых терминах.
 

NoName

Member
NinjaTrader
#5
Нет, не это. Вы хотите использовать unsupported features of NinjaTrader не зная платформы и языка - это будет непросто. Я бы рекомендовал начать с простых вещей. Установите VS 2013, разберитесь, как смотреть метаданные классов из DLL. Затем посмотрите на классы из DLL, включенных в поставку NT. Обратите внимание на класс Account - там и будут интересующие вас методы.

Данный подход поможет вам в написании нестандартного кода. Именно метаданные позволяют понять - какую функциональность можно "наловить" с помощью недокументированных классов, благо разработчики NT в целом следовали best practices & code standards.

А лучше всего начните с более простых вещей. Скорее всего, вам не нужно программировать ордера из индикатора, скорее всего ваша задача может быть переформулирована/решена в более простых терминах.
С C# знаком, со студией знаком, знаю в основном как с ней обращаться, с ninjatrader не очень. Также плохо с английским, изучал другой язык..
Попросили реализовать стратегию. Я писал всё это дело в индикаторе, всё проверил Alertами. Вроде всё работает, где выполняется определенное условие - идёт оповещение. Теперь вместо алертов надо уже непосредственно выставлять ордера.. Вот в этом вся моя проблема.
Были варианты при наступлении определенных условий в индикаторе вызывать стратегию и там уже выставлять ордера. Либо выставлять ордера из самого индикатора. Но ни то ни другое в виду отсутствия опыта программирования и навыков работы с ордерами да и с NT в целом реализовать не получается, не знаю с чего начать.. Как вариант после вашего сообщения пришла в голову мысль о создании объекта в инициализации индикатора, и потом обращаться к этому объекту, но опять же не знаю с чего начать да и вообще, верный ли подход..

"Установите VS 2013, разберитесь, как смотреть метаданные классов из DLL. Затем посмотрите на классы из DLL, включенных в поставку NT. Обратите внимание на класс Account - там и будут интересующие вас методы." - Правильно ли я понимаю, что вы предлагаете поиграть с IntelliSense, посмотреть методы, поля классов, что от кого наследуется и т.д.? Поглядел класс Account через IntelliSense - ввиду отсутствия описания методов так и не понял что именно мне нужно(
И ещё хотелось бы уточнить: смогу ли я потом через маркет реплеер всё это дело прогнать и увидеть где выставляются ордера? Использую OnMarketData()
И о каких DLL идёт речь?
 
Последнее редактирование:
#6
В данном случае вы пытаетесь выполнить стандартную задачу стратегии через нестандартное использование индикатора. Лучше так не делать, а использовать прямые методы. Ваша задача - типовая, и решаться она должна самым обычным образом - путем написания стратегии.

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

NoName

Member
NinjaTrader
#7
"Перепишите ваш индикатор таким образом, чтобы он выдавал торговые сигналы наружу" - именно это я пытался реализовать, но не знаю как, поэтому обращаюсь за помощью к данному форуму..)
(Я спрашивал: "..Или можно ли как-то при определенных условиях в индикаторе вызывать стратегию и в ней уже выставлять ордера?".)

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


Попытаюсь дать ответ на свой вопрос:
В стратегии имеется фрагмент:
...
if (CrossAbove(RSI(14, 0), 30, 1))
{
// Draws a square 1 tick above the high of the bar identifying when a limit order is issued
DrawSquare("My square" + CurrentBar, false, 0, High[0] + 1 * TickSize, Color.DodgerBlue);

// Enter a long position via a limit order at the current ask price
EnterLongLimit(GetCurrentAsk(), "RSI");
...
EnterLongLimit(GetCurrentAsk(), "RSI"); - именно здесь идёт обращение к индикатору RSI и берётся оттуда сигнал или снова что-то не правильно понимаю?
 
#8
Посмотрел стандартные индикаторы, стандартные стратегии - так и не понял механизм, как внешний наблюдатель может видеть сигналы индикаторов. Если вас не затруднит, приведите, пожалуйста, простейший пример как внешний наблюдатель может видеть сигналы индикаторов.
Смотрите, например, реализацию MACD.
public DataSeries Avg
...

Это и есть серия для внешнего пользователя, т.е. пользователь иникатора MACD имеет доступ к серии Avg.

По аналогии вы определяет серию в своем индикаторе, которая дает торговые сигналы. Самый простой пример:
public DataSeries Signal // -1 = Short, 0 = no signal, +1 = Long

или, если у вас одновременно возможны разносторонние сигналы:
public BoolSeries LongSignal
public BoolSeries ShortSignal

Таким образом, вы можете узнать сигнал в стретегии:
if (MyCustomIndicator().LongSignal[0])
{
// enter long position

EnterLongLimit(GetCurrentAsk(), "RSI"); - именно здесь идёт обращение к индикатору RSI и берётся оттуда сигнал или снова что-то не правильно понимаю?
Данное выражении не имеет отношения к RSI, т.к. "RSI" - это строка, в данном случае это просто имя сигнала. Не игнорируйте документацию, она ваш самый главный помощник/источник. Смотрите, вот здесь http://ninjatrader.com/support/helpGuides/nt7/?enterlonglimit.htm написано об этой функции.

RSI у вас используется в функции CrossAbove().
 

NoName

Member
NinjaTrader
#9
Спасибо большое, походу то что нужно! Буду изучать соответствующие материалы. Документацию стараюсь не игнорировать, но какой толк ею пользоваться, если не знаю английского.. Перевожу по возможности то что надо, но всю справку таким образом увы не изучить(
И ещё один вопрос - подключаю к чарту стратегию, с помощью visual studio присоединяюсь к процессу и пытаюсь поставить точку останова на обновлении бара в стратегии. Почему-то точка останова не срабатывает( (В индикаторах всё хорошо работает). В чём может быть причина, не подскажете?
 
#10
1) Стратегию необходимо перевести в режим Debug
2) Иногда точки действительно не подхватываются с первого раза. Похоже, это побочный эффект особенностей компиляции скриптов самим NT. Обычно помогает перекомпилировать и затем перенабросить стратегию. После этого переключитесь в студию - она должна обновить файлы и, как правило, точки останова активируются.
 

NoName

Member
NinjaTrader
#11
Вылезает сообщение "although you have order confirmation enabled, orders generated by a strategy will be submitted without confirmation" при наложении стратегии на чарт - может ли это быть причиной того, что не останавливается на точке останова? Уж как не пробовал, ни в какую не останавливается(( Перевел, но корявый перевод ни о чём толковом не поведал..
И кстати, такой момент:
По сути если я сделаю глобальную переменную (скажем типа bool), и буду устанавливать её в true при наступлении определенного условия в индикаторе - то можно в стратегии всё это отслеживать (при обновлении бара проверять состояние) и по сути выставлять ордера после установления переменной в true?
 

Muratik

Well-Known Member
NinjaTrader
#12
Приветствую.
Вышеизложенное наглядный пример того, что категорично, и обязательно, нужен сериал видео уроков (скорее всего много сезонный), в котором максимально подробно детализировать все возможности программирования (робото-, скрипто-, индикаторо-, плагино и т.п.,-строение) в NT её же средствами.
Наверно большой объём темы, и предполагаемый массовый переход на ожидаемую NT 8 сдерживает. Но всё равно - пробел в этой информации существует и его надо как то качественно заполнить...
 

NoName

Member
NinjaTrader
#13
Приветствую! Абсолютно с Вами согласен, но из русскоязычного материала я нашел только пару видеуроков Светланы и этот форум. Остальное всё, к сожалению, на английском( А этой информации конечно же недостаточно.. Была идея купить книжку даже на английском и переводить её, но не нашел ни одной толковой книжки. Приобрел с Амазона одну, но там 54 страницы бестолковщины. Если где либо существуют материалы (видео уроки, робото-, скрипто-, индикаторо-, плагино и т.п.,-строение, толковые книжки, касающиеся NT) - поделитесь информацией о таковых, буду рад изучить данные материалы, чтобы впредь здесь не задавать глупых вопросов)

Хотелось бы дополнить: обычные уроки по ручной торговле в NT меня не интересуют, т.к. сам я не трейдер. У меня имеются очень скромные навыки программирования на C#, поэтому меня озадачили попытаться написать торгового робота. Вот я и пытаюсь с той информацией, которая у меня есть, сделать что-то толковое.
 
Последнее редактирование:

NoName

Member
NinjaTrader
#14
NinjaScript Programmer's Launch Pad - кто-нибудь может прокомментировать данную книжку? Какого характера информация, поможет ли новичку в изучении NinjaScript, расскажет ли о взаимодействии индикаторов и стратегий, существуют ли в ней практические примеры, или это переписанный help?
 
#15
"although you have order confirmation enabled, orders generated by a strategy will be submitted without confirmation"
Это стандартное предупреждение NT, его можно отключить в настройках.

если я сделаю глобальную переменную (скажем типа bool), и буду устанавливать её в true при наступлении определенного условия в индикаторе - то можно в стратегии всё это отслеживать (при обновлении бара проверять состояние) и по сути выставлять ордера после установления переменной в true
Суть вами понята совершенно правильно. Но все же лучше пользоваться сериями, чтобы у вас всегда было значение этой переменной для любого бара.
 

NoName

Member
NinjaTrader
#16
OnBarUpdate() почему то в стратегии так и не работает, не могу найти причину( И через отладчик пробовал с включенным дебагом, и пробовал заново компилировать, накладывать стратегию на чарт - безрезультатно.
Создаю новую стратегию, там в OnBarUpdate() пишу на график и пытаюсь организовать звуковое оповещение - также безрезультатно( Повторюсь, в индикаторе всё прекрасно работает. Какие ещё причины могут быть?

protected override void OnBarUpdate()
{
DrawTextFixed("Text", "Text", TextPosition.TopLeft);
Alert("Alert", NinjaTrader.Cbi.Priority.High, "Alert", "Alert1.wav", 10, Color.Red, Color.White);
}
 

NoName

Member
NinjaTrader
#17
Обнаружил, что когда Enabled перевожу в true и жму Apply (применить стратегию), то Enabled автоматически переводится в false и поэтому наверно всё не работает( С чем это может быть связано?
 
#18
Ваш код - рабочий, дело не в нем. Обратите внимание, что Alert() работает только на реалтайме/реплее.

Обнаружил, что когда Enabled перевожу в true и жму Apply (применить стратегию), то Enabled автоматически переводится в false и поэтому наверно всё не работает( С чем это может быть связано?
Это означает, что NT по какой-то причине деактивирует стратегию. Самая распространенная причина - ошибка в скрипте. Используйте Output Window для отладки.
 

NoName

Member
NinjaTrader
#19
Стратегия заработала, теперь вопрос вот в чём:
или, если у вас одновременно возможны разносторонние сигналы:
public BoolSeries LongSignal
public BoolSeries ShortSignal

Таким образом, вы можете узнать сигнал в стретегии:
if (MyCustomIndicator().LongSignal[0])
{
// enter long position
Спасибо за пример, делаю так:
В индикаторе объявляю переменную: public BoolSeries temp;
инициализирую объект: temp = new BoolSeries(this);
Далее, где мне надо передать сигнал в стратегию, делаю так: temp.Set(true); И уже в стратегии обрабатываю сигнал:
if (MyCustomIndicator().temp[0])
{
...
}

Но это условие MyCustomIndicator().temp[0] почему-то не срабатывает, в отладчике вообще почему то ни тип не видит переменной, ни значение.. Что опять не так делаю?)
 

NoName

Member
NinjaTrader
#20
Вообщем ковырялся, ковырялся - всё перекинул в стратегию и по крайней мере работает) Только не дает тестить в Strategy Analizator( Никаких ошибок, просто не включается. В маркет реплеере всё норм работает.
 
Вверх Снизу