← Zurück

Стратегия не учитывает сделки по стоп ордерам

Создаю простую стратегию на базе Strategy. В ней по окончанию свечи входим в позицию и ставим трейлинг стоп. Что получаем по факту?

Заявка и сделка для лимитного ордера нормально проходит и в стратегии отображается. Заявка и сделка для стоп ордера проходит криво и в стратегии НЕ отображается.

В итоге PositionManager не учитывает изменение позиции по стопу, и она постепенно растет. Хотя по факту она нулевая. PositionManager.Position > 0.

Похоже сделки для стоп ордеров не учитываются совсем. Странно что раньше не было обнаружено.

Пожелание - исправить ситуацию :)

ЗЫ: в коннекторе нет проблем. Все события приходят нормально.

War dieses Thema hilfreich?

Thema teilen

Kommentare (9)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

Alexander
Alexander

Ну собственно такого точно нет, потому и не было замечено раньше :) Вы что-то не так делаете.

Что такое "проходит криво"?

Давайте лог, пишите конкретно как подаётся заявка, приводите код.

ra81
ra81 Autor

Alexander Mukhanchikov: Ну собственно такого точно нет, потому и не было замечено раньше :) Вы что-то не так делаете.

Что такое "проходит криво"?

Давайте лог, пишите конкретно как подаётся заявка, приводите код.

Это при старте стратегии.


protected override void OnStarting()
{
    base.OnStarting();

    _candleManager =  _candleManager ?? new CandleManager(Trader);
    _candleToken = _candleToken  ?? _candleManager.RegisterTimeFrameCandles(Security,     (TimeSpan)AlfaTimeFrames.Minute1);

            this
                .When(_candleToken.CandlesFinished())
                .Do(TryMakeTrade).Once();
}

Сначала идет сделка на покупу потом на продажу в TryMakeTrade.

var order = new Order()
                            {
                                Direction = OrderDirections.Buy,
                                Type = OrderTypes.Market,
                                Volume = this.Security.MinLotSize,
                                Security = this.Security,
                                Portfolio = this.Portfolio,
                            };
            RegisterOrder(order);

            this
                .When(order.Matched())
                .Do(SetStop).Once();
            // Сделка висит пока не закроется по стоплоссу.

А вот метод SetStop

        private void SetStop(Order order)
        {
            var averPrice = order.GetAlfaAveragePrice();
            var stopPersent = 0.01;
            var trailLevel = (double)averPrice * stopPersent;

            var stop = new Order()
                           {
                               Type = OrderTypes.Conditional,
                               Direction = OrderDirections.Sell,
                               Portfolio = this.Portfolio,
                               Security = this.Security,
                               Volume = this.Security.MinLotSize,
                               StopCondition = new AlfaStopCondition()
                                                   {
                                                       Slippage = 1,
                                                       StopPrice = (double)averPrice + 0.5,
                                                       TrailingLevel = trailLevel,
                                                   },
                           };

            RegisterOrder(stop);
        }

После подобной манипуляции должна быть общая позиция равна нулю, потому что стоп заявка сразу же исполняется (специально так сформирована). А по факту позиция равна 1 лоту. Если повторить операцию позиция увеличится еще на лот и так далее. Продажи по стопу не учитываются никак.

Кажется что сделки для стоп ордеров просто не считаются и все. Их тупо нет в стратегии. А для простых ордеров все считается.

Вот лог стратегии


SS     | 16.03.2012 12:46:19.047 |       | Стратегия запущена.
SS     | 16.03.2012 12:46:59.781 |       | Свеча завершена, начинаем проверку условий.
SS     | 16.03.2012 12:46:59.781 |       | Проверка завершена, можно входить в позицию.
SS     | 16.03.2012 12:46:59.781 |       | Формируем ордер. Направление: Buy Тип: Market Объем: 10 Инструмент: SBER3
SS     | 16.03.2012 12:47:02.781 |       | Новая позиция 10.
SS     | 16.03.2012 12:47:08.859 |       | Заявка исполнена, формируем стоп. Направление: Sell Тип: Conditional Объем: 10 Инструмент: SBER3
SS     | 16.03.2012 12:47:08.859 |       | Новая Buy сделка 134193310 по цене 100,74 на 10 заявки 212770782.

А вот что пишет студия. Событие продажи как видим приходит.


15:46:53 - New Order. Цена: 101,74 Направление: Buy Тип ордера: Limit
15:46:59 - Order Changed. Цена: 101,74 Направление: Buy Тип ордера: Limit
15:46:59 - Order Changed. Цена: 101,74 Направление: Buy Тип ордера: Limit
15:46:59 - New My Trade. Цена: 100,74 Направление: Buy Тип ордера: Limit
15:47:2 - New Order. Цена: 100,28 Направление: Sell Тип ордера: Conditional
15:47:2 - Order Changed. Цена: 100,28 Направление: Sell Тип ордера: Conditional
15:47:14 - Order Changed. Цена: 100,28 Направление: Sell Тип ордера: Conditional
15:47:20 - Order Changed. Цена: 100,28 Направление: Sell Тип ордера: Conditional
15:47:23 - New My Trade. Цена: 100,71 Направление: Sell Тип ордера: Conditional
15:47:24 - Order Changed. Цена: 100,28 Направление: Sell Тип ордера: Conditional

Alexander
Alexander

Это альфа коннектор, переношу в соответствующую ветку.

В других коннекторах всё в порядке.

ra81
ra81 Autor

Alexander Mukhanchikov: Это альфа коннектор, переношу в соответствующую ветку.

В других коннекторах всё в порядке.

Прикрепил выше постом всю стратегию. Можно сразу заводить и смотреть. Один раз по завершению свечи совершит установку ордера на покупку и стоп на продажу. После этого можно посмотреть позицию. Врядли это связано с коннектором :).

Alexander
Alexander

через Quik \ Plaza какую позицию выводит? Привидите лог.

И версия S# из последних?

ra81
ra81 Autor

Alexander Mukhanchikov: через Quik \ Plaza какую позицию выводит? Привидите лог.

И версия S# из последних? Я бы с удовольствием привел позицию с других терминалов, но на текущий момент у меня терминал только один.

Коннектор генерирует события НОРМАЛЬНО. События приходят.

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

Версия S# 4.0.20 релиз.

Mikhail Sukhov
Mikhail Sukhov

ra81: тогда я буду много думать в чем же дело.

Order.DerivedOrder заполняется?

Alexander
Alexander

Посмотрел оба альфа коннектора. Ни там ни там не заполняется DerivedOrder и не добавляется ассоциация через метод AddDerivedOrder.

Т.е. и там и там либо не идёт работа со стоп ордерами, либо идёт неверная работа с ними.

Как и сказал сразу - проблема шлюза, а не базовых вещей S#.

Update: Михаил выше тоже про это задал вопрос

ra81
ra81 Autor

Ок. Поставил себе заметку про DerivedOrder. Стопы в коннекторах работают нормально. Но вот это поле не используется. Буду доделывать.