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); } }
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()); }
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)); }
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); }
private void TradeAccepted(object sender, TradeArgs e) { if (CurrentCustomer != null) { _loggerService.Log("Trade accepted " + CurrentCustomer.Nickname); EndTrade(CurrentCustomer, true); } }
//交易回报 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); }
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); } }
private void TradeCanceled(object sender, TradeArgs e) { _loggerService.Log("Trade canceled " + CurrentCustomer.Nickname); if (CurrentCustomer == null) { return; } TradinngThread.Abort(); Thread.Sleep(500); RequestTrade(); }
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("成交通知"); }
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")); //用于刷新 } }
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); } } }
private void TradeRequest(object sender, TradeArgs e) { Customers.Add(e.customer); CommandsService.InviteCustomer(e.customer); _loggerService.Log("Trade registered " + e.customer.Nickname); }
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); } } }
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()); }
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}"); }
private void DefOnRtnTrade(object sender, TradeArgs e) { }
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(); }
public void onTrade(TradeArgs e) { //throw new NotImplementedException(); }