示例#1
0
        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);
            }
        }
示例#2
0
文件: Program.cs 项目: aoxiang310/CPS
        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();
            }
        }
示例#3
0
 public void Release()
 {
     if (mdApi != null)
     {
         mdApi.Release();
         mdApi = null;
     }
 }
示例#4
0
        public CTPMarketDataProvider(AccountInfo accountInfo)
        {
            this.AccountInfo = accountInfo;

            ctpReader = new CTPMDAdapter();
            Initialize(ctpReader);

            Connect(accountInfo.MarketDataAddress);
        }
示例#5
0
 private void Initialize(CTPMDAdapter ctpReader)
 {
     ctpReader.OnFrontConnected     += ReaderOnFrontConnected;
     ctpReader.OnFrontDisconnected  += ReaderOnFrontDisconnected;
     ctpReader.OnRspUserLogin       += ReaderOnRspUserLogin;
     ctpReader.OnRspUserLogout      += ReaderOnRspUserLogout;
     ctpReader.OnRtnDepthMarketData += ReaderOnRtnDepthMarketData;
     ctpReader.OnRspError           += ReaderOnRspError;
 }
示例#6
0
        public CTPMarketDataProvider(AccountInfo accountInfo, string pszFlowPath)
        {
            this.AccountInfo = accountInfo;

            var dataFlowPath = CreateDirectory(pszFlowPath);

            ctpReader = new CTPMDAdapter(dataFlowPath, false);
            Initialize(ctpReader);

            Connect(accountInfo.MarketDataAddress);
        }
示例#7
0
        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();
        }
示例#8
0
        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();
        }
示例#9
0
 /// <summary>
 /// 构造函数
 /// </summary>
 public MarketManager(CTPMDAdapter marketer)
 {
     ActiveContractDictionary = new Dictionary<string, ActiveContract>();
     this.marketer = marketer;
 }
示例#10
0
        /// <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

        }
示例#11
0
 /// <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;
 }
示例#12
0
        /// <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 行情初始化
        }