public static EnumOpenClose CheckOpenClose(Order order) { string text = order.Text; EnumOpenClose OpenClose = EnumOpenClose.OPEN; if (text.StartsWith("{") && text.EndsWith("}")) { TextParameter parameter = JsonConvert.DeserializeObject <TextParameter>(text); switch (parameter.Type) { case EnumGroupType.COMMON: { TextCommon t = JsonConvert.DeserializeObject <TextCommon>(text); OpenClose = t.OpenClose; } break; case EnumGroupType.QUOTE: { TextQuote t = JsonConvert.DeserializeObject <TextQuote>(text); OpenClose = t.OpenClose; } break; } } return(OpenClose); }
public override void Init(TextCommon t) { base.Init(t); TextQuote q = t as TextQuote; QuoteID = q.QuoteID; StayTime = q.StayTime; }
public override void Add(SingleOrder order, TextCommon t) { if (Index >= GetLegNum()) { return; } Leg[Index] = new MultiOrderLeg { Order = order, OpenClose = t.OpenClose }; ++Index; }
public static EnumOpenClose CheckOpenClose(Order order) { string text = order.Text; EnumOpenClose OpenClose = EnumOpenClose.OPEN; if (text.StartsWith("{") && text.EndsWith("}")) { TextCommon parameter = JsonConvert.DeserializeObject <TextCommon>(text); OpenClose = parameter.OpenClose; } return(OpenClose); }
public override void OnStrategyStart() { base.OnStrategyStart(); TargetOrderBook = new OrderBook_BothSide_Size(); TargetOrderBook.Sell.PriceHelper = base.PriceHelper; TargetOrderBook.Buy.PriceHelper = base.PriceHelper; TextParameterAsk = new TextCommon() { OpenClose = EnumOpenClose.OPEN }; TextParameterBid = new TextCommon() { OpenClose = EnumOpenClose.OPEN }; }
public override void Add(SingleOrder order, TextCommon t) { if (order.Side == Side.Buy) { Buy = new MultiOrderLeg() { Order = order, OpenClose = t.OpenClose }; } else { Sell = new MultiOrderLeg() { Order = order, OpenClose = t.OpenClose }; } }
public override void OnStrategyStart() { TimeHelper = new TimeHelper(Instrument.Symbol); PriceHelper = new PriceHelper(Instrument.TickSize); TextParameter = new TextCommon() { OpenClose = EnumOpenClose.OPEN }; CloseTodayHelper = new CloseTodayHelper(EnumExchangeID.SHFE); DualPosition = new DualPosition(); DualPosition.Sell.PriceHelper = PriceHelper; DualPosition.Buy.PriceHelper = PriceHelper; DualPosition.CloseTodayHelper = CloseTodayHelper; // 测试代码 //TargetPosition = 3; DualPosition.Long.Qty = 0; DualPosition.Short.Qty = 0; }
public override void Add(SingleOrder order, TextCommon t) { Leg = new MultiOrderLeg { Order = order, OpenClose = t.OpenClose }; }
public override void Init(TextCommon t) { base.Init(t); Leg = null; }
public virtual void Add(SingleOrder order, TextCommon t) { }
public virtual void Init(TextCommon t) { TextRequest = t; }
private void Send(NewOrderSingle order) { if (!_bTdConnected) { EmitError(-1, -1, "交易服务器没有连接,无法报单"); tdlog.Error("交易服务器没有连接,无法报单"); return; } // 表示特殊的Json格式 if (order.Text.StartsWith("{") && order.Text.EndsWith("}")) { TextParameter parameter = JsonConvert.DeserializeObject <TextParameter>(order.Text); switch (parameter.Type) { case EnumGroupType.COMMON: { TextCommon t = JsonConvert.DeserializeObject <TextCommon>(order.Text); CommonOrderItem item = CommonOrderCombiner.Add(order as SingleOrder, t); Send(item); } break; case EnumGroupType.QUOTE: { TextQuote t = JsonConvert.DeserializeObject <TextQuote>(order.Text); QuoteOrderItem item = QuoteOrderCombiner.Add(order as SingleOrder, t); } break; case EnumGroupType.SP: { TextSP t = JsonConvert.DeserializeObject <TextSP>(order.Text); SPOrderItem item = SPOrderCombiner.Add(order as SingleOrder, t); Send(item); } break; case EnumGroupType.SPC: { TextSPC t = JsonConvert.DeserializeObject <TextSPC>(order.Text); SPCOrderItem item = SPCOrderCombiner.Add(order as SingleOrder, t); Send(item); } break; case EnumGroupType.SPD: { TextSPD t = JsonConvert.DeserializeObject <TextSPD>(order.Text); SPDOrderItem item = SPDOrderCombiner.Add(order as SingleOrder, t); Send(item); } break; } } else { // 无法识别的格式,直接发送报单,只开仓 TextCommon t = new TextCommon() { Type = EnumGroupType.COMMON, OpenClose = EnumOpenClose.OPEN }; CommonOrderItem item = CommonOrderCombiner.Add(order as SingleOrder, t); Send(item); } }
public override void Init(TextCommon t) { base.Init(t); Index = 0; }
// 这里假设已经挂的单子已经是按最优数量进行处理过,目标是直接挂单 // 目前对前两层做智能开平,后面的全用开仓单 // 因为后面的使用平仓单,还要处理复杂的大量开挂单的问题。 // 实际上不能太深,因为深了占用资金 public int 单边全面补单(OrderBook_OneSide_Order buy1, OrderBook_OneSide_Size buy2) { int cnt = 0; List <CopyOrder> list = new List <CopyOrder>(); // 方向不对,不可能补单 if (buy1.Side != buy2.Side) { return(cnt); } TextCommon tp = buy1.Side == OrderSide.Buy ? TextParameterBid : TextParameterAsk; PositionRecord LongShort = buy1.Side == OrderSide.Buy ? base.DualPosition.Short : base.DualPosition.Long; lock (this) { int l = 0; // 由于在别的地方做了撤单,在这buy2中的数量是大于等于buy1的 foreach (var b2 in buy2.GridList) { ++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 > AlwaysOpenIfDepthGreatThan) { tp.OpenClose = EnumOpenClose.OPEN; tp.Text = string.Format("{0}层,开仓补单", l); } else { // 计算开平 double q = CloseTodayHelper.GetCloseAndQty(LongShort, out tp.OpenClose); if (q < leave) { tp.OpenClose = EnumOpenClose.OPEN; tp.Text = string.Format("开仓:可平量{0}<{1}", q, leave); } else { tp.Text = string.Format("平仓:可平量{0}>={1}", q, leave); } } // 入场下单 // 在模拟下,这个地方有可能导致成交回报lock //SendLimitOrder(buy2.Side, leave, price, tp.ToString()); list.Add(new CopyOrder() { Side = buy2.Side, Qty = leave, Price = price, Text = tp.ToString(), }); } } foreach (var o in list) { SendLimitOrder(o.Side, o.Qty, o.Price, o.Text); } return(cnt); }