将量化投资进行到底
提供专业的量化投资解决方案

用AlgoPlus做量化交易之订阅全市场

收集并存储数据几乎是每个使用AlgoPlus的交易者都会面临的问题。范例subscribe_all.py给出了一种解决方案:

from multiprocessing import Process, Queue
from AlgoPlus.CTP.TraderApi import req_instrument
from AlgoPlus.CTP.MdApi import run_mdrecorder
from AlgoPlus.CTP.FutureAccount import get_simnow_account


if __name__ == '__main__':
    # 账户配置
    future_account = get_simnow_account(
        investor_id='',  # SimNow账户
        password='',  # SimNow账户密码
        server_name=''  # 电信1、电信2、移动、TEST
    )

    # 查询所有期货合约
    future_account.instrument_id_list = req_instrument(future_account)

    # 订阅并保存行情为csv文件
    run_mdrecorder(future_account)

用方法AlgoPlus.CTP.TraderApi.req_instrument返回的全市场合约列表更新期货账户实例的instrument_id_list属性,再用run_mdrecorder订阅并存储,大功告成!

因为run_mdrecorder在范例tick_to_csv.py中就已经使用过,所以这里来看一下AlgoPlus.CTP.TraderApi.req_instrument的实现:TraderApi初始化完成之后(self.status==0)使用self.req_qry_instrumrent_id()查询全部合约,最后一次响应之后返回全市场的合约列表,不同的阶段通过修改status来标识。

def Join(self):
    while True:
        if self.status == 0:
            self.req_qry_instrumrent_id()
            self.status = 1
        elif self.status == 2:
            return self.instrument_id_list
        sleep(1)

收到查询合约的响应时判断是否为期货合约,将其存储在列表中。bIsLast在最后一次响应时为真,否则为假。

def OnRspQryInstrument(self, pInstrument, pRspInfo, nRequestID, bIsLast):
    if not pRspInfo or pRspInfo['ErrorID'] == 0:
        if pInstrument \
            and (pInstrument['InstrumentID'][-4:].isdigit() and pInstrument['InstrumentID'][:-4].isalpha()
                 or pInstrument['InstrumentID'][-3:].isdigit() and pInstrument['InstrumentID'][:-3].isalpha()):
            self.instrument_id_list.append(pInstrument['InstrumentID'])

    self.status += bIsLast

以上。

赞(3) 打赏
未经允许不得转载:CTP量化投资技术研究 - AlgoPlus量化投资开源框架 - 将交易进行到底 » 用AlgoPlus做量化交易之订阅全市场
分享到: (0)

评论 抢沙发

评论前必须登录!

 

知者不惑,仁者不忧,勇者不惧

你的认可是我们最大的动力!

微信扫一扫打赏