public class SingleOptionQuotingStrategy :BestByPriceQuotingStrategy
{
public SingleOptionQuotingStrategy(Order order, Unit betsPriceOffset, Unit theorpriceOffset)
: base(order, betsPriceOffset)
{
TheorPriceOffset = theorpriceOffset;
}
public SingleOptionQuotingStrategy(OrderDirections dir, decimal vol, Unit theorpriceOffset)
: base(dir, vol) { TheorPriceOffset = theorpriceOffset; }
private System.Timers.Timer _timer;
public Security UnderlyingSecurity { get; private set; }
public Unit TheorPriceOffset { 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")));
r = Security.TheorPrice;
r = this.QuotingDirection == OrderDirections.Buy ? (decimal)(r - TheorPriceOffset) : (decimal)(r + TheorPriceOffset);
r = Security.ShrinkPrice(r);
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 IEnumerable<StrategyRule> GetNotificationRules()
{
return base.GetNotificationRules();
//return new List<StrategyRule>
//{
// this.When(UnderlyingSecurity.MarketDepthChanged()).Do(ProcessQuoting)
//};
}
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("Новая сделка"); //Debug.WriteLine("Время: {0}; Событие NewMyTrades; Цена БА: {1}; Цена сделки: {2}; Объем сделки: {3}.".Put(DateTime.Now.ToString("HH:mm:ss.fff"),
//this.UnderlyingSecurity.LastTrade.Price.ToString("0.0"), t.FirstOrDefault().Trade.Price.ToString("0.0")), t.FirstOrDefault().Trade.Volume.ToString("0.0"));
this.SuspendRules();
this.UnderlyingSecurity = this.Security.GetUnderlyingAsset();
base.OnStarting();
this.SuspendRules();
//this.Rules.RemoveWhere(r => r.Name.Contains("Изменение стакана инструмента") || r.Name.Contains("Изменение инструмента"));
//var qRule = this.When(UnderlyingSecurity.MarketDepthChanged()).Do(DoQouting);
//qRule.EnableLog(true);
this.Rules.ForEach(r => r.EnableLog(true));
//this.Rules.RemoveWhere(r => r.Name.Contains("Изменение стакана инструмента"));
_timer = new System.Timers.Timer(500);
_timer.Elapsed += (s, a) =>
{
if (DateTime.Now - UnderlyingSecurity.LastTrade.Time < TimeSpan.FromSeconds(3))
{
_timer.Stop();
this.ResumeRules();
}
else
{
Debug.WriteLine("Время: {0}; Грузитя история! Последняя сделка: {1}".Put(DateTime.Now.ToString("HH:mm:ss.fff"), UnderlyingSecurity.LastTrade.Time.ToString("HH:mm:ss.fff")));
}
};
_timer.Start();
}
protected override void OnStopping()
{
base.OnStopping();
if(_timer != null) _timer.Stop();
}
}