По стратегиям из последней версии
BestByPriceQuotingStrategy и MarketQuotingStrategy
Так как MarketQuotingStrategy унаследована от BestByPriceQuotingStrategy, метод NeedQuoting у них общий. Проблема с тем, что заявка не откатывается у них общая
Код
if (QuotingDirection == Sides.Sell)
{
//Здесь если BestPrice > currentPrice то ни чего происходить не будет, и заявка не откатится назад
if (currentPrice == null || (decimal)(price + BestPriceOffset) < currentPrice)
return price + (decimal)BestPriceOffset / 2;
}
else
{
//Здесь если BestPrice < currentPrice то ни чего происходить не будет, и заявка не откатится назад
if (currentPrice == null || (decimal)(price - BestPriceOffset) > currentPrice)
return price - (decimal)BestPriceOffset / 2;
}
Можно вылечить так
Код
if (QuotingDirection == Sides.Sell)
{
var newPrice = Security.ShrinkPrice((decimal) price + (decimal) BestPriceOffset/2);
if (currentPrice == null || (newPrice != currentPrice)) return newPrice;
}
else
{
var newPrice = Security.ShrinkPrice((decimal) price - (decimal) BestPriceOffset/2);
if (currentPrice == null || (newPrice != currentPrice)) return newPrice;
}
В таком случае, заявка будет всегда переставляться на параметры заданные стратегией. Кроме случая если она уже стоит на нужной цене.
Изучив код подробней этих стратегий, понял что мое представление о том как они должны работать не совпадают с реализованным.
1) BestPriceOffset - Отступ от лучшей цены, на который
может уйти котируемая заявка.
Слово может очень сбивает с толку, в стратегии строго забито, что она в любом случае отступит от лучшей цены на значение BestPriceOffset
В моем представлении, если взять для примера BestByPriceQuotingStrategy, то стратегия должна выставлять заявку на лучшую цену(на то это и
BestByPriceQuotingStrategy). Но если заявка уйдет от BestPrice на значение меньшее чем BestPriceOffset то переставляться не будет.
2) PriceOffset - Отступ цены для выставляемой заявки. Определяет размер отступа от лучшей котировки (для покупки прибавляется к цене, для продажи - вычитается).
Этот отступ есть у MarketQuotingStrategy если он положительный а сделка Buy, стратегия выставит заявку на BestPrice - BestPriceOffset + PriceOffset. То есть выше описанный BestPriceOffset тоже вычитается.
В общем мне кажется BestPriceOffset сейчас работает не так как надо, а GetAcceptablePriceRange() все таки нужный метод, по крайней мере для BestByPriceQuotingStrategy. Править?
В BestByVolumeQuotingStrategy я исправил один метод NeedQuoting. В коде постарался пояснения написать по подробнее. Протестировал, стратегия работает, выложил в ВК.