• Demo счет NinjaTrader, регистрируется в брокерской компании NinjaTrader Brokerage . NinjaTrader™, LLC
    Ссылка на демо счет NinjaTrader
    Фид на соединении Continuum/CQG.
    Для справки: Continuum - это брэнд CQG.
    Обратите внимание, что в настоящее время CQG не высылает логин и пароль на электронные адреса от mail.ru, bk.ru, list.ru, inbox.ru, поэтому необходимо повторить регистрацию с электронного адреса от другого домейна (yahoo, gmail, и тд).
  • NinjaTrader с зарекомендовавшим себя брокерским сервисом предоставляет наилучшие условия для фьючерсной торговли, включая:
    • Низкие комиссии: Экономьте на торгах через низкие и понятные комиссии
    • Низкая маржа: Всего $50 для микро контрактов
    • Низкие минимумы: Откройте счет от $400
    • Бесплатная платформа: Включает весь необходимый функционал для торговли в реале
  • Открыть счет в Тинькофф Банке
    Ссылка на сайт банка
    Для справки: на Тинькофф банк вывод денежных средств с брокерского счета приходит без проблем.
  • Уважаемые посетители форума!
    При регистрации на форуме отправляется письмо подтверждения на ваш почтовый ящик, если письмо не пришло, просьба проверить папку "спам" вашего почтового ящика, возможно письмо попало туда.
  • Сколько я реально плачу комиссии?
    Подробнее по ссылке

Не могу открыть ордер на продажу по цене ниже рыночной

N

Ninjadev

New Member
NinjaTrader
  • #1
Пишу робота, который открывает 4 ордера одновременно в указанный момент времени, и вроде всё хорошо, но 2 сделки из 4 он не может открыть и не понимаю в чём ошибка.
2 разворотных ордера написанных по следующему принципу
Код:
 double ByPrise = Close[0] - B;
                    SubmitOrderUnmanaged(1, OrderAction.Buy, OrderType.Limit, DefaultQuantity,  ByPrise, ByPrise + Target,"", "Open Buy2 Position");
Работают хорошо. Но мне нужно, чтобы если цена пошла по импульсу вниз мы и зашли на этом импульсе по рынку на продажу, соответственно, на покупку, но перепробовав все типы данных, так и не получилось добиться нужного результата. Либо ругался, что нельзя открыть ордер на продажу по цене ниже рыночной, либо ордера просто друг друга перекрывали. Вот весь код нужного фрагмента
Код:
 protected override void OnBarUpdate()
        {


            if (CurrentBar < 1)
                return;
            
            #region //Выставление ордеров
            
            if (BarsInProgress == 1) {//+++
                if (Times[1][0].ToString("H:mm:ss") == Time)
                    
                {
                    double ByPrise = Close[0] + A;
                    SubmitOrderUnmanaged(1, OrderAction.Buy, OrderType.MIT, DefaultQuantity, ByPrise, ByPrise + Target,"", "Open Buy Position");
                  
                    Print ("Выставлен By ордер" + (ByPrise));
            
                
                }

                
                if (Times[1][0].ToString("H:mm:ss") == Time)//+++
                {
                    double SellPrise = Close[0] - A;
                    SubmitOrderUnmanaged(1, OrderAction.Sell, OrderType.MIT,DefaultQuantity, SellPrise ,  SellPrise + Stop, "", "Open Sell Position");
                    
                    Print ("Выставлен Sell ордер" + (SellPrise));
                }
            }
            if (BarsInProgress == 1) {//+++
                
                
                 if (Times[1][0].ToString("H:mm:ss") == Time)//+++
                {
                    double SellPrise = Close[0] + B;
                    SubmitOrderUnmanaged(1, OrderAction.Sell, OrderType.Limit, DefaultQuantity, SellPrise ,  SellPrise + Stop, "", "Open Sell2 Position");
                    
                    Print ("Выставлен 2 Sell ордер" + (SellPrise));
                }
                
                 if (Times[1][0].ToString("H:mm:ss") == Time)
                {
                    double ByPrise = Close[0] - B;
                    SubmitOrderUnmanaged(1, OrderAction.Buy, OrderType.Limit, DefaultQuantity,  ByPrise, ByPrise + Target,"", "Open Buy2 Position");
                
                    Print ("Выставлен 2 By ордер" + (ByPrise));
                }
            }

Должно получиться на выходе следующее
 
  • Like
Реакции: Muratik
N

NTTrade

Well-Known Member
NinjaTrader
  • #2
SubmitOrderUnmanaged(int selectedBarsInProgress, OrderAction orderAction, OrderType orderType, int quantity, double limitPrice, double stopPrice, string oco, string signalName)

orderType
Determines the type of order submitted

Possible values:

OrderType.Limit
OrderType.Market
OrderType.MIT
OrderType.StopMarket
OrderType.StopLimit

orderAction
Determines if the order is a buy or sell order

Possible values:

OrderAction.Buy
OrderAction.BuyToCover
OrderAction.Sell
OrderAction.SellShort

Вы хотите получить OrderType.StopLimit, а запускаете OrderType.MIT ))
 
  • Like
Реакции: Muratik
N

