public void OnExecutionReport(ExecutionReport report) { DualPositionRecord record = GetPositionRecord(report.Instrument); // 更新对应的持仓信息 record.OnExecutionReport(report); // 加入定时器,用于定时跟单功能 switch (report.ExecType) { case SmartQuant.ExecType.ExecTrade: OnOrderFilled(report.Order, record); break; case SmartQuant.ExecType.ExecRejected: OnOrderRejected(report.Order, record); break; case SmartQuant.ExecType.ExecCancelReject: OnOrderCancelReject(report.Order); break; case SmartQuant.ExecType.ExecCancelled: OnOrderCancelled(report.Order); break; case SmartQuant.ExecType.ExecNew: OnPendingNewOrder(report.Order); break; } }
/// <summary> /// 处理核心 /// </summary> public virtual void Process(DualPositionRecord record, double price) { // 得到仓差 double diff = record.TargetPosition - record.CurrentPosition; if (diff != 0 && record.IsDone) { // 先标记成处理中,防止再次进入 record.IsDone = false; if (diff > 0) { // 增多仓 Order order1 = BuyOrder(record.Instrument, diff, record.Text); Order order2 = OpenCloseHelper.RebuildOrder(record, order1); OpenCloseHelper.Send(order2); } else { // 增空仓 Order order1 = SellOrder(record.Instrument, -diff, record.Text); Order order2 = OpenCloseHelper.RebuildOrder(record, order1); OpenCloseHelper.Send(order2); } } }
private void OnOrderFilled(Order order, DualPositionRecord record) { // 当前单子成交后,立即发接下来的新单 if (OpenCloseHelper.SendNext(order)) { // 表示还在发单,所以状态必须改成一样的 record.IsDone = false; } }
protected override void OnBarOpen(Instrument instrument, Bar bar) { if (MaxBarSize == bar.Size) { DualPositionRecord record = StrategyHelper.GetPositionRecord(instrument); InstrumentStrategyHelper InstrumentStrategyHelper = StrategyHelper.GetInstrumentStrategyHelper(Instrument, this); InstrumentStrategyHelper.ChangeTradingDay(record); // 2.同步持仓 //SyncPosition(); } }
public void ChangeTradingDay(DualPositionRecord record) { if (TimeHelper.BeginOfDay > TimeHelper.EndOfDay) { // 夜盘 if (TimeHelper.GetTime(framework.Clock.DateTime) > TimeHelper.EndOfDay && TimeHelper.GetTime(framework.Clock.DateTime) < TimeHelper.BeginOfDay) { record.ChangeTradingDay(); } } else { if (TimeHelper.GetTime(framework.Clock.DateTime) > TimeHelper.EndOfDay || TimeHelper.GetTime(framework.Clock.DateTime) < TimeHelper.BeginOfDay) { record.ChangeTradingDay(); } } }
private void OnOrderRejected(Order order, DualPositionRecord record) { // 1.非交易时间 // 2.超出涨跌停 // 3.报单错误 OpenCloseType OpenClose = OpenCloseHelper.GetOpenClose(order); if (OpenClose == OpenCloseType.Open) { // 1.资金不足 // 开仓被拒绝,需要返回原持仓 } else { // 1.可平手数不足 } // 是重试N次还是立即还原呢?就算是立即还原,会由于行情满足会再次进入 // 这种方法还原是否可行? record.TargetPosition = record.CurrentPosition; }
protected override void OnBar(Instrument instrument, Bar bar) { StrategyHelper.StatisticsHelper.Update(instrument, bar.Close); DualPositionRecord record = StrategyHelper.GetPositionRecord(instrument); InstrumentStrategyHelper InstrumentStrategyHelper = StrategyHelper.GetInstrumentStrategyHelper(Instrument, this); if (MaxBarSize == bar.Size) { bars86400.Add(bar); return; } else { Log(bar, barsGroup); } if (HH.Count > 0) { Log(HH.Last, hhGroup); Log(HC.Last, hcGroup); Log(LC.Last, lcGroup); Log(LL.Last, llGroup); } // Update performance. Portfolio.Performance.Update(); // Log equity. Log(Portfolio.Value, equityGroup); do { // 尾盘平仓 if (TimeHelper.GetTime(Clock.DateTime) > 1500 && TimeHelper.GetTime(Clock.DateTime) < 2100) { record.TargetPosition = 0; break; } double price = bar.Close; double NetQty = record.CurrentPosition; if (NetQty == 0) { if (price >= UpperBand) { record.TargetPosition = 1; } if (price <= LowerBand) { record.TargetPosition = -1; } } else if (NetQty > 0) { if (price <= LowerBand) { record.TargetPosition = -1; } } else if (NetQty < 0) { if (price >= UpperBand) { record.TargetPosition = 1; } } // 策略改进:14:00以后了只让平仓,不让开仓 if (TimeHelper.GetTime(Clock.DateTime) > 1400) { record.FilterCloseOnly(); } // 策略改进:达到当日亏损次数上限和当日连续亏损次数上限后不让开仓 if (dailyNumOfLossTrades.TotalValue >= MaxLoss || dailyConsecutiveLossTrades.TotalValue >= MaxConsecutiveLoss) { record.FilterCloseOnly(); } } while (false); InstrumentStrategyHelper.Process(record, bar.Close); //// 价格达到涨跌停 //if (bar.Close >= UpperLimitPrice) //{ // //// 这个地方方向是否有问题?会不会将我在这个地方的反方向开仓给平了? // //StrategyHelper.ClosePosition(Position, "涨跌停平仓"); // //// 由于在这之前已经先达到了 // // 01.19 判断一下持仓方向,然后决定是否平仓(如涨停时,持有多仓则不应平仓) // if (HasShortPosition(instrument)) // { // StrategyHelper.ClosePosition(Position, "涨停平仓"); // } // return; //} //else if (bar.Close <= LowerLimitPrice) //{ // // 01.19 判断一下持仓方向,然后决定是否平仓(如跌停时,持有空仓则不应平仓) // if (HasLongPosition(instrument)) // { // StrategyHelper.ClosePosition(Position, "跌停平仓"); // } //} // 开仓条件 //if (bar.Close >= UpperBand) //{ // if (HasShortPosition(instrument)) // { // Order order = StrategyHelper.BuyOrder(instrument, Position.Qty + Qty, "AA"); // order = StrategyHelper.RebuildOrder(order); // StrategyHelper.Send(order); // return; // } // if (!HasPosition(instrument)) // { // if (!flgLongStopped) // { // Order order = StrategyHelper.BuyOrder(instrument, Position.Qty + Qty, "AA"); // order = StrategyHelper.RebuildOrder(order); // StrategyHelper.Send(order); // return; // } // if (bar.Close > TrailingPrice.HighestAfterEntry) // { // Order order = StrategyHelper.BuyOrder(instrument, Position.Qty + Qty, "AA"); // order = StrategyHelper.RebuildOrder(order); // StrategyHelper.Send(order); // return; // } // } //} //if (bar.Close <= LowerBand) //{ // if (HasLongPosition(instrument)) // { // Order order = StrategyHelper.SellOrder(instrument, Position.Qty + Qty, "BB"); // order = StrategyHelper.RebuildOrder(order); // StrategyHelper.Send(order); // return; // } // if (!HasPosition(instrument)) // { // if (!flgShortStopped) // { // Order order = StrategyHelper.SellOrder(instrument, Position.Qty + Qty, "BB"); // order = StrategyHelper.RebuildOrder(order); // StrategyHelper.Send(order); // return; // } // if (bar.Close < TrailingPrice.LowestAfterEntry) // { // Order order = StrategyHelper.SellOrder(instrument, Position.Qty + Qty, "BB"); // order = StrategyHelper.RebuildOrder(order); // StrategyHelper.Send(order); // return; // } // } //} }
protected override void OnBar(Instrument instrument, Bar bar) { DualPositionRecord record = StrategyHelper.GetPositionRecord(instrument); InstrumentStrategyHelper InstrumentStrategyHelper = StrategyHelper.GetInstrumentStrategyHelper(Instrument, this); // Add bar to bar series. if (MaxBarSize == bar.Size) { bars86400.Add(bar); return; } else { bars60.Add(bar); Log(bar, bars60Group); } //if (!SuspendTrading) //{ // Console.WriteLine("fastSMA.Count = {0}", fastSMA.Count); // Console.WriteLine("slowSMA.Count = {0}", slowSMA.Count); //} if (fastSMA.Count <= 0) { return; } Log(fastSMA.Last, fastSmaGroup); if (slowSMA.Count <= 0) { return; } Log(slowSMA.Last, slowSmaGroup); // Update performance. Portfolio.Performance.Update(); // Log equity. Log(Portfolio.Value, equityGroup); if (SuspendTrading) { return; } do { // 尾盘平仓 if (TimeHelper.GetTime(Clock.DateTime) > 1500 && TimeHelper.GetTime(Clock.DateTime) < 2055) { record.TargetPosition = 0; break; } // 开仓条件 Cross cross = fastSMA.Crosses(slowSMA, bar.DateTime); switch (cross) { case Cross.Above: record.TargetPosition = 1; record.Text = "上行"; break; case Cross.Below: record.TargetPosition = -1; record.Text = "下行"; break; } }while(false); InstrumentStrategyHelper.Process(record, bar.Close); }