Example #1
0
        private void BeginTrade(object sender, TradeArgs e)
        {
            bool requestTrade = false;
            var  customer     = Customers.FirstOrDefault(c => c.Nickname == e.CustomerName);

            if (customer == null)
            {
                _loggerService.Log($"Customer {e.CustomerName} not found in my trade list");
                return;
            }
            if (_InTrade)
            {
                _loggerService.Log($"Currently in trade, queue him");
                return;
            }
            _loggerService.Log("Customer arrived " + customer.Nickname);
            if (customer.OrderType == CustomerInfo.OrderTypes.SINGLE)
            {
                requestTrade = _StashHelper.WithrawItemFromStash(customer);
            }
            else if (customer.OrderType == CustomerInfo.OrderTypes.MANY)
            {
                requestTrade = _StashHelper.WithrawTradeItemsFromStash(customer);
            }
            if (requestTrade)
            {
                CurrentCustomer = customer;
                RequestTrade();
            }
            else
            {
                Customers.Remove(customer);
            }
        }
Example #2
0
        private void TradeHandler(object sender, TradeArgs e)
        {
            itemTrade itrade = e.ItemTrade;



            // Order o = new OrderImpl(iorder.msecsym, iorder.IsBuyOrder(), iorder.mqty, Convert.ToDecimal(iorder.mprice), Convert.ToDecimal(iorder.mstopprice), "", iorder.mc_date, iorder.mc_date, iorder.morderid);
            Trade trade = new TradeImpl();

            trade.symbol = itrade.msecsym;
            itemOrder lorder = socketOrderServer.sitemOrder.FindItem(itrade.morderid);

            if (lorder == null)
            {
                return;
            }
            trade.side   = lorder.IsBuyOrder();
            trade.xprice = Convert.ToDecimal(itrade.mprice);
            trade.xsize  = itrade.mqty;
            DateTime mdate = ComFucs.GetDate(itrade.mm_date);

            trade.Account = "";
            trade.xdate   = mdate.Day + mdate.Month * 100 + mdate.Year * 10000;
            trade.xtime   = mdate.Second + mdate.Minute * 100 + mdate.Hour * 10000;
            tl.newFill(trade);
            v(trade.symbol + " received fill ack for: " + trade.ToString());
        }
Example #3
0
        public void onTrade(TradeArgs e)
        {
            ////throw new NotImplementedException();
            //Console.WriteLine("[" + DateTime.Now.ToLocalTime().ToString() + "]" + "OnRtnTrade:{0}", e.Value.TradeID);
            //Log.log(string.Format("OnRtnTrade:{0} OrderID {1}", e.Value.TradeID, e.Value.OrderID), e.Value.InstrumentID);
            ////成交 需要下委托单
            //string direction = e.Value.Direction == DirectionType.Buy ? "买" : "卖";
            //InstrumentData instrumentdata;
            //if (mTradeData.TryGetValue(e.Value.InstrumentID, out instrumentdata) == false)
            //{
            //    return;
            //}


            //if (e.Value.Direction == DirectionType.Buy)
            //{
            //    instrumentdata.holder = 1;
            //    instrumentdata.price = e.Value.Price;
            //}
            //else
            //{
            //    instrumentdata.holder = -1;
            //    instrumentdata.price = e.Value.Price;
            //}

            //string offsetType = "开";
            //if (e.Value.Offset == OffsetType.Close)
            //    offsetType = "平";
            //else if (e.Value.Offset == OffsetType.CloseToday)
            //    offsetType = "平今";
            //Log.logTrade(string.Format("{0},{1},{2},{3},{4},{5}", e.Value.InstrumentID, e.Value.TradingDay, e.Value.TradeTime,
            //    e.Value.Price, e.Value.Volume, direction + offsetType));
        }
