解决方案:Python进行量化|使用AlgoPlus实时接收期货行情

  • A+
所属分类:期货行情

金融领域也是Python的重要方向之一。我知道有些读者只是为了量化而接触Python交易。今天,我将与您分享使用Python的期货交易API。

量化交易在中国方兴未艾。由于允许卖空的T + 0交易系统,交易的大力推广以及信息技术红利带来的赚钱效果,它培养了大批粉丝。定量交易在期货行业中起步较早,并且发展相对成熟。

尽管每个期货交易都开发了自己的交易后端,但上海期货交易所的CTP仍然是使用最广泛的CTP。因此,对于想要从事定量研究和交易的学生,学习CTP开发是必修课。本文将带您了解CTP并介绍CTP交易 interface-AlgoPlus的python版本

关于CTP

CTP是“综合交易平台”的缩写。 CTP具有两个独立的开放接口,即MdApi和TraderApi。

MdApi负责行情个相关操作(订阅,接收)。

TraderApi负责交易个相关操作(购买,出售期货,提款,支票)。

MdApi和TraderApi方法的执行过程是异步的,并且每个请求都对应一个或多个负责接收执行结果的回调函数。例如,通过使用ReqOrderInsert方法向交易发送购买和未结订单,相应的回调方法OnRtnOrder可以实时接收服务器从交易发送回的执行通知。

关于AlgoPlus

上一期CTP的官方API仅支持C ++语言。除非您有开发经验,否则不建议直接使用C ++语言进行开发。

Python语言在许多领域都得到了广泛使用,量化交易也不例外。本文介绍给您的AlgoPlus是官方CTP软件包的定量投资接口的python版本。与其他Python版本的CTP相比,AlgoPlus具有以下功能:

忠实于CTP的正式功能。简而言之,AlgoPlus是官方CTP的python翻译版本期货交易实时行情,没有过多的包装期货配资,允许交易人根据实际情况选择正式设计的功能。使用Cython,ctypes技术打包,不仅可以达到低延迟的要求,而且与python语言的易用性兼容。经过严格的测试,从触发交易信号的策略到调用C ++方法,AlgoPlus的延迟仅约40微秒。从实践的角度,我们将向学生展示量化策略的发展过程期货交易实时行情,例如趋势策略,套利策略,风险控制策略,执行算法和其他教程。安装AlgoPlus

第1步:安装Anaconda。

第2步:使用pip install algoplus命令进行安装。

看到以下内容:

Processing dependencies for AlgoPlus==1.5
Finished processing dependencies for AlgoPlus==1.5
请按任意键继续. . .

安装成功!

注册模拟帐户

1、Simnow是由上海期货交易技术公司维护的一组模拟交易系统,可通过注册一个帐户免费使用该系统:

2、在通用下载页面上下载客户端,以方便实时查看模拟交易情况:

3、在个人主页上记录InvestorID,在产品和服务页面上记录服务器地址。配置帐户参数时需要此信息。

配置帐户信息

FutureAccountInfo是期货帐户类,包括broker_id(期货公司的标识),server_dict(行情和交易服务器地址),reserve_server_dict(备用服务器地址),Investor_id(帐户),密码(密码),app_id(客户端ID,对应于auth_code,法规要求),auth_code(客户端代码对应的授权代码,法规要求),instrument_id_list(订购合同列表),md_page_dir(行情相关文件存储地址),td_page_dir (交易个相关文件的存储地址)。

将所有帐户信息存储在my_future_account_info_dict词典中。创建交易接口的实例时,请找到相应的帐户信息作为参数。

# -*- coding: utf-8 -*-
 
BASE_LOCATION = "."  # 根目录地址
MD_LOCATION = BASE_LOCATION + "\\MarketData"  # 行情数据地址
TD_LOCATION = BASE_LOCATION + "\\TradingData"  # 交易数据地址
SD_LOCATION = BASE_LOCATION + "\\StrategyData"  # 策略数据地址
 
class FutureAccountInfo:
    def __init__(self, broker_id, server_dict, reserve_server_dict, investor_id, password, app_id, auth_code, instrument_id_list, md_page_dir=MD_LOCATION, td_page_dir=TD_LOCATION):
        self.broker_id = broker_id  # 期货公司BrokerID
        self.server_dict = server_dict  # 服务器地址。TDServer为交易服务器,MDServer为行情服务器。服务器地址格式为"ip:port"
        self.reserve_server_dict = reserve_server_dict  # 备用服务器地址
        self.investor_id = investor_id  # 账户
        self.password = password  # 密码
        self.app_id = app_id  # 认证使用AppID
        self.auth_code = auth_code  # 认证使用授权码
        self.instrument_id_list = instrument_id_list  # 订阅合约列表[]
        self.md_page_dir = md_page_dir  # MdApi流文件存储地址,默认MD_LOCATION
        self.td_page_dir = td_page_dir  # TraderApi流文件存储地址,默认TD_LOCATION
 
my_future_account_info_dict = {
    # 交易时间测试
    'SimNow': FutureAccountInfo(
        broker_id='9999'  # 期货公司BrokerID
        # TDServer为交易服务器,MDServer为行情服务器。服务器地址格式为"ip:port"
        , server_dict={'TDServer': "180.168.146.187:10100", 'MDServer': '180.168.146.187:10110'}
        # 备用服务器地址
        , reserve_server_dict={'电信1': {'TDServer': "180.168.146.187:10100", 'MDServer': '180.168.146.187:10110'},
                               '电信2': {'TDServer': "180.168.146.187:10101", 'MDServer': '180.168.146.187:10111'},
 
                               '其他1': {'TDServer': "180.168.146.187:10130", 'MDServer': '180.168.146.187:10131'},  # 7*24
                               '其他2': {'TDServer': "218.202.237.33:10102", 'MDServer': '218.202.237.33:10112'},  # 移动
                               }
        , investor_id=''  # 账户
        , password=''  # 密码
        , app_id='simnow_client_test'  # 认证使用AppID
        , auth_code='0000000000000000'  # 认证使用授权码
        # 订阅合约列表
        , instrument_id_list=[b'rb2001', b'fu2001'] # 订阅螺纹2001合约和燃料油2001合约
    ),
}

AlgoPlus创建行情界面

MdApi是行情接口。使用它时,只需传递帐户参数即可创建实例。这是一个完整的示例:

from AlgoPlus.CTP.MdApi import MdApi
 
class TickEngine(MdApi):
    # ///深度行情通知
    def OnRtnDepthMarketData(self, pDepthMarketData):
        print(pDepthMarketData)
        # print(f"{pDepthMarketData.InstrumentID}当前最新价:{pDepthMarketData.LastPrice}")
 
if __name__ == '__main__':
    from account_info import my_future_account_info_dict
    future_account = my_future_account_info_dict['SimNow']
    tick_engine = TickEngine(future_account.server_dict['MDServer']
                             , future_account.broker_id
                             , future_account.investor_id
                             , future_account.password
                             , future_account.app_id
                             , future_account.auth_code
                             , future_account.instrument_id_list
                             , None
                             , future_account.md_page_dir)
    tick_engine.Join()

1、从AlgoPlus.CTP.MdApi文件导入MdApi类。 MdApi封装了工作流程的前六个步骤。

2、 TickEngine是MdApi的子类。 TickEngine类主要实现接收到的行情数据处理算法股指期货,该示例仅打印接收到的行情。

3、需要在创建行情接口实例之前导入帐户信息。示例帐户信息存储在同一目录中的account_info.py文件中。

在[k19]交易时间运行上述代码以打印出接收到的实时期货行情。

5、回调函数OnRtnDepthMarketData接收到的pDepthMarketData 行情是DepthMarketDataField结构的实例,该结构在AlgoPlus.CTP.ApiStruct中定义。可以通过调用属性来获取行情中任何字段的值,例如pDepthMarketData.LastPrice表示最新价格。 DepthMarketDataField包含以下字段:

class DepthMarketDataField(BaseField):
    """深度行情"""
    _fields_ = [
        ('TradingDay', c_char * 9)  # ///交易日
        , ('InstrumentID', c_char * 31)  # 合约代码
        , ('ExchangeID', c_char * 9)  # 交易所代码
        , ('ExchangeInstID', c_char * 31)  # 合约在交易所的代码
        , ('LastPrice', c_double)  # 最新价
        , ('PreSettlementPrice', c_double)  # 上次结算价
        , ('PreClosePrice', c_double)  # 昨收盘
        , ('PreOpenInterest', c_double)  # 昨持仓量
        , ('OpenPrice', c_double)  # 今开盘
        , ('HighestPrice', c_double)  # 最高价
        , ('LowestPrice', c_double)  # 最低价
        , ('Volume', c_int)  # 数量
        , ('Turnover', c_double)  # 成交金额
        , ('OpenInterest', c_double)  # 持仓量
        , ('ClosePrice', c_double)  # 今收盘
        , ('SettlementPrice', c_double)  # 本次结算价
        , ('UpperLimitPrice', c_double)  # 涨停板价
        , ('LowerLimitPrice', c_double)  # 跌停板价
        , ('PreDelta', c_double)  # 昨虚实度
        , ('CurrDelta', c_double)  # 今虚实度
        , ('UpdateTime', c_char * 9)  # 最后修改时间
        , ('UpdateMillisec', c_int)  # 最后修改毫秒
        , ('BidPrice1', c_double)  # 申买价一
        , ('BidVolume1', c_int)  # 申买量一
        , ('AskPrice1', c_double)  # 申卖价一
        , ('AskVolume1', c_int)  # 申卖量一
        , ('BidPrice2', c_double)  # 申买价二
        , ('BidVolume2', c_int)  # 申买量二
        , ('AskPrice2', c_double)  # 申卖价二
        , ('AskVolume2', c_int)  # 申卖量二
        , ('BidPrice3', c_double)  # 申买价三
        , ('BidVolume3', c_int)  # 申买量三
        , ('AskPrice3', c_double)  # 申卖价三
        , ('AskVolume3', c_int)  # 申卖量三
        , ('BidPrice4', c_double)  # 申买价四
        , ('BidVolume4', c_int)  # 申买量四
        , ('AskPrice4', c_double)  # 申卖价四
        , ('AskVolume4', c_int)  # 申卖量四
        , ('BidPrice5', c_double)  # 申买价五
        , ('BidVolume5', c_int)  # 申买量五
        , ('AskPrice5', c_double)  # 申卖价五
        , ('AskVolume5', c_int)  # 申卖量五
        , ('AveragePrice', c_double)  # 当日均价
        , ('ActionDay', c_char * 9)  # 业务日期
    ]

其他

该项目已在Github和Code Cloud上开源。

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: