public StrategyHelper(Framework framework, SmartQuant.Strategy strategy) { this.framework = framework; this.strategy = strategy; this.DualPositionContainer = new DualPositionContainer(framework); this.OpenCloseHelper = new OpenCloseHelper(framework, strategy); this.PositionHelper = new PositionHelper(framework); this.Strategies = new Dictionary <int, InstrumentStrategyHelper>(); { // 创建多空两套持仓,只是显示用,实际上不以此为依据 Long = new Portfolio(framework, strategy.Name + "_Long"); framework.PortfolioManager.Add(Long); Long.Parent = strategy.Portfolio; Short = new Portfolio(framework, strategy.Name + "_Short"); framework.PortfolioManager.Add(Short); Short.Parent = strategy.Portfolio; } { // 在实际下单时需要使用指定所操作的Portfolio OpenCloseHelper.Long = Long; OpenCloseHelper.Short = Short; } }
// 这里假设已经挂的单子已经是按最优数量进行处理过,目标是直接挂单 // 目前对前两层做智能开平,后面的全用开仓单 // 因为后面的使用平仓单,还要处理复杂的大量开挂单的问题。 // 实际上不能太深,因为深了占用资金 public int 补单(OrderBook_OneSide_Order buy1, OrderBook_OneSide_Size buy2) { int cnt = 0; // 方向不对,不可能补单 if (buy1.Side != buy2.Side) { return(cnt); } int l = 0; // 由于在别的地方做了撤单,在这buy2中的数量是大于buy1的 foreach (var b2 in buy2.Grid) { ++l; int level = b2.Key; double size = b2.Value; // 要补单的数量 double leave = size - buy1.SizeByLevel(level); if (leave <= 0) { continue; } double price = PriceHelper.GetPriceByLevel(level); cnt += (int)leave; // 超过两层的全用开仓 if (l > 2) { SendLimitOrder(buy2.Side, leave, price, OpenCloseHelper.GetOpenCloseString(EnumOpenClose.OPEN)); continue; } // 应当对容易平仓的位置进行平仓 // 这个地方要测试一个,我只有10持仓,先挂10手平,第二个价格再挂自动生成的单是平还是开?检查数据计算是否正确 // 补单是一次性的,还是分两笔,还是分两笔吧 //double canqty = DualPosition.CanCloseQty(buy2.Side); //// 检查平仓,如果补单限为一次,那就把此行注释 //if (canqty > 0) //{ // double min = Math.Min(leave, canqty); // leave -= min; // SendLimitOrder(buy2.Side, min, price, // OpenCloseHelper.GetOpenCloseString(EnumOpenClose.CLOSE_TODAY)); //} if (leave > 0) { //SendLimitOrder(buy2.Side, leave, price, // OpenCloseHelper.GetOpenCloseString(DualPosition.CanClose(buy2.Side, leave))); } } return(cnt); }
// 下单操作 private void SendOrder(OrderSide side, EnumOpenClose oc, double qty) { if (!TimeHelper.IsTradingTime()) { return; } if (qty <= 0) { return; } // 为减少滑点,对数量少的单子直接市价单 bool bMarketOrder = false; if (EnumOpenClose.OPEN == oc) { if (qty <= MarketOpenPriceThreshold) { bMarketOrder = true; } } else { if (qty <= MarketClosePriceThreshold) { bMarketOrder = true; } } if (bMarketOrder) { SendMarketOrder(side, qty, OpenCloseHelper.GetOpenCloseString(oc)); } else { SendLimitOrder(side, qty, PriceHelper.GetMatchPrice(this, side, 2), OpenCloseHelper.GetOpenCloseString(oc)); } }
protected override void OnStrategyStart() { OpenCloseHelper = new OpenCloseHelper(framework, this); OpenCloseHelper.SeparateOrder = SeparateOrder.SeparateCloseOpen; OpenCloseHelper.SendStyle = SendStyle.OneByOne; }
// 重新发单 private void ResendOrder(Order order) { SendOrder(order.Side, OpenCloseHelper.CheckOpenClose(order), order.LeavesQty); }