NTTrade

Well-Known Member
NinjaTrader
  • #3
Да и судя по вашей Сетке OrderType.StopLimit не самый лучший выбор, так как если один запустит, и вы зайдете в рынок, то на втором если будет проскальзывание может не сработать, и вы не выйдете из рынка. Лучше использовать OrderType.StopMarket они даже если и будет проскальзывание закроют по ближней цене. )) Или если ставите OrderType.StopLimit то нужно указывать Рендж тиков, в котором он будет работать если будет проскальзывание.
 
  • Like
Реакции: Muratik
N

NTTrade

Well-Known Member
NinjaTrader
  • #4
Ninjadev сказал(а):
Но мне нужно, чтобы если цена пошла по импульсу вниз мы и зашли на этом импульсе по рынку

Если вам нужно открывать позицию сразу по рынку то нужно использовать Маркет

SubmitOrderUnmanaged(1, OrderAction.Buy, OrderType.Market , DefaultQuantity, 0, Close[0], "", "Open Buy Position");

SubmitOrderUnmanaged(1, OrderAction.Sell, OrderType.Market, DefaultQuantity, 0 , Close[0], "", "Open Sell Position");
 
  • Like
Реакции: Muratik
N

Ninjadev

New Member
NinjaTrader
  • #5
NTTrade сказал(а):
Да и судя по вашей Сетке OrderType.StopLimit не самый лучший выбор, так как если один запустит, и вы зайдете в рынок, то на втором если будет проскальзывание может не сработать, и вы не выйдете из рынка. Лучше использовать OrderType.StopMarket они даже если и будет проскальзывание закроют по ближней цене. )) Или если ставите OrderType.StopLimit то нужно указывать Рендж тиков, в котором он будет работать если будет проскальзывание.
То, что сверху скидывали, я всё читал и пробовал. МИТ стоит потому что уже все варианты перетестил. Маркет меня не устроит, т.к. мне нужно одновременно 4 ордера открыть. По сути, мне нужно 1) два ближних ордера по направлению цены. Пошла вниз - открываем вниз(аналогично наверх) 2) Два дальних ордера на разворот. С дальними ордерами проблем нет, а вот ближние не могу разместить нормально
 
N

NTTrade

Well-Known Member
NinjaTrader
  • #6
Ninjadev сказал(а):
То, что сверху скидывали, я всё читал и пробовал. МИТ стоит потому что уже все варианты перетестил. Маркет меня не устроит, т.к. мне нужно одновременно 4 ордера открыть. По сути, мне нужно 1) два ближних ордера по направлению цены. Пошла вниз - открываем вниз(аналогично наверх) 2) Два дальних ордера на разворот. С дальними ордерами проблем нет, а вот ближние не могу разместить нормально
МИТ это не то что вам нужно. Вам нужно СтопЛимит или СтопМаркет
 
  • Like
Реакции: Alexander
N

NTTrade

Well-Known Member
NinjaTrader
  • #7
Но что бы работать с управляемыми ордерами нужно знать C# там ещё много писанины нужно делать в Методах

protected override void OnOrderUpdate(Order order,double limitPrice, double stopPrice, int quantity, intfilled, double averageFillPrice, OrderState orderState,DateTime time, ErrorCode error, string comment)
{
}
protected override void OnExecutionUpdate(Executionexecution, string executionId, double price, int quantity,MarketPosition marketPosition, string orderId,DateTime time)
{
}
protected override void OnPositionUpdate(Positionposition, double averagePrice, int quantity,MarketPosition marketPosition)
{
}
 
M

Muratik

Well-Known Member
NinjaTrader
  • #8
Ninjadev сказал(а):
если цена пошла по импульсу вниз мы и зашли на этом импульсе
OFFTOP

Ninjadev, если не секрет, как, и с помощью чего, определяете импульс? Какие условия достаточны, для Вас, что импульс сформировался, или намечается?
Спасибо!

 
N

Ninjadev

New Member
NinjaTrader
  • #9
Muratik сказал(а):
OFFTOP

Ninjadev, если не секрет, как, и с помощью чего, определяете импульс? Какие условия достаточны, для Вас, что импульс сформировался, или намечается?
Спасибо!

Импульс это условно, просто когда цена пошла вниз и коснулась нашего ордера, то идём вниз вместе с ним до следующего разворотного ордера
 
  • Like
Реакции: Muratik
M

Muratik

Well-Known Member
NinjaTrader
  • #10
Ninjadev сказал(а):
Импульс это условно, просто когда цена пошла вниз и коснулась нашего ордера, то идём вниз вместе с ним до следующего разворотного ордера
Спасибо!
 
N

Ninjadev

New Member
NinjaTrader
  • #11
NTTrade сказал(а):
Но что бы работать с управляемыми ордерами нужно знать C# там ещё много писанины нужно делать в Методах

protected override void OnOrderUpdate(Order order,double limitPrice, double stopPrice, int quantity, intfilled, double averageFillPrice, OrderState orderState,DateTime time, ErrorCode error, string comment)
{
}
protected override void OnExecutionUpdate(Executionexecution, string executionId, double price, int quantity,MarketPosition marketPosition, string orderId,DateTime time)
{
}
protected override void OnPositionUpdate(Positionposition, double averagePrice, int quantity,MarketPosition marketPosition)
{
}

По сути всё работает, как мне и требуется, за исключением того, что ни stopmarket, ни stoplimit не дают открыть мне сделку на понижение ниже рыночной цены, и на повышение выше рыночной цены. Неужели нужно сейчас менять всю структуру и дописывать множество строк, чтобы решить эту проблему?
 
  • Like
Реакции: Muratik
N

NTTrade

Well-Known Member
NinjaTrader
  • #12
Ninjadev сказал(а):
По сути всё работает, как мне и требуется, за исключением того, что ни stopmarket, ни stoplimit не дают открыть мне сделку на понижение ниже рыночной цены, и на повышение выше рыночной цены. Неужели нужно сейчас менять всю структуру и дописывать множество строк, чтобы решить эту проблему?
Это сейчас у вас одна проблема, а потом вылезти другая, что если сработал Лимит то нужно отменить не нужные, а потом ещё нужно обнулить ордера если нет позиций что бы оно повторно открывались. Это все управляемые ордера, тут нет оболочки как в не управляемых ))
 
  • Like
Реакции: Muratik
N

Ninjadev

New Member
NinjaTrader
  • #13
NTTrade сказал(а):
Это сейчас у вас одна проблема, а потом вылезти другая, что если сработал Лимит то нужно отменить не нужные, а потом ещё нужно обнулить ордера если нет позиций что бы оно повторно открывались. Это все управляемые ордера, тут нет оболочки как в не управляемых ))
Тут верно, при срабатывании дальних разворотных ордеров другие надо отменить, я думал через ОКО получится прописать
 
  • Like
Реакции: Muratik
N

NTTrade

Well-Known Member
NinjaTrader
  • #14
Ninjadev сказал(а):
Тут верно, при срабатывании дальних разворотных ордеров другие надо отменить, я думал через ОКО получится прописать
OCO да может быть но в вашем случае нужно прописать что при активации СтопЛимита должен отменится не нужный Лимит и СтопЛимит и на место не нужного СтопЛимита должен встать СтопМаркет, если уже открыта позиция, и у которого при активации сработает OCO и отменит Лимит, а при активации Лимита по OCO отменит СтопМаркет.
 
  • Like
Реакции: Iman и Muratik
N

Ninjadev

New Member
NinjaTrader
  • #15
NTTrade сказал(а):
OCO да может быть но в вашем случае нужно прописать что при активации СтопЛимита должен отменится не нужный Лимит и СтопЛимит и на место не нужного СтопЛимита должен встать СтопМаркет, если уже открыта позиция, и у которого при активации сработает OCO и отменит Лимит, а при активации Лимита по OCO отменит СтопМаркет.
ОСО нормально работает, единственно пока не разобрался с моментом, что в коде указываю для одной пары "1" - "1", для второй "2"-"2", компилирую и запускаю, всё отлично. Когда ещё раз хочу стратегию запустить, выдаёт ошибку, что нельзя с этими OCO ID запустить ордера, т.к. они уже использовались
 
  • Like
Реакции: Muratik
N

NTTrade

Well-Known Member
NinjaTrader
  • #16
Выставляет два Стоп Лимит Ордера. При срабатывании одного удаляет лишний и ставит Стоп и Таргет. При срабатывании Таргета удаляет Стоп, при срабатывании Стопа удаляет Таргет. Для Реала нужно еще в Методе OnOrderUpdate подумать что будет делать Стратегия если Ордера залило частично OrderState.Rejected
 

Вложения

  • Sample.zip
    2,6 КБ · Просмотры: 6
  • Like
Реакции: yunakhan11, Ninjadev и Muratik
N

Ninjadev

New Member
NinjaTrader
  • #17
NTTrade сказал(а):
Выставляет два Стоп Лимит Ордера. При срабатывании одного удаляет лишний и ставит Стоп и Таргет. При срабатывании Таргета удаляет Стоп, при срабатывании Стопа удаляет Таргет. Для Реала нужно еще в Методе OnOrderUpdate подумать что будет делать Стратегия если Ордера залило частично OrderState.Rejected
Спасибо, будем разбираться
 
N

Ninjadev

New Member
NinjaTrader
  • #18
NTTrade сказал(а):
Выставляет два Стоп Лимит Ордера. При срабатывании одного удаляет лишний и ставит Стоп и Таргет. При срабатывании Таргета удаляет Стоп, при срабатывании Стопа удаляет Таргет. Для Реала нужно еще в Методе OnOrderUpdate подумать что будет делать Стратегия если Ордера залило частично OrderState.Rejected
Но на данный момент хочу доработать именно свою концепцию, где просто вписываю OCO ID, единственно не знаю, как его ресетить, чтобы не лезть в код постоянно, думаю может задать рандом значение для него
 
  • Like
Реакции: Muratik
N

NTTrade

Well-Known Member
NinjaTrader
  • #19
В ОСО должен быть ID уникальный что бы не было повторения.
 
  • Like
Реакции: Muratik
Верх Низ