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

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


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

Обнаружил, следующую проблему: лимитированная заявка на покупку выставляется по цене 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).



Спасибо:


1 2  >
Mikhail Sukhov

Фотография
Дата: 30.10.2012
Ответить


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

Yury Smykalov

Фотография
Дата: 31.10.2012
Ответить


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;
        }
           
    }
}
report.xls 4 MB (390)
Спасибо:

Igor123

Фотография
Дата: 08.11.2012
Ответить


Та же самая проблема: при тестирование на истории выставляется лимитированная заявка, но она исполняется по невероятной цене , которой даже нет в истории, с проскальзыванием -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 версия
проблема как нить решена?
Спасибо:

pyhta4og

Фотография
Дата: 09.11.2012
Ответить


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


И стаканов:
Код
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

Фотография
Дата: 09.11.2012
Ответить


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


Выложил на КодеПлекс.
Спасибо:

khmike

Фотография
Дата: 09.11.2012
Ответить


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


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


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

Alexander

Фотография
Дата: 09.11.2012
Ответить


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


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


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


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

Yury Smykalov

Фотография
Дата: 10.11.2012
Ответить


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

Igor123

Фотография
Дата: 14.11.2012
Ответить


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


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

Yury Smykalov

Фотография
Дата: 14.11.2012
Ответить


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


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

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

Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy