收集并存储数据几乎是每个使用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
以上。
评论前必须登录!
注册