← 返回

Я богат

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

本主题对您有帮助吗?

分享主题

评论 (23)

登录创建账户, 登录或注册以发表评论

vk37
vk37 作者

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

Mikhail Sukhov
Mikhail Sukhov

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

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

vk37
vk37 作者

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

Marco
Marco

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

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

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

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

pyhta4og
pyhta4og

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

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

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

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

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

vk37
vk37 作者

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

vk37
vk37 作者

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

vk37
vk37 作者

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

vk37
vk37 作者

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

Mikhail Sukhov
Mikhail Sukhov

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

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

vk37
vk37 作者

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

Mikhail Sukhov
Mikhail Sukhov

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

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

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

vk37
vk37 作者

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

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

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

Mikhail Sukhov
Mikhail Sukhov

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

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

vk37
vk37 作者

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

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

vk37
vk37 作者

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

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 作者

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

vk37
vk37 作者

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

pyhta4og
pyhta4og

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

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

vk37
vk37 作者

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

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

vk37
vk37 作者

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

pyhta4og
pyhta4og

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

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

vk37
vk37 作者

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