public override void OnTick(TickData td) { if (!InitOk) { return; } LastPrice = Math.Round((ASKPRICE(1).LASTDATA + BIDPRICE(1).LASTDATA) / 2, 2); // 委托不成交,立刻撤单重发 List <Order> ordLst = GetUnAllTradedOrderList(SYMBOL); if (ordLst != null && ordLst.Count > 0) { //说明有可撤单 //注意看止损 foreach (Order order in ordLst) { if (ORDER_KEY_LIST.Contains(order.Key))//说明是本策略下的订单 { double Dt = (TickNow - ConvertToDateTime(order.InsertDate, order.InsertTime)).TotalSeconds; if (TickNow.ToString("HH:mm:ss").CompareTo(RestT1.ToString("HH:mm:ss")) > 0 && order.InsertTime.Substring(0, 8).CompareTo(RestT0.ToString("HH:mm:ss")) < 0) //时间已到下午,但是order又是在上午下的单 { Dt = Dt - (RestT1 - RestT0).TotalSeconds; //除去中午休息时间 } if (order.OrderStatus == EnumOrderStatusType.NoTradeQueueing || order.OrderStatus == EnumOrderStatusType.PartTradedQueueing) { if (Dt > KCBC)//超时未成交 { CancelOrder(order); if (!IfFKC) { KN -= (order.VolumeTotalOriginal - order.VolumeTraded);//更新总开仓的剩余数量 if (PN >= KN_Trd) { Clear(); } else { PrintLine("开仓超时,但是PN=" + PN + ",KN_Trd=" + KN_Trd + ",已开的仓还没有全平。"); } } } } } } } if (TickNow.ToString("HH:mm:ss").CompareTo(tFinish.ToString("HH:mm:ss")) < 0) { // 首先确认是否经过高点或者地点 if (!IfSeeHigh) { if (LastPrice >= SSetup) { IfSeeHigh = true; PrintLine(TickNow.ToString("HH:mm:ss.fff") + "->" + "最新价" + LastPrice + ">SSetup=" + SSetup + ",设定进入观察卖空"); } } if (!IfSeeLow) { if (LastPrice <= BSetup) { IfSeeLow = true; PrintLine(TickNow.ToString("HH:mm:ss.fff") + "->" + "最新价" + LastPrice + "<BSetup=" + BSetup + ",设定进入观察卖空"); } } if (Flag == 0)//没有开仓 { // 突破开仓 if (LastPrice >= BBreak) { Flag = 1; 止损位 = SSetup; PrintLine(TickNow.ToString("HH:mm:ss.fff") + "->" + "向上突破" + LastPrice + ">" + BBreak + ",开仓做多,设置止损位=" + 止损位); KN = Qty; PN = 0; KN_Trd = 0; T0 = SERVERTIME; SendOrder(KCJP, Qty, EnumDirectionType.Buy, EnumOffsetFlagType.Open, PriceTick); } else if (LastPrice <= SBreak) { Flag = -1; 止损位 = BSetup; PrintLine(TickNow.ToString("HH:mm:ss.fff") + "->" + "向下突破" + LastPrice + "<" + SBreak + ",开仓做空,设置止损位=" + 止损位); KN = Qty; PN = 0; KN_Trd = 0; T0 = SERVERTIME; SendOrder(KCJP, Qty, EnumDirectionType.Sell, EnumOffsetFlagType.Open, PriceTick); } // 观察买入 卖出 if (IfSeeHigh && LastPrice <= SEnter) { IfSeeHigh = false; Flag = -1; 止损位 = SSetup; PrintLine(TickNow.ToString("HH:mm:ss.fff") + "->" + "观察后向下" + LastPrice + "<" + SEnter + ",开仓做空,设置止损位=" + 止损位); KN = Qty; PN = 0; KN_Trd = 0; T0 = SERVERTIME; SendOrder(KCJP, Qty, EnumDirectionType.Sell, EnumOffsetFlagType.Open, PriceTick); } else if (IfSeeLow && LastPrice >= BEnter) { IfSeeHigh = false; Flag = 1; 止损位 = BSetup; PrintLine(TickNow.ToString("HH:mm:ss.fff") + "->" + "观察后向上" + LastPrice + ">" + BEnter + ",开仓做多,设置止损位=" + 止损位); KN = Qty; PN = 0; KN_Trd = 0; T0 = SERVERTIME; SendOrder(KCJP, Qty, EnumDirectionType.Buy, EnumOffsetFlagType.Open, PriceTick); } } else { // 如果有Flag,需要检查止损 if (Flag > 0)//已经买入开仓 { //用买1 //卖1 - 跳 if (BIDPRICE(1).LASTDATA < 止损位) { //如果发现价格仍然高于突破买入(换句话说,平仓后还要买入)---调整止损位 if (LastPrice >= BBreak) { //多单超过了最高的一条线BBreak,将止损线从BSetup上移到SSetup 止损位 = SSetup; } else { SendOrder(PCJP, KN_Trd, EnumDirectionType.Sell, EnumOffsetFlagType.Close, PriceTick); PrintLine(TickNow.ToString("HH:mm:ss.fff") + "->" + "多头持仓触发止损,BidPrice1=" + BIDPRICE(1).LASTDATA + ",止损位=" + 止损位 + ",T0=" + T0); Clear(); } } } else if (Flag < 0)//已经卖出开仓 { if (ASKPRICE(1).LASTDATA > 止损位) { if (LastPrice <= SBreak) { //空单跌破了最低的一条线SBreak,将止损线从SSetup下移到BSetup 止损位 = BSetup; } else { SendOrder(PCJP, KN_Trd, EnumDirectionType.Buy, EnumOffsetFlagType.Close, PriceTick); PrintLine(TickNow.ToString("HH:mm:ss.fff") + "->" + "空头持仓触发止损,AskPrice1=" + ASKPRICE(1).LASTDATA + ",止损位=" + 止损位 + ",T0=" + T0); Clear(); } } } } } else { //中间有5分钟的缓冲 if (!IfFinish) { RealeaseAccount(); } } }
private double CalculateOrderDuration(Order order) { double Dt = (TickNow - ConvertToDateTime(order.InsertDate, order.InsertTime)).TotalSeconds; if (TickNow.ToString("HH:mm:ss").CompareTo(RestT1.ToString("HH:mm:ss")) >= 0 && order.InsertTime.Substring(0, 8).CompareTo(RestT0.ToString("HH:mm:ss")) <= 0) { Dt = Dt - (RestT2 - RestT0).TotalSeconds; // 除去早盘休息时间 } else if (TickNow.ToString("HH:mm:ss").CompareTo(RestT3.ToString("HH:mm:ss")) >= 0 && order.InsertTime.Substring(0, 8).CompareTo(RestT2.ToString("HH:mm:ss")) <= 0) { Dt = Dt - (RestT3 - RestT2).TotalSeconds; // 除去中午休息时间 } return(Dt); }