public void Init() { if (FrontAddrs == null || FrontAddrs.Length == 0) { HandleErrorInternal("前置机地址不能为空!"); return; } try { if (mdApi == null) { mdApi = new CTPMDAdapter(".\\md", false); // 创建md目录存放流文件,避免与交易流文件冲突 mdApi.OnFrontConnected += new FrontConnected(OnFrontConnected); mdApi.OnFrontDisconnected += new FrontDisconnected(OnFrontDisconnected); mdApi.OnRspUserLogout += new RspUserLogout(OnRspUserLogout); mdApi.OnRspUserLogin += new RspUserLogin(OnRspUserLogin); mdApi.OnRspSubMarketData += new RspSubMarketData(OnRspSubMarketData); mdApi.OnRspUnSubMarketData += new RspUnSubMarketData(OnRspUnSubMarketData); mdApi.OnRtnDepthMarketData += new RtnDepthMarketData(OnRtnDepthMarketData); mdApi.OnRspError += new RspError(OnRspError); } foreach (var addr in FrontAddrs) { mdApi.RegisterFront(addr); // 注册所有的可用地址 } mdApi.Init(); } catch (Exception ex) { HandleErrorInternal("CTPMD.Start()异常:" + ex.Message + "\n" + ex.StackTrace); } }
public void Run() { api = new CTPMDAdapter(); api.OnFrontConnected += new FrontConnected(OnFrontConnected); api.OnFrontDisconnected += new FrontDisconnected(OnFrontDisconnected); api.OnHeartBeatWarning += new HeartBeatWarning(OnHeartBeatWarning); api.OnRspError += new RspError(OnRspError); api.OnRspSubMarketData += new RspSubMarketData(OnRspSubMarketData); api.OnRspUnSubMarketData += new RspUnSubMarketData(OnRspUnSubMarketData); api.OnRspUserLogin += new RspUserLogin(OnRspUserLogin); api.OnRspUserLogout += new RspUserLogout(OnRspUserLogout); api.OnRtnDepthMarketData += new RtnDepthMarketData(OnRtnDepthMarketData); try { api.RegisterFront(FRONT_ADDR); api.Init(); api.Join(); // 阻塞直到关闭或者CTRL+C } catch (Exception e) { Console.WriteLine(e.Message); } finally { api.Release(); } }
public void Release() { if (mdApi != null) { mdApi.Release(); mdApi = null; } }
public CTPMarketDataProvider(AccountInfo accountInfo) { this.AccountInfo = accountInfo; ctpReader = new CTPMDAdapter(); Initialize(ctpReader); Connect(accountInfo.MarketDataAddress); }
private void Initialize(CTPMDAdapter ctpReader) { ctpReader.OnFrontConnected += ReaderOnFrontConnected; ctpReader.OnFrontDisconnected += ReaderOnFrontDisconnected; ctpReader.OnRspUserLogin += ReaderOnRspUserLogin; ctpReader.OnRspUserLogout += ReaderOnRspUserLogout; ctpReader.OnRtnDepthMarketData += ReaderOnRtnDepthMarketData; ctpReader.OnRspError += ReaderOnRspError; }
public CTPMarketDataProvider(AccountInfo accountInfo, string pszFlowPath) { this.AccountInfo = accountInfo; var dataFlowPath = CreateDirectory(pszFlowPath); ctpReader = new CTPMDAdapter(dataFlowPath, false); Initialize(ctpReader); Connect(accountInfo.MarketDataAddress); }
private void Release(CTPMDAdapter ctpReader) { ctpReader.OnFrontConnected -= ReaderOnFrontConnected; ctpReader.OnFrontDisconnected -= ReaderOnFrontDisconnected; ctpReader.OnRspUserLogin -= ReaderOnRspUserLogin; ctpReader.OnRspUserLogout -= ReaderOnRspUserLogout; ctpReader.OnRtnDepthMarketData -= ReaderOnRtnDepthMarketData; ctpReader.OnRspError -= ReaderOnRspError; ctpReader.Dispose(); }
public void Initialize() { var configPath = Path.Combine(Path.GetDirectoryName(this.GetType().Assembly.Location), "CTP.yaml"); if (!File.Exists(configPath)) { throw new Exception(string.Format("{0}初始化失败,配置文件{1}不存在", this.GetType().FullName, configPath)); } using (var reader = new StreamReader(configPath)) { var deserializer = new Deserializer(namingConvention: new UnderscoredNamingConvention()); this._config = deserializer.Deserialize <Config>(reader); } // ================================================================================ // 交易初始化 // ================================================================================ this._trade = new CTPTraderAdapter(Path.GetDirectoryName(this.GetType().Assembly.Location) + '\\'); this._trade.OnFrontConnected += _trade_OnFrontConnected; this._trade.OnRspUserLogin += _trade_OnRspUserLogin; this._trade.OnRspAuthenticate += _trade_OnRspAuthenticate; this._trade.OnRspQryInstrument += _trade_OnRspQryInstrument; this._trade.OnRspError += OnRspError; this._trade.OnRspQryTradingAccount += _trade_OnRspQryTradingAccount; this._trade.OnRspQryOrder += _trade_OnRspQryOrder; this._trade.OnRspOrderInsert += (order, rsp, _3, _4) => { if (rsp.ErrorID != 0) { this.OnLog($"ERROR: OnRspOrderInsert: {nameof(rsp.ErrorID) + rsp.ErrorID}, {nameof(rsp.ErrorMsg) + rsp.ErrorMsg}"); } }; this._trade.OnRtnOrder += _trade_OnRtnOrder; this._trade.OnRtnTrade += _ => { this.QueryPositions(); this.OnTrade(new Trade { InstrumentID = _.InstrumentID, Price = _.Price, Qty = _.Volume }); }; this._trade.OnRspQryInvestorPosition += (positionField, rspField, requestId, isLast) => { if (positionField != null) { this._positions[requestId].Add(positionField); } if (isLast) { if (rspField != null && rspField.ErrorID != 0) { throw new Exception($"查询持仓失败,代码:{rspField.ErrorID},描述:{rspField.ErrorMsg}"); } this.Account.Positions = this._positions[requestId].Select(_ => _.ToOptionPosition()).Where(_ => _.Qty > 0).ToList(); this._positions.Remove(requestId); } }; foreach (var f in this._config.TradingFrontends) { this._trade.RegisterFront(f); } this._trade.SubscribePrivateTopic(EnumTeResumeType.THOST_TERT_QUICK); this._trade.Init(); this.OnLog("等待交易登录响应。。。"); this._asyncWaiter.WaitOne(); // ================================================================================ // 行情初始化 // ================================================================================ this._market = new CTPMDAdapter(); this._market.OnRspError += OnRspError; this._market.OnFrontConnected += _market_OnFrontConnected; this._market.OnRspUserLogin += _market_OnRspUserLogin; this._market.OnRtnDepthMarketData += _market_OnRtnDepthMarketData; foreach (var f in this._config.MarketFrontends) { this._market.RegisterFront(f); } this._market.Init(); this.OnLog("等待行情登录响应。。。"); this._asyncWaiter.WaitOne(); this.OnLog("查询合约并订阅行情。。。"); this._ctpReqstr.Schedule(() => this._trade.ReqQryInstrument(new ThostFtdcQryInstrumentField { ExchangeID = "SSE" }, this._session.NextRequestID())); this._asyncWaiter.WaitOne(); }
/// <summary> /// 构造函数 /// </summary> public MarketManager(CTPMDAdapter marketer) { ActiveContractDictionary = new Dictionary<string, ActiveContract>(); this.marketer = marketer; }
/// <summary> /// 主窗体创建的时候相应动作 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void MainForm_Load(object sender, EventArgs e) { #region API初始化 CtpMDApi = new CTPMDAdapter(); CtpTDApi = new CTPTDAdapter(); sCtpMdApi = new CTPMDAPI(this); sCtpTdApi = new CTPTDAPI(this); #endregion #region 登录数据库初始化 this.InitConfig(); #endregion #region 消息队列初始化 Thread td_SendData = new Thread(SendData); td_SendData.IsBackground = true; td_SendData.Start(); #endregion 消息队列初始化 #region SQLite 入库线程启动 Queue_SQLite.bUse = true; Queue_SQLite.t = new Thread(sqlitedb); Queue_SQLite.t.IsBackground = true; Queue_SQLite.t.Start(this); #endregion SQLite 入库线程启动 #region GridView深度行情 string[] columnNames = { "品种名称", "交易日", "自然日", "时间", "毫秒", "最新价", "上次结算价", "昨收盘", "昨持仓", "开盘价", "最高价", "最低价", "数量", "成交金额", "持仓量", "收盘价", "结算价", "涨停板价", "跌停板价", "昨虚实度", "虚实度", "叫卖价", "叫卖量", "叫买价", "叫买量", "叫卖价2", "叫卖量2", "叫买价2", "叫买量2", "叫卖价3", "叫卖量3", "叫买价3", "叫买量3", "叫卖价4", "叫卖量4", "叫买价4", "叫买量4", "叫卖价5", "叫卖量5", "叫买价5", "叫买量5", "当日均价"}; foreach (string n in columnNames) { DT_DeepInstrumentRSP.Columns.Add(n, typeof(String)); } //建立主键 DataColumn[] cols = new DataColumn[] { DT_DeepInstrumentRSP.Columns["品种名称"] }; this.DT_DeepInstrumentRSP.PrimaryKey = cols; this.GridView_DeepInstrument.DataSource = this.DT_DeepInstrumentRSP; this.GridView_DeepInstrument.Columns["昨虚实度"].Visible = false; this.GridView_DeepInstrument.Columns["交易日"].Visible = false; this.GridView_DeepInstrument.Columns["最高价"].Visible = false; this.GridView_DeepInstrument.Columns["最低价"].Visible = false; this.GridView_DeepInstrument.Columns["开盘价"].Visible = false; this.GridView_DeepInstrument.Columns["虚实度"].Visible = false; this.GridView_DeepInstrument.Columns["结算价"].Visible = false; this.GridView_DeepInstrument.Columns["自然日"].Visible = false; this.GridView_DeepInstrument.Columns["上次结算价"].Visible = false; this.GridView_DeepInstrument.Columns["昨收盘"].Visible = false; this.GridView_DeepInstrument.Columns["昨持仓"].Visible = false; this.GridView_DeepInstrument.Columns["收盘价"].Visible = false; this.GridView_DeepInstrument.Columns["涨停板价"].Visible = false; this.GridView_DeepInstrument.Columns["跌停板价"].Visible = false; this.GridView_DeepInstrument.Columns["当日均价"].Visible = false; this.GridView_DeepInstrument.Columns["叫卖价2"].Visible = false; this.GridView_DeepInstrument.Columns["叫卖价3"].Visible = false; this.GridView_DeepInstrument.Columns["叫卖价4"].Visible = false; this.GridView_DeepInstrument.Columns["叫卖价5"].Visible = false; this.GridView_DeepInstrument.Columns["叫卖量2"].Visible = false; this.GridView_DeepInstrument.Columns["叫卖量3"].Visible = false; this.GridView_DeepInstrument.Columns["叫卖量4"].Visible = false; this.GridView_DeepInstrument.Columns["叫卖量5"].Visible = false; this.GridView_DeepInstrument.Columns["叫买价2"].Visible = false; this.GridView_DeepInstrument.Columns["叫买价3"].Visible = false; this.GridView_DeepInstrument.Columns["叫买价4"].Visible = false; this.GridView_DeepInstrument.Columns["叫买价5"].Visible = false; this.GridView_DeepInstrument.Columns["叫买量2"].Visible = false; this.GridView_DeepInstrument.Columns["叫买量3"].Visible = false; this.GridView_DeepInstrument.Columns["叫买量4"].Visible = false; this.GridView_DeepInstrument.Columns["叫买量5"].Visible = false; #endregion #region GridView可供订阅的品种 string[] columnNames1 = { "品种名称", "合约名称", "中文名", "交易所ID" }; foreach (string n in columnNames1) { DT_Instrument.Columns.Add(n, typeof(String)); } //建立主键 this.DT_Instrument.PrimaryKey = new DataColumn[] { DT_Instrument.Columns["品种名称"] }; this.GridView_RegistInstrument_Data.DataSource = this.DT_Instrument; this.GridView_RegistInstrument_Data.Columns["合约名称"].Visible = false; this.GridView_RegistInstrument_Data.Columns["交易所ID"].Visible = false; #endregion #region Gridview报单通知 string[] columnNames2 = { "报单引用", "会话标识", "前置机标识", "报单编号", "交易所", "品种名称", "买卖", "开平", "投机标志", "价格", "报单量", "今成交", "剩余量", "报单日期", "报单时间", "报单状态", "状态信息", "备注" }; foreach (string n in columnNames2) { this.DT_RtnOrder.Columns.Add(n, typeof(String)); } //建立主键 this.DT_RtnOrder.PrimaryKey = new DataColumn[] { DT_RtnOrder.Columns["报单引用"], DT_RtnOrder.Columns["会话标识"], DT_RtnOrder.Columns["前置机标识"] }; this.GridView_RtnOrder.DataSource = DT_RtnOrder; this.GridView_RtnOrder.Columns["会话标识"].Visible = false; this.GridView_RtnOrder.Columns["报单编号"].Visible = false; this.GridView_RtnOrder.Columns["报单引用"].Visible = false; this.GridView_RtnOrder.Columns["前置机标识"].Visible = false; this.GridView_RtnOrder.Columns["报单状态"].Visible = false; this.GridView_RtnOrder.Columns["交易所"].Visible = false; #endregion #region GridView持仓查询通知 string[] columnNames3 = { "合约代码", "开仓日期", "交易日", "持仓类型", "买卖", "数量", "开仓价", "投机标志", "成交编号", "结算编号", "成交类型", "昨结算价", "结算价", "平仓量", "平仓金额" }; foreach (string n in columnNames3) { this.DT_InvestorPositionDetail.Columns.Add(n, typeof(String)); } //建立主键 //this.sDT_InvestorPositionDetail.PrimaryKey = new DataColumn[] { sDT_InvestorPositionDetail.Columns["合约代码"] }; this.GridView_InvestorPositionDetail.DataSource = DT_InvestorPositionDetail; this.GridView_InvestorPositionDetail.Columns["结算编号"].Visible = false; this.GridView_InvestorPositionDetail.Columns["开仓日期"].Visible = false; this.GridView_InvestorPositionDetail.Columns["交易日"].Visible = false; this.GridView_InvestorPositionDetail.Columns["平仓量"].Visible = false; this.GridView_InvestorPositionDetail.Columns["平仓金额"].Visible = false; this.GridView_InvestorPositionDetail.Columns["成交编号"].Visible = false; #endregion }
/// <summary> /// 注销按钮点击 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Button_Loginout_Click(object sender, EventArgs e) { ThostFtdcUserLogoutField pUserLogout = new ThostFtdcUserLogoutField(); pUserLogout.BrokerID = sBrokerID; pUserLogout.UserID = sUserID; if (this.TSS_MDLoginState.Text == "已连接") { CtpMDApi.ReqUserLogout(pUserLogout, nRequestID++); } if (this.TSS_TDLoginState.Text == "已连接") { CtpMDApi.ReqUserLogout(pUserLogout, nRequestID++); } CtpMDApi.Release(); CtpMDApi = null; CtpTDApi.Release(); CtpTDApi = null; this.TSS_MDConnState.Text = "已断开"; this.TSS_TDConnState.Text = "已断开"; this.TSS_MDLoginState.Text = "已断开"; this.TSS_TDLoginState.Text = "已断开"; Button_Loginout.Enabled = false; MemDB.CloseDB(); MemDB = null; }
/// <summary> /// 点击连接按钮连接前置机 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Button_Connect_Click(object sender, EventArgs e) { sTDAddress = this.TextBox_TDADDRESS.Text; sMDAddress = this.TextBox_MDADDRESS.Text; sBrokerID = this.TextBox_BrokerID.Text; sUserID = this.TextBox_UserID.Text; sPassword = this.TextBox_PassWord.Text; sTableName = string.Empty; #region 数据库初始化 //内存数据库打开 if (this.radioButton_MemDB.Checked && MemDB == null) { MemDB = new SQLiteBase.SQLiteBase(); } else if (MemDB == null) { MemDB = new SQLiteBase.SQLiteBase("InstrmentDataBase.db"); } MemDB.OpenDB(); #endregion #region 交易初始化 CtpMDApi = new CTPMDAdapter("MDAPI", false); CtpMDApi.OnFrontConnected += new FrontConnected(sCtpMdApi.OnFrontConnected); CtpMDApi.OnFrontDisconnected += new FrontDisconnected(sCtpMdApi.OnFrontDisconnected); CtpMDApi.OnHeartBeatWarning += new HeartBeatWarning(sCtpMdApi.OnHeartBeatWarning); CtpMDApi.OnRspError += new RspError(sCtpMdApi.OnRspError); CtpMDApi.OnRspSubMarketData += new RspSubMarketData(sCtpMdApi.OnRspSubMarketData); CtpMDApi.OnRspUnSubMarketData += new RspUnSubMarketData(sCtpMdApi.OnRspUnSubMarketData); CtpMDApi.OnRspUserLogin += new RspUserLogin(sCtpMdApi.OnRspUserLogin); CtpMDApi.OnRspUserLogout += new RspUserLogout(sCtpMdApi.OnRspUserLogout); CtpMDApi.OnRtnDepthMarketData += new RtnDepthMarketData(sCtpMdApi.OnRtnDepthMarketData); //注册前置机 CtpMDApi.RegisterFront(sMDAddress); //初始化 CtpMDApi.Init(); #endregion 交易初始化 #region 行情初始化 CtpTDApi = new CTPTDAdapter("TDAPI"); CtpTDApi.OnFrontConnected += new FrontConnected(sCtpTdApi.OnFrontConnected); CtpTDApi.OnFrontDisconnected += new FrontDisconnected(sCtpTdApi.OnFrontDisconnected); CtpTDApi.OnHeartBeatWarning += new HeartBeatWarning(sCtpTdApi.OnHeartBeatWarning); CtpTDApi.OnRspError += new RspError(sCtpTdApi.OnRspError); CtpTDApi.OnRspUserLogin += new RspUserLogin(sCtpTdApi.OnRspUserLogin); CtpTDApi.OnRspOrderAction += new RspOrderAction(sCtpTdApi.OnRspOrderAction); CtpTDApi.OnRspOrderInsert += new RspOrderInsert(sCtpTdApi.OnRspOrderInsert); CtpTDApi.OnRspQryInstrument += new RspQryInstrument(sCtpTdApi.OnRspQryInstrument); CtpTDApi.OnRspQryInvestorPosition += new RspQryInvestorPosition(sCtpTdApi.OnRspQryInvestorPosition); CtpTDApi.OnRspQryInvestorPositionDetail += new RspQryInvestorPositionDetail(sCtpTdApi.OnRspQryInvestorPositionDetail); CtpTDApi.OnRspQryTradingAccount += new RspQryTradingAccount(sCtpTdApi.OnRspQryTradingAccount); CtpTDApi.OnRspSettlementInfoConfirm += new RspSettlementInfoConfirm(sCtpTdApi.OnRspSettlementInfoConfirm); CtpTDApi.OnRtnOrder += new RtnOrder(sCtpTdApi.OnRtnOrder); CtpTDApi.OnRtnTrade += new RtnTrade(sCtpTdApi.OnRtnTrade); //注册流 switch (comboBox_ResumeType.Text) { case "断线恢复": CtpTDApi.SubscribePublicTopic(EnumTeResumeType.THOST_TERT_RESUME); // 注册公有流 CtpTDApi.SubscribePrivateTopic(EnumTeResumeType.THOST_TERT_RESUME); // 注册私有流 break; case "当天全部": CtpTDApi.SubscribePublicTopic(EnumTeResumeType.THOST_TERT_RESTART); // 注册公有流 CtpTDApi.SubscribePrivateTopic(EnumTeResumeType.THOST_TERT_RESTART); // 注册私有流 break; default: CtpTDApi.SubscribePublicTopic(EnumTeResumeType.THOST_TERT_QUICK); // 注册公有流 CtpTDApi.SubscribePrivateTopic(EnumTeResumeType.THOST_TERT_QUICK); // 注册私有流 break; } //注册前置机 CtpTDApi.RegisterFront(sTDAddress); //初始化 CtpTDApi.Init(); #endregion 行情初始化 }