← Zurück

При тестировании на истории заявка исполнилась по неправильной цене

Запустил исторический тест. Решил по логам проверить, все ли в порядке.

Обнаружил, следующую проблему: лимитированная заявка на покупку выставляется по цене 141850, а исполняется по 141770. При этом я вижу, что моя стратегия не обновляла заявку.

Вот выдержка из лога:

2012.10.30 10:10:32.851|       |MQS_RIZ2@RTS_test account|Стратегия запущена. [0,324]. Позиция при старте 0.
2012.10.30 10:10:32.851|       |EmulationTrader|RegisterOrder: 58453309/0 Покупка Цена=141850 Объем=1 Сост=None Бал=1 
2012.10.30 10:10:32.851|       |EmulationTrader|New order: 58453309/324 Покупка Цена=141850 Объем=1 Сост=Active Бал=1 
2012.10.30 10:10:33.128|       |EmulationTrader|Order changed: 58453309/324 Покупка Цена=141850 Объем=1 Сост=Done Бал=0 
2012.10.30 10:10:33.128|       |MVWAPS_RIZ2@RTS_test account|Новая позиция: test account-RIZ2@RTS=0.
2012.10.30 10:10:33.128|       |MQS_RIZ2@RTS_test account|Новая позиция: test account-RIZ2@RTS=1.
2012.10.30 10:10:33.128|       |MQS_RIZ2@RTS_test account|Заявка 58453309 больше не активна.
2012.10.30 10:10:33.128|       |MQS_RIZ2@RTS_test account|Стратегия останавливается. [0,324]. Позиция при старте 1.
2012.10.30 10:10:33.128|       |MQS_RIZ2@RTS_test account|Ожидание снятия всех активных заявок.
2012.10.30 10:10:33.128|       |MQS_RIZ2@RTS_test account|Стратегия остановлена. [0,324]. Позиция при старте 1.
2012.10.30 10:10:33.128|       |MVWAPS_RIZ2@RTS_test account|Новая Buy сделка 324 по цене 141770 на 1 заявки 58453309.
2012.10.30 10:10:33.128|       |MQS_RIZ2@RTS_test account|Новая Buy сделка 324 по цене 141770 на 1 заявки 58453309.
2012.10.30 10:10:33.561|       |MQS_RIZ2@RTS_test account|Стратегия запущена. [0,325]. Позиция при старте 0.

MQS - это не стандартная стратегия котирования S#, а моя собственная, похожая. Выставляется заявка примерно так:

ActiveOrder = this.CreateOrder(Direction, StartPrice, Volume);
ActiveOrder.ShrinkPrice();
ActiveOrder.Security = Security;
while (!Trader.IsConnected) Trader.Reconnect();
base.RegisterOrder(ActiveOrder);
ActiveOrder.WhenMatched()
    .Do(Finish)
    .Apply(this);

Цена закрытия (141770) ниже обоих границ спреда и цен последних сделок:

MarketTime;DepthTime;BestBid;BestAsk;LastTradeTime;LastTrade
30.10.2012 10:10:31,097;30.10.2012 10:10:31,079;141850;141860;30.10.2012 10:10:30,930;141850
30.10.2012 10:10:31,714;30.10.2012 10:10:31,641;141850;141860;30.10.2012 10:10:31,097;141850
30.10.2012 10:10:31,754;30.10.2012 10:10:31,715;141850;141860;30.10.2012 10:10:31,714;141850
30.10.2012 10:10:31,839;30.10.2012 10:10:31,761;141860;141870;30.10.2012 10:10:31,754;141860
30.10.2012 10:10:31,849;30.10.2012 10:10:31,761;141860;141870;30.10.2012 10:10:31,839;141860
30.10.2012 10:10:31,863;30.10.2012 10:10:31,761;141860;141870;30.10.2012 10:10:31,849;141860
30.10.2012 10:10:32,142;30.10.2012 10:10:32,077;141850;141870;30.10.2012 10:10:31,863;141860
30.10.2012 10:10:32,631;30.10.2012 10:10:32,532;141860;141870;30.10.2012 10:10:32,142;141870
30.10.2012 10:10:32,658;30.10.2012 10:10:32,532;141860;141870;30.10.2012 10:10:32,631;141870
30.10.2012 10:10:32,851;30.10.2012 10:10:32,810;141860;141870;30.10.2012 10:10:32,658;141870
30.10.2012 10:10:33,561;30.10.2012 10:10:33,480;141860;141870;30.10.2012 10:10:32,851;141870
30.10.2012 10:10:33,621;30.10.2012 10:10:33,566;141860;141870;30.10.2012 10:10:33,561;141870
30.10.2012 10:10:33,720;30.10.2012 10:10:33,668;141870;141880;30.10.2012 10:10:33,621;141870
30.10.2012 10:10:33,967;30.10.2012 10:10:33,937;141860;141870;30.10.2012 10:10:33,720;141870
30.10.2012 10:10:34,780;30.10.2012 10:10:34,741;141870;141880;30.10.2012 10:10:33,967;141870

Вот выдержка из report.xls:

Номер сделки	Номер транзакции	Время	Цена	Цена заявки	Объем	Направление	Номер заявки	Проскальзывание	Проскальзывание (котирование)	Комментарий	Прибыль в рублях	Прибыль в пунктах	Прибыль в рублях (суммарная)	Прибыль в пунктах (суммарная)	Позиция		Номер заявки	Номер транзакции	Направление	Зарегистрирована	Изменена	Продолжительность	Цена	Цена (усредн.)	Статус	Состояние	Баланс	Объем	Тип	Проскальзывание	Задержка регистрации	Задержка отмены	Комментарий
324	58453309	30.10.2012 10:10:33	141770	141850	1	Покупка	324	0	-80	MQS_RIZ2@RTS_test account	55,8	90	2653,6	4280	0		324	58453309	Покупка	30.10.2012 10:10:32	30.10.2012 10:10:33	00:00:00	141850	141770	Не активна	Исполнена	0	1	Лимитная	-80	00:00:00	00:00:00	MQS_RIZ2@RTS_test account

Версия из транка (20514).

Kommentare (14)

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

Mikhail Sukhov
Mikhail Sukhov

Инструмент, дата в истории, код воспроизводящий проблему.

Yury Smykalov
Yury Smykalov Autor

RIZ2@RTS

Сделка №4178 из report.xls Дата сделки: 30.10.2012 10:10:35 Цена сделки: 142120 Цена заявки: 141870 Направление: Продажа

Цена сделки выглядит очень странной, на фоне сохраненных сделок:

Time;Code;Price;Volume
30.10.2012 10:10:34,780;RIZ2@RTS;141870;5
30.10.2012 10:10:34,840;RIZ2@RTS;141870;4
30.10.2012 10:10:34,840;RIZ2@RTS;141870;1
30.10.2012 10:10:34,927;RIZ2@RTS;141870;3
30.10.2012 10:10:34,927;RIZ2@RTS;141870;2
30.10.2012 10:10:34,935;RIZ2@RTS;141870;3
30.10.2012 10:10:35,259;RIZ2@RTS;141870;1
30.10.2012 10:10:36,786;RIZ2@RTS;141860;1
30.10.2012 10:10:36,864;RIZ2@RTS;141860;1
30.10.2012 10:10:36,864;RIZ2@RTS;141860;2
30.10.2012 10:10:36,952;RIZ2@RTS;141860;1
30.10.2012 10:10:36,952;RIZ2@RTS;141860;1
30.10.2012 10:10:37,041;RIZ2@RTS;141860;1

И стаканов:

DepthTime;Code;BestBid;BestAsk
30.10.2012 10:10:34,897;RIZ2@RTS;141870;141880
30.10.2012 10:10:34,937;RIZ2@RTS;141860;141870
30.10.2012 10:10:35,036;RIZ2@RTS;141860;141870
30.10.2012 10:10:35,155;RIZ2@RTS;141860;141870
30.10.2012 10:10:35,223;RIZ2@RTS;141860;141870
30.10.2012 10:10:35,270;RIZ2@RTS;141860;141870
30.10.2012 10:10:35,322;RIZ2@RTS;141860;141870
30.10.2012 10:10:35,588;RIZ2@RTS;141860;141870
30.10.2012 10:10:35,653;RIZ2@RTS;141860;141870
30.10.2012 10:10:35,757;RIZ2@RTS;141860;141870
30.10.2012 10:10:35,942;RIZ2@RTS;141860;141870
30.10.2012 10:10:36,639;RIZ2@RTS;141860;141870
30.10.2012 10:10:36,704;RIZ2@RTS;141860;141870
30.10.2012 10:10:36,844;RIZ2@RTS;141860;141870
30.10.2012 10:10:36,885;RIZ2@RTS;141860;141870
30.10.2012 10:10:36,952;RIZ2@RTS;141850;141860
30.10.2012 10:10:37,099;RIZ2@RTS;141860;141870

Для воспроизведения достаточно вот этих двух файлов:

Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using StockSharp.Algo;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using System.Threading;
using System.Diagnostics;
using StockSharp.Algo.Storages;
using StockSharp.Logging;
using StockSharp.Algo.Testing;
using StockSharp.Algo.Reporting;

namespace BugDemo
{
    class Program
    {
        static void Main(string[] args)
        {

            var security = new Security
            {
                Id = "RIZ2@RTS",
                Code = "RIZ2",
                Name = "RTS-12.12",
                MinStepSize = 10,
                MinStepPrice = 6.2m,
                Exchange = Exchange.Rts,
            };

            var storagePath = @"C:\StockSharp\4.1.5\StorageMDS";
            var portfolio = new Portfolio { Name = "test account", BeginValue = 1000000m };
            var startDate = new DateTime(2012, 10, 30, 10, 0, 0);
            var stopDate = new DateTime(2012, 10, 30, 10, 30, 0);
            var timeFrame = TimeSpan.FromMinutes(1);

            var storageRegistry = new StorageRegistry();
            ((LocalMarketDataDrive)storageRegistry.DefaultDrive).Path = storagePath;

            var logManager = new LogManager();
            var fileListener = new FileLogListener(String.Format("{0}_{1:00}_{2:00}.txt", DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day));
            logManager.Listeners.Add(fileListener);

            var emulationTrader = new EmulationTrader(
                new[] { security },
                new[] { portfolio })
            {
                MarketTimeChangedInterval = timeFrame,
                StorageRegistry = storageRegistry,
                UseMarketDepth = true
            };

            logManager.Sources.Add(emulationTrader);

            emulationTrader.RegisterTrades(security);
            emulationTrader.RegisterMarketDepth(security);
            
            emulationTrader.Connect();
            emulationTrader.StartExport();

            var strategy = new DemoStrategy()
            {
                Volume = 1,
                Trader = emulationTrader,
                Security = security,
                Portfolio = portfolio,
                StartDate = startDate,
                StopDate = stopDate
            };

            logManager.Sources.Add(strategy);

            strategy.Start();
            emulationTrader.Start(startDate, stopDate);

            while (emulationTrader.State == EmulationStates.Started && strategy.ProcessState == ProcessStates.Started)
            {
                Thread.Sleep(100);
            }

            new ExcelStrategyReport(strategy, "report.xls").Generate();
            Process.Start("report.xls");

            emulationTrader.Dispose();
            strategy.Dispose();

            Console.WriteLine("Press Enter to exit...");
            Console.ReadLine();
        }
    }
}

DemoStrategy.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using StockSharp.Algo;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using System.Threading;

namespace BugDemo
{
    class DemoStrategy : Strategy
    {
        private bool _lock = false;
        public DateTime StartDate;
        public DateTime StopDate;

        protected override void OnStarted()
        {
            Security.WhenNewTrades()
                .Do(ProcessNewTrades)
                .Apply(this);
            base.OnStarted();
        }

        protected void ProcessNewTrades(IEnumerable<Trade> trades)
        {
            if (Security.LastTrade == null || Security.BestAsk == null || Security.BestBid == null) return;
            if (_lock) return;

            var marketTime = Trader.GetMarketTime(Exchange.Rts);
            if (StartDate.CompareTo(marketTime) > 0) return;
            if (StopDate.CompareTo(marketTime) < 0) Stop();

            OpenPosition();
        }

        protected void OpenPosition()
        {
            _lock = true;
            var order = RegisterNewOrder(OrderDirections.Buy, Security.BestAsk.Price);
            order.WhenMatched()
                .Do(ClosePosition)
                .Apply();
        }

        protected void ClosePosition()
        {
            var order = RegisterNewOrder(OrderDirections.Sell, Security.BestBid.Price);
            order.WhenMatched()
                .Do(() => _lock = false)
                .Apply();
        }

        protected Order RegisterNewOrder(OrderDirections direction, decimal price)
        {
            var newOrder = this.CreateOrder(direction, price, Volume);
            newOrder.ShrinkPrice();
            newOrder.Security = Security;
            while (!Trader.IsConnected) Trader.Reconnect();
            base.RegisterOrder(newOrder);
            return newOrder;
        }
           
    }
}
pyhta4og
pyhta4og

Yury Smykalov: RIZ2@RTS

Сделка №4178 из report.xls Дата сделки: 30.10.2012 10:10:35 Цена сделки: 142120 Цена заявки: 141870 Направление: Продажа

Цена сделки выглядит очень странной, на фоне сохраненных сделок:

Time;Code;Price;Volume 30.10.2012 10:10:34,780;RIZ2@RTS;141870;5 30.10.2012 10:10:34,840;RIZ2@RTS;141870;4 30.10.2012 10:10:34,840;RIZ2@RTS;141870;1 30.10.2012 10:10:34,927;RIZ2@RTS;141870;3 30.10.2012 10:10:34,927;RIZ2@RTS;141870;2 30.10.2012 10:10:34,935;RIZ2@RTS;141870;3 30.10.2012 10:10:35,259;RIZ2@RTS;141870;1 30.10.2012 10:10:36,786;RIZ2@RTS;141860;1 30.10.2012 10:10:36,864;RIZ2@RTS;141860;1 30.10.2012 10:10:36,864;RIZ2@RTS;141860;2 30.10.2012 10:10:36,952;RIZ2@RTS;141860;1 30.10.2012 10:10:36,952;RIZ2@RTS;141860;1 30.10.2012 10:10:37,041;RIZ2@RTS;141860;1

