← Atrás

Дочерние стратегии StopLoss и TakeProfit.

Добрый день! Пытаюсь выставить заявки типа стоп лимит и тейк профит так:

                var order = new Order()
                {
                    Type = OrderTypes.Market,
                    Direction = isShortLessThenLong ? Sides.Sell : Sides.Buy,
                    Volume = Position == 0 ? Volume : Volume * 2,
                };
                order.WhenNewTrade(Connector).Do((trade) =>
                    {
                            var takeProfit = new TakeProfitStrategy(trade, 20);
                            var stopLoss = new StopLossStrategy(trade, 10);
                            var protectiveStrategies = new TakeProfitStopLossStrategy(takeProfit, stopLoss);
                            ChildStrategies.Add(protectiveStrategies);
                    })
                    .Apply(this);

                RegisterOrder(order);

Как только приходит сделка сразу же исполняется отложенный ордер. В примере SampleQuik при выставлении стоп заявки таблица стоп заявок пишет "Ошибка". Как правильно выставлять стопы и тейки?

И еще вопрос. С помощью какого элемента графики рисовать стопы на графике? Пробовал рисовать LineElement но исключение пишет что элемент поддерживается.

Comentarios (23)

Iniciar sesión o Crear cuenta, Inicie sesión o regístrese para dejar un comentario

Support
Support

Добрый день

Пожалуйста приведите логи стратегии.

Константин
Константин Autor

Log:

