← Voltar

В RealTimeEmulationTrader не происходят сделки

Специально для проверки StopLossStrategy кидаю лимитки близко к спреду. Но сделки, судя по логу, не происходят. Что-то делаю не так?

Лог файл

RS_SRM3@RTS_SPBFUT007r0 | 25.03.2013 16:59:00.104 |            | Правило 'Интервал 00:01:00 (0x1C4D180)'. Активация.
RS_SRM3@RTS_SPBFUT007r0 | 25.03.2013 16:54:53.440 |            | Переход из состояния Stopped в Started.
RS_SRM3@RTS_SPBFUT007r0 | 25.03.2013 16:54:53.442 |            | Стратегия запущена. [0,-1]. Позиция при старте 0.
RS_SRM3@RTS_SPBFUT007r0 | 25.03.2013 16:56:00.039 |            | Правило 'Интервал 00:01:00 (0x1C4D180)'. Активация.
RS_SRM3@RTS_SPBFUT007r0 | 25.03.2013 16:56:00.064 |            | Регистрация новой Limit (0x31AE540) заявки на Buy с ценой 9847 и объемом 1. 
RS_SRM3@RTS_SPBFUT007r0 | 25.03.2013 16:56:00.112 |            | Правило 'Полное исполнение  60886354/0 (0x36B20B7)'. Подписалось на события.
RS_SRM3@RTS_SPBFUT007r0 | 25.03.2013 16:56:00.113 |            | Правило 'Отмена заявки  60886354/0 (0x283D6C)'. Подписалось на события.
RS_SRM3@RTS_SPBFUT007r0 | 25.03.2013 16:56:00.113 |            | Правило 'Ошибка регистрации заявки  60886354/0 (0x271D65F)'. Подписалось на события.
RS_SRM3@RTS_SPBFUT007r0 | 25.03.2013 16:57:00.062 |            | Правило 'Интервал 00:01:00 (0x1C4D180)'. Активация.
RS_SRM3@RTS_SPBFUT007r0 | 25.03.2013 16:57:00.063 |            | Регистрация новой Limit (0xEB7DE3) заявки на Buy с ценой 9841 и объемом 1. 
RS_SRM3@RTS_SPBFUT007r0 | 25.03.2013 16:57:00.064 |            | Правило 'Полное исполнение  60886355/0 (0x4D82E1)'. Подписалось на события.
RS_SRM3@RTS_SPBFUT007r0 | 25.03.2013 16:57:00.064 |            | Правило 'Отмена заявки  60886355/0 (0x86693B)'. Подписалось на события.
RS_SRM3@RTS_SPBFUT007r0 | 25.03.2013 16:57:00.064 |            | Правило 'Ошибка регистрации заявки  60886355/0 (0x2874BB6)'. Подписалось на события.
RS_SRM3@RTS_SPBFUT007r0 | 25.03.2013 16:58:00.085 |            | Правило 'Интервал 00:01:00 (0x1C4D180)'. Активация.
RS_SRM3@RTS_SPBFUT007r0 | 25.03.2013 16:58:00.085 |            | Регистрация новой Limit (0x3F13BE6) заявки на Buy с ценой 9845 и объемом 1. 
RS_SRM3@RTS_SPBFUT007r0 | 25.03.2013 16:58:00.085 |            | Правило 'Полное исполнение  60886356/0 (0xCEF4B6)'. Подписалось на события.
RS_SRM3@RTS_SPBFUT007r0 | 25.03.2013 16:58:00.085 |            | Правило 'Отмена заявки  60886356/0 (0x17B6DE0)'. Подписалось на события.
RS_SRM3@RTS_SPBFUT007r0 | 25.03.2013 16:58:00.085 |            | Правило 'Ошибка регистрации заявки  60886356/0 (0xDC417)'. Подписалось на события.

Код стратегии


using System;
using System.Globalization;
using System.Windows;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Ecng.Collections;
using Ecng.Xaml;

using StockSharp.Algo;
using StockSharp.Algo.Strategies;
using StockSharp.Algo.Candles;
using System.Threading;
using StockSharp.BusinessEntities;


namespace Spikes_Test_it
{
    internal class RobotStrategy : TimeFrameStrategy
    {
        private readonly CandleManager _candleManager;  //Менеджер свечей

        private readonly CandleSeries _candleSeries;    //Свечи

        private DateTime _nextTime;                     

        private decimal _delta;

        private readonly decimal _deltaPercent;

        private decimal _stopLoss;

        private readonly decimal _stopLossPercent;

        public RobotStrategy(CandleManager candleManager, CandleSeries candleSeries, decimal deltaPercent, decimal stopLossPercent, TimeSpan timeFrame)
            : base(timeFrame)
        {
            _candleManager = candleManager;

            _candleSeries = candleSeries;

            _deltaPercent = deltaPercent;

            _stopLossPercent = stopLossPercent;
            
        }


        /// <summary>
        /// Метод вызывается тогда, когда вызвался метод <see cref="M:StockSharp.Algo.Strategies.Strategy.Start"/>, и состояние <see cref="P:StockSharp.Algo.Strategies.Strategy.ProcessState"/> перешло в значение <see cref="F:StockSharp.Algo.ProcessStates.Started"/>.
        /// </summary>
        protected override void OnStarted()
        {

            //Вычисляем время окончания текущей свечки
            _nextTime = Interval.GetCandleBounds(base.Trader.GetMarketTime(Exchange.Me)).Max;
            
            Thread.Sleep(_nextTime - base.Trader.GetMarketTime(Exchange.Me));

            base.OnStarted();
        }


        protected override ProcessResults OnProcess()
        {
            //Если наша стратегия в процессе остановки 
            if (base.ProcessState == ProcessStates.Stopping)
            {
                //Отменяем активные заявки 
                CancelActiveOrders();

                //Так как все активные заявки гарантированно были отменены, то возвращаем ProcessResults.Stop 
                return ProcessResults.Stop;
            }
            
            
            //Событие обработки торговой стратегии вызвалось в первый раз, что раньше, чем окончания текущей свечки 
            if (Trader.GetMarketTime(Exchange.Me) < _nextTime)
            {
                
                //Возвращаем ProcessResults.Continue, так как наш алгоритм еще не закончил свою работу, а просто ожидает следующего вызова. 
                return ProcessResults.Continue;
                
            }
             
            //Получаем сформированную свечку
            var candle = _candleSeries.GetTimeFrameCandle(_nextTime-TimeFrame);
            
            //если свечки не существует (не было ни одной сделке в тайм-фрейме), то ждем окончания следующей свечки. 
            if (candle == null)
            {
                // если прошло больше 10 секунд с момента окончания свечки, а она так и не появилась, 
                // значит сделок в прошедшей 5-минутке не было, и переходим на следующую свечку 
                if ((this.GetMarketTime() - _nextTime) > TimeSpan.FromSeconds(10))
                    _nextTime = TimeFrame.GetCandleBounds(Trader.GetMarketTime(Exchange.Me)).Max;
                
                return ProcessResults.Continue;
            }
            
            _nextTime += TimeFrame;

            //Создаем заявку
            var order = this.CreateOrder(OrderDirections.Buy, candle.ClosePrice - 3, Volume);

            //Регистрируем правило, отслеживающее появление новых сделок, осуществленных трейдером
            Trader
                .WhenNewMyTrades()
                .Do(OnNewMyTrades)
                .Apply(this);

            RegisterOrder(order);

            return ProcessResults.Continue;
        }

        protected override void OnNewMyTrades(IEnumerable<MyTrade> trades)
        {
            //Для каждой сделки добавляем защитную стоп-лосс стратегию
            var protectiveStrategies = trades.Select(t =>
                                                         {
                                                             MessageBox.Show("Идентификатор сделки: " +
                                                                             t.Trade.Id.ToString(
                                                                                 CultureInfo.InvariantCulture));
                _stopLoss = t.Trade.Price * _stopLossPercent/100;
                //Выставляем стоп-лосс 2% от цены входа
                var stopLossStrategy = new AutoProtectiveStrategy
                                           {
                                               StopLossLevel = _stopLoss,
                                               //TakeProfitTimeOut = TimeSpan.FromMinutes(TimeFrame.Minutes*2)
                                               TakeProfitTimeOut = TimeSpan.FromSeconds((_nextTime+TimeFrame+TimeFrame).Second-t.Trade.Time.Second)
                                           };
                MessageBox.Show(stopLossStrategy.TakeProfitTimeOut.ToString());
                return stopLossStrategy;
            });

            ChildStrategies.AddRange(protectiveStrategies);
            
            base.OnNewMyTrades(trades);
        }


    }
}

Este tópico foi útil?

Compartilhar tópico

Comentários (6)

Entrar ou Criar conta, Faça login ou cadastre-se para deixar um comentário

ak
ak

вероятно, по этой же самой причине - http://stocksharp.com/forum/3024/Nie-rieghistriruietsia-zaiavka-v-RealTimeEmulationTrader/?page=3

Mikhail Sukhov
Mikhail Sukhov

На этой неделе запланировали устранить проблему. Извиняюсь за задержку.

Lipot
Lipot Autor

Будем ждать.

Спасибо за библиотеку.

Lipot
Lipot Autor

Вышла новая версия StockSharp. Скачал, обновил ссылки. Но проблема до сих пор не ушла. При тестировании в реал-тайм заявки выставляются, но сделки не происходят.

esper
esper

Экспорт стакана у вас для этого инструмента запущен?

AASorokovoy
AASorokovoy

Скорее всего из за: http://stocksharp.com/forum/3448/Probliema-v-RealTimeEmulationTrader/

Но к сожалению этот баг так тщательно игнорируется... 😢