После исполнения котируемой заявки в TheorPriceQuotingStrategy стратегия не останавливается, а продолжает котирование.
Лог стратегии:
14:26:17.722 | | SOQS | Стратегия запущена.
14:26:18.445 | | SOQS | Регистрация новой заявки на Sell с ценой 233 и объемом 1.
14:26:18.461 | | SOQS | Заявка 51668157 на Sell отправлена с ценой 233 объемом 1.
14:26:44.024 | | SOQS | Цена текущей 233 и лучшей 236.
14:26:44.024 | | SOQS | Лучший бид 220 и лучший аск 233.
14:26:44.025 | | SOQS | Котирование заявки 51668157 на Sell с ценой 233 объемом 1.
14:26:44.032 | | SOQS | Перекотирование зарегистрировано для заявки 51668158 на Sell с ценой 236 объемом 1.
14:29:22.051 | | SOQS | Цена текущей 236 и лучшей 239.
14:29:22.051 | | SOQS | Лучший бид 220 и лучший аск 236.
14:29:22.051 | | SOQS | Котирование заявки 51668158 на Sell с ценой 236 объемом 1.
14:29:22.052 | | SOQS | Перекотирование зарегистрировано для заявки 51668159 на Sell с ценой 239 объемом 1.
14:30:14.404 | | SOQS | Цена текущей 239 и лучшей 244.
14:30:14.404 | | SOQS | Лучший бид 224 и лучший аск 239.
14:30:14.404 | | SOQS | Котирование заявки 51668159 на Sell с ценой 239 объемом 1.
14:30:14.407 | | SOQS | Перекотирование зарегистрировано для заявки 51668160 на Sell с ценой 244 объемом 1.
14:30:32.645 | | SOQS | Новая Sell сделка 452914851 по цене 244 на 1 заявки 51668160.
14:32:36.471 | | SOQS | Цена текущей 244 и лучшей 251.
14:32:36.471 | | SOQS | Лучший бид 250 и лучший аск 258.
14:32:36.471 | | SOQS | Котирование заявки 51668160 на Sell с ценой 244 объемом 1.
14:32:36.472 | | SOQS | Перекотирование зарегистрировано для заявки 51668161 на Sell с ценой 251 объемом 1.
14:32:36.815 | Error | SOQS | Заявка 51668161 не была принята по причине System.InvalidOperationException: Сервер для транзакции 'ACTION=MOVE_ORDERS; TRANS_ID=51668161; CLASSCODE=SPBOPT; SECCODE=SR8250BL1; MODE=0; FIRST_ORDER_NUMBER=5904276069; FIRST_ORDER_NEW_PRICE=251; FIRST_ORDER_NEW_QUANTITY=1;' вернул неправильное сообщение 'Ошибка перестановки заявок. [FORTS] "Не найдена заявка для перестановки.".' по передвинутым заявкам..
14:32:38.634 | Error | SOQS | Котируемая заявка 51668161 не принята биржей по причине 'Сервер для транзакции 'ACTION=MOVE_ORDERS; TRANS_ID=51668161; CLASSCODE=SPBOPT; SECCODE=SR8250BL1; MODE=0; FIRST_ORDER_NUMBER=5904276069; FIRST_ORDER_NEW_PRICE=251; FIRST_ORDER_NEW_QUANTITY=1;' вернул неправильное сообщение 'Ошибка перестановки заявок. [FORTS] "Не найдена заявка для перестановки.".' по передвинутым заявкам.'.
14:32:38.635 | | SOQS | Регистрация новой заявки на Sell с ценой 251 и объемом 1.
14:32:38.636 | | SOQS | Заявка 51668162 на Sell отправлена с ценой 251 объемом 1.
14:32:48.379 | | SOQS | Цена текущей 251 и лучшей 255.
14:32:48.379 | | SOQS | Лучший бид 250 и лучший аск 251.
14:32:48.379 | | SOQS | Котирование заявки 51668162 на Sell с ценой 251 объемом 1.
14:32:48.380 | | SOQS | Перекотирование зарегистрировано для заявки 51668163 на Sell с ценой 255 объемом 1.
14:32:54.006 | | SOQS | Отмена заявки 51668160.
14:32:54.007 | | SOQS | Отмена заявки 51668163.
14:32:54.008 | | SOQS | Стратегия останавливается.
14:32:54.009 | | SOQS | Заканчиваем котирование с неисполненным объемом равный 1.
14:32:54.009 | | SOQS | Заканчиваем котирование с неисполненным объемом равный 1.
14:32:54.010 | | SOQS | Стратегия остановлена.
Вот то что я выводил в дебаггер. Событие новой сделки приходило, однако стратегия на нее не отреагировала
Время: 14:26:18.426; Вызван NeedFinish; Цена БА: 7865.0; Результат: False.
Время: 14:26:18.440; Вызван GetNewPrice; Цена БА: 7865.0; Теор цена из таб: 230.0; Результат: 233.5.
Время: 14:26:18.442; Вызван GetNewVolume; Цена БА: 7865.0; Результат: 1.0.
Время: 14:26:18.443; Вызван NeedRegister; Цена БА: 7865.0; Результат: True.
Время: 14:26:18.444; Вызван NeedFinish; Цена БА: 7865.0; Результат: False.
Время: 14:26:18.446; Вызван RegisterQuotingOrder.
Время: 14:26:18.447; Вызван RegisterOrder.
Время: 14:26:18.462; Вызван NeedFinish; Цена БА: 7865.0; Результат: False.
Время: 14:26:18.737; Событие NewOrder; Цена БА: 7865.0; Цена заявки: 233.0; Объем заявки: 1.0.
Время: 14:26:18.941; Вызван NeedFinish; Цена БА: 7866.0; Результат: False.
***** удалено для экономии места
Время: 14:30:32.445; Вызван NeedFinish; Цена БА: 7892.0; Результат: False.
Время: 14:30:32.463; Вызван GetNewPrice; Цена БА: 7892.0; Теор цена из таб: 240.0; Результат: 243.6.
Время: 14:30:32.467; Вызван GetNewVolume; Цена БА: 7892.0; Результат: 1.0.
Время: 14:30:32.493; Вызван NeedRegister; Цена БА: 7892.0; Результат: False.
Время: 14:30:32.499; Вызван NeedReRegister с параметрами newBestPrice=244.0 и newVolume=1.0; Цена БА: 7892.0; Результат: False.
Время: 14:30:32.501; Вызван NeedFinish; Цена БА: 7892.0; Результат: False.
Новая сделка
Время: 14:30:35.459; Вызван NeedFinish; Цена БА: 7892.0; Результат: False.
Время: 14:30:35.460; Вызван GetNewPrice; Цена БА: 7892.0; Теор цена из таб: 240.0; Результат: 243.6.
Время: 14:30:35.461; Вызван GetNewVolume; Цена БА: 7892.0; Результат: 1.0.
Время: 14:30:35.462; Вызван NeedRegister; Цена БА: 7892.0; Результат: False.
Время: 14:30:35.462; Вызван NeedReRegister с параметрами newBestPrice=244.0 и newVolume=1.0; Цена БА: 7892.0; Результат: False.
Время: 14:30:35.463; Вызван NeedFinish; Цена БА: 7892.0; Результат: False.
Время: 14:31:08.047; Вызван NeedFinish; Цена БА: 7892.0; Результат: False.
Время: 14:31:08.050; Вызван GetNewPrice; Цена БА: 7892.0; Теор цена из таб: 239.0; Результат: 242.6.
Время: 14:31:08.051; Вызван GetNewVolume; Цена БА: 7892.0; Результат: 1.0.
Время: 14:31:08.051; Вызван NeedRegister; Цена БА: 7892.0; Результат: False.
Время: 14:31:08.052; Вызван NeedReRegister с параметрами newBestPrice=243.0 и newVolume=1.0; Цена БА: 7892.0; Результат: False.
Время: 14:31:08.053; Вызван NeedFinish; Цена БА: 7892.0; Результат: False.
Время: 14:31:10.007; Вызван NeedFinish; Цена БА: 7892.0; Результат: False.
Время: 14:31:10.008; Вызван GetNewPrice; Цена БА: 7892.0; Теор цена из таб: 239.0; Результат: 242.6.
Время: 14:31:10.008; Вызван GetNewVolume; Цена БА: 7892.0; Результат: 1.0.
Время: 14:31:10.009; Вызван NeedRegister; Цена БА: 7892.0; Результат: False.
Время: 14:31:10.009; Вызван NeedReRegister с параметрами newBestPrice=243.0 и newVolume=1.0; Цена БА: 7892.0; Результат: False.
Время: 14:31:10.010; Вызван NeedFinish; Цена БА: 7892.0; Результат: False.
Время: 14:31:16.199; Вызван NeedFinish; Цена БА: 7889.0; Результат: False.
Время: 14:31:16.200; Вызван GetNewPrice; Цена БА: 7889.0; Теор цена из таб: 240.0; Результат: 243.6.
Время: 14:31:16.201; Вызван GetNewVolume; Цена БА: 7889.0; Результат: 1.0.
Время: 14:31:16.201; Вызван NeedRegister; Цена БА: 7889.0; Результат: False.
Время: 14:31:16.202; Вызван NeedReRegister с параметрами newBestPrice=244.0 и newVolume=1.0; Цена БА: 7889.0; Результат: False.
Время: 14:31:16.202; Вызван NeedFinish; Цена БА: 7889.0; Результат: False.
Время: 14:31:17.837; Вызван NeedFinish; Цена БА: 7889.0; Результат: False.
Время: 14:31:17.838; Вызван GetNewPrice; Цена БА: 7889.0; Теор цена из таб: 240.0; Результат: 243.6.
Время: 14:31:17.839; Вызван GetNewVolume; Цена БА: 7889.0; Результат: 1.0.
Время: 14:31:17.840; Вызван NeedRegister; Цена БА: 7889.0; Результат: False.
Время: 14:31:17.840; Вызван NeedReRegister с параметрами newBestPrice=244.0 и newVolume=1.0; Цена БА: 7889.0; Результат: False.
Время: 14:31:17.841; Вызван NeedFinish; Цена БА: 7889.0; Результат: False.
Время: 14:31:18.807; Вызван NeedFinish; Цена БА: 7889.0; Результат: False.
Время: 14:31:18.808; Вызван GetNewPrice; Цена БА: 7889.0; Теор цена из таб: 240.0; Результат: 243.6.
Время: 14:31:18.808; Вызван GetNewVolume; Цена БА: 7889.0; Результат: 1.0.
Время: 14:31:18.809; Вызван NeedRegister; Цена БА: 7889.0; Результат: False.
Время: 14:31:18.809; Вызван NeedReRegister с параметрами newBestPrice=244.0 и newVolume=1.0; Цена БА: 7889.0; Результат: False.
Время: 14:31:18.810; Вызван NeedFinish; Цена БА: 7889.0; Результат: False.
Время: 14:31:50.891; Вызван NeedFinish; Цена БА: 7892.0; Результат: False.
Время: 14:31:50.892; Вызван GetNewPrice; Цена БА: 7892.0; Теор цена из таб: 239.0; Результат: 242.6.
Время: 14:31:50.893; Вызван GetNewVolume; Цена БА: 7892.0; Результат: 1.0.
Время: 14:31:50.893; Вызван NeedRegister; Цена БА: 7892.0; Результат: False.
Время: 14:31:50.894; Вызван NeedReRegister с параметрами newBestPrice=243.0 и newVolume=1.0; Цена БА: 7892.0; Результат: False.
Время: 14:31:50.894; Вызван NeedFinish; Цена БА: 7892.0; Результат: False.
The thread '<No Name>' (0x1500) has exited with code 0 (0x0).
The thread '<No Name>' (0x1ed0) has exited with code 0 (0x0).
Время: 14:32:36.468; Вызван NeedFinish; Цена БА: 7901.0; Результат: False.
Время: 14:32:36.469; Вызван GetNewPrice; Цена БА: 7901.0; Теор цена из таб: 247.0; Результат: 250.7.
Время: 14:32:36.469; Вызван GetNewVolume; Цена БА: 7901.0; Результат: 1.0.
Время: 14:32:36.470; Вызван NeedRegister; Цена БА: 7901.0; Результат: False.
Время: 14:32:36.470; Вызван NeedReRegister с параметрами newBestPrice=251.0 и newVolume=1.0; Цена БА: 7901.0; Результат: True.
Время: 14:32:36.471; Вызван NeedFinish; Цена БА: 7901.0; Результат: False.
Время: 14:32:36.472; Вызван ReRegisterOrder.
Время: 14:32:36.473; Вызван NeedFinish; Цена БА: 7901.0; Результат: False.
Время: 14:32:38.631; Вызван NeedFinish; Цена БА: 7903.0; Результат: False.
Время: 14:32:38.632; Вызван GetNewPrice; Цена БА: 7903.0; Теор цена из таб: 247.0; Результат: 250.7.
Время: 14:32:38.633; Вызван GetNewVolume; Цена БА: 7903.0; Результат: 1.0.
Время: 14:32:38.633; Вызван NeedRegister; Цена БА: 7903.0; Результат: True.
Время: 14:32:38.634; Вызван NeedFinish; Цена БА: 7903.0; Результат: False.
Время: 14:32:38.635; Вызван RegisterQuotingOrder.
Время: 14:32:38.636; Вызван RegisterOrder.
Время: 14:32:38.636; Вызван NeedFinish; Цена БА: 7903.0; Результат: False.
Время: 14:32:38.688; Событие NewOrder; Цена БА: 7903.0; Цена заявки: 251.0; Объем заявки: 1.0.
Время: 14:32:38.910; Вызван NeedFinish; Цена БА: 7903.0; Результат: False.
**** далее идет котирование новой заявки
Код стратегии следующий
class SingleOptionQuotingStrategy : TheorPriceQuotingStrategy
{
public SingleOptionQuotingStrategy(Order order, Unit betsPriceOffset, Unit theorpriceOffset)
: base(order, betsPriceOffset, theorpriceOffset) { }
public SingleOptionQuotingStrategy(OrderDirections dir, decimal vol, Unit theorpriceOffset)
: base(dir, vol, theorpriceOffset) { }
public Security UnderlyingSecurity { get; private set; }
protected override decimal GetNewPrice()
{
var r = base.GetNewPrice();
Debug.WriteLine("Время: {0}; Вызван GetNewPrice; Цена БА: {1}; Теор цена из таб: {3}; Результат: {2}.".Put(DateTime.Now.ToString("HH:mm:ss.fff"),
UnderlyingSecurity.LastTrade.Price.ToString("0.0"), r.ToString("0.0"), Security.TheorPrice.ToString("0.0")));
return r;
}
protected override decimal GetNewVolume()
{
var r = base.GetNewVolume();
Debug.WriteLine("Время: {0}; Вызван GetNewVolume; Цена БА: {1}; Результат: {2}.".Put(DateTime.Now.ToString("HH:mm:ss.fff"),
UnderlyingSecurity.LastTrade.Price.ToString("0.0"), r.ToString("0.0")));
return r;
}
protected override bool NeedFinish()
{
var r = base.NeedFinish();
Debug.WriteLine("Время: {0}; Вызван NeedFinish; Цена БА: {1}; Результат: {2}.".Put(DateTime.Now.ToString("HH:mm:ss.fff"),
UnderlyingSecurity.LastTrade.Price.ToString("0.0"), r.ToString()));
return r;
}
protected override bool NeedRegister()
{
var r = base.NeedRegister();
Debug.WriteLine("Время: {0}; Вызван NeedRegister; Цена БА: {1}; Результат: {2}.".Put(DateTime.Now.ToString("HH:mm:ss.fff"),
UnderlyingSecurity.LastTrade.Price.ToString("0.0"), r.ToString()));
return r;
}
protected override bool NeedReRegister(decimal newBestPrice, decimal newVolume)
{
var r = base.NeedReRegister(newBestPrice, newVolume);
Debug.WriteLine("Время: {0}; Вызван NeedReRegister с параметрами newBestPrice={3} и newVolume={4}; Цена БА: {1}; Результат: {2}.".Put(DateTime.Now.ToString("HH:mm:ss.fff"),
UnderlyingSecurity.LastTrade.Price.ToString("0.0"), r.ToString(), newBestPrice.ToString("0.0"), newVolume.ToString("0.0")));
return r;
}
protected override void RegisterOrder(Order order)
{
Debug.WriteLine("Время: {0}; Вызван RegisterOrder.".Put(DateTime.Now.ToString("HH:mm:ss.fff")));
base.RegisterOrder(order);
}
protected override void RegisterQuotingOrder(Order order)
{
Debug.WriteLine("Время: {0}; Вызван RegisterQuotingOrder.".Put(DateTime.Now.ToString("HH:mm:ss.fff")));
base.RegisterQuotingOrder(order);
}
protected override void ReRegisterOrder(Order oldOrder, Order newOrder)
{
Debug.WriteLine("Время: {0}; Вызван ReRegisterOrder.".Put(DateTime.Now.ToString("HH:mm:ss.fff")));
base.ReRegisterOrder(oldOrder, newOrder);
}
protected override void OnStarting()
{
this.NewOrder += o => Debug.WriteLine("Время: {0}; Событие NewOrder; Цена БА: {1}; Цена заявки: {2}; Объем заявки: {3}.".Put(DateTime.Now.ToString("HH:mm:ss.fff"),
this.UnderlyingSecurity.LastTrade.Price.ToString("0.0"), o.Price.ToString("0.0"), o.Volume.ToString("0.0")));
this.NewMyTrades += t => Debug.WriteLine("Новая сделка");
this.UnderlyingSecurity = this.Security.GetUnderlyingAsset();
base.OnStarting();
}
}