Example #4
0
 public void onTrade(TradeArgs tradeArgs)
 {
     foreach (IStrategy strategy in mStrategyDictionary.Values)
     {
         strategy.onTrade(tradeArgs);
     }
 }
        public bool operateInstrument(OpType op, string instrumentId, double price, int limitMin)
        {
            if (op == OpType.BUY_OPEN || op == OpType.SELL_OPEN)
            {
                int        orderId    = _orderId++;
                OrderField orderField = new OrderField();
                orderField.OrderID      = orderId;
                orderField.InstrumentID = instrumentId;
                orderField.LimitPrice   = price;
                if (op == OpType.BUY_OPEN)
                {
                    orderField.Direction = DirectionType.Buy;
                }
                else
                {
                    orderField.Direction = DirectionType.Sell;
                }

                _tradeOrders.Add(orderId, orderField);

                if (limitMin > 0)
                {
                    _waitingOrder.Add(instrumentId, new HashSet <string>());
                    _waitingMin[instrumentId] = limitMin;
                }
                else
                {
                    _waitingMin[_instrumentId] = 0;
                }

                StrategyManager.getInstance().onOrder(orderField);
            }
            else
            {
                if (_holding != 0)
                {
                    TradeArgs tradeArgs = new TradeArgs();
                    tradeArgs.Value = new TradeField();
                    if (_holdingOrder.Direction == DirectionType.Buy)
                    {
                        tradeArgs.Value.Direction = DirectionType.Sell;
                    }
                    else
                    {
                        tradeArgs.Value.Direction = DirectionType.Buy;
                    }

                    tradeArgs.Value.InstrumentID = _instrumentId;
                    tradeArgs.Value.Price        = _currentLastPrice;
                    tradeArgs.Value.TradeTime    = _currentTime;
                    tradeArgs.Value.OrderID      = _holdingOrder.OrderID;
                    tradeArgs.Value.Offset       = OffsetType.Close;
                    StrategyManager.getInstance().onTrade(tradeArgs);
                    _holding      = 0;
                    _holdingOrder = null;
                }
            }
            return(true);
        }
Example #6
0
        private void TradeAccepted(object sender, TradeArgs e)
        {
            if (CurrentCustomer != null)
            {
                _loggerService.Log("Trade accepted " + CurrentCustomer.Nickname);

                EndTrade(CurrentCustomer, true);
            }
        }
Example #7
0
        //交易回报
        private void _OnRtnTrade(object sender, TradeArgs e)
        {
            while (0 != Interlocked.Exchange(ref BaseStrategy.Locker, 1))
            {
            }
            TradeField trade = e.Value;

            LogUtils.EnginLog($"交易回报:{trade.OrderID}\t{trade.InstrumentID}\t{trade.Direction}\t{trade.Offset}\t{trade.Price}\t{trade.Volume}");
            Interlocked.Exchange(ref BaseStrategy.Locker, 0);
        }
Example #8
0
        private void OnRtnTrade(object sender, TradeArgs e)//将成交回报分发给各个合约
        {
            AContract contract = Contracts.Find(
                delegate(AContract c) { return(string.Compare(c.Instrument.InstrumentID, e.Value.InstrumentID) == 0); }
                );

            if (contract != null)
            {
                contract.OnRtnTrade(sender, e);
            }
        }
Example #9
0
 private void TradeCanceled(object sender, TradeArgs e)
 {
     _loggerService.Log("Trade canceled " + CurrentCustomer.Nickname);
     if (CurrentCustomer == null)
     {
         return;
     }
     TradinngThread.Abort();
     Thread.Sleep(500);
     RequestTrade();
 }
Example #10
0
 void trade_OnRtnTrade(object sender, TradeArgs e)
 {
     _queueTradeFresh.Enqueue(e.Value.TradeID);                  //刷新时用
     if (e.Value.Offset == OffsetType.Open)
     {
         _queuePositionFresh.Enqueue(e.Value.InstrumentID + "_" + e.Value.Direction);                    //刷持仓
     }
     else
     {
         _queuePositionFresh.Enqueue(e.Value.InstrumentID + "_" + (e.Value.Direction == DirectionType.Buy ? "Sell" : "Buy"));                    //刷持仓
     }
     Ring("成交通知");
 }
