Пример #1
0
        /// <summary>
        /// 预处理线程启动
        /// </summary>
        private static void ThreadProc()
        {
            log.LogEvent("交易预处理线程开始执行");


            while (true)
            {
                Thread.Sleep(10);

                /*****************************
                 * 生成交易List之前的例行工作
                 * **************************/

                #region 策略生成交易队列
                List<TradeOrderStruct> tos = PreTradeModule.instance.DeQueue();
                if (tos != null)
                {


                    log.LogEvent("来自策略的交易数:" + tos.Count.ToString());

                    //获取到新的list
                    List<TradeOrderStruct> stocks_sh = (from item in tos where item.cExhcnageID == ExchangeID.SH select item).OrderBy(i => i.cOrderLevel).ToList();

                    List<TradeOrderStruct> stocks_sz = (from item in tos where item.cExhcnageID == ExchangeID.SZ select item).OrderBy(i => i.cOrderLevel).ToList();

                    List<TradeOrderStruct> future = (from item in tos where item.cExhcnageID == ExchangeID.CF select item).OrderBy(i => i.cOrderLevel).ToList();

                    //将新的list推送到对应的线程控制器
                    #region 交易送入队列

                    List<TradeOrderStruct> unit = new List<TradeOrderStruct>();

                    #region SH股票交易送入队列
                    if (stocks_sh.Count > 0)
                    {
                        log.LogEvent("上海交易所入队交易数量:" + stocks_sh.Count.ToString());

                        foreach (TradeOrderStruct stu in stocks_sh)
                        {

                            TradeOrderStruct _tos = CreateNewTrade(stu);
                            unit.Add(_tos);

                            if (unit.Count == 15)
                            {
                                List<TradeOrderStruct> _li = CreateList(unit);
                                unit.Clear();

                                lock (QUEUE_SH_TRADE.GetQueue().SyncRoot)
                                {

                                    QUEUE_SH_TRADE.GetQueue().Enqueue((object)_li);
                                }

                            }
                        }

                        if (unit.Count != 0)
                        {
                            List<TradeOrderStruct> _li = CreateList(unit);
                            unit.Clear();

                            lock (QUEUE_SH_TRADE.GetQueue().SyncRoot)
                            {
                                QUEUE_SH_TRADE.GetQueue().Enqueue((object)_li);
                            }

                        }

                    }
                    #endregion

                    #region SZ股票交易送入队列
                    if (stocks_sz.Count > 0)
                    {
                        log.LogEvent("深圳交易所入队交易数量:" + stocks_sz.Count.ToString());
                        foreach (TradeOrderStruct stu in stocks_sz)
                        {

                            TradeOrderStruct _tos = CreateNewTrade(stu);
                            unit.Add(_tos);

                            if (unit.Count == 15)
                            {
                                List<TradeOrderStruct> _li = CreateList(unit);
                                unit.Clear();

                                lock (QUEUE_SZ_TRADE.GetQueue().SyncRoot)
                                {
                                    QUEUE_SZ_TRADE.GetQueue().Enqueue((object)_li);
                                }

                                unit.Clear();
                            }
                        }

                        if (unit.Count != 0)
                        {
                            List<TradeOrderStruct> _li = CreateList(unit);
                            unit.Clear();

                            lock (QUEUE_SZ_TRADE.GetQueue().SyncRoot)
                            {
                                QUEUE_SZ_TRADE.GetQueue().Enqueue((object)_li);
                            }

                            //unit.Clear();
                        }

                    }
                    #endregion

                    #region 期货交易送入队列
                    if (future.Count > 0)
                    {
                        log.LogEvent("期货交易入队交易数量:" + future.Count.ToString());
                        foreach (TradeOrderStruct stu in future)
                        {
                            TradeOrderStruct _tos = stu;
                            unit.Add(_tos);

                            List<TradeOrderStruct> _li = CreateList(unit);
                            unit.Clear();

                            if (_li.Count == 15)
                            {
                                lock (QUEUE_FUTURE_TRADE.GetQueue().SyncRoot)
                                {
                                    QUEUE_FUTURE_TRADE.GetQueue().Enqueue((object)_li);
                                }
                            }

                            if (_li.Count != 0)
                            {
                                lock (QUEUE_FUTURE_TRADE.GetQueue().SyncRoot)
                                {
                                    QUEUE_FUTURE_TRADE.GetQueue().Enqueue((object)_li);
                                }
                            }
                        }

                        

                    }
                    #endregion

                    #endregion


                }

                #endregion

                #region 交易管理界面直接发起交易
                MakeOrder mo = PreTradeModule.instance.DeQueueMonitorOrder();
                if (mo != null)
                {
                    List<TradeOrderStruct> _TradeList = new List<TradeOrderStruct>();
                    TradeOrderStruct _tradeUnit = new TradeOrderStruct()
                    {
                        cExhcnageID = mo.exchangeId,
                        cSecurityCode = mo.cSecurityCode,
                        nSecurityAmount = mo.nSecurityAmount,
                        dOrderPrice = mo.dOrderPrice,
                        cTradeDirection = mo.cTradeDirection,
                        cOffsetFlag = mo.cOffsetFlag,
                        SecurityName = String.Empty,
                        cOrderPriceType = "0",
                        cUser = mo.User,
                        cSecurityType = mo.cSecurityType,
                        cOrderLevel = "1",
                        cOrderexecutedetail = "0",
                        belongStrategy = mo.belongStrategy,
                        OrderRef = REQUEST_ID.ApplyNewID()
                    };

                    UserRequestMap.GetInstance().AddOrUpdate(_tradeUnit.OrderRef, mo.User,(key,oldValue) => oldValue = mo.User);

                    _TradeList.Add(_tradeUnit);

                    log.LogEvent("来自交易管理页面的交易");
                    if (mo.cSecurityType == "s" || mo.cSecurityType == "S")
                    {
                        if (mo.exchangeId == ExchangeID.SH)
                        {
                            lock (QUEUE_SH_TRADE.GetQueue().SyncRoot)
                            {
                                QUEUE_SH_TRADE.GetQueue().Enqueue((object)_TradeList);
                            }
                        }
                        else if (mo.exchangeId == ExchangeID.SZ)
                        {
                            lock (QUEUE_SZ_TRADE.GetQueue().SyncRoot)
                            {
                                QUEUE_SZ_TRADE.GetQueue().Enqueue((object)_TradeList);
                            }
                        }

                    }
                    else if (mo.cSecurityType == "f" || mo.cSecurityType == "F")
                    {
                        lock (QUEUE_FUTURE_TRADE.GetQueue().SyncRoot)
                        {
                            QUEUE_FUTURE_TRADE.GetQueue().Enqueue((object)_TradeList);
                        }
                    }
                }
                
                #endregion

                if (DateTime.Now.Second != PreTradeModule.isRunning.Second)
                {
                    KeyValuePair<string, object> message1 = new KeyValuePair<string, object>("THREAD_PRE_TRADE", (object)true);
                    queue_system_status.GetQueue().Enqueue((object)message1);
                    PreTradeModule.isRunning = DateTime.Now;
                }

                

            }
        }
Пример #2
0
        /// <summary>
        /// 线程工作函数
        /// </summary>
        private void _threadProc()
        {
            while (!bRun) {
                //标记最后扫描时间,交付上级判断
                RunningMark = DateTime.Now;

                //尚未运行的策略,直接丢弃队列中新的行情
                while (_marketQueue.Count > 0)
                {
                    DeQueueInfo();
                }
                //标记线程状态为正在空转
                Status = 1;
                
                Thread.Sleep(10); 

            }

            if (DBAccessLayer.DBEnable)
            {
                DBAccessLayer.UpdateStrategyStatusRecord(StrategyInstanceID, 1);
            }

            while (!breaklabel)
            { 


                /****
                 * 循环工作:
                 * 1. 更新行情信息
                 * 2. 计算中间参数
                 * 3. 判断运行条件
                 * 4. 生成交易列表
                 * ****/

                //标记最后扫描时间,交付上级判断
                RunningMark = DateTime.Now;

                if (Status == 1)
                {
                    if (DBAccessLayer.DBEnable)
                    {
                        DBAccessLayer.UpdateStrategyStatusRecord(StrategyInstanceID, 2);
                    }
                }
                if(bRun)
                {
                    //标记线程状态为正在运行
                    Status = 2;
                    Thread.Sleep(1);

                    //策略实例运算
                    List<managedMarketInforStruct> infos = new List<managedMarketInforStruct>();
                    List<MarketData> dataList = new List<MarketData>();

                    
                    while (_marketQueue.Count > 0)
                    {
                        MarketData d = (MarketData)DeQueueInfo();


                        if (d == null)
                        {
                            Thread.Sleep(10);
                            continue;
                        }

                        dataList.Add(d);
                    }

                    
                    
                    foreach(MarketData data in dataList)
                    {
                        
                        managedMarketInforStruct info = new managedMarketInforStruct();

                        info.dAskPrice = new double[10];
                        info.dAskVol = new double[10];
                        info.dBidPrice  = new double[10];
                        info.dBidVol = new double[10];

                        if (data.AskPrice != null)
                        {
                            for (int i = 0; i < data.AskPrice.Count(); i++)
                            {
                                info.dAskPrice[i] = Convert.ToDouble(data.AskPrice[i]) / 10000;
                                info.dAskVol[i] = Convert.ToDouble(data.AskVol[i]) ;
                                info.dBidPrice[i] = Convert.ToDouble(data.BidPrice[i]) / 10000;
                                info.dBidVol[i] = Convert.ToDouble(data.BidVol[i]) ;
                            }
                        }

                        managedsecurityindex index = new managedsecurityindex();
                        index.cSecurity_code = data.Code;
                        

                        info.msecurity = index;
                        info.security_name = data.Code;
                        info.nTime = data.Time / 1000;
                        info.nStatus = data.Status;
                        info.nPreClose = Convert.ToDouble(data.PreClose) / 10000;
                        info.dLastPrice = Convert.ToDouble(data.Match) / 10000;
                        info.dHighLimited = Convert.ToDouble(data.HighLimited) / 10000;
                        info.dLowLimited = Convert.ToDouble(data.LowLimited) /10000;
                        info.exchangeID = data.WindCode.Split('.')[1];

                        if (data.Status == 68)
                        {
                            info.bstoped = true;
                        }

                        switch(data.IOPV)
                        {
                            case 0:
                                {
                                    index.cSecuritytype = 115;
                                    break;
                                }
                            case 1:
                                {
                                    index.cSecuritytype = 102;
                                    break;
                                }
                            case 2:
                                {
                                    index.cSecuritytype = 105;
                                    break;
                                }
                            

                        }
                        info.LastUpdateTime = Int32.Parse(DateTime.Now.Hour.ToString().PadLeft(2, '0') + DateTime.Now.Minute.ToString().PadLeft(2, '0') + DateTime.Now.Second.ToString().PadLeft(2, '0'));

                        //MarketDelayCalculation.cal(data.Time, 3);
                        if (data.Status == 68 || data.Status == 66)
                        {
                            info.bstoped = true;
                        }
                        else
                        {
                            info.bstoped = false;
                        }

                        info.nInfotLag = info.LastUpdateTime - info.nTime ;
                        infos.Add(info);
                    }


                    
                    

                    if(infos.Count > 0)
                    {
                        if (Type == "OPEN")
                        {
                            DateTime d1 = DateTime.Now;

                            m_strategy_open.updateSecurityInfo(infos.ToArray(), infos.Count);

                            d1 = DateTime.Now;

                            m_strategy_open.calculateSimTradeStrikeAndDelta();


                        }
                        else
                        {
                            m_strategy_close.updateSecurityInfo(infos.ToArray(), infos.Count);
                            m_strategy_close.calculateSimTradeStrikeAndDelta();
                        }
                    }
                    else { continue; }
                    
                }

                

                if(bRun && bAllow)
                {
                    bool _reached = false;
                    if (Type == "OPEN")
                    {
                        _reached = m_strategy_open.isOpenPointReached();
                    }
                    else
                    {
                        _reached = m_strategy_close.isOpenPointReached();
                    }


                    _reached = true; //测试使用,注意删除

                    // 生成交易列表
                    if (_reached)
                    {
                        

                        List<managedTraderorderstruct> ol = (Type == "OPEN") ? m_strategy_open.getTradeList().ToList() : m_strategy_close.getTradeList().ToList();


                        
                        //交易列表送往交易线程下单(下单的线程,股票和期货是分开的)
                        List<TradeOrderStruct> orderli = new List<TradeOrderStruct>();

                        foreach (managedTraderorderstruct item in ol)
                        {
                            TradeOrderStruct order = new TradeOrderStruct();
                            order.cExhcnageID = item.cExchangeID;
                            order.cSecurityCode = item.cSecurity_code;
                            order.SecurityName = item.cSecurity_code;
                            order.nSecurityAmount = item.nSecurity_amount;
                            order.dOrderPrice = item.dOrderprice;
                            order.cTradeDirection = item.cTraderdirection.ToString();
                            order.cOffsetFlag = item.cOffsetFlag.ToString();
                            order.cOrderPriceType = item.cOrderPriceType.ToString();

                            order.cSecurityType = item.cSecuritytype.ToString();
                            order.cOrderLevel = item.cOrderlevel.ToString();
                            order.cOrderexecutedetail = item.cOrderexecutedetail.ToString();
                            order.belongStrategy = StrategyInstanceID;
                            order.OrderRef = REQUEST_ID.ApplyNewID();
                            order.cUser = User;

                            orderli.Add(order);

                            UserRequestMap.GetInstance().AddOrUpdate(order.OrderRef, User, (key, oldvalue) => oldvalue = User);
                        }

                        if (DBAccessLayer.DBEnable == true)
                        {
                            string json = Json.Encode(orderli);
                            DBAccessLayer.InsertORDERLIST(StrategyInstanceID, json);
                        }

                        //下单到交易预处理模块
                        queue_prd_trade.GetQueue().Enqueue((object)orderli);

                        if (DBAccessLayer.DBEnable)
                        {
                            DBAccessLayer.UpdateStrategyStatusRecord(StrategyInstanceID, 3);
                            DBAccessLayer.UpdateSGOPENStatus(StrategyInstanceID, 3);
                        }

                        // 列表只会生成一次
                        breaklabel = true;
                    }
                   
                }

                //获取中间显示参数
                //gettaderargs   getshowstatus

                if (Type == "OPEN")
                {
                    string status = m_strategy_open.getshowstatus();

                    List<String> statusLi = status.Split(' ').ToList();

                    status = string.Empty;
                    
                    foreach (string i in statusLi)
                    {
                        if (i.Trim() != string.Empty)
                        {
                            status += (i + "&");
                        }
                    }

                    PushStrategyInfo.Instance.UpdateStrategyInfo(StrategyInstanceID, status);
                }
                else
                {
                    string status = m_strategy_close.getshowstatus();

                    List<string> statusLi = status.Split(' ').ToList();

                    status = string.Empty;

                    foreach (string i in statusLi)
                    {
                        if (i.Trim() != string.Empty)
                        {
                            status += (i + "&");
                        }
                    }

                    PushStrategyInfo.Instance.UpdateStrategyInfo(StrategyInstanceID, status);
                }
                Thread.Sleep(1);
            }
        }
