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

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

Ninjadev

New Member
NinjaTrader
Пишу робота, который открывает 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));
                }
            }

Должно получиться на выходе следующее Screenshot_4.png
 
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 ))
 
Да и судя по вашей Сетке OrderType.StopLimit не самый лучший выбор, так как если один запустит, и вы зайдете в рынок, то на втором если будет проскальзывание может не сработать, и вы не выйдете из рынка. Лучше использовать OrderType.StopMarket они даже если и будет проскальзывание закроют по ближней цене. )) Или если ставите OrderType.StopLimit то нужно указывать Рендж тиков, в котором он будет работать если будет проскальзывание.
 
Но мне нужно, чтобы если цена пошла по импульсу вниз мы и зашли на этом импульсе по рынку

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

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");
 
Да и судя по вашей Сетке OrderType.StopLimit не самый лучший выбор, так как если один запустит, и вы зайдете в рынок, то на втором если будет проскальзывание может не сработать, и вы не выйдете из рынка. Лучше использовать OrderType.StopMarket они даже если и будет проскальзывание закроют по ближней цене. )) Или если ставите OrderType.StopLimit то нужно указывать Рендж тиков, в котором он будет работать если будет проскальзывание.
То, что сверху скидывали, я всё читал и пробовал. МИТ стоит потому что уже все варианты перетестил. Маркет меня не устроит, т.к. мне нужно одновременно 4 ордера открыть. По сути, мне нужно 1) два ближних ордера по направлению цены. Пошла вниз - открываем вниз(аналогично наверх) 2) Два дальних ордера на разворот. С дальними ордерами проблем нет, а вот ближние не могу разместить нормально
 
То, что сверху скидывали, я всё читал и пробовал. МИТ стоит потому что уже все варианты перетестил. Маркет меня не устроит, т.к. мне нужно одновременно 4 ордера открыть. По сути, мне нужно 1) два ближних ордера по направлению цены. Пошла вниз - открываем вниз(аналогично наверх) 2) Два дальних ордера на разворот. С дальними ордерами проблем нет, а вот ближние не могу разместить нормально
МИТ это не то что вам нужно. Вам нужно СтопЛимит или СтопМаркет
 
Но что бы работать с управляемыми ордерами нужно знать 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)
{
}
 
если цена пошла по импульсу вниз мы и зашли на этом импульсе
OFFTOP

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

 
OFFTOP

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

Импульс это условно, просто когда цена пошла вниз и коснулась нашего ордера, то идём вниз вместе с ним до следующего разворотного ордера
 
Но что бы работать с управляемыми ордерами нужно знать 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 не дают открыть мне сделку на понижение ниже рыночной цены, и на повышение выше рыночной цены. Неужели нужно сейчас менять всю структуру и дописывать множество строк, чтобы решить эту проблему?
 
По сути всё работает, как мне и требуется, за исключением того, что ни stopmarket, ни stoplimit не дают открыть мне сделку на понижение ниже рыночной цены, и на повышение выше рыночной цены. Неужели нужно сейчас менять всю структуру и дописывать множество строк, чтобы решить эту проблему?
Это сейчас у вас одна проблема, а потом вылезти другая, что если сработал Лимит то нужно отменить не нужные, а потом ещё нужно обнулить ордера если нет позиций что бы оно повторно открывались. Это все управляемые ордера, тут нет оболочки как в не управляемых ))
 
Это сейчас у вас одна проблема, а потом вылезти другая, что если сработал Лимит то нужно отменить не нужные, а потом ещё нужно обнулить ордера если нет позиций что бы оно повторно открывались. Это все управляемые ордера, тут нет оболочки как в не управляемых ))
Тут верно, при срабатывании дальних разворотных ордеров другие надо отменить, я думал через ОКО получится прописать
 
Тут верно, при срабатывании дальних разворотных ордеров другие надо отменить, я думал через ОКО получится прописать
OCO да может быть но в вашем случае нужно прописать что при активации СтопЛимита должен отменится не нужный Лимит и СтопЛимит и на место не нужного СтопЛимита должен встать СтопМаркет, если уже открыта позиция, и у которого при активации сработает OCO и отменит Лимит, а при активации Лимита по OCO отменит СтопМаркет.
 
OCO да может быть но в вашем случае нужно прописать что при активации СтопЛимита должен отменится не нужный Лимит и СтопЛимит и на место не нужного СтопЛимита должен встать СтопМаркет, если уже открыта позиция, и у которого при активации сработает OCO и отменит Лимит, а при активации Лимита по OCO отменит СтопМаркет.
ОСО нормально работает, единственно пока не разобрался с моментом, что в коде указываю для одной пары "1" - "1", для второй "2"-"2", компилирую и запускаю, всё отлично. Когда ещё раз хочу стратегию запустить, выдаёт ошибку, что нельзя с этими OCO ID запустить ордера, т.к. они уже использовались
 
Выставляет два Стоп Лимит Ордера. При срабатывании одного удаляет лишний и ставит Стоп и Таргет. При срабатывании Таргета удаляет Стоп, при срабатывании Стопа удаляет Таргет. Для Реала нужно еще в Методе OnOrderUpdate подумать что будет делать Стратегия если Ордера залило частично OrderState.Rejected
 

Вложения

  • Sample.zip
    2,6 КБ · Просмотры: 7
Выставляет два Стоп Лимит Ордера. При срабатывании одного удаляет лишний и ставит Стоп и Таргет. При срабатывании Таргета удаляет Стоп, при срабатывании Стопа удаляет Таргет. Для Реала нужно еще в Методе OnOrderUpdate подумать что будет делать Стратегия если Ордера залило частично OrderState.Rejected
Спасибо, будем разбираться
 
Выставляет два Стоп Лимит Ордера. При срабатывании одного удаляет лишний и ставит Стоп и Таргет. При срабатывании Таргета удаляет Стоп, при срабатывании Стопа удаляет Таргет. Для Реала нужно еще в Методе OnOrderUpdate подумать что будет делать Стратегия если Ордера залило частично OrderState.Rejected
Но на данный момент хочу доработать именно свою концепцию, где просто вписываю OCO ID, единственно не знаю, как его ресетить, чтобы не лезть в код постоянно, думаю может задать рандом значение для него
 
В ОСО должен быть ID уникальный что бы не было повторения.
 
Назад
Верх Низ