> 
> И стаканов:
> ```plain
DepthTime;Code;BestBid;BestAsk
30.10.2012 10:10:34,897;RIZ2@RTS;141870;141880
30.10.2012 10:10:34,937;RIZ2@RTS;141860;141870
30.10.2012 10:10:35,036;RIZ2@RTS;141860;141870
30.10.2012 10:10:35,155;RIZ2@RTS;141860;141870
30.10.2012 10:10:35,223;RIZ2@RTS;141860;141870
30.10.2012 10:10:35,270;RIZ2@RTS;141860;141870
30.10.2012 10:10:35,322;RIZ2@RTS;141860;141870
30.10.2012 10:10:35,588;RIZ2@RTS;141860;141870
30.10.2012 10:10:35,653;RIZ2@RTS;141860;141870
30.10.2012 10:10:35,757;RIZ2@RTS;141860;141870
30.10.2012 10:10:35,942;RIZ2@RTS;141860;141870
30.10.2012 10:10:36,639;RIZ2@RTS;141860;141870
30.10.2012 10:10:36,704;RIZ2@RTS;141860;141870
30.10.2012 10:10:36,844;RIZ2@RTS;141860;141870
30.10.2012 10:10:36,885;RIZ2@RTS;141860;141870
30.10.2012 10:10:36,952;RIZ2@RTS;141850;141860
30.10.2012 10:10:37,099;RIZ2@RTS;141860;141870

Воспроизвел, будет фикс.

Mikhail Sukhov
Mikhail Sukhov

pyhta4og: Воспроизвел, будет фикс.

Выложил на КодеПлекс.

khmike
khmike

Mikhail Sukhov:

pyhta4og: Воспроизвел, будет фикс.

Выложил на КодеПлекс.

Добрый день! Пришлите пожалуйста ссылку на версию с этим фиксом. А то я вижу последний update на coldplex - StockSharp 4.1.5 Oct 28, 2012 by mika_soukhov

Alexander
Alexander

khmike:

Mikhail Sukhov:

pyhta4og: Воспроизвел, будет фикс.

Выложил на КодеПлекс.

Добрый день! Пришлите пожалуйста ссылку на версию с этим фиксом. А то я вижу последний update на coldplex - StockSharp 4.1.5 Oct 28, 2012 by mika_soukhov

Смотрите в исходниках, в папке References. Тут

Igor123
Igor123

Та же самая проблема: при тестирование на истории выставляется лимитированная заявка, но она исполняется по невероятной цене , которой даже нет в истории, с проскальзыванием -1340

Номер сделки Номер транзакции Время Цена Цена заявки Объем Направление Номер заявки Проскальзывание Проскальзывание (котирование) Позиция 1257 194837 31.10.2012 20:32:32 141970 141970 1 Покупка 1350 0 0 0 1258 194838 31.10.2012 20:32:41 142030 142030 1 Покупка 1351 0 0 1 1259 194839 31.10.2012 20:32:59 142140 142140 1 Покупка 1352 0 0 2 1260 194840 31.10.2012 20:33:47 142800 142130 2 Продажа 1353 0 -1340 0 1261 194841 31.10.2012 20:35:37 142800 142010 1 Продажа 1354 0 -790 -1 1262 194842 31.10.2012 20:35:46 142080 142080 1 Покупка 1355 0 0 0

2012.10.31 20:33:47.000| |SS_RIZ2@RTS_test account|Заявка Sell цена 142130 количество 2 2012.10.31 20:33:47.000| |SS_RIZ2@RTS_test account|Новая Sell сделка 1260 по цене 142800 на 2 заявки 194840. 2012.10.31 20:33:47.000| |SS_RIZ2@RTS_test account|Новая позиция: test account-RIZ2@RTS=0. 2012.10.31 20:33:47.000| |SS_RIZ2@RTS_test account|Заявка 194840 больше не активна.

4.1.5 версия проблема как нить решена?

Yury Smykalov
Yury Smykalov Autor

Проблема исправлена. Всем спасибо!

Igor123
Igor123

Yury Smykalov: Проблема исправлена. Всем спасибо!

У меня проблема не решилась, как было так и осталось, скачен был файл stocksharp-20984.zip и заменены файлы в Reference, что то не так?

Yury Smykalov
Yury Smykalov Autor

Igor123: У меня проблема не решилась, как было так и осталось, скачен был файл stocksharp-20984.zip и заменены файлы в Reference, что то не так?

Решение-то пересобрали после обновления dll-ек? Возможно, файлы библиотеки берутся по другому пути?

Я обычно обновляю S#, копируя новое содержимое References прямо в папку bin/Debug, рядом с роботом. После пересборки решения подхватываются обновленные файлы.

Igor123
Igor123

Yury Smykalov:

Igor123: У меня проблема не решилась, как было так и осталось, скачен был файл stocksharp-20984.zip и заменены файлы в Reference, что то не так?

Решение-то пересобрали после обновления dll-ек? Возможно, файлы библиотеки берутся по другому пути?

Я обычно обновляю S#, копируя новое содержимое References прямо в папку bin/Debug, рядом с роботом. После пересборки решения подхватываются обновленные файлы.

нет, все пересобрал, dll поменялись, проблема осталась(

Igor123
Igor123

http://stocksharp.codeplex.com/releases/view/97689 в этой версии такая же проблема

pyhta4og
pyhta4og

Igor123: http://stocksharp.codeplex.com/releases/view/97689 в этой версии такая же проблема

Прикрепите файлы данных со сделками и стаканами и тестовую стратегию на которой можно воспроизвести ошибку. Укажите ID проблемной сделки.

Igor123
Igor123

хорошо попробую