private SpreadInfo ProcessHQ(CustomMarketData m1, CustomMarketData m2) { SpreadInfo hqInfo = new SpreadInfo(); hqInfo.Time = m1.Time; hqInfo.LastIF1Price = (lastHQInfo == null) ? 0 : lastHQInfo.IF1Price; hqInfo.LastIF2Price = (lastHQInfo == null) ? 0 : lastHQInfo.IF2Price; hqInfo.IF1Price = (m1 == null) ? double.NaN : m1.NewPrice; hqInfo.IF2Price = (m2 == null) ? double.NaN : m2.NewPrice; if (m1 == null || m2 == null || m1.Buy.Length <= 0 || m1.Sell.Length <= 0 || m2.Buy.Length <= 0 || m2.Sell.Length <= 0) { hqInfo.IF1OpenPrice = hqInfo.IF1ClosePrice = hqInfo.IF2OpenPrice = hqInfo.IF2ClosePrice = double.NaN; hqInfo.CurrentSpread = hqInfo.CloseSpread = hqInfo.OpenSpread = double.NaN; UpdateLogInfo(string.Format("当前行情异常:无法获得{0}的买卖盘口", (m1 == null || m1.Buy.Length <= 0 || m1.Sell.Length <= 0) ? param.InIF1 : param.InIF2)); } else { hqInfo.IF1OpenPrice = m1.Sell[0]; hqInfo.IF1ClosePrice = m1.Buy[0]; hqInfo.IF2OpenPrice = m2.Buy[0]; hqInfo.IF2ClosePrice = m2.Sell[0]; hqInfo.MaxOpenVol = (int)Math.Min(m1.SellVol[0], m2.BuyVol[0]); hqInfo.MaxCloseVol = (int)Math.Min(m1.BuyVol[0], m2.SellVol[0]); hqInfo.LastSpread = (lastHQInfo == null) ? 0 : lastHQInfo.CurrentSpread; hqInfo.CurrentSpread = m1.NewPrice - m2.NewPrice; // 实时最新价差 hqInfo.OpenSpread = hqInfo.IF1OpenPrice - hqInfo.IF2OpenPrice; // 实时开仓价差 hqInfo.CloseSpread = hqInfo.IF1ClosePrice - hqInfo.IF2ClosePrice; // 实时平仓价差 } lastHQInfo = hqInfo; return(hqInfo); }
private void OnMarketDataInternal(CustomMarketData m) { spreadTrader.OnMarketData(m); // 更新本地行情缓存 if (m != null && m.StockCode == cB_IF1.Text) { latestM1 = m; } else if (m != null && m.StockCode == cB_IF2.Text) { latestM2 = m; } else { return; } // 当前行情时间戳是否一致,一致时才进行开仓平仓判断 if (latestM1 != null && latestM2 != null && latestM1.StockCode == cB_IF1.Text && latestM2.StockCode == cB_IF2.Text && latestM1.Time == latestM2.Time && latestM1.MilliSec == latestM2.MilliSec) { // 处理行情,计算价差 var spInfo = ProcessHQ(latestM1, latestM2); spreadTrader.OnSpreadData(spInfo); UpdateHQ(spInfo); } }
private void UpdateMarketData(CustomMarketData marketData) { lock (mdLocker) { foreach (var f in formList) { // 推送行情 if (!f.IsDisposed) { f.OnMarketData(marketData); } } } }
public void OnMarketData(CustomMarketData m) { if (inParam == null || m == null) { return; } // 更新本地行情缓存 if (m.StockCode == inParam.InIF1) { latestM1 = m; } else if (m.StockCode == inParam.InIF2) { latestM2 = m; } }
/* * -------------------------------------------------------------- * 行情通知 * -------------------------------------------------------------- */ private void OnRtnDepthMarketData(ThostFtdcDepthMarketDataField pDepthMarketData) { if (HandleRawMarketDataDel != null) { HandleRawMarketDataDel(pDepthMarketData); } if (HandleMarketDataDel != null) { CustomMarketData m = new CustomMarketData(); m.StockCode = pDepthMarketData.InstrumentID; m.Exchange = PublicDefine.EXCHANGE_SYMBOL_EN[6]; m.Time = int.Parse(pDepthMarketData.UpdateTime.Replace(":", "")); m.MilliSec = pDepthMarketData.UpdateMillisec; m.NewPrice = pDepthMarketData.LastPrice; m.Buy = new double[] { pDepthMarketData.BidPrice1, pDepthMarketData.BidPrice2, pDepthMarketData.BidPrice3, pDepthMarketData.BidPrice4, pDepthMarketData.BidPrice5 }; m.BuyVol = new int[] { pDepthMarketData.BidVolume1, pDepthMarketData.BidVolume2, pDepthMarketData.BidVolume3, pDepthMarketData.BidVolume4, pDepthMarketData.BidVolume5 }; m.Sell = new double[] { pDepthMarketData.AskPrice1, pDepthMarketData.AskPrice2, pDepthMarketData.AskPrice3, pDepthMarketData.AskPrice4, pDepthMarketData.AskPrice5 }; m.SellVol = new int[] { pDepthMarketData.AskVolume1, pDepthMarketData.AskVolume2, pDepthMarketData.AskVolume3, pDepthMarketData.AskVolume4, pDepthMarketData.AskVolume5 }; HandleMarketDataDel(m); } }
public void UpdateMarketData(CustomMarketData marketData) { Instruments[marketData.StockCode].MarketData = marketData; }
public void OnMarketData(CustomMarketData m) { var del = new HandleMarketDataDelegate(OnMarketDataInternal); this.BeginInvoke(del, new object[] { m }); }