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

Образцы кодов стратегий для NT 6.5

knowledgebase

Administrator
Команда форума
Помогли тебе - помоги другим!
NinjaTrader
В этой ветке выложены запрограммированные для Вас девелоперами НТ популярные стратегии.

Что бы посмотреть пример, импортируйте его в НТ:
1. Загрузите файл на рабочий стол
2. В окне Control Center, выберите в меню File>Utilities>Import NinjaScript
3. Выберите сохраненный Вами файл на рабочем столе.

-Использование фильтрования времени для ограничения торговой сессии
-Использование нескольких сигналов на вход/выход одновременно
-Торговля на пересечениях (кроссоверах)
 
Использование фильтрования времени для ограничения торговой сессии

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

Важные элементы кода:

DayOfWeek
Time
ToTime
ToDay
 

Вложения

  • SampleTimeFilter.tar.gz
    1,3 КБ · Просмотры: 165
Использование нескольких сигналов на вход/выход одновременно

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

Прикрепленный образец показывает, как:
- Добавить указатели, доработанные пользователем для стратегии, на график
- Определить, как НТ будет активировать ордера при совпадении условий
- Как обозначить вход/выход по определенному условию индивидуально

Важные элементы кода:

Add()
EntriesPerDirection
EnterLongStopLimit
EnterLongLimit
EnterLongStop
EnterLongStopLimit
 

Вложения

  • SampleMultipleEntryExitSignals (1).tar.gz
    5 КБ · Просмотры: 158
Торговля на пересечениях (кроссоверах)

Подобно концепции торговли на пробитии, многие трейдеры торгуют на пересечениях – будь то пересечение ценового барьера или скрещивание двух индикаторов.
Приведенный образец демонстрирует следующее:
- Определение и хранение первых 15ти самых высоких и самых низких значений баров текущей сессии
- Отправка ордеров long и short в зависимости от того, какой барьер пересечен
- Использование трейлинговых стопов для выхода из позиции

Подсказка: Этот образец устанавливает CalculateOnBarClose на False, для того, что бы ордера уходили именно в момент пересечения, а не в тот момент, когда закроется бар, в течении которого это пересечение произощло.
Важные элементы кода:
CalculateOnBarClose
CrossAbove()
CrossBelow()
SetTrailStop()
SetStopLoss()
SetProfitTarget()
 

Вложения

  • SampleHighLowCross (1).tar.gz
    1,4 КБ · Просмотры: 155
Здравствуйте.

Прошу помощи у всех кто работает с NT.
Мне нужно получить цены Ask/Bid с 2-х инструментов сразу, естественно почитал хелп накидал код - что-то вроде:
Код:
protected override void Initialize()
{
   CalculateOnBarClose = false;
   Add( first_Pair , PeriodType.Tick , 1 );
   Add( second_Pair , PeriodType.Tick , 1 );
}
protected override void OnBarUpdate()
{	
   // Вход стратегии
   if(Closes[0][0] > Closes[0][1] && Closes[1][0] > Closes[1][1]  && entryOrder == null )
      // SELL
      entryOrder = EnterShort();
}
// Остальное не важно потому как похоже в программном смысле
Принтами потом выяснилось, что если запускать эту стратегию на 2-х разных инструментах(first_Pair и second_Pair) то на second_Pair цена у first_Pair отличается от цены которую выводит стратегия запущенная на first_Pair. ВОт вобщем первичная проблема.
Попробовал всё это решить подключением NT к своему приложению(DLL), всё нормально работает! НО через некоторое время программа перестаёт получать котировки, хотя проверяю через деббагер запросы из моей программы идут, но ответ(return) из NT один и тот же, иногда бывает просто 0 возвращает хотя в NT цены нормально движутся.
А мне для автоматической торговли нужна стабильность программы(решения) это для меня самое важное.
Можете помочь?
 
Интересно... Quantum-Zen здесь ещё появится? ::rolleyes24.gif:: Или ограничется одним сообщением?)))
 
Александр сказал(а):
Интересно... Quantum-Zen здесь ещё появится? ::rolleyes24.gif:: Или ограничется одним сообщением?)))
Должен появиться, с ним общался в переписке, пока держат личные дела.
Кроме Quantum-Zen вижу на форуме других спецов, наверно присматриваются.
  • Господа программисты, как писал, для Вас все условия, хотите оказывать платные услуги трейдерам в дополнение к бесплатным - пожалуйста, откроем для вас личные закрытые разделы при надобности.
 
StatBars сказал(а):
Прошу помощи у всех кто работает с NT.
Мне нужно получить цены Ask/Bid с 2-х инструментов сразу, естественно почитал хелп накидал код - что-то вроде:
После того, как Вы в Initialize добавили 2 серии данных, аски и биды Вы можете получать следующим образом:
Код:
ask1=GetCurrentAsk(1);
ask2=GetCurrentAsk(2);
bid1=GetCurrentBid(1);
bid2=GetCurrentBid(2);
т.е. в скобках единица соответствует first_Pair в Вашем примере, двойка соответствует second_Pair
 
Здравствуйте!
Прошу помочь в написании стратегии. Необходимо установить срок действия лимитного ордера. Например необходимо, чтобы ордер EnterLongLimit отменялся по истечении 5 баров. Пробовал использовать CancelOrder, однако появились непонятные трудности. Просьба выложить часть простенького кода, чтобы выполнялась вышеописанная операция. Спасибо.
 
Bifff сказал(а):
Здравствуйте!
Прошу помочь в написании стратегии. Необходимо установить срок действия лимитного ордера. Например необходимо, чтобы ордер EnterLongLimit отменялся по истечении 5 баров. Пробовал использовать CancelOrder, однако появились непонятные трудности. Просьба выложить часть простенького кода, чтобы выполнялась вышеописанная операция. Спасибо.
Здравствуйте.
Напрямую это, к сожалению, сделать нельзя, нужно немного поколдовать)

Например, в момент поступления сигнала на выставление лимитного ордера, Вы запоминаете данное время и вычисляете время, которое будет через 5 баров(назовем его t1). И пока текущее время меньше этого второго времени(t1), Вы выполняете установку лимитного ордера:
Код:
//В регион Variables добавляем переменную со временем
private DateTime SignalTime=DateTime.Now;
//и переменную, указывающую что появился сигнал
private bool GetSignal=false;


protected override void OnBarUpdate()
{
if (CrossAbove(SMA(20), SMA(10), 1))
   {
    //Например здесь мы получаем сигнал на выставление лимитного ордера
    //Устанавливаем флаг получения сигнала и запоминаем время свечки
    GetSignal=true;
    SignalTime=Time[1];
    }	
//Здесь проверяем установлен ли флаг получения сигнала или нет. 
//Если установлен, то проверяем меньше ли текущее время времени, 
//которое получается через 5 свечей
if(GetSignal)
{
if(Time[1]>SignalTime.AddMinutes(Period*5))
  {
   //Это значит что 5 свечей уже прошло. Обнуляем сигнал
   GetSignal=false;
  }
else
{
EnterLongLimit(limitprice);
}
}
}

Если есть более простые способы решения этого вопроса, прошу поделиться..
 
NTDeveloper, спасибо. Попробую применить вашу идею. Если доработаю свою, то обязательно поделюсь с Вами.
 
NTDeveloper, вот как удалось осуществить отмену лимитного ордера с использованием CancelOrder()

Код:
#region Variables
//в регион добавляем переменную следующего характера
private IOrder myEntryShortOrder = null;


 protected override void OnBarUpdate()
{
            // ставим следующее или подобное условие на выставление лимитного ордера

            if (myEntryShortOrder == null && Close[1] > Close[0])
            {

//собственно выставляем лимитник
                myEntryShortOrder = EnterShortLimit(0,true,DefaultQuantity, Close[1] + ticksShortLimitPrice * TickSize, "Short");
              
//запоминаем бар, на котором высталяем лимитник
	nbarsShort = CurrentBar;
				
            }

//далее записываем условие на отмену ордера если прошло с момента выставления ордера barsLife свечей. Этот параметр задаем сами
            if (myEntryShortOrder != null && CurrentBar == nbarsShort + barsLife)
            {
	       CancelOrder(myEntryShortOrder);
             }


//и для толка запишем какое-нибудь условие на выход из позиции.
            if (BarsSinceEntry("Short") > 10)
            	ExitShort("shorttarget", "Short");


}



//далее запишем цикл в котором будем обнулять лимитный ордер, если он исполнился или отменился.

protected override void OnOrderUpdate(IOrder order){						
     if (order != null && order.OrderState == OrderState.Filled)
     {     			
	myEntryShortOrder = null;				
     }
   				
			
     if (order != null && order.OrderState == OrderState.Cancelled)
     {	
	myEntryShortOrder = null;
     }


Ну вот как-то так :) Если будут вопросы попробую ответить.
В свою очередь хотел еще поинтересоваться возможно ли как-то параметр CalculateOnBarClose изменять в процессе работы системы?
 
да, нормальный вариант.

Насчет CalculateOnBarClose думаю наврядли можно в процессе работы стратегии это дело изменять. Единственное, можно пойти на собственные функции и методы определения нового бара, например запоминать время нулевого бара и сравнивать на каждом тике его со временем опять же нулевого бара...
 
Просьба кто знает, как настроить в АТМ условие (стратегию): Если Close бара выше ЕМА то покупать, а если Close бара ниже ЕМА - то продавать? Система реверсная. ::smile24.gif:: Мне бы узнать именно как это сделать имеющимися в Нинзе настройками. С кодами не разберусь к сожалению. ::yield::
 
FOKS сказал(а):
Просьба кто знает, как настроить в АТМ условие (стратегию): Если Close бара выше ЕМА то покупать, а если Close бара ниже ЕМА - то продавать? Система реверсная. Улыбка Мне бы узнать именно как это сделать имеющимися в Нинзе настройками. С кодами не разберусь к сожалению. Белый флаг

Вот сделал небольшое видео, на котором показал как создать нужную Вам стратегию
http://www.screencast.com/t/YzkyNmQ1NWYt
 
Вот сделал небольшое видео, на котором показал как создать нужную Вам стратегию
http://www.screencast.com/t/YzkyNmQ1NWYt


Благодарю за ответ! Оказалось, что я делал настройки стратегии по такомуже порядку, но при настройках графиков, которые не соответствуют "общепринятым", Нинзя глючит не по-детски. С чем и обращусь к вам за платной консультацией в личку. Обращался я так же на официальный сайт Нинзи в техподдержку, но пока не ответили...
 
Доброго времени - у меня такие вопросы.
1. Метод OnBarUpdate() - отвечает за обновление бара, тоесть как только приходит новый тик то он срабатывает ?
2. Не мог бы ты дать пример кода - как воити в длинную позицию с выставлением Стоплосса , тейкпрофита, объема сделки(лота), установки какого нибудь примечания на ордер(что бы можно было потом найти его через селект или forsearch).
3. Выставление трала идет как функция и выполняеться уже на сервере - или надо вести его на клиенте - тащя стоплосс за ценой?
4. Если есть пример кода выбора(select-а, forsearch) ордера по допустим какому нибудь примечанию или мэйджеку, для последующей обработки ордера.
 
hammerlights сказал(а):
1) Если не сложно - покажите пример кода - входа допустим в длинную позицию. Установки ТП SL ,Объема сделки и Трала. Если трал реализуеться отдельно - то большая просьба так же показать пример. Установки какого нибудь примечания ордера.
Пример: рыночный бай
int Lot=1;
EnterLong(Lot,"строковой идентификатор сделки");

установка стоп лосса в пунктах:
int SL=50;
SetStopLoss(CalculationMode.Ticks,SL);

Тейк профит:
SetProfitTarget(CalculationMode.Ticks,TP);

hammerlights сказал(а):
3. Выставление трала идет как функция и выполняеться уже на сервере - или надо вести его на клиенте - тащя стоплосс за ценой?
Идет на клиентской части, вот пример процедуры:
Код:
void Tral()
        {
            
            if(Position.MarketPosition==MarketPosition.Long)
            {
                pnlPoint=Convert.ToInt32(Math.Round((Close[0]-Position.AvgPrice)/TickSize,0));
            }
            if(Position.MarketPosition==MarketPosition.Short)
            {
                pnlPoint=Convert.ToInt32(Math.Round((Position.AvgPrice-Close[0])/TickSize,0));
            }
            
            
            if(Position.MarketPosition==MarketPosition.Long)
            {
                    if(Close[0]-Tral*TickSize>SLPrice)
                    {
                        SLPrice=Close[0]Tral*TickSize;
                        SetStopLoss(CalculationMode.Price,SLPrice);
                    }
         
            }
            if(Position.MarketPosition==MarketPosition.Short)
            {
                    if(Close[0]+Tral*TickSize<SLPrice)
                    {
                    SLPrice=Close[0]+Tral*TickSize
                    SetStopLoss(CalculationMode.Price,SLPrice);
                    }
                            
        }            
        }

Поиск ордера, открытого вышеуказанным способом по magic можно лишь среди позиций на счете(Account.Orders, либо позиций в данной стратегии this.Orders)

Код:
foreach(Order ord in Account.Orders)
                {
                    string s=ord.Name;
                    if(s.IndexOf(magic)!=-1) 
                    {//Здесь что то делаем с ордером

}}
 
Назад
Верх Низ