Я богат
Atom
11/10/2012
vk37


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




Thanks:


< 1 2 3  >
vk37

Avatar
Date: 11/14/2012
Reply


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

Thanks:

Mikhail Sukhov

Avatar
Date: 11/14/2012
Reply


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

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

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

Thanks:

vk37

Avatar
Date: 11/14/2012
Reply


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

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

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

Thanks:

Mikhail Sukhov

Avatar
Date: 11/14/2012
Reply


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

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

Thanks:

vk37

Avatar
Date: 11/14/2012
Reply


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

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

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

Report.zip 1 MB (492)
Thanks:

vk37

Avatar
Date: 11/14/2012
Reply


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

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

Thanks:

vk37

Avatar
Date: 11/15/2012
Reply


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

Thanks:

vk37

Avatar
Date: 11/15/2012
Reply


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

Thanks:

pyhta4og

Avatar
Date: 11/15/2012
Reply


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

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

Thanks:

vk37

Avatar
Date: 11/15/2012
Reply


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

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

Thanks:
< 1 2 3  >

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

loading
clippy