//根据挂单情况获取可成交汇总
        private SortedDictionary <double, int> getMarketWaitingVolumeSummary(StockTickTransaction tickData)
        {
            SortedDictionary <double, int> market = new SortedDictionary <double, int>();

            if (tickData.Ask1 * tickData.AskV1 > 0)
            {
                market.Add(tickData.Ask1, Convert.ToInt32(tickData.AskV1));
            }
            if (tickData.Ask2 * tickData.AskV2 > 0)
            {
                market.Add(tickData.Ask2, Convert.ToInt32(tickData.AskV2));
            }
            if (tickData.Ask3 * tickData.AskV3 > 0)
            {
                market.Add(tickData.Ask3, Convert.ToInt32(tickData.AskV3));
            }
            if (tickData.Ask4 * tickData.AskV4 > 0)
            {
                market.Add(tickData.Ask4, Convert.ToInt32(tickData.AskV4));
            }
            if (tickData.Ask5 * tickData.AskV5 > 0)
            {
                market.Add(tickData.Ask5, Convert.ToInt32(tickData.AskV5));
            }
            return(market);
        }
        private int getTradableVolumeFromMarket(StockTickTransaction tickData, double price)
        {
            int volume = 0;
            SortedDictionary <double, int> market = new SortedDictionary <double, int>();

            if (tickData.Bid1 * tickData.BidV1 > 0)
            {
                market.Add(tickData.Bid1, Convert.ToInt32(tickData.BidV1));
            }
            if (tickData.Bid2 * tickData.BidV2 > 0)
            {
                market.Add(tickData.Bid2, Convert.ToInt32(tickData.BidV2));
            }
            if (tickData.Bid3 * tickData.BidV3 > 0)
            {
                market.Add(tickData.Bid3, Convert.ToInt32(tickData.BidV3));
            }
            if (tickData.Bid4 * tickData.BidV4 > 0)
            {
                market.Add(tickData.Bid4, Convert.ToInt32(tickData.BidV4));
            }
            if (tickData.Bid5 * tickData.BidV5 > 0)
            {
                market.Add(tickData.Bid5, Convert.ToInt32(tickData.BidV5));
            }
            foreach (var item in market)
            {
                if (item.Key >= price)
                {
                    volume = +item.Value;
                }
            }
            return(volume);
        }
 private void printTradingLog(TradeBook trade, List <OrderBook> orderBook, StockTickTransaction tickData)
 {
     //foreach (var order in orderBook)
     //{
     //    if (trade.orderId==order.orderId)
     //    {
     //        Console.WriteLine("成交时间:{0},挂单时间:{1},成交量:{2},成交价:{3},ask1:{4},bid1:{5},lp:{6}", trade.time, order.time, trade.volume, trade.price, tickData.Ask1, tickData.Bid1, tickData.LastPrice);
     //    }
     //}
 }
        private double getOrderPrice(int orderPriceMode, StockTickTransaction tickData)
        {
            double price = -1;

            switch (orderPriceMode)
            {
            case 5:
                price = tickData.Ask5;
                break;

            case 4:
                price = tickData.Ask4;
                break;

            case 3:
                price = tickData.Ask3;
                break;

            case 2:
                price = tickData.Ask2;
                break;

            case 1:
                price = tickData.Ask1;
                break;

            case -1:
                price = tickData.Bid1;
                break;

            case -2:
                price = tickData.Bid2;
                break;

            case -3:
                price = tickData.Bid3;
                break;

            case -4:
                price = tickData.Bid4;
                break;

            case -5:
                price = tickData.Bid5;
                break;

            default:
                break;
            }
            if (price == 0 && tickData.Bid1 != 0)
            {
                price = tickData.Bid1;
            }
            return(price);
        }
 //撤单,撤掉五档行情之外的挂单
 private void cancelDeviateOrders(ref List <OrderBook> orderBook, StockTickTransaction tickData)
 {
     foreach (var item in orderBook)
     {
         if (item.price > tickData.Ask5)
         {
             item.volume        = 0;
             item.waitingVolume = 0;
         }
     }
 }
