Beispiel #1
0
        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);
                }
            }
        }
Beispiel #3
0
 private void OnOrderFilled(Order order, DualPositionRecord record)
 {
     // 当前单子成交后,立即发接下来的新单
     if (OpenCloseHelper.SendNext(order))
     {
         // 表示还在发单,所以状态必须改成一样的
         record.IsDone = false;
     }
 }
Beispiel #4
0
        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();
         }
     }
 }
Beispiel #6
0
        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;
        }
Beispiel #7
0
        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;
            //        }
            //    }
            //}
        }
Beispiel #8
0
        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);
        }