0001/01/01 00:00:00.000| |QuikTrader|Connect 2018/03/07 21:48:40.726| |Quik LUA. Transactions|Connect to 127.0.0.1:5001... 2018/03/07 21:48:40.726| |Quik LUA. Transactions|Connect to 127.0.0.1:5001 is OK. 2018/03/07 21:48:40.728| |Quik LUA. Transactions|Sending logon to 127.0.0.1:5001... 2018/03/07 21:48:40.742| |Quik LUA. Transactions|Logon sent to 127.0.0.1:5001 OK. 2018/03/07 21:48:40.744| |Quik LUA. Market data|Connect to 127.0.0.1:5001... 2018/03/07 21:48:40.744| |Quik LUA. Market data|Connect to 127.0.0.1:5001 is OK. 2018/03/07 21:48:40.744| |Quik LUA. Market data|Sending logon to 127.0.0.1:5001... 2018/03/07 21:48:40.744| |Quik LUA. Market data|Logon sent to 127.0.0.1:5001 OK. 2018/03/07 21:48:40.747| |Quik LUA. Transactions|Start message processing. 2018/03/07 21:48:40.747| |Quik LUA. Market data|Start message processing. 2018/03/07 21:48:41.054| |QuikTrader|Создан новый портфель SPBFUT00c93. 2018/03/07 21:48:41.058| |QuikTrader|Создан новый портфель 10088. 2018/03/07 21:48:41.059| |QuikTrader|Создан новый портфель NL0011100043. 2018/03/07 21:48:41.915|Error |BasketMessageAdapter|System.InvalidOperationException: Не найден подходящий адаптер для MarketData,T(L)=2018/03/07 21:48:41.078,Sec=S#:SBER@QJSIM, Native:,Type:,Sec=S#:SBER@QJSIM, Native:,Type:,Type=CandleTimeFrame,IsSubscribe=True,Arg=00:00:10,TransId=78520336,OrigId=0. в StockSharp.Algo.BasketMessageAdapter.GetAdapters(Message message) в StockSharp.Algo.BasketMessageAdapter.GetSubscriptionAdapter(MarketDataMessage mdMsg) в StockSharp.Algo.BasketMessageAdapter.ProcessMarketDataRequest(MarketDataMessage mdMsg) в StockSharp.Algo.BasketMessageAdapter.OnSendInMessage(Message message) в StockSharp.Messages.MessageAdapter.SendInMessage(Message message) 2018/03/07 21:48:41.078| |QuikTrader|New order: 77920355/3643327797 SBER@QJSIM 10088 Продажа Цена=0 Объем=2 Сост=Done Бал=0 2018/03/07 21:48:41.078| |SmaStrategy|Стратегия Запущена. [0,-1]. Позиция 0. 2018/03/07 21:48:41.078|Error |QuikTrader|Ошибка регистрации инструмента SBER@QJSIM на получение рыночных данных для CandleTimeFrame: 2018/03/07 21:48:41.078| |QuikTrader|Инструмент SBER@QJSIM зарегистрирован на получение рыночных данных для CandleTimeFrame 00:00:10. 2018/03/07 21:48:41.078| |SmaStrategy|Регистрация новой Market (0x92A299) заявки на Sell с ценой 0 и объемом 2. 2018/03/07 21:48:41.078| |QuikTrader|RegisterOrder: 0/ SBER@QJSIM NL0011100043 Продажа Цена=0 Объем=2 Сост=None Бал=0 2018/03/07 21:48:41.078| |SmaStrategy|Регистрация новой Market (0xF4D7FE) заявки на Buy с ценой 0 и объемом 2. 2018/03/07 21:48:41.078| |QuikTrader|RegisterOrder: 0/ SBER@QJSIM NL0011100043 Покупка Цена=0 Объем=2 Сост=None Бал=0 2018/03/07 21:48:41.078| |QuikTrader|New order: 78520340/ SBER@QJSIM NL0011100043 Продажа Цена=0 Объем=2 Сост=Pending Бал=2 2018/03/07 21:48:41.078| |QuikTrader|New order: 78520341/ SBER@QJSIM NL0011100043 Покупка Цена=0 Объем=2 Сост=Pending Бал=2 2018/03/07 21:48:41.081| |QuikTrader|New order: 78259893/3643335696 SBER@QJSIM 10088 Продажа Цена=0 Объем=2 Сост=Done Бал=0 2018/03/07 21:48:41.081| |QuikTrader|New order: 78259894/3643335697 SBER@QJSIM 10088 Покупка Цена=0 Объем=2 Сост=Done Бал=0 2018/03/07 21:48:41.081| |QuikTrader|New order: 78259895/3643335698 SBER@QJSIM 10088 Продажа Цена=0 Объем=2 Сост=Done Бал=0 2018/03/07 21:48:41.938| |QuikTrader|Инструмент SBER@QJSIM зарегистрирован на получение рыночных данных для MarketDepth. 2018/03/07 21:49:18.876| |QuikTrader|Инструмент SBER@QJSIM зарегистрирован на получение рыночных данных для Trades. 2018/03/07 21:50:21.950|Warning|QuikTrader|Заявка 3643342785 не найдена. 2018/03/07 21:50:21.950| |QuikTrader|My trade delayed: Execution,T(L)=2018.03.07 21:50:21.950,T(S)=2018.03.07 21:50:26.000,(Transaction),Sec=S#:SBER@QJSIM, Native:,Type:,Ord=3643342785/0/0,Fail=,Price=0,OrdVol=,TrVol=2,Bal=,TId=2475889940,Pf=NL0011100043,TPrice=274,82,UId=,State= 2018/03/07 21:50:21.992|Warning|QuikTrader|Заявка 3643342789 не найдена. 2018/03/07 21:50:21.992| |QuikTrader|My trade delayed: Execution,T(L)=2018.03.07 21:50:21.992,T(S)=2018.03.07 21:50:26.000,(Transaction),Sec=S#:SBER@QJSIM, Native:,Type:,Ord=3643342789/0/0,Fail=,Price=0,OrdVol=,TrVol=1,Bal=,TId=2475889943,Pf=NL0011100043,TPrice=275,01,UId=,State= 2018/03/07 21:50:22.121|Warning|QuikTrader|Заявка 3643342789 не найдена. 2018/03/07 21:50:22.121| |QuikTrader|My trade delayed: Execution,T(L)=2018.03.07 21:50:22.121,T(S)=2018.03.07 21:50:26.000,(Transaction),Sec=S#:SBER@QJSIM, Native:,Type:,Ord=3643342789/0/0,Fail=,Price=0,OrdVol=,TrVol=1,Bal=,TId=2475889944,Pf=NL0011100043,TPrice=275,1,UId=,State= 2018/03/07 21:50:22.245|Warning|QuikTrader|Заявка 3643342785 не найдена. 2018/03/07 21:50:22.245| |QuikTrader|My trade delayed: Execution,T(L)=2018.03.07 21:50:22.245,T(S)=2018.03.07 21:50:26.000,(Transaction),Sec=S#:SBER@QJSIM, Native:,Type:,Ord=3643342785/0/0,Fail=,Price=0,OrdVol=,TrVol=2,Bal=,TId=2475889940,Pf=NL0011100043,TPrice=274,82,UId=,State= 2018/03/07 21:50:22.245|Warning|QuikTrader|Заявка 3643342785 не найдена. 2018/03/07 21:50:22.245| |QuikTrader|My trade delayed: Execution,T(L)=2018.03.07 21:50:22.245,T(S)=2018.03.07 21:50:26.000,(Transaction),Sec=S#:SBER@QJSIM, Native:,Type:,Ord=3643342785/0/0,Fail=,Price=0,OrdVol=,TrVol=2,Bal=,TId=2475889940,Pf=NL0011100043,TPrice=274,82,UId=,State= 2018/03/07 21:50:22.245|Warning|QuikTrader|Заявка 3643342789 не найдена. 2018/03/07 21:50:22.245| |QuikTrader|My trade delayed: Execution,T(L)=2018.03.07 21:50:22.245,T(S)=2018.03.07 21:50:26.000,(Transaction),Sec=S#:SBER@QJSIM, Native:,Type:,Ord=3643342789/0/0,Fail=,Price=0,OrdVol=,TrVol=1,Bal=,TId=2475889943,Pf=NL0011100043,TPrice=275,01,UId=,State= 2018/03/07 21:50:22.245|Warning|QuikTrader|Заявка 3643342789 не найдена. 2018/03/07 21:50:22.245| |QuikTrader|My trade delayed: Execution,T(L)=2018.03.07 21:50:22.245,T(S)=2018.03.07 21:50:26.000,(Transaction),Sec=S#:SBER@QJSIM, Native:,Type:,Ord=3643342789/0/0,Fail=,Price=0,OrdVol=,TrVol=1,Bal=,TId=2475889943,Pf=NL0011100043,TPrice=275,01,UId=,State= 2018/03/07 21:50:22.246|Warning|QuikTrader|Заявка 3643342789 не найдена. 2018/03/07 21:50:22.246| |QuikTrader|My trade delayed: Execution,T(L)=2018.03.07 21:50:22.246,T(S)=2018.03.07 21:50:26.000,(Transaction),Sec=S#:SBER@QJSIM, Native:,Type:,Ord=3643342789/0/0,Fail=,Price=0,OrdVol=,TrVol=1,Bal=,TId=2475889944,Pf=NL0011100043,TPrice=275,1,UId=,State= 2018/03/07 21:50:22.246|Warning|QuikTrader|Заявка 3643342789 не найдена. 2018/03/07 21:50:22.246| |QuikTrader|My trade delayed: Execution,T(L)=2018.03.07 21:50:22.246,T(S)=2018.03.07 21:50:26.000,(Transaction),Sec=S#:SBER@QJSIM, Native:,Type:,Ord=3643342789/0/0,Fail=,Price=0,OrdVol=,TrVol=1,Bal=,TId=2475889944,Pf=NL0011100043,TPrice=275,1,UId=,State= 2018/03/07 21:50:22.246|Warning|QuikTrader|Заявка 3643342785 не найдена. 2018/03/07 21:50:22.246|Warning|QuikTrader|Заявка 3643342789 не найдена. 2018/03/07 21:50:22.247| |QuikTrader|Order changed: 78520340/3643342785 SBER@QJSIM NL0011100043 Продажа Цена=0 Объем=2 Сост=Done Бал=0 2018/03/07 21:50:22.247| |SmaStrategy|Новая позиция: (S#:SBER@QJSIM, Native:,Type:Stock, NL0011100043)=-2. 2018/03/07 21:50:22.247| |SmaStrategy|Заявка 78520340 (0x92A299) больше не активна. 2018/03/07 21:50:22.247| |SmaStrategy|Новая Sell сделка 2475889940 по цене 274.82 на 2 заявки 78520340. 2018/03/07 21:50:22.247| |TPS_SBER@QJSIM_NL0011100043|Стратегия Запущена. [0,2]. Позиция 0. 2018/03/07 21:50:22.247| |TPS_SBER@QJSIM_NL0011100043|Защита позиции Sell/274.82 с объемом 2. Уровень=0.5, Скользящий=False, Маркет-заявки=False, Котирование=False, Проскальзывание=0 2018/03/07 21:50:22.247| |TPS_SBER@QJSIM_NL0011100043|Котирование на Buy объема 2. 2018/03/07 21:50:22.247| |SLS_SBER@QJSIM_NL0011100043|Стратегия Запущена. [0,2]. Позиция 0. 2018/03/07 21:50:22.247| |SLS_SBER@QJSIM_NL0011100043|Защита позиции Sell/274.82 с объемом 2. Уровень=0.5, Скользящий=False, Маркет-заявки=False, Котирование=False, Проскальзывание=0 2018/03/07 21:50:22.247| |SLS_SBER@QJSIM_NL0011100043|Котирование на Buy объема 2. 2018/03/07 21:50:22.247| |TPSLS_SBER@QJSIM_NL0011100043|Стратегия Запущена. [2,1]. Позиция 0. 2018/03/07 21:50:22.248| |QuikTrader|Order changed: 78520341/3643342789 SBER@QJSIM NL0011100043 Покупка Цена=0 Объем=2 Сост=Done Бал=0 2018/03/07 21:50:22.248| |SmaStrategy|Новая позиция: (S#:SBER@QJSIM, Native:,Type:Stock, NL0011100043)=0. 2018/03/07 21:50:22.248| |SmaStrategy|Заявка 78520341 (0xF4D7FE) больше не активна. 2018/03/07 21:50:22.248| |SmaStrategy|Новая Buy сделка 2475889943 по цене 275.01 на 1 заявки 78520341. 2018/03/07 21:50:22.248| |TPS_SBER@QJSIM_NL0011100043|Стратегия Запущена. [0,2]. Позиция 0. 2018/03/07 21:50:22.248| |TPS_SBER@QJSIM_NL0011100043|Защита позиции Buy/275.01 с объемом 1. Уровень=0.5, Скользящий=False, Маркет-заявки=False, Котирование=False, Проскальзывание=0 2018/03/07 21:50:22.248| |TPS_SBER@QJSIM_NL0011100043|Котирование на Sell объема 1. 2018/03/07 21:50:22.248| |SLS_SBER@QJSIM_NL0011100043|Стратегия Запущена. [0,2]. Позиция 0. 2018/03/07 21:50:22.248| |SLS_SBER@QJSIM_NL0011100043|Защита позиции Buy/275.01 с объемом 1. Уровень=0.5, Скользящий=False, Маркет-заявки=False, Котирование=False, Проскальзывание=0 2018/03/07 21:50:22.248| |SLS_SBER@QJSIM_NL0011100043|Котирование на Sell объема 1. 2018/03/07 21:50:22.248| |TPSLS_SBER@QJSIM_NL0011100043|Стратегия Запущена. [2,2]. Позиция 0. 2018/03/07 21:50:22.248| |SmaStrategy|Новая Buy сделка 2475889944 по цене 275.1 на 1 заявки 78520341. 2018/03/07 21:50:22.248| |TPS_SBER@QJSIM_NL0011100043|Стратегия Запущена. [0,2]. Позиция 0. 2018/03/07 21:50:22.248| |TPS_SBER@QJSIM_NL0011100043|Защита позиции Buy/275.1 с объемом 1. Уровень=0.5, Скользящий=False, Маркет-заявки=False, Котирование=False, Проскальзывание=0 2018/03/07 21:50:22.248| |TPS_SBER@QJSIM_NL0011100043|Котирование на Sell объема 1. 2018/03/07 21:50:22.248| |SLS_SBER@QJSIM_NL0011100043|Стратегия Запущена. [0,2]. Позиция 0. 2018/03/07 21:50:22.248| |SLS_SBER@QJSIM_NL0011100043|Защита позиции Buy/275.1 с объемом 1. Уровень=0.5, Скользящий=False, Маркет-заявки=False, Котирование=False, Проскальзывание=0 2018/03/07 21:50:22.248| |SLS_SBER@QJSIM_NL0011100043|Котирование на Sell объема 1. 2018/03/07 21:50:22.248| |TPSLS_SBER@QJSIM_NL0011100043|Стратегия Запущена. [2,3]. Позиция 0.
Support
Support