Ejemplo n.º 6
0
        private List <StockTickTransaction> FetchDataFromSource(string code, DateTime date)
        {
            List <StockTickTransaction> list = new List <StockTickTransaction>();
            var  dt = dataSource.Get(code, new DateTime(date.Year, date.Month, date.Day, 9, 15, 0, 0), new DateTime(date.Year, date.Month, date.Day, 15, 1, 0, 0));
            bool highLimitExists = false;

            if (dt.Columns.Contains("HighLimit"))
            {
                highLimitExists = true;
            }
            foreach (DataRow dr in dt.Rows)
            {
                StockTickTransaction tick = new StockTickTransaction();
                tick.Code = Convert.ToString(dr["stkcd"]);
                tick.TransactionDateTime = Convert.ToDateTime(dr["tdatetime"]);
                tick.LastPrice           = Convert.ToDouble(dr["cp"]);
                tick.Volume = Convert.ToDouble(dr["ts"]);
                tick.Amount = Convert.ToDouble(dr["tt"]);
                if (highLimitExists == true)
                {
                    tick.HighLimit = Convert.ToDouble(dr["HighLimit"]);
                    tick.LowLimit  = Convert.ToDouble(dr["LowLimit"]);
                }
                tick.Ask1  = Convert.ToDouble(dr["S1"]);
                tick.Ask2  = Convert.ToDouble(dr["S2"]);
                tick.Ask3  = Convert.ToDouble(dr["S3"]);
                tick.Ask4  = Convert.ToDouble(dr["S4"]);
                tick.Ask5  = Convert.ToDouble(dr["S5"]);
                tick.AskV1 = Convert.ToDouble(dr["SV1"]);
                tick.AskV2 = Convert.ToDouble(dr["SV2"]);
                tick.AskV3 = Convert.ToDouble(dr["SV3"]);
                tick.AskV4 = Convert.ToDouble(dr["SV4"]);
                tick.AskV5 = Convert.ToDouble(dr["SV5"]);
                tick.Bid1  = Convert.ToDouble(dr["B1"]);
                tick.Bid2  = Convert.ToDouble(dr["B2"]);
                tick.Bid3  = Convert.ToDouble(dr["B3"]);
                tick.Bid4  = Convert.ToDouble(dr["B4"]);
                tick.Bid5  = Convert.ToDouble(dr["B5"]);
                tick.BidV1 = Convert.ToDouble(dr["BV1"]);
                tick.BidV2 = Convert.ToDouble(dr["BV2"]);
                tick.BidV3 = Convert.ToDouble(dr["BV3"]);
                tick.BidV4 = Convert.ToDouble(dr["BV4"]);
                tick.BidV5 = Convert.ToDouble(dr["BV5"]);
                list.Add(tick);
            }
            return(list);
        }
        private StockTickTransaction onTick(int seconds, List <StockTickTransaction> data)
        {
            StockTickTransaction tick = new StockTickTransaction();
            int secondsIndex          = DataTimeStampExtension.GetStockSecondsIndex(data[0].TransactionDateTime);

            for (int i = 0; i < data.Count(); i++)
            {
                secondsIndex = DataTimeStampExtension.GetStockSecondsIndex(data[i].TransactionDateTime);
                if (secondsIndex <= seconds)
                {
                    tick = data[i];
                }
                else
                {
                    break;
                }
            }
            return(tick);
        }
        private void UpdateTickData(ref StockTickTransaction tickData, int volume)
        {
            int residualVolume = volume;

            residualVolume -= Convert.ToInt32(Math.Min(volume, tickData.BidV1));
            tickData.BidV1 -= Math.Min(volume, tickData.BidV1);
            volume          = residualVolume;
            residualVolume -= Convert.ToInt32(Math.Min(volume, tickData.BidV2));
            tickData.BidV2 -= Math.Min(volume, tickData.BidV2);
            volume          = residualVolume;
            residualVolume -= Convert.ToInt32(Math.Min(volume, tickData.BidV3));
            tickData.BidV3 -= Math.Min(volume, tickData.BidV3);
            volume          = residualVolume;
            residualVolume -= Convert.ToInt32(Math.Min(volume, tickData.BidV4));
            tickData.BidV4 -= Math.Min(volume, tickData.BidV4);
            volume          = residualVolume;
            residualVolume -= Convert.ToInt32(Math.Min(volume, tickData.BidV5));
            tickData.BidV5 -= Math.Min(volume, tickData.BidV5);
            volume          = residualVolume;
        }
Ejemplo n.º 9
0
        private List <StockTickTransaction> ConvertToTicks(string code, HashEntry[] hashEntries)
        {
            var ticks = new List <StockTickTransaction>();

            for (int i = 0; i < hashEntries.Length; i++)
            {
                var array = hashEntries[i].Value.ToString().Split(',');
                var tick  = new StockTickTransaction()
                {
                    Code = code,
                    TransactionDateTime = hashEntries[i].Name.ToString().ToDateTime(),
                    LastPrice           = array[0].ConvertTo <double>(),
                    Ask1      = array[1].ConvertTo <double>(),
                    Ask2      = array[2].ConvertTo <double>(),
                    Ask3      = array[3].ConvertTo <double>(),
                    Ask4      = array[4].ConvertTo <double>(),
                    Ask5      = array[5].ConvertTo <double>(),
                    Bid1      = array[6].ConvertTo <double>(),
                    Bid2      = array[7].ConvertTo <double>(),
                    Bid3      = array[8].ConvertTo <double>(),
                    Bid4      = array[9].ConvertTo <double>(),
                    Bid5      = array[10].ConvertTo <double>(),
                    AskV1     = array[11].ConvertTo <double>(),
                    AskV2     = array[12].ConvertTo <double>(),
                    AskV3     = array[13].ConvertTo <double>(),
                    AskV4     = array[14].ConvertTo <double>(),
                    AskV5     = array[15].ConvertTo <double>(),
                    BidV1     = array[16].ConvertTo <double>(),
                    BidV2     = array[17].ConvertTo <double>(),
                    BidV3     = array[18].ConvertTo <double>(),
                    BidV4     = array[19].ConvertTo <double>(),
                    BidV5     = array[20].ConvertTo <double>(),
                    Volume    = array[21].ConvertTo <double>(),
                    Amount    = array[22].ConvertTo <double>(),
                    HighLimit = array[23].ConvertTo <double>(),
                    LowLimit  = array[24].ConvertTo <double>()
                };
                ticks.Add(tick);
            }
            return(ticks);
        }
        public static List <StockTickTransaction> ModifyStockTickData(List <StockTickTransaction> original)
        {
            var timelist = GetStockTickStamp();

            StockTickTransaction[] modify = new StockTickTransaction[timelist.Count];
            int      timeIndex            = 0;
            DateTime today = new DateTime(original[0].TransactionDateTime.Year, original[0].TransactionDateTime.Month, original[0].TransactionDateTime.Day);

            for (int j = 0; j < original.Count; j++)
            {
                while (original[j].TransactionDateTime.TimeOfDay >= timelist[timeIndex] && timeIndex < timelist.Count - 1)
                {
                    timeIndex++;
                }
                if (original[j].TransactionDateTime.TimeOfDay < timelist[timeIndex])
                {
                    var data0 = original[j];
                    modify[timeIndex - 1] = new StockTickTransaction {
                        Ask1 = data0.Ask1, Ask2 = data0.Ask2, Ask3 = data0.Ask3, Ask4 = data0.Ask4, Ask5 = data0.Ask5, AskV1 = data0.AskV1, AskV2 = data0.AskV2, AskV3 = data0.AskV3, AskV4 = data0.AskV4, AskV5 = data0.AskV5, Bid1 = data0.Bid1, Bid2 = data0.Bid2, Bid3 = data0.Bid3, Bid4 = data0.Bid4, Bid5 = data0.Bid5, BidV1 = data0.BidV1, BidV2 = data0.BidV2, BidV3 = data0.BidV3, BidV4 = data0.BidV4, BidV5 = data0.BidV5, Amount = data0.Amount, Code = data0.Code, LastPrice = data0.LastPrice, TransactionDateTime = data0.TransactionDateTime, Volume = data0.Volume
                    };
                }
            }
            for (int i = 1; i < timelist.Count; i++)
            {
                if (modify[i] == null && modify[i - 1] != null)
                {
                    var data0 = modify[i - 1];
                    modify[i] = new StockTickTransaction {
                        Ask1 = data0.Ask1, Ask2 = data0.Ask2, Ask3 = data0.Ask3, Ask4 = data0.Ask4, Ask5 = data0.Ask5, AskV1 = data0.AskV1, AskV2 = data0.AskV2, AskV3 = data0.AskV3, AskV4 = data0.AskV4, AskV5 = data0.AskV5, Bid1 = data0.Bid1, Bid2 = data0.Bid2, Bid3 = data0.Bid3, Bid4 = data0.Bid4, Bid5 = data0.Bid5, BidV1 = data0.BidV1, BidV2 = data0.BidV2, BidV3 = data0.BidV3, BidV4 = data0.BidV4, BidV5 = data0.BidV5, Amount = data0.Amount, Code = data0.Code, LastPrice = data0.LastPrice, TransactionDateTime = data0.TransactionDateTime, Volume = data0.Volume
                    };
                    modify[i].TransactionDateTime = today + timelist[i];
                }
                if (modify[i] != null)
                {
                    modify[i].TransactionDateTime = today + timelist[i];
                }
            }
            return(modify.ToList());
        }
        //根据盘口数据更新orderbook中的waitingvolume字段
        private void modifyOrderBookByTickData(ref List <OrderBook> orderBook, StockTickTransaction tickData)
        {
            var marketSummary = getMarketWaitingVolumeSummary(tickData);
            var orderSummary  = getOrderBookSummary(orderBook);

            foreach (var market in marketSummary)
            {
                if (orderSummary.ContainsKey(market.Key) && orderSummary[market.Key] > 0)
                {
                    //从后往前更新数据
                    int waitingVolume = market.Value;
                    for (int i = orderBook.Count() - 1; i >= 0; i--)
                    {
                        var order = orderBook[i];
                        if (order.price == market.Key && order.volume > 0)
                        {
                            order.waitingVolume = waitingVolume;
                            waitingVolume       = Math.Max(waitingVolume - order.volume, 0);
                        }
                    }
                }
            }
        }
        private void placeAnOrder(ref List <OrderBook> orderBook, StockTickTransaction tickData, double price, DateTime time, int volume, int orderId)
        {
            var marketSummary = getMarketWaitingVolumeSummary(tickData);
            var order         = new OrderBook();

            order.time          = time;
            order.price         = price;
            order.orderId       = orderId;
            order.volume        = volume;
            order.code          = tickData.Code;
            order.waitingVolume = 0;
            if (marketSummary.ContainsKey(price))
            {
                order.waitingVolume = marketSummary[price];
            }
            else if (marketSummary.Count() > 0)
            {
                if (price > marketSummary.Keys.Max() && marketSummary.Keys.Max() > 0)
                {
                    order.waitingVolume = 2 * marketSummary[marketSummary.Keys.Max()];
                }
            }
            orderBook.Add(order);
        }
        private double getStockMidPrice(StockTickTransaction tick, double volumeTarget = 1000)
        {
            double mid = 0;

            if (tick == null || tick.AskV1 == 0 || tick.BidV1 == 0 || tick.Ask1 == 0 || tick.Bid1 == 0)
            {
                return(mid);
            }
            var askv1     = Math.Min(volumeTarget, tick.AskV1);
            var askv2     = Math.Max(Math.Min(volumeTarget - askv1, tick.AskV2), 0);
            var askv3     = Math.Max(Math.Min(volumeTarget - askv1 - askv2, tick.AskV3), 0);
            var askv4     = Math.Max(Math.Min(volumeTarget - askv1 - askv2 - askv3, tick.AskV4), 0);
            var askv5     = Math.Max(Math.Min(volumeTarget - askv1 - askv2 - askv3 - askv4, tick.AskV5), 0);
            var bidv1     = Math.Min(volumeTarget, tick.BidV1);
            var bidv2     = Math.Max(Math.Min(volumeTarget - bidv1, tick.BidV2), 0);
            var bidv3     = Math.Max(Math.Min(volumeTarget - bidv1 - bidv2, tick.BidV3), 0);
            var bidv4     = Math.Max(Math.Min(volumeTarget - bidv1 - bidv2 - bidv3, tick.BidV4), 0);
            var bidv5     = Math.Max(Math.Min(volumeTarget - bidv1 - bidv2 - bidv3 - bidv4, tick.BidV5), 0);
            var askvtotal = askv1 + askv2 + askv3 + askv4 + askv5;
            var bidvtotal = bidv1 + bidv2 + bidv3 + bidv4 + bidv5;

            mid = (askv1 * tick.Ask1 + askv2 * tick.Ask2 + askv3 * tick.Ask3 + askv4 * tick.Ask4 + askv5 * tick.Ask5 + bidv1 * tick.Bid1 + bidv2 * tick.Bid2 + bidv3 * tick.Bid3 + bidv4 * tick.Bid4 + bidv5 * tick.Bid5) / (askvtotal + bidvtotal);
            return(mid);
        }
        //按盘口价格模拟成交
        private void transactionSimulation(ref List <OrderBook> orderBook, ref List <TradeBook> tradeBook, StockTickTransaction tickData)
        {
            //如果orderbook上的挂单时间早于tickData数据的时间,认为orderbook的挂单完全成交。
            for (int i = 0; i < orderBook.Count(); i++)
            {
                var order = orderBook[i];
                if (order.time < tickData.TransactionDateTime)
                {
                    if (order.price <= tickData.Bid1 && order.volume > 0) //若order的卖价小于等于bid1的价格,认为其在该时刻已经成交了。
                    {
                        //记录成交信息
                        TradeBook trade = new TradeBook();
                        trade.tradeId = tradeId;
                        tradeId      += 1;
                        trade.time    = tickData.TransactionDateTime;
                        trade.price   = order.price;
                        trade.volume  = order.volume;
                        trade.orderId = order.orderId;
                        //刷新orderbook情况
                        UpdateOrderBookWaitingVolume(order.price, orderBook[i].waitingVolume + orderBook[i].volume, i + 1, ref orderBook);
                        order.waitingVolume = 0;
                        order.volume        = 0;
                        tradeBook.Add(trade);
                        printTradingLog(trade, orderBook, tickData);
                    }
                }
            }
            //如果orderbook上的挂单时间等于或者晚于tickData数据的时间,按照盘口成交,并减少盘口的量。
            var summary = getOrderBookSummary(orderBook);//先汇总挂单价格

            //按挂单价格遍历
            foreach (var price in summary.Keys)
            {
                for (int i = 0; i < orderBook.Count(); i++)//按order挂单的先后顺序成交
                {
                    int tradableVolume = getTradableVolumeFromMarket(tickData, price);
                    int tradedVolume   = 0;
                    if (tradableVolume <= 0)
                    {
                        break;
                    }
                    var order = orderBook[i];
                    if (orderBook[i].volume == 0 || orderBook[i].price != price)
                    {
                        continue;
                    }
                    //先成交他人的订单
                    if (tradableVolume <= orderBook[i].waitingVolume)
                    {
                        //无法成交
                        UpdateOrderBookWaitingVolume(price, tradableVolume, i, ref orderBook);
                        tradedVolume   = tradableVolume;
                        tradableVolume = 0;
                        UpdateTickData(ref tickData, tradedVolume);
                        break;
                    }
                    //再成交策略的挂单
                    else if (tradableVolume <= orderBook[i].waitingVolume + orderBook[i].volume)
                    {
                        //部分成交
                        UpdateOrderBookWaitingVolume(price, tradableVolume, i + 1, ref orderBook);
                        TradeBook trade = new TradeBook();
                        trade.tradeId = tradeId;
                        tradeId      += 1;
                        trade.time    = tickData.TransactionDateTime;
                        trade.price   = price;
                        trade.volume  = tradableVolume - orderBook[i].waitingVolume;
                        trade.orderId = orderBook[i].orderId;
                        UpdateOrderBookWaitingVolume(price, tradableVolume, i + 1, ref orderBook);
                        orderBook[i].volume       -= tradableVolume - orderBook[i].waitingVolume;
                        orderBook[i].waitingVolume = 0;
                        tradedVolume = tradableVolume;
                        UpdateTickData(ref tickData, tradedVolume);
                        tradableVolume = 0;
                        tradeBook.Add(trade);
                        printTradingLog(trade, orderBook, tickData);
                        break;
                    }
                    else
                    {
                        //完全成交
                        UpdateOrderBookWaitingVolume(price, orderBook[i].waitingVolume + orderBook[i].volume, i + 1, ref orderBook);

                        TradeBook trade = new TradeBook();
                        trade.code    = code;
                        trade.tradeId = tradeId;
                        tradeId      += 1;
                        trade.time    = tickData.TransactionDateTime;
                        trade.price   = price;
                        trade.volume  = orderBook[i].volume;
                        trade.orderId = orderBook[i].orderId;
                        UpdateOrderBookWaitingVolume(price, tradableVolume, i + 1, ref orderBook);
                        tradedVolume               = orderBook[i].waitingVolume + orderBook[i].volume;
                        orderBook[i].volume        = 0;
                        orderBook[i].waitingVolume = 0;
                        UpdateTickData(ref tickData, tradedVolume);
                        tradableVolume -= tradedVolume;
                        tradeBook.Add(trade);
                        printTradingLog(trade, orderBook, tickData);
                    }
                }
            }
        }
        private List <StockTickTransaction> getMergeData(List <StockTickTransaction> list1, List <StockTickTransaction> list2)
        {
            List <StockTickTransaction> list = new List <StockTickTransaction>();

            foreach (var item in list1)
            {
                StockTickTransaction trans = new StockTickTransaction();
                trans.Volume              = item.Volume;
                trans.Amount              = item.Amount;
                trans.Code                = item.Code;
                trans.LastPrice           = item.LastPrice;
                trans.TransactionDateTime = item.TransactionDateTime;
                trans.Ask1                = item.Ask1;
                trans.Ask2                = item.Ask2;
                trans.Ask3                = item.Ask3;
                trans.Ask4                = item.Ask4;
                trans.Ask5                = item.Ask5;
                trans.AskV1               = item.AskV1;
                trans.AskV2               = item.AskV2;
                trans.AskV3               = item.AskV3;
                trans.AskV4               = item.AskV4;
                trans.AskV5               = item.AskV5;
                trans.Bid1                = item.Bid1;
                trans.Bid2                = item.Bid2;
                trans.Bid3                = item.Bid3;
                trans.Bid4                = item.Bid4;
                trans.Bid5                = item.Bid5;
                trans.BidV1               = item.BidV1;
                trans.BidV2               = item.BidV2;
                trans.BidV3               = item.BidV3;
                trans.BidV4               = item.BidV4;
                trans.BidV5               = item.BidV5;
                list.Add(trans);
            }
            foreach (var item in list2)
            {
                StockTickTransaction trans = new StockTickTransaction();
                trans.Volume              = item.Volume;
                trans.Amount              = item.Amount;
                trans.Code                = item.Code;
                trans.LastPrice           = item.LastPrice;
                trans.TransactionDateTime = item.TransactionDateTime;
                trans.Ask1                = item.Ask1;
                trans.Ask2                = item.Ask2;
                trans.Ask3                = item.Ask3;
                trans.Ask4                = item.Ask4;
                trans.Ask5                = item.Ask5;
                trans.AskV1               = item.AskV1;
                trans.AskV2               = item.AskV2;
                trans.AskV3               = item.AskV3;
                trans.AskV4               = item.AskV4;
                trans.AskV5               = item.AskV5;
                trans.Bid1                = item.Bid1;
                trans.Bid2                = item.Bid2;
                trans.Bid3                = item.Bid3;
                trans.Bid4                = item.Bid4;
                trans.Bid5                = item.Bid5;
                trans.BidV1               = item.BidV1;
                trans.BidV2               = item.BidV2;
                trans.BidV3               = item.BidV3;
                trans.BidV4               = item.BidV4;
                trans.BidV5               = item.BidV5;
                list.Add(trans);
            }
            return(list.OrderBy(x => x.TransactionDateTime).ToList());
        }