Example #1
0
        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);
        }
Example #2
0
        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();
                }
            }
        }