Добрый день

В логе у вас уровень 0.5 а в примере 10 и 20. Вы меняли код?

Константин
Константин Autor

Здравствуйте! С данной проблемой вроде разобрался. Скажите пожалуйста как можно отрисовывать стоп-лосс и тейк-профит на графике?

Константин
Константин Autor

Думал что разобрался, но еще больше запутался. Такое ощущение что стратегия бросает заявку в стакан по цене сделки. Закрывает не весь объем позиции, а только часть. В основном только 1 лот. Таблица стоп заявок в квике не отображает стоп заявки установленные стратегией. В примере используется OrderConditionalGrid, но он закрыт и как там все работает посмотреть нельзя. Из примера заявки выставляются вроде как нормально. И квик отображает стоп заявки в таблице. Код:

        private void CandleManagerOnProcessing(CandleSeries candleSeries, Candle candle)
        {
            if (IsRealTime && Position == 0 && candle.State == CandleStates.Finished)
            {
                var order = new Order()
                {
                    Type = OrderTypes.Market,
                    Volume = Volume,
                    Direction = Sides.Buy
                };
                order.WhenNewTrade(Connector).Do((trade) =>
                {
                    // для сделки добавляем защитную пару стратегии
                    // выставляет тейк-профит в 40 пунктов
                    var takeProfit = new TakeProfitStrategy(trade, 0.5);

                    // выставляет стоп-лосс в 20 пунктов
                    var stopLoss = new StopLossStrategy(trade, 0.5);

                    var protectiveStrategies = new TakeProfitStopLossStrategy(takeProfit, stopLoss);
                    ChildStrategies.Add(protectiveStrategies);
                }).Apply(this);
                RegisterOrder(order);
            }
        }

Лог:

2018/03/10 21:12:00.693| |BuySellStrategy|Новая позиция: (S#:SBER@QJSIM, Native:,Type:Stock, NL0011100043)=10. 2018/03/10 21:12:00.693| |BuySellStrategy|Заявка 76313444 (0x23EA4AA) больше не активна. 2018/03/10 21:12:00.693| |BuySellStrategy|Новая Buy сделка 2478978512 по цене 272.36 на 10 заявки 76313444. 2018/03/10 21:12:00.693| |TPS_SBER@QJSIM_NL0011100043|Стратегия Запущена. [0,2]. Позиция 0. 2018/03/10 21:12:00.693| |TPS_SBER@QJSIM_NL0011100043|Защита позиции Buy/272.36 с объемом 10. Уровень=0.5, Скользящий=False, Маркет-заявки=False, Котирование=False, Проскальзывание=0 2018/03/10 21:12:00.693| |TPS_SBER@QJSIM_NL0011100043|Котирование на Sell объема 10. 2018/03/10 21:12:00.693| |SLS_SBER@QJSIM_NL0011100043|Стратегия Запущена. [0,2]. Позиция 0. 2018/03/10 21:12:00.693| |SLS_SBER@QJSIM_NL0011100043|Защита позиции Buy/272.36 с объемом 10. Уровень=0.5, Скользящий=False, Маркет-заявки=False, Котирование=False, Проскальзывание=0 2018/03/10 21:12:00.693| |SLS_SBER@QJSIM_NL0011100043|Котирование на Sell объема 10. 2018/03/10 21:12:00.693| |TPSLS_SBER@QJSIM_NL0011100043|Стратегия Запущена. [2,1]. Позиция 0. 2018/03/10 21:12:00.804| |TPS_SBER@QJSIM_NL0011100043|Защита активирована. Закрытие позиции по 272.36. 2018/03/10 21:12:00.804| |TPS_SBER@QJSIM_NL0011100043|Цена текущей NULL и лучшей 272.36. 2018/03/10 21:12:00.804| |TPS_SBER@QJSIM_NL0011100043|Лучший бид 272.35 и лучший аск 272.36. 2018/03/10 21:12:00.804| |TPS_SBER@QJSIM_NL0011100043|Регистрация новой (0x38F75DF) заявки на Sell с ценой 272.36 и объемом 1. 2018/03/10 21:12:00.804| |QuikTrader|RegisterOrder: 0/ SBER@QJSIM NL0011100043 Продажа Цена=272.36 Объем=1 Сост=None Бал=0 2018/03/10 21:12:00.804| |SLS_SBER@QJSIM_NL0011100043|Стратегия останавливается. [0,2]. Позиция 0. 2018/03/10 21:12:00.804| |SLS_SBER@QJSIM_NL0011100043|Правило 'Новые сделки инструмента SBER@QJSIM (0x38B3767)'. Приостановлено. 2018/03/10 21:12:00.804|Warning|SLS_SBER@QJSIM_NL0011100043|Заканчиваем котирование с неисполненным объемом равный 10. 2018/03/10 21:12:00.804| |SLS_SBER@QJSIM_NL0011100043|Ожидание снятия всех активных заявок. 2018/03/10 21:12:00.804| |SLS_SBER@QJSIM_NL0011100043|Стратегия остановлена. [0,2]. Позиция 0. 2018/03/10 21:12:00.804| |QuikTrader|New order: 76313449/ SBER@QJSIM NL0011100043 Продажа Цена=272.36 Объем=1 Сост=Pending Бал=1 2018/03/10 21:12:14.245|Warning|QuikTrader|Заявка 3648755200 не найдена. 2018/03/10 21:12:14.245| |QuikTrader|Order changed: 76313449/3648755200 SBER@QJSIM NL0011100043 Продажа Цена=272.36 Объем=1 Сост=Active Бал=1 2018/03/10 21:12:14.245| |BuySellStrategy|Новая позиция: (S#:SBER@QJSIM, Native:,Type:Stock, NL0011100043)=10. 2018/03/10 21:12:14.245| |TPSLS_SBER@QJSIM_NL0011100043|Новая позиция: (S#:SBER@QJSIM, Native:,Type:Stock, NL0011100043)=0. 2018/03/10 21:12:14.245| |TPS_SBER@QJSIM_NL0011100043|Новая позиция: (S#:SBER@QJSIM, Native:,Type:Stock, NL0011100043)=0. 2018/03/10 21:12:14.245| |TPS_SBER@QJSIM_NL0011100043|Позиция изменилась на 0. Оставшийся объем 10. 2018/03/10 21:12:14.245| |TPS_SBER@QJSIM_NL0011100043|Заявка 76313449 (0x38F75DF) принята биржей. 2018/03/10 21:12:14.245| |TPS_SBER@QJSIM_NL0011100043|Сброс счетчика ошибок регистрации с 0 до нуля. 2018/03/10 21:12:17.637| |QuikTrader|Инструмент SBER@QJSIM зарегистрирован на получение рыночных данных для Trades. 2018/03/10 21:12:18.704| |QuikTrader|Order changed: 76313449/3648755200 SBER@QJSIM NL0011100043 Продажа Цена=272.36 Объем=1 Сост=Active Бал=1 2018/03/10 21:12:18.704| |BuySellStrategy|Новая позиция: (S#:SBER@QJSIM, Native:,Type:Stock, NL0011100043)=10. 2018/03/10 21:12:18.704| |TPSLS_SBER@QJSIM_NL0011100043|Новая позиция: (S#:SBER@QJSIM, Native:,Type:Stock, NL0011100043)=0. 2018/03/10 21:12:18.704| |TPS_SBER@QJSIM_NL0011100043|Новая позиция: (S#:SBER@QJSIM, Native:,Type:Stock, NL0011100043)=0. 2018/03/10 21:12:18.704| |TPS_SBER@QJSIM_NL0011100043|Позиция изменилась на 0. Оставшийся объем 10. 2018/03/10 21:12:18.704| |BuySellStrategy|Новая Sell сделка 2478978684 по цене 272.36 на 1 заявки 76313449. 2018/03/10 21:12:18.704| |TPSLS_SBER@QJSIM_NL0011100043|Новая Sell сделка 2478978684 по цене 272.36 на 1 заявки 76313449. 2018/03/10 21:12:18.704| |TPS_SBER@QJSIM_NL0011100043|Новая Sell сделка 2478978684 по цене 272.36 на 1 заявки 76313449. 2018/03/10 21:12:18.713| |QuikTrader|Order changed: 76313449/3648755200 SBER@QJSIM NL0011100043 Продажа Цена=272.36 Объем=1 Сост=Active Бал=1 2018/03/10 21:12:18.713| |BuySellStrategy|Новая позиция: (S#:SBER@QJSIM, Native:,Type:Stock, NL0011100043)=10. 2018/03/10 21:12:18.713| |TPSLS_SBER@QJSIM_NL0011100043|Новая позиция: (S#:SBER@QJSIM, Native:,Type:Stock, NL0011100043)=0. 2018/03/10 21:12:18.713| |TPS_SBER@QJSIM_NL0011100043|Новая позиция: (S#:SBER@QJSIM, Native:,Type:Stock, NL0011100043)=0. 2018/03/10 21:12:18.713| |TPS_SBER@QJSIM_NL0011100043|Позиция изменилась на 0. Оставшийся объем 10. 2018/03/10 21:12:18.713| |QuikTrader|Order changed: 76313449/3648755200 SBER@QJSIM NL0011100043 Продажа Цена=272.36 Объем=1 Сост=Active Бал=1 2018/03/10 21:12:18.713| |BuySellStrategy|Новая позиция: (S#:SBER@QJSIM, Native:,Type:Stock, NL0011100043)=10. 2018/03/10 21:12:18.713| |TPSLS_SBER@QJSIM_NL0011100043|Новая позиция: (S#:SBER@QJSIM, Native:,Type:Stock, NL0011100043)=0. 2018/03/10 21:12:18.713| |TPS_SBER@QJSIM_NL0011100043|Новая позиция: (S#:SBER@QJSIM, Native:,Type:Stock, NL0011100043)=0. 2018/03/10 21:12:18.713| |TPS_SBER@QJSIM_NL0011100043|Позиция изменилась на 0. Оставшийся объем 10. 2018/03/10 21:12:18.723| |QuikTrader|Order changed: 76313449/3648755200 SBER@QJSIM NL0011100043 Продажа Цена=272.36 Объем=1 Сост=Done Бал=0 2018/03/10 21:12:18.723| |BuySellStrategy|Новая позиция: (S#:SBER@QJSIM, Native:,Type:Stock, NL0011100043)=9. 2018/03/10 21:12:18.723| |TPSLS_SBER@QJSIM_NL0011100043|Новая позиция: (S#:SBER@QJSIM, Native:,Type:Stock, NL0011100043)=-1. 2018/03/10 21:12:18.723| |TPS_SBER@QJSIM_NL0011100043|Новая позиция: (S#:SBER@QJSIM, Native:,Type:Stock, NL0011100043)=-1. 2018/03/10 21:12:18.723| |TPS_SBER@QJSIM_NL0011100043|Позиция изменилась на -1. Оставшийся объем 9. 2018/03/10 21:12:18.723| |TPS_SBER@QJSIM_NL0011100043|Заявка 76313449 (0x38F75DF) полностью исполнилась. Оставшийся объем 9. 2018/03/10 21:12:18.723| |TPS_SBER@QJSIM_NL0011100043|Заявка 76313449 (0x38F75DF) больше не активна.
Support
Support

Добрый день

Если вы хотите чтобы позиция закрывалась одной заявкой то необходимо выставить свойство QuotingVolume

Константин
Константин Autor

Support: Добрый день

Если вы хотите чтобы позиция закрывалась одной заявкой то необходимо выставить свойство QuotingVolume Здравствуйте. Меня больше волнует почему стоп срабатывает сразу после получения сделки, и как отрисовать стоп и тейк на графике.

Support
Support

Защитная стратегия активируется при пересечении цены. В вашем логе нет отладочной информации с указанием цен стакана или тиковой сделки. Вероятно было пробитие стаканом или сделкой защитного уровня.

Константин
Константин Autor

Вот проект Wpf - https://github.com/Constalgo/StopLossAndTakeProfit. Вместо стоп заявок стратегия выставляет лимитку с ценой сделки. Потому она сразу же исполняется. Таблица стоп заявок в квике пуста. Так же обратите внимание что при клике по кнопке автовыравнивание приложение зависает вместе с квиком.

Support
Support

Добрый день

Защитные стратегии выставляют лимитные заявки. Если вам нужны сто заявки то их необходимо выставлять в коде как обычные заявки.

Константин
Константин Autor

Для стопов и тейков есть элемент для отрисовки на графике?

Support
Support

Добрый день

График не зависит от типов торговых данных. Вы можете изобразить ваши заявки любым подходящим элементом графика. Например уровнями http://doc.stocksharp.ru/html/T_StockSharp_Xaml_Charting_ChartOrderElement.htm Наш пример SampleActiveOrders демонстрирует работу с данным элементом.

Константин
Константин Autor

SampleActiveOrders это немного не то. Вот так можно ли как то рисовать?

Support
Support

Добрый день

Вы можете использовать маркер заявок. Пример использования показан в SampleChartActiveOrders

79f0ac5f8fd5d57e2febe73ccdd8e5fd.png

Константин
Константин Autor

Здравствуйте! Я смотрел этот пример. Я же написал что это немного не то. Если я буду использовать трейлинг то на истории я не смогу видеть как он смещался. SampleChartActiveOrders показывает просто уровни. На скрине выше видно как стоп смещается. Может можно использовать значения не привязанные к ордерам? Рисовать ломаную линию на графике указав координаты оси X (время) и оси Y (цена).

Support
Support

Все элементы графика не привязаны к торговым объектам. Вы можете выбрать подходящий элемент и рисовать на графике в произвольном стиле.

Константин
Константин Autor

Добрый день! Я не понимаю как можно рисовать в произвольном стиле. Метод добавления данных на график (ChartDrawData.Add();) принимает аргумент типа IIndicatorValue. Перегрузки с аргументом типа decimal нет. При попытке передать decimal выбрасывает исключение, при чем ошибки уровня компиляции нет. Скрин: https://yadi.sk/i/UCLUsVhF3WxFnE Пробовал создать класс реализующий интерфейс IIndicatorValue, но так и не понял куда передать нужное значение. Код:

public partial class MainWindow : Window
    {
        private readonly QuikTrader _trader;
        private Security _security;
        public static CandleManager CandleManager { get; private set; }
        public static CandleSeries Series { get; private set; }
        public CandleSeries CandleSeries { get; private set; }
        public ChartCandleElement ChartCandleElement { get; private set; }
        public ChartIndicatorElement Line { get; private set; }
        public bool IsRealtiem { get; private set; }
        public TimeSpan TimeFrame => TimeSpan.FromMinutes(1);
        public MainWindow()
        {
            InitializeComponent();
            _trader = new QuikTrader();
            _trader.NewSecurity += security =>
            {
                if (security.Id == "SBER@QJSIM" && _security == null)
                {
                    _security = security;
                    Start();
                }
            };
            _trader.Connect();

        }

        private void Start()
        {
            if (CandleManager == null) CandleManager = new CandleManager(_trader);
            if (CandleSeries == null) CandleSeries = new CandleSeries(typeof(TimeFrameCandle), _security, TimeFrame);

            this.GuiAsync(() =>
            {
                InitCart();
                StartButton.IsEnabled = StopButton.IsEnabled = true;
            });
        }

        public void InitCart()
        {
            Chart.ClearAreas();

            var area = new ChartArea();
            var yAxis = area.YAxises.First();
            yAxis.AutoRange = true;
            Chart.IsAutoScroll = true;
            Chart.ShowOverview = true;
            Chart.AddArea(area);
            ChartCandleElement = new ChartCandleElement();
            Chart.AddElement(area, ChartCandleElement);
            Line = new ChartIndicatorElement(){DrawStyle = ChartIndicatorDrawStyles.Line};
            Chart.AddElement(area, Line);
        }

        private void DisplayNewMarketData(CandleSeries candleSeries, Candle candle)
        {
            IsRealtiem = candle.OpenTime + TimeFrame >= DateTimeOffset.Now || IsRealtiem;

            var chartDrawData = new ChartDrawData();
            var group = chartDrawData.Group(candle.OpenTime);
            group.Add(ChartCandleElement, candle);
            group.Add(Line, 221.1m); // Добавляем данные для отрисовки 
            if (IsRealtiem || candle.State == CandleStates.Finished)
                Chart.Draw(chartDrawData);
        }

        private void StartButton_Click(object sender, RoutedEventArgs e)
        {
            CandleManager.Processing += DisplayNewMarketData;
            CandleManager.Start(CandleSeries);
        }

        private void StopButton_Click(object sender, RoutedEventArgs e)
        {
            CandleManager.Processing -= DisplayNewMarketData;
            CandleManager.Stop(CandleSeries);
            IsRealtiem = false;
            InitCart();
        }
    }
Support
Support

Добрый день

Есть два варианта: 1) Подобрать подходящий графически индикатор и передавать в него значения. В этом варианте вы контролируете что именно рисовать. 2) Изменить существующий индикатор путём переопределение интерфейса IIndicatorPainter. В этом варианте вы контролируете как именно рисовать данные.

Константин
Константин Autor

Про IIndicatorPainter не понял. Как можно переопределить интерфейс? Да и интерфейса такого я не нашел. Есть IChartIndicatorPainter. Вы его имели в виду? То есть для того что бы рисовать индикатор так, как мне нужно мне надо создать класс реализующий IChartIndicatorPainter, а затем экземпляр этого класса передать в ChartIndicatorElement.IndicatorPainter? Верно? Если да то можно ли где то посмотреть реализацию такого класса? Не очень понятно как реализовывать методы этого интерфейса.

Support
Support

Добрый день

Ниже реализация отрисовщика для индикатора Ишимоку

namespace StockSharp.Xaml.Charting.IndicatorPainters
{
	using System;
	using System.Collections.Generic;
	using System.ComponentModel.DataAnnotations;
	using System.Windows.Media;

	using Ecng.Serialization;
	using Ecng.Xaml;

	using StockSharp.Algo.Indicators;
	using StockSharp.Localization;

	/// <summary>
	/// The renderer for <see cref="Ichimoku"/>.
	/// </summary>
	[Indicator(typeof(Ichimoku))]
	public class IchimokuPainter : BaseChartIndicatorPainter
	{
		private ChartIndicatorElement _tenkan;
		private ChartIndicatorElement _kijun;
		private ChartIndicatorElement _senkouA;
		private ChartIndicatorElement _chinkou;

		/// <summary>
		/// <see cref="Ichimoku.Tenkan"/> line color.
		/// </summary>
		[Display(
			ResourceType = typeof(LocalizedStrings),
			Name = LocalizedStrings.Str2039Key,
			Description = LocalizedStrings.Str2040Key)]
		public Color TenkanColor { get; set; } = Colors.Red;

		/// <summary>
		/// <see cref="Ichimoku.Kijun"/> line color.
		/// </summary>
		[Display(
			ResourceType = typeof(LocalizedStrings),
			Name = LocalizedStrings.Str2041Key,
			Description = LocalizedStrings.Str2042Key)]
		public Color KijunColor { get; set; } = Colors.Blue;

		/// <summary>
		/// <see cref="Ichimoku.SenkouA"/> line color.
		/// </summary>
		[Display(
			ResourceType = typeof(LocalizedStrings),
			Name = LocalizedStrings.Str2043Key,
			Description = LocalizedStrings.Str2044Key)]
		public Color SenkouAColor { get; set; } = Colors.SandyBrown;

		/// <summary>
		/// <see cref="Ichimoku.SenkouB"/> line color.
		/// </summary>
		[Display(
			ResourceType = typeof(LocalizedStrings),
			Name = LocalizedStrings.Str2045Key,
			Description = LocalizedStrings.Str2046Key)]
		public Color SenkouBColor { get; set; } = Colors.Thistle;

		/// <summary>
		/// <see cref="Ichimoku.Chinkou"/> line color.
		/// </summary>
		[Display(
			ResourceType = typeof(LocalizedStrings),
			Name = LocalizedStrings.Str2047Key,
			Description = LocalizedStrings.Str2048Key)]
		public Color ChinkouColor { get; set; } = Colors.Green;

		/// <summary>
		/// To initialize renderer.
		/// </summary>
		/// <returns>Graphical data.</returns>
		public override IEnumerable<ChartIndicatorElement> Init()
		{
			InnerElements.Clear();

			InnerElements.Add(_tenkan = new ChartIndicatorElement
			{
				DrawStyle = ChartIndicatorDrawStyles.Line,
				Color = TenkanColor,
				StrokeThickness = BaseElement.StrokeThickness,
				Title = LocalizedStrings.Str764
			});

			InnerElements.Add(_kijun = new ChartIndicatorElement
			{
				DrawStyle = ChartIndicatorDrawStyles.Line,
				Color = KijunColor,
				StrokeThickness = BaseElement.StrokeThickness,
				Title = LocalizedStrings.Str765
			});

			InnerElements.Add(_senkouA = new ChartIndicatorElement
			{
				DrawStyle = ChartIndicatorDrawStyles.Band,
				Color = SenkouAColor,
				AdditionalColor = SenkouBColor,
				StrokeThickness = BaseElement.StrokeThickness,
				Title = LocalizedStrings.Str767
			});

			InnerElements.Add(_chinkou = new ChartIndicatorElement
			{
				DrawStyle = ChartIndicatorDrawStyles.Line,
				Color = ChinkouColor,
				StrokeThickness = BaseElement.StrokeThickness,
				Title = LocalizedStrings.Str768
			});

			return InnerElements;
		}

		/// <summary>
		/// To process new values.
		/// </summary>
		/// <param name="time">The time stamp of the new data generation.</param>
		/// <param name="value">Indicator values.</param>
		/// <param name="draw">The method of value drawing on the chart.</param>
		public override void ProcessValues(DateTimeOffset time, IIndicatorValue value, DrawHandler draw)
		{
			if (!value.IsFormed)
			{
				draw(_tenkan, 0, double.NaN);
				draw(_kijun, 0, double.NaN);
				draw(_senkouA, 0, double.NaN, double.NaN);
				draw(_chinkou, 0, double.NaN);
			}
			else
			{
				var values = value.GetSimpleValues();
				var ind = (Ichimoku)value.Indicator;

				draw.TryDraw(_tenkan, 0, values[ind.Tenkan]);
				draw.TryDraw(_kijun, 0, values[ind.Kijun]);
				draw.TryDraw(_senkouA, 0, values[ind.SenkouA], values[ind.SenkouB]);
				draw(_chinkou, 0, double.NaN);
				draw.TryDraw(_chinkou, ind.Kijun.Length, values[ind.Chinkou]);
			}
		}

		#region IPersistable

		/// <summary>
		/// Load settings.
		/// </summary>
		/// <param name="storage">Settings storage.</param>
		public override void Load(SettingsStorage storage)
		{
			TenkanColor = storage.GetValue<SettingsStorage>(nameof(TenkanColor)).ToColor();
			KijunColor = storage.GetValue<SettingsStorage>(nameof(KijunColor)).ToColor();
			SenkouAColor = storage.GetValue<SettingsStorage>(nameof(SenkouAColor)).ToColor();
			SenkouBColor = storage.GetValue<SettingsStorage>(nameof(SenkouBColor)).ToColor();
			ChinkouColor = storage.GetValue<SettingsStorage>(nameof(ChinkouColor)).ToColor();
		}

		/// <summary>
		/// Save settings.
		/// </summary>
		/// <param name="storage">Settings storage.</param>
		public override void Save(SettingsStorage storage)
		{
			storage.SetValue(nameof(TenkanColor), TenkanColor.ToStorage());
			storage.SetValue(nameof(KijunColor), KijunColor.ToStorage());
			storage.SetValue(nameof(SenkouAColor), SenkouAColor.ToStorage());
			storage.SetValue(nameof(SenkouBColor), SenkouBColor.ToStorage());
			storage.SetValue(nameof(ChinkouColor), ChinkouColor.ToStorage());
		}

		#endregion
	}
}
Константин
Константин Autor

Здравствуйте! В какой сборке определен метод TryDraw?

Ошибка:

Ошибка CS1061 'DrawHandler" не содержит определения для "TryDraw" и не удалось найти метод расширения "TryDraw", принимающий тип "DrawHandler" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку).

Подключенные сборки:

using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Windows.Media; using Ecng.Serialization; using Ecng.Xaml; using StockSharp.Algo.Indicators; using StockSharp.Localization; using StockSharp.Xaml.Charting; using StockSharp.Xaml.Charting.IndicatorPainters;

Support
Support

Ниже код метода расширения

static class PainterExtensions
	{
		public static void TryDraw(this DrawHandler draw, ChartIndicatorElement elem, int index, params IIndicatorValue[] values)
		{
			draw(elem, index, values.Select(v => v.IsEmpty ? double.NaN : v.GetValue<double>()).ToArray());
		}
	}
Константин
Константин
Константин Autor

Спасибо. Разобрался😂