Example #11
0
        private void CustomerLeft(object sender, TradeArgs e)
        {
            if (_InTrade)
            {
                TradinngThread.Abort();
                _InTrade = false;
            }
            _loggerService.Log("Customer left " + e.CustomerName);
            var customer = Customers.FirstOrDefault(c => c.Nickname == e.CustomerName);

            if (customer != null)
            {
                EndTrade(customer);
            }
        }
        void _t_OnRtnTrade(object sender, TradeArgs e)
        {
            var trade = (Trade)sender;
            var field = e.Value;

            var vap = _straOrdersId.FirstOrDefault(n => n.Value.IndexOf(e.Value.OrderID) >= 0);

            if (vap.Key == null)
            {
                return;
            }
            var ids = vap.Value;
            var o1  = _t.DicOrderField.Values.Where(n => ids.IndexOf(n.OrderID) >= 0 && n.InstrumentID == vap.Key.Instrument1);

            vap.Key.VolumeTraded1 = o1.Sum(n => n.Volume - n.VolumeLeft);

            var p1 = o1.Sum(n => n.AvgPrice * (n.Volume - n.VolumeLeft)) / vap.Key.VolumeTraded1;
            var o2 = _t.DicOrderField.Values.Where(n => ids.IndexOf(n.OrderID) >= 0 && n.InstrumentID == vap.Key.Instrument2);

            vap.Key.VolumeTraded2 = o2.Sum(n => n.Volume - n.VolumeLeft);

            if (vap.Key.Instrument1 == field.InstrumentID)
            {
                _queueModifiedStra.Enqueue(new Tuple <Stra, string>(vap.Key, "VolumeTraded1"));                //用于刷新
            }
            else if (vap.Key.Instrument2 == field.InstrumentID)
            {
                _queueModifiedStra.Enqueue(new Tuple <Stra, string>(vap.Key, "VolumeTraded2"));                //用于刷新
            }
            var    p2 = o2.Sum(n => n.AvgPrice * (n.Volume - n.VolumeLeft)) / vap.Key.VolumeTraded2;
            double p  = p1 - p2;

            if (!double.IsNaN(p))
            {
                vap.Key.PriceTraded = p;
                if (vap.Key.VolumeTraded1 == vap.Key.Volume1 && vap.Key.Volume2 == vap.Key.VolumeTraded2)
                {
                    vap.Key.Status = ArbStatus.Filled;
                }
                else
                {
                    vap.Key.Status = ArbStatus.Partial;
                }
                _queueModifiedStra.Enqueue(new Tuple <Stra, string>(vap.Key, "Status"));                //用于刷新
                _queueModifiedStra.Enqueue(new Tuple <Stra, string>(vap.Key, "PriceTraded"));           //用于刷新
            }
        }
Example #13
0
        private void ProcessMarketDataFullRefresh(Message msg)
        {
            Debug.Assert(MsgType.Market_Data_Snapshot_Full_Refresh == msg.Type);

            MarketDataUpdate update = new MarketDataUpdate();

            string symbol = msg.Get(Tags.Symbol);

            bool isPriceChanged = false;

            Group mdDEntries = msg.GetGroup(Tags.NoMDEntries);

            for (int i = 0; i < mdDEntries.NumberOfInstances; ++i)
            {
                string priceValue = mdDEntries.Get(Tags.MDEntryPx, i);
                if (null != priceValue)
                {
                    double price;
                    if (double.TryParse(priceValue, NumberStyles.Number, CultureInfo.InvariantCulture, out price))
                    {
                        double size      = 0;
                        string sizeValue = mdDEntries.Get(Tags.MDEntrySize, i);
                        if (!string.IsNullOrEmpty(sizeValue))
                        {
                            double.TryParse(sizeValue, NumberStyles.Number, CultureInfo.InvariantCulture, out size);
                        }
                        string entryType = mdDEntries.Get(Tags.MDEntryType, i);
                        if (MDEntryType.Bid == entryType)
                        {
                            if (update.Bid != price || update.BidSize != size)
                            {
                                update.Bid     = price;
                                update.BidSize = size;
                                isPriceChanged = true;
                            }
                        }
                        else if (MDEntryType.Offer == entryType)
                        {
                            if (update.Ask != price || update.AskSize != size)
                            {
                                update.Ask     = price;
                                update.AskSize = size;
                                isPriceChanged = true;
                            }
                        }
                        else if (MDEntryType.Trade == entryType)
                        {
                            TradeArgs rv = new TradeArgs(symbol, price, size);
                            if (TradeReceived != null)
                            {
                                TradeReceived(this, rv);
                            }
                        }
                    }
                }
            }

            if (isPriceChanged)
            {
                PriceChangeArgs rv = new PriceChangeArgs(symbol, update.Bid, update.BidSize, update.Ask, update.AskSize);
                if (PriceChange != null)
                {
                    PriceChange(this, rv);
                }
            }
        }
Example #14
0
 private void TradeRequest(object sender, TradeArgs e)
 {
     Customers.Add(e.customer);
     CommandsService.InviteCustomer(e.customer);
     _loggerService.Log("Trade registered " + e.customer.Nickname);
 }
Example #15
0
        private void ProcessMarketDataIncrementalRefresh(Message msg)
        {
            Debug.Assert(MsgType.Market_Data_Incremental_Refresh == msg.Type);

            string mdReqID = msg.Get(Tags.MDReqID);

            MarketDataUpdate update;

            lock (lastMD)
            {
                if (!lastMD.TryGetValue(mdReqID, out update))
                {
                    update = new MarketDataUpdate();
                    lastMD.Add(mdReqID, update);
                }
            }

            string symbol = null;

            bool isPriceChanged = false;

            Group mdDEntries = msg.GetGroup(Tags.NoMDEntries);

            for (int i = 0; i < mdDEntries.NumberOfInstances; ++i)
            {
                if (null == symbol)
                {
                    symbol = mdDEntries.Get(Tags.Symbol, i);
                }
                else
                {
                    Debug.Assert(mdDEntries.Get(Tags.Symbol, i) == symbol);
                }
                string priceValue = mdDEntries.Get(Tags.MDEntryPx, i);
                if (null != priceValue)
                {
                    double price;
                    if (double.TryParse(priceValue, NumberStyles.Number, System.Globalization.CultureInfo.InvariantCulture, out price))
                    {
                        double size      = 0;
                        string sizeValue = mdDEntries.Get(Tags.MDEntrySize, i);
                        if (!string.IsNullOrEmpty(sizeValue))
                        {
                            double.TryParse(sizeValue, NumberStyles.Number, CultureInfo.InvariantCulture, out size);
                        }
                        string entryType = mdDEntries.Get(Tags.MDEntryType, i);
                        if (MDEntryType.Bid == entryType)
                        {
                            if (update.Bid != price)
                            {
                                update.Bid     = price;
                                update.BidSize = size;
                                isPriceChanged = true;
                            }
                        }
                        else if (MDEntryType.Offer == entryType)
                        {
                            if (update.Ask != price)
                            {
                                update.Ask     = price;
                                update.AskSize = size;
                                isPriceChanged = true;
                            }
                        }
                        else if (MDEntryType.Trade == entryType)
                        {
                            TradeArgs rv = new TradeArgs(symbol, price, size);
                            if (TradeReceived != null)
                            {
                                TradeReceived(this, rv);
                            }
                        }
                    }
                }
            }

            if (isPriceChanged)
            {
                PriceChangeArgs rv = new PriceChangeArgs(symbol, update.Bid, update.BidSize, update.Ask, update.AskSize);
                if (PriceChange != null)
                {
                    PriceChange(this, rv);
                }
            }
        }
Example #16
0
        private void TradeHandler(object sender, TradeArgs e)
        {


            itemTrade itrade = e.ItemTrade;




           // Order o = new OrderImpl(iorder.msecsym, iorder.IsBuyOrder(), iorder.mqty, Convert.ToDecimal(iorder.mprice), Convert.ToDecimal(iorder.mstopprice), "", iorder.mc_date, iorder.mc_date, iorder.morderid);
            Trade trade = new TradeImpl();
            trade.symbol = itrade.msecsym;
            itemOrder lorder =socketOrderServer.sitemOrder.FindItem(itrade.morderid);
            if (lorder== null) return; 
              trade.side = lorder.IsBuyOrder();
            trade.xprice = Convert.ToDecimal(itrade.mprice);
            trade.xsize = itrade.mqty;
            DateTime mdate = ComFucs.GetDate(itrade.mm_date);
            trade.Account = "";
            trade.xdate = mdate.Day + mdate.Month * 100 + mdate.Year * 10000;
            trade.xtime = mdate.Second + mdate.Minute * 100 + mdate.Hour * 10000;
            tl.newFill(trade);
            v(trade.symbol+" received fill ack for: " + trade.ToString());
        }
Example #17
0
 private void _t_OnRtnTrade(object sender, TradeArgs e)
 {
     Log($"{e.Value.InstrumentID}\t{e.Value.Direction}\t{e.Value.Offset}\t{e.Value.Price}\t{e.Value.Volume}");
 }
Example #18
0
 private void DefOnRtnTrade(object sender, TradeArgs e)
 {
 }
Example #19
0
        public void start()
        {
            FileStream fs = new FileStream(FileUtil.getTestDataFilePath(_instrumentId + "_Tick.csv"), System.IO.FileMode.Open, System.IO.FileAccess.Read);

            //StreamReader sr = new StreamReader(fs, Encoding.UTF8);
            StreamReader sr = new StreamReader(fs, Encoding.UTF8);
            //string fileContent = sr.ReadToEnd();
            //encoding = sr.CurrentEncoding;
            //记录每次读取的一行记录
            string strLine = "";

            //记录每行记录中的各字段内容
            string[] aryLine = null;
            //标示列数
            int columnCount = 0;
            //标示是否是读取的第一行
            bool IsFirst = true;
            //逐行读取CSV中的数据
            int count = 0;

            while ((strLine = sr.ReadLine()) != null)
            {
                //strLine = Common.ConvertStringUTF8(strLine, encoding);
                //strLine = Common.ConvertStringUTF8(strLine);

                {
                    aryLine = strLine.Split(',');
                    TickEventArgs tick = new TickEventArgs();
                    tick.Tick = new MarketData();
                    bool result = double.TryParse(aryLine[8], out tick.Tick.LastPrice);
                    if (result == false || tick.Tick.LastPrice <= 0)
                    {
                        continue;
                    }
                    _currentLastPrice = tick.Tick.LastPrice;

                    tick.Tick.InstrumentID = _instrumentId;
                    string date = aryLine[0].Substring(0, 4) + "-" + aryLine[0].Substring(4, 2) + "-" + aryLine[0].Substring(6);
                    string time;
                    string temparyLine1 = aryLine[1];
                    string temparyLine2 = aryLine[1];
                    if (temparyLine1.IndexOf('E') >= 0)
                    {
                        Decimal dec = ChangeDataToD(temparyLine1);
                        temparyLine2 = dec.ToString();
                    }

                    temparyLine2 += "00000000";

                    time = temparyLine2.Substring(2, 2) + ":" + temparyLine2.Substring(4, 2) + ":" + temparyLine2.Substring(6, 2);


                    tick.Tick.UpdateTime = date + " " + time;
                    _currentTime         = tick.Tick.UpdateTime;

                    OrderField order = getOpeningOrder(_instrumentId);
                    if (order != null)
                    {
                        if ((order.Direction == DirectionType.Buy &&
                             order.LimitPrice >= tick.Tick.LastPrice) ||
                            (order.Direction == DirectionType.Sell &&
                             order.LimitPrice <= tick.Tick.LastPrice))
                        {
                            TradeArgs tradeArgs = new TradeArgs();
                            tradeArgs.Value              = new TradeField();
                            tradeArgs.Value.Direction    = order.Direction;
                            tradeArgs.Value.InstrumentID = _instrumentId;
                            tradeArgs.Value.Price        = tick.Tick.LastPrice;
                            tradeArgs.Value.TradeTime    = tick.Tick.UpdateTime;
                            tradeArgs.Value.OrderID      = order.OrderID;
                            tradeArgs.Value.Offset       = order.Offset;
                            StrategyManager.getInstance().onTrade(tradeArgs);
                            _holding      = 1;
                            _holdingOrder = order;
                            removeOrder(order.OrderID);
                            removeWaitingOrder(_instrumentId);
                        }
                    }
                    StrategyManager.getInstance().onTick(tick);
                    if (hasWaitingOrder(_instrumentId))
                    {
                        if (_waitingOrder.ContainsKey(_instrumentId))
                        {
                            HashSet <string> tickTime = _waitingOrder[_instrumentId];
                            tickTime.Add(tick.Tick.UpdateTime);
                            if (tickTime.Count == 1 && order != null)
                            {
                                order.InsertTime = tick.Tick.UpdateTime;
                            }

                            if (tickTime.Count > _waitingMin[_instrumentId] * 60)
                            {
                                removeOrder(order.OrderID);
                                removeWaitingOrder(_instrumentId);
                                order.InsertTime = tick.Tick.UpdateTime;
                                StrategyManager.getInstance().onOrderCancel(order);
                            }
                        }
                    }
                }
            }


            sr.Close();
            fs.Close();
        }
Example #20
0
 public void onTrade(TradeArgs e)
 {
     //throw new NotImplementedException();
 }