← Back

Я богат

Легко могу написать стратегию, которая при тестировании на истории увеличит счет за день в несколько раз. Какая-то лажа, по-видимому, при записи стакана. Если кто может, дайте, плз, маркет данные со стаканом фьючерса РТС за 19.09.12.

Comments (23)

Login or Create account, Log in or register to leave a comment

vk37
vk37 Author

Похоже, что такой сверх доход могу получить не только 19.09.12, но и в другие дни. Нет у меня доверия к результатам тестирования. Может маркет данные со смарта некорректны, может ошибка в стокшарпе. Хорошо бы свериться по маркет данным не смартокма.

Mikhail Sukhov
Mikhail Sukhov

vk37: Похоже, что такой сверх доход могу получить не только 19.09.12, но и в другие дни. Нет у меня доверия к результатам тестирования. Может маркет данные со смарта некорректны, может ошибка в стокшарпе. Хорошо бы свериться по маркет данным не смартокма.

Банк, кредит, брокер, аэропорт, Багамы, кайф, фотка, форум, зависть.

vk37
vk37 Author

В тестировании на истории обхожу победителей ЛЧИ по доходности в не один десяток раз )

Marco
Marco

vk37: В тестировании на истории обхожу победителей ЛЧИ деляпо доходности в не один десяток раз )

Меняю необходимые данные на исходники стратегии! :)

Последняя неделя RIZ2 устроит? Пришлите контакты в личку, вышлю.

P.S.: Вышлю и без исходников. Нафига мне эти Багамы...

pyhta4og
pyhta4og

vk37: В тестировании на истории обхожу победителей ЛЧИ по доходности в не один десяток раз )

у смарта в стаканах нет миллисекунд. это вообще локальное время на вашем компьютере. А время сделок - биржевое. Поэтому писать стаканы из смарта для тестирования HFT - дело гиблое. сверхбыстрые стратегии (а у вас подозреваю что то высокочастотное) по этим данным адекватно не протестировать. Другое дело стаканы записанные из плазы. Там время биржевое а не локальное и миллисекунды есть.

Но даже для плазы я бы ставил Latency минимум 100 мс (на сеть+очередь ядра) чтобы надеятся на правдоподобный результат. Вообще тема латенси довольно обширна и сложна в правильной эмуляции. Есть 75мс квантование данных из ядра. Оно еще замедляет реакцию стратегии. Это можно в тестере стокшарпа тоже включить.

В принципе если поставите латенси в секунду я почти уверен что даже на смартовых данных у вас все развалится.

Так что не переживайте, все тут такие же богачи :)

vk37
vk37 Author

Личка не работает. Мой контакт здесь.

vk37
vk37 Author

И за 19.09.12 включите, пожалуйста, если не сложно.

vk37
vk37 Author

Похоже, что причина такой высокой доходности: большое отрицателное проскальзывание, которого в реал тайме не наблюдается. Наверное нужно правильно подобрать параметр EmulationTrader.MarketEmulator.Settings.Slippage Пока не придумал как сравнить реалтайм с эмуляцией за большой период времени: сравнивать каждый сигнал и каждую сделку долго.

vk37
vk37 Author

Не знаю как правильно. В общем не наблюдаю я такой величины проскальзывания, которую дает эмулятор. Не измерял точное различие, но судя по логам за пару дней, различие, похоже, в десятки раз.

Mikhail Sukhov
Mikhail Sukhov

vk37: Не знаю как правильно. В общем не наблюдаю я такой величины проскальзывания, которую дает эмулятор. Не измерял точное различие, но судя по логам за пару дней, различие, похоже, в десятки раз.

Может опять что не так настроили? Вы хоть код приводите, логи, цифры.

vk37
vk37 Author

В ответ на настойчивые просьбы пользователей форума показать код сверхдоходной стратегии, подготовил упрощенный вариант стратегии увеличивающей счет в 5 раз за 7 дней (неплохая доходность, да?). Стратегия простая. Ссылка на код проекта. Надеюсь SkyDrive справиться с количеством загрузок )

Mikhail Sukhov
Mikhail Sukhov

vk37: В ответ на настойчивые просьбы пользователей форума

Я не являюсь пользователем форума, а являюсь представителем администрации. Ваш код мне ни к чему, и смотреть его времени нет.

Если вам нужен ответ на вопрос почему у вас что-то не работает, то присылайте куски кода, логи, цифры, отчеты.

vk37
vk37 Author

Mikhail Sukhov: Я не являюсь пользователем форума, а являюсь представителем администрации. Ваш код мне ни к чему, и смотреть его времени нет.

Если вам нужен ответ на вопрос почему у вас что-то не работает, то присылайте куски кода, логи, цифры, отчеты.

Ну это зря. Более лучшего способа продемонстрировать ошибку я не придумаю.

Mikhail Sukhov
Mikhail Sukhov

vk37: Ну это зря. Более лучшего способа продемонстрировать ошибку я не придумаю.

Ошибка то у вас, в вашем коде. Так что это вам зря, что ты не делаете по инструкции.😂

vk37
vk37 Author

Mikhail Sukhov: Ошибка то у вас, в вашем коде. Так что это вам зря, что ты не делаете по инструкции.😂 Та же стратегия на тех же данных, только на текущей версии сборок с кодплекса (первый вариант был на сборках месячной давности):

Доходность: -114597,79760
Проскальзывание: 35820
Сделок: 21177
Время выполнения: 00:01:02.7461809

vk37
vk37 Author

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

using StockSharp.Algo;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;

namespace AlgoTrading.SpeedTest
{
    public class MarketDepthSkeleton : Strategy
    {
        private Order _order;
        private bool _canProcess = true;
        private readonly object _locker = new object();

        protected override void OnStarted()
        {
            Security
                .WhenMarketDepthChanged()
                .Do(ProcessDepth)
                .Sync(_locker)
                .Apply(this);

            base.OnStarted();
        }

        private void ProcessDepth(MarketDepth depth)
        {
            if (Security.BestAsk == null || Security.BestBid == null)
                return;

            if (_canProcess)
            {
                _canProcess = false;
                var orderDirection = _order == null ? OrderDirections.Buy : _order.Direction.Invert();
                _order = this.CreateOrder(orderDirection, depth.GetCurrentPrice(orderDirection).Value);
                var strategy = new MarketQuotingStrategy(_order, new Unit(1, UnitTypes.Step, Security),
                                                         new Unit(1, UnitTypes.Step, Security)) 
                                                         { Volume = Volume };
                strategy.WhenStopped().Do(() => _canProcess = true).Sync(_locker).Once().Apply(this);
                ChildStrategies.Add(strategy);
            }
        }
    }
}
using System;
using System.Diagnostics;
using System.Threading;
using StockSharp.Algo.Storages;
using StockSharp.Algo.Testing;
using StockSharp.BusinessEntities;
using System.Linq;

namespace AlgoTrading.SpeedTest
{
    [Serializable]
    public class TestRunner
    {
        private IStorageRegistry _storageRegistry;
        private LocalMarketDataDrive _defaultDrive;

        public void Run()
        {
            var startTime = new DateTime(2012, 11, 1);
            var stopTime = new DateTime(2012, 11, 12);

            _storageRegistry = new StorageRegistry();
            _defaultDrive = (LocalMarketDataDrive)_storageRegistry.DefaultDrive;
            _defaultDrive.Path = @"D:\DBs\HydraData\SmartTest";
            var security = Securities.Instance.RtsF;
            using (var waitHandle = new AutoResetEvent(false))
            {
                var rts = security.Clone();
                var portfolio = new Portfolio { Name = "test account", BeginValue = 100000m };
                var trader = new EmulationTrader(
                    new[] { rts },
                    new[] { portfolio },
                    _storageRegistry)
                    {
                        UseMarketDepth = true,
                        StorageRegistry = _storageRegistry,
                    };

                trader.MarketEmulator.Settings.Latency = TimeSpan.FromSeconds(1);
                trader.RegisterMarketDepth(rts);
                trader.Connect();
                trader.StartExport();
                
                var strategy = new MarketDepthSkeleton()
                    {
                        Volume = 1,
                        Security = rts,
                        Portfolio = portfolio,
                        Trader = trader,
                        CommissionManager = rts.GetComissionManager(),
                    };
                var sw = new Stopwatch();

                trader.StateChanged += (oldState, newState) =>
                    {
                        if (trader.State == EmulationStates.Started)
                        {
                            strategy.Start();
                            Console.WriteLine("Стратегия запущена");
                        }
                        else if (trader.State == EmulationStates.Stopped)
                        {
                            sw.Stop();
                            Console.WriteLine("Доходность: {0}", strategy.PnL);
                            Console.WriteLine("Проскальзывание: {0}", strategy.Slippage);
                            Console.WriteLine("Сделок: {0}", strategy.MyTrades.Count());
                            Console.WriteLine("Время выполнения: {0}", sw.Elapsed);
                            waitHandle.Set();
                        }
                    };
                sw.Start();
                trader.Start(startTime, stopTime);
                waitHandle.WaitOne();
            }
        }
    }
}
Доходность: 54507
Проскальзывание: -72840
Сделок: 8127
Время выполнения: 00:00:45.514

Полный код проекта и тестовые данные здесь. Маркет данные закачены через смартком. Удивляет нереально высокое отрицательное проскальзывание.

vk37
vk37 Author

Опробовал рабочую стратегию на новых сборках. Ситуация с проскальзыванием, похоже не поменялась на смарт данных. Если сравнивать с реалтаймом, то частота, с которой проскальзывание случается приблизительно похоже на реалтайм: где-то каждые 10-15 сделок (хотя в реалтайме реже, наверное). Проскальзывание отрицательное и в тестировании и в реалтайме. Вот только в реалтайме у меня больше одного шага цены проскальзывания не бывает. В тестировании - 1-2-3-4 шага цены. Это на смарт данных. На плазе проскальзывание похоже на реалтайм. Эх, хочу плазу )

vk37
vk37 Author

На смарте проскальзывание тоже стало похожим на рилтайм при уменьшении задержки до 100мс

pyhta4og
pyhta4og

vk37: На смарте проскальзывание тоже стало похожим на рилтайм при уменьшении задержки до 100мс

в итоге у вас есть жалобы на тестер?

vk37
vk37 Author

По точности расчета пока нет. При сверке тестирования с рилтаймом сталкивался с тем, что сигналы генерируются с разницей по времени иногда до 30 сек. Пока не готов исследовать этот момент. В дальнейшем буду сверять: если столкусь с такой проблемой, то сообщу. Может со временем попробую объединить закачку маркет данных с роботом, чтобы свести разницу в тестировании с рилтаймом к минимуму.

Медленнее стала работать оптимизация. Я уже писал об этом. Но использование какого именно функционала S# замедлило это тестирование пока не могу сказать.

vk37
vk37 Author

Сегодняшний рилтайм получился доходнее эмуляции в сумме на 1% от депозита. Лучше так, чем наоборот.

pyhta4og
pyhta4og

vk37: Сегодняшний рилтайм получился доходнее эмуляции в сумме на 1% от депозита. Лучше так, чем наоборот.

рилтаймом вы называете боевое исполнение на живых деньгах или эмуляцию в режиме реального времени на realtimeEmulationTrader?

vk37
vk37 Author

боевое исполнение на живых деньгах