• Тинькофф Банк-лучшие банковские продукты еще выгоднее
    Выбирайте продукт от банка Тинькофф
  • Уважаемые форумчане, друзья и посетители!
    Поступило предложение ( ссылка на обсуждение ) на сбор средств поддержания форума в рабочем состоянии с 1 июня ( оплата хостинга, бэкап ежедневный на другой хостинг и тд), отчетность будет предоставляться ежемесячно. Пока на ЮMoney ( яндекс деньги), доступно картой перевод, далее добавлю другие способы. Сумму перевода указывайте на ваш выбор исходя из своих возможностей.
    Форум продолжает свою работу благодаря Вашим пожертвованиям.

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

Вообщем за основу брал индикатор Eds, для поиска максимального объёма в баре. Вот как раз мне необходимо избавиться от OnMarketData() и прибегнуть чисто к средствам OnBarUpdate(). Не подскажете как переделать вышеупомянутые конструкции?
Код:
if (e.MarketDataType == MarketDataType.Last)
if (e.MarketDataType == MarketDataType.Ask)
if (e.MarketDataType == MarketDataType.Bid)
e.Volume


Код:
protected override void OnMarketData(MarketDataEventArgs e)
        {
            // Print some data to the Output window
            if (e.MarketDataType == MarketDataType.Last)
            {
                lastPrice = e.Price;
                if ((lastPrice >= askPrice) && (lastPrice > bidPrice))
                {
                    if (volumeRows.ContainsKey(e.Price) == false)
                        volumeRows.Add(e.Price, new VolumeTradedRow(0, (int) e.Volume));
                    else
                        volumeRows[e.Price].Bull += (int) e.Volume;
                    mostRecentBullPrice = e.Price;
                    mostRecentBullVolume = volumeRows[e.Price].Bull;
                }
                else if ((lastPrice <= bidPrice) && (lastPrice < askPrice))
                {
                    if (volumeRows.ContainsKey(e.Price) == false)
                        volumeRows.Add(e.Price, new VolumeTradedRow((int) e.Volume, 0));
                    else
                        volumeRows[e.Price].Bear += (int) e.Volume;
                    mostRecentBearPrice = e.Price;
                    mostRecentBearVolume = volumeRows[e.Price].Bear;
                }
                else // neutrals are too insignificant to waste ram space and processing power, just return
                    return;
              
                // объем текущей цены
                volumeS = volumeRows[e.Price].Bear + volumeRows[e.Price].Bull;
          
                BEAR = volumeRows[e.Price].Bear;
                BULLL = volumeRows[e.Price].Bull;
          

                if (volumeRows[e.Price].Bear + volumeRows[e.Price].Bull > largestVolume)
                {
                    largestVolume = volumeRows[e.Price].Bear + volumeRows[e.Price].Bull;
                    PRICE_VALUE = e.Price;
                }
            
                tempMAX_VOL = largestVolume;


                DrawTextFixed("MAX_VOLUME_DRAW", "Максимальный объём: " + tempMAX_VOL.ToString() + "\nТекущий бар = " + CurrentBar.ToString() + "\n\n\n\n", TextPosition.BottomLeft);
                ChartControl.Refresh();
          
                if (DateTime.Now > lastRefresh.AddMilliseconds(refreshDelay))
                {
                    ChartControl.Refresh();
                    lastRefresh = DateTime.Now;
                }
            }
            else if (e.MarketDataType == MarketDataType.Ask)
                askPrice = e.Price;
      
            else if (e.MarketDataType == MarketDataType.Bid)
                bidPrice = e.Price;
      
            HIGH_PRICE = Bars.GetHigh(CurrentBar);
            LOW_PRICE  = Bars.GetLow(CurrentBar);
        }
 
MarketDataType.Last это обычый тик/трейд. Его аналогом в некотором допустимом приближении можно считать сам факт вызова OnBarUpdate().

Что касается двух других, то GetCurrentAsk()/GetCurrentBid(), но учтите, что они ведут себя некорректно на истории.
 
Здравствуйте! Возникла необходимость использовать стандартный индикатор ParabolicSAR.
В стратегии обращаюсь к переменной индикатора ParabolicSAR следующим образом:
Код:
bool test = ParabolicSAR(0.02, 0.2, 0.02).longPosition;

Загвостка в том, что в маркет реплеере переменная test постоянно обновляется, показывая правильные данные. Всё хорошо. Но вот на бэктесте данная переменная постоянно false и не желает меняться (точнее не меняется ParabolicSAR(0.02, 0.2, 0.02).longPosition). Все необходимые переменные установлены в public. Через отладчик видно, что в функцию Revers(), в которой и вычисляется значение longPosition, отладчик почему-то не входит.. Можно ли как-то решить эту проблему или что-то делаю не так?
 
Скажите, а откуда взялась переменая longPosition? Такой переменной нет в стандартном индикаторе ParabolicSAR.
 
Вот такой у меня стандартный параболик. В функции Reverse() вычисляется значение longPosition.
 

Вложения

  • @ParabolicSAR.rar
    2,8 КБ · Просмотры: 7
Вы имеете ввиду приватную переменную индикатора? Но для чего вам она? Что не так с самим индикатором?
 
Вы имеете ввиду приватную переменную индикатора? Но для чего вам она? Что не так с самим индикатором?
Да, имею ввиду приватную переменную longPosition (которую сделал для видимости public). Я хочу из стратегии получать данные о состоянии этой переменной. Т.е. В стратегии написана строчка:
Код:
bool test = ParabolicSAR(0.02, 0.2, 0.02).longPosition;
Как только значение данной переменной меняется в индикаторе, мне необходимо в стратегии это улавливать. Повторюсь, что обращаясь к данной переменной в вышеуказанном формате из стратегии всё прекрасно работает в маркет реплеере, но вот на бэктесте работать не хочет, переменная постоянно возвращает false, хотя при смене тенденции переменная должна возвращать противоположное значение (что опять же повторюсь происходит в маркет реплеере, но не работает на бэктесте). С индикатором же всё в порядке, он работает должным образом, строит графики как положено.
 
В стандартном индикаторе эта переменная изменяется на любом источнике данных (реалтайм, реплей, история). Напишите функцию логгирования в файл, прогоните бэктест (или можно просто на истории) и посмотрите, где именно, на каких OHLC и почему не происходит реверсала (а он будет). И нам расскажите. Также, изменять стандартные индикаторы - это очень плохая практика, для тестов создавайте копию.

Еще один момент: работая с НТ важно мыслить "векторно", а не скалярно. Вас интересует момент смены тренда, но это не скаляр, это вектор. Почему вектор? Потому что смена тренда происходит в разные моменты времени. Т.е. лучше всего в таких случаях уходить от голой переменной и создавать серию, которая для каждого бара будет возвращать вам значение тренда(+/-1). Скорее всего, вы обращаетесь к одному и тому же значению переменной (первому или последнему известному), поэтому на истории это выглядит будто реверсала нет.
 
Как успехи, разобрались с проблемой?

Еще бывает, что исторические данные повреждены, в этом случае проще всего попробовать сделать Repair DB (см. Options menu, Data Tab)
 
Последнее редактирование:
Нет, не это. Вы хотите использовать unsupported features of NinjaTrader не зная платформы и языка - это будет непросто. Я бы рекомендовал начать с простых вещей. Установите VS 2013, разберитесь, как смотреть метаданные классов из DLL. Затем посмотрите на классы из DLL, включенных в поставку NT. Обратите внимание на класс Account - там и будут интересующие вас методы.

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

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

А я вот мечтаю об этом уже пару лет. Хоть 1 раз увидеть как это делается.
1. В NT пишу и индикаторы и стратегии, проблем нет. Даже на заказ делаю.
2. В студии тоже могу программировать, но опыт маленький. Нашел в нэте несколько десятков бесплатных уроков. Все их делаю без проблем.

Но вот как сделать, то что Вы рассказали, не знаю...не понимаю. Хоть к стенке ставьте. Нужен видео урок. ОЧЕНЬ НУЖЕН !!!
Если позволите примерный план урока, лично для меня будет иметь огромный интерес.
1. Что то очень простое. Типа как взять из NT ... High[0] и Low[0]. В студии сделать High[0] - Low[0], и передать обратно (построить индикатор).
2. Как подключить библиотеку типа вот этой http://www.alglib.net/ взять отуда fft (это Быстрое Преобразование Фурье) построить спектр и вывести ввиде индикатора.
3. Сделать *.dll и прицепить её к NT
4. Рассказать, то что вы описали (предложили сделать).

Заранее ОГРОМНОЕ СПАСИБО, если решитесь сделать такой урок.
 
Как успехи, разобрались с проблемой?

Еще бывает, что исторические данные повреждены, в этом случае проще всего попробовать сделать Repair DB (см. Options menu, Data Tab)
Не разобрался( Брал перерыв, что-то пытался сделать, ничего не получается. У меня так и не получается "вытаскивать" данные из индикатора(

Вообщем прикрепил стратегию и индикатор, которые использую. В стратегии описал проблему в комментариях. В индикаторе добавил комментарий в функцию Reverse() на счёт использования log (если это является логом), который также не работает почему-то. Закомментировал его, ругается на то, что файл кем-то используется уже.

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

9PuK5ZJ.png
 

Вложения

  • TESTstrategy.rar
    1,7 КБ · Просмотры: 7
  • ParabolicSARmy.rar
    3,3 КБ · Просмотры: 4
ван нужно заменить
public bool longPosition;
на
private DataSeries longPosition;

И выдавать её на ружу. Вот пример как это сделать. Там индикатор и стратегия.
 

Вложения

  • SampleExposedDataSeries.zip
    2,1 КБ · Просмотры: 14
ван нужно заменить
public bool longPosition;
на
private DataSeries longPosition;

И выдавать её на ружу. Вот пример как это сделать. Там индикатор и стратегия.
Спасибо большое, то что надо:thumbsup: Загвостка была в DataSeries (для моих потребностей) - нашел и применил BoolSeries.Теперь понимаю концепцию передачи параметров из индикатора в стратегию)
 
Последнее редактирование:
1. Что то очень простое. Типа как взять из NT ... High[0] и Low[0]. В студии сделать High[0] - Low[0], и передать обратно (построить индикатор).
2. Как подключить библиотеку типа вот этой http://www.alglib.net/ взять отуда fft (это Быстрое Преобразование Фурье) построить спектр и вывести ввиде индикатора.
3. Сделать *.dll и прицепить её к NT

Если я вас правильно понял:

Работа с DLL (передача данных из стратегии/индикатора в DLL и обратно) - это типовая задача. Она не имеет отношения к NT. Сделайте тестовый solution в VS (один проект - EXE, второй проект в том же solution - DLL) и попробуйте попередавать данные туда и обратно. В сети масса примеров реализации. Тонкие моменты смело игнорируйте, для того чтобы нормально работать с DLL необязательно (хотя и желательно) иметь полное понимание в этой области.

После этого переходите к работе с DLL из NT. Надо признать, что для комфортной разработки DLL для NT необходимы дополнительные усилия, но даже и без них вы вполне сможете добиться того, что вам надо.

4. Рассказать, то что вы описали (предложили сделать).
Но вы же сами дали верный ответ, про серию.
 
Если я вас правильно понял:

Работа с DLL (передача данных из стратегии/индикатора в DLL и обратно) - это типовая задача. Она не имеет отношения к NT. Сделайте тестовый solution в VS (один проект - EXE, второй проект в том же solution - DLL) и попробуйте попередавать данные туда и обратно. В сети масса примеров реализации. Тонкие моменты смело игнорируйте, для того чтобы нормально работать с DLL необязательно (хотя и желательно) иметь полное понимание в этой области.

После этого переходите к работе с DLL из NT. Надо признать, что для комфортной разработки DLL для NT необходимы дополнительные усилия, но даже и без них вы вполне сможете добиться того, что вам надо.


Но вы же сами дали верный ответ, про серию.

dll - это уже потом. Мне бы хоть 1 глазом увидеть как вы умудряетесь в вижуал студии писать индикаторы, отлаживать стратегии для NT.
Я понимаю что это что то простое, рутинное для вас. А я ни разу этого не видел (незнаю как это сделать). Методом тыка ничего не получилось. Так и пишу в блокноте уже несколько лет, и отлаживаю принтами.
 
NT включает в себя VS проект Documents\NinjaTrader 7\bin\Custom\NinjaTrader.Custom.csproj
Откройте его в студии - и все. Новые стратегии/индикаторы надо сначала создать в NT, а потом добавить получившиеся cs-файлы в проект - и можно начинать с ними работать.

Чтобы отлаживаться в студии, необходимо а) перевести скритп в режим дебага (правый клик мышкой в редакторе NinjaScript -> Debug Mode) b) накинуть/активировать скрипт, т.е., чтобы он начал работать в NT с) в студии подключиться к процессе NinjaTrader.exe (Debug -> Attach to process). Иногда нужно перенакинуть скрипт после этого (F5 на чарте), чтобы подцепились breakpoints. Может заработать не с первого раза, да и иногда требуется повторять шаги, по отдельности или все сразу.

Стоит заметить, что компиляция в студии не компилирует скрипты для NT, чтобы это сделать, необходима компиляции из редактора (держите какой-нибудь ненужный индикатор открытым в редакторе и компилируйте его время от времени - т.к. NT компилирует все скрипты сразу, то это и будет компиляция ваших скриптов в частности). А компиляцию в студии используйте как верификатор ошибок. Обратите внимание, что индикаторы имеют сгенерированный код (появляется после добавления/изменения параметров и компиляции в NT). Студия подгрузит новый код автоматически при активации ее окна.

Это самый лобовой метод. Как минимум, у вас будет хороший редактор с множеством полезных функций. Есть и другие методы работы в студии, которые упрощают те или иные аспекты разработки.
 
Попробовал. Что то ругается
Предупреждение 1 The referenced project '..\NinjaTrader.Core\NinjaTrader.Core.csproj' does not exist. NinjaTrader.Custom
Предупреждение 2 Не найден компонент "WilsonORMapper", на который указывает ссылка. NinjaTrader.Custom
Предупреждение 3 Не найден компонент "NinjaTrader.Core", на который указывает ссылка. NinjaTrader.Custom

+ в стратегии которую создал и добавил, много красного
Я не уверен, но вроде как вот это не видит
using NinjaTrader.Cbi;

Подскажите, что нужно сделать. Заранее Спасибо.
 
Да, действительно, нужно еще добавить ссылки на библиотеки, которые использует проект. Разработчики слегка поленились и не сделали это по умолчанию, поэтому вам надо самостоятельно прописать ссылки на это DDL-ки. Например:

Под NinjaTrader.Custom -> References -> клик правой мышкой -> Add Reference -> Browse -> (кнопка Browse)

C:\Program Files (x86)\NinjaTrader 7\bin\NinjaTrader.Core.dll
и
C:\Program Files (x86)\NinjaTrader 7\bin\WilsonORMapper.DLL
 
Спасибо за терпение и помощь. Но не помогает. Привожу скрины
VS01.jpg
После того как жму ок. Происходит вот это

VS02.jpg
То есть NinjaTrader.Core.dll не добавляется. Захожу обратно в Add Reference, галочка напротив NinjaTrader.Core.dll снята.
З.Ы. Первый шаг он трудный самый. Нужно сделать Hello World !!! из VS в NT ... дальше будет легче.
 
Возможно, вы установили Nt7 в другое место? Файлы существуют по указанным путям?
 
Назад
Верх Низ