Пример #3
0
 private static TradeOrderStruct CreateNewTrade(TradeOrderStruct tos)
 {
     TradeOrderStruct t = new TradeOrderStruct();
     t.cExhcnageID = tos.cExhcnageID;
     t.cOffsetFlag = tos.cOffsetFlag;
     t.cOrderexecutedetail = tos.cOrderexecutedetail;
     t.cOrderLevel = tos.cOrderLevel;
     t.cOrderPriceType = tos.cOrderPriceType;
     t.cSecurityCode = tos.cSecurityCode;
     t.cSecurityType = tos.cSecurityType;
     t.cTradeDirection = tos.cTradeDirection;
     t.dOrderPrice = tos.dOrderPrice;
     t.nSecurityAmount = tos.nSecurityAmount;
     t.SecurityName = tos.SecurityName;
     t.belongStrategy = tos.belongStrategy;
     t.OrderRef = tos.OrderRef;
     t.cUser = tos.cUser;
     return t;
 }
Пример #4
0
        private static TradeOrderStruct_M CreateTradeUnit(TradeOrderStruct unit)
        {


            TradeOrderStruct_M _sorder = new TradeOrderStruct_M();

            _sorder.ExchangeID = (unit.cExhcnageID.Length != 0) ? unit.cExhcnageID : "0";
            _sorder.OffsetFlag = (unit.cOffsetFlag.Length != 0) ? Convert.ToSByte(unit.cOffsetFlag) : Convert.ToSByte("0");
            _sorder.OrderExecutedDetail = (sbyte)0;
            _sorder.OrderLevel = (unit.cOrderLevel.Length != 0) ? Convert.ToSByte(unit.cOrderLevel) : Convert.ToSByte("0");
            _sorder.OrderPrice = unit.dOrderPrice;
            _sorder.OrderPriceType = (unit.cOrderPriceType.Length != 0) ? Convert.ToSByte(unit.cOrderPriceType) : Convert.ToSByte("0");
            _sorder.SecurityAmount = (int)(unit.nSecurityAmount);
            _sorder.SecurityCode = (unit.cSecurityCode.Length != 0) ? unit.cSecurityCode : "0";
            _sorder.SecurityType = (unit.cSecurityType.Length != 0) ? (unit.cSecurityType == "115" ? (sbyte)115 : (sbyte)102) : (sbyte)115;


            _sorder.TradeDirection = Convert.ToSByte(Convert.ToInt16(unit.cTradeDirection));
            
            //if (unit.cTradeDirection == "0") { _sorder.TradeDirection = 49; }
            //else if (unit.cTradeDirection == "1") { _sorder.TradeDirection = 50; }
            //else { _sorder.TradeDirection = 49; }



            return _sorder;

        }