Качаю маркет данные со смарта. Простая стратегия
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);
}
}
}
}
дает следующий график доходности (см прикрепленный файл). Подскажите, пожалуйста, куда посмотреть, чтобы поправить маркет данные?
Comentários (20)
Entrar ou Criar conta, Faça login ou cadastre-se para deixar um comentário
я бы начал с того что в стратегии написал проверку
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. Настроил свою гидру, чтобы маркет данные качались по расписанию работы биржи РТС.