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

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


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

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

Вот выдержка из лога:
Code
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#, а моя собственная, похожая. Выставляется заявка примерно так:
Code
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) ниже обоих границ спреда и цен последних сделок:
Code
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:
Code
Номер сделки	Номер транзакции	Время	Цена	Цена заявки	Объем	Направление	Номер заявки	Проскальзывание	Проскальзывание (котирование)	Комментарий	Прибыль в рублях	Прибыль в пунктах	Прибыль в рублях (суммарная)	Прибыль в пунктах (суммарная)	Позиция		Номер заявки	Номер транзакции	Направление	Зарегистрирована	Изменена	Продолжительность	Цена	Цена (усредн.)	Статус	Состояние	Баланс	Объем	Тип	Проскальзывание	Задержка регистрации	Задержка отмены	Комментарий
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).



Thanks:


1 2  >
Mikhail Sukhov

Avatar
Date: 10/30/2012
Reply


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

Yury Smykalov

Avatar
Date: 10/31/2012
Reply


RIZ2@RTS

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

Цена сделки выглядит очень странной, на фоне сохраненных сделок:
Code
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


И стаканов:
Code
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
Code
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
Code
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 (403)
Thanks:

Igor123

Avatar
Date: 11/8/2012
Reply


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

pyhta4og

Avatar
Date: 11/9/2012
Reply


Yury Smykalov
RIZ2@RTS

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

Цена сделки выглядит очень странной, на фоне сохраненных сделок:
Code
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


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




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

Mikhail Sukhov

Avatar
Date: 11/9/2012
Reply


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


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

khmike

Avatar
Date: 11/9/2012
Reply


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


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


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

Alexander

Avatar
Date: 11/9/2012
Reply


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


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


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


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

Yury Smykalov

Avatar
Date: 11/10/2012
Reply


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

Igor123

Avatar
Date: 11/14/2012
Reply


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


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

Yury Smykalov

Avatar
Date: 11/14/2012
Reply


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


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

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

Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy