vk37
|
Дата: 14.11.2012
В ответ на настойчивые просьбы пользователей форума показать код сверхдоходной стратегии, подготовил упрощенный вариант стратегии увеличивающей счет в 5 раз за 7 дней (неплохая доходность, да?). Стратегия простая. Ссылка на код проекта. Надеюсь SkyDrive справиться с количеством загрузок )
|
|
Спасибо:
|
|
|
|
|
Mikhail Sukhov
|
Дата: 14.11.2012
vk37 В ответ на настойчивые просьбы пользователей форума Я не являюсь пользователем форума, а являюсь представителем администрации. Ваш код мне ни к чему, и смотреть его времени нет. Если вам нужен ответ на вопрос почему у вас что-то не работает, то присылайте куски кода, логи, цифры, отчеты.
|
|
Спасибо:
|
|
|
|
|
vk37
|
Дата: 14.11.2012
Mikhail Sukhov Я не являюсь пользователем форума, а являюсь представителем администрации. Ваш код мне ни к чему, и смотреть его времени нет.
Если вам нужен ответ на вопрос почему у вас что-то не работает, то присылайте куски кода, логи, цифры, отчеты.
Ну это зря. Более лучшего способа продемонстрировать ошибку я не придумаю.
|
|
Спасибо:
|
|
|
|
|
Mikhail Sukhov
|
Дата: 14.11.2012
vk37 Ну это зря. Более лучшего способа продемонстрировать ошибку я не придумаю. Ошибка то у вас, в вашем коде. Так что это вам зря, что ты не делаете по инструкции.[laugh]
|
|
Спасибо:
|
|
|
|
|
vk37
|
Дата: 14.11.2012
|
|
|
|
Код стратегии: Код
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
Отчет Excel прикреплен к сообщению. Полный код проекта и тестовые данные здесь. Маркет данные закачены через смартком. Удивляет нереально высокое отрицательное проскальзывание.
|
|
Спасибо:
|
|
|
|
|
vk37
|
Дата: 14.11.2012
Mikhail Sukhov Ошибка то у вас, в вашем коде. Так что это вам зря, что ты не делаете по инструкции.[laugh] Та же стратегия на тех же данных, только на текущей версии сборок с кодплекса (первый вариант был на сборках месячной давности): Код
Доходность: -114597,79760
Проскальзывание: 35820
Сделок: 21177
Время выполнения: 00:01:02.7461809
Теперь понятно у кого ошибка в коде )
|
|
Спасибо:
|
|
|
|
|
vk37
|
Дата: 15.11.2012
Опробовал рабочую стратегию на новых сборках. Ситуация с проскальзыванием, похоже не поменялась на смарт данных. Если сравнивать с реалтаймом, то частота, с которой проскальзывание случается приблизительно похоже на реалтайм: где-то каждые 10-15 сделок (хотя в реалтайме реже, наверное). Проскальзывание отрицательное и в тестировании и в реалтайме. Вот только в реалтайме у меня больше одного шага цены проскальзывания не бывает. В тестировании - 1-2-3-4 шага цены. Это на смарт данных. На плазе проскальзывание похоже на реалтайм. Эх, хочу плазу )
|
|
Спасибо:
|
|
|
|
|
vk37
|
Дата: 15.11.2012
На смарте проскальзывание тоже стало похожим на рилтайм при уменьшении задержки до 100мс
|
|
Спасибо:
|
|
|
|
|
pyhta4og
|
Дата: 15.11.2012
vk37 На смарте проскальзывание тоже стало похожим на рилтайм при уменьшении задержки до 100мс в итоге у вас есть жалобы на тестер?
|
|
Спасибо:
|
|
|
|
|
vk37
|
Дата: 15.11.2012
По точности расчета пока нет. При сверке тестирования с рилтаймом сталкивался с тем, что сигналы генерируются с разницей по времени иногда до 30 сек. Пока не готов исследовать этот момент. В дальнейшем буду сверять: если столкусь с такой проблемой, то сообщу. Может со временем попробую объединить закачку маркет данных с роботом, чтобы свести разницу в тестировании с рилтаймом к минимуму.
Медленнее стала работать оптимизация. Я уже писал об этом. Но использование какого именно функционала S# замедлило это тестирование пока не могу сказать.
|
|
Спасибо:
|
|
|
|