Качаю маркет данные со смарта. Простая стратегия
using StockSharp.Algo;
using StockSharp.Algo.Logging;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
namespace AlgoTrading.Strategies.Development
{
public class MarketDepthSkeleton : Strategy
{
private Order _order;
private bool _canProcess = true;
protected override void OnStarted()
{
Security
.WhenMarketDepthChanged()
.Do(ProcessDepth)
.Apply(this);
base.OnStarted();
}
private void ProcessDepth(MarketDepth depth)
{
if (_canProcess)
{
_canProcess = false;
var orderDirection = _order == null ? OrderDirections.Buy : _order.Direction.Invert();
_order = this.CreateOrder(orderDirection, depth.GetCurrentPrice(orderDirection).Value);
this.AddInfoLog("Вход в направлении {0} по цене {1}", _order.Direction, _order.Price);
var strategy = new MarketQuotingStrategy(_order, new Unit(1, UnitTypes.Step, Security),
new Unit(1, UnitTypes.Step, Security))
{ Volume = Volume };
strategy.WhenStopped().Do(() => _canProcess = true).Apply(this);
ChildStrategies.Add(strategy);
}
}
}
}
дает следующий график доходности (см прикрепленный файл). Подскажите, пожалуйста, куда посмотреть, чтобы поправить маркет данные?
Kommentare (20)
Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen
я бы начал с того что в стратегии написал проверку
if(Strategy.BestBid.Price=0 || Strategy.BestAsk.Price=0||Strategy.LastTrade.Price=0|| Depth.BestBid.Price=0||Depth.BestAsk.Price=0 || Abs(BestAsk-LastTrade)>много || (BestBid-LastTrade)>много || Abs(nextTrade-LastTrade)>много)
где nextTrade - пришедшая сделка, Depth - пришедший стакан.
Это позволит выяснить не было ли действительно кривых данных записано.
Еще вариант - поставить брекпойнт в Strategy.PnLChanged и от туда раскручивать - если PnL стал сильно маленьким, посмотреть по коллстаку на наличие аргументов Trade, Depth с маленькими значениями
Hope it helps.
Добавил брейкпоинт и логгирование в стратегию:
Лог до брейкпоинта:
Лог после брейкпоинта:
Причина, похоже в том, что на какой-то момент у Security BestBid и BestAsk равны null
это может быть в клиринг, когда стакан очищается. или когда планка. сделайте проверку в стратегии.
Все 5 ошибок на графике до 12:00 )
А что в самих данных?
А где посмотреть? Что перебрать? )
На диске. Данные.
Провереть SecurityChanges на предмет Security.BestAsk == null и Security.BestBid == null?
Проверил все сохраненные MarketDepths. Не нашел ни одного со значениями BestBid == null или BestAsk == null. В стратегии на событии MarketDepthChanged, судя по логу, такие появляются:
Думаю, ошибка не в данных. Проверял так:
файлы данных можете прикрепить (сделки и стаканы) за проблемный день?
Прикрепить не получилось. Ссылка: http://sdrv.ms/U6jFLM
Проверьте на последней версии на codeplex.
Не знаю в чем проблема. Менеджеру статистики верить нельзя: неверно просадку считает. Что делать посоветуете? Свой менеджер статистики писать?
Я так понимаю, что для расчета прибыли на каждый текущий момент нужна информация о стоимости инструмента на каждый текущий момент. Предполагаю, что стоимость инструмента в закаченных маркет данных на какой-то момент неверна. Могу исключить эту неверную цену из маркет данных. Только я не понимаю как внутри этот PnLManager работает. Откуда он берет текущую цену инструмента? Эх, был бы доступ к исходникам )
PnLManager берет bestbid/bestask из стакана для расчета цены инструмента. А вот если их нет то берутся bestbid/bestask из инструмента, потом lasttrade... Короче PnLManager борется до последнего, а если нет ничего то берет НОЛЬ и будет спайк.
Если это в клиринг то возможно в клиринге очистило стакан и пошли такие спецэффекты. А ласттрейд был давно. Hope it helps
На этот раз похоже действительно клиринг.
Клиринг тут как виноват?
В этот раз прибыль некорректно посчиталась в период 18:50 - 19:00. Настроил свою гидру, чтобы маркет данные качались по расписанию работы биржи РТС.