新增无界面CTA策略交易的Example,修改DataRecorder的配置文件为csv格式
This commit is contained in:
parent
f58f2be4ee
commit
bed06834e3
@ -21,7 +21,17 @@ def printLog(content):
|
|||||||
def processLogEvent(event):
|
def processLogEvent(event):
|
||||||
"""处理日志事件"""
|
"""处理日志事件"""
|
||||||
log = event.dict_['data']
|
log = event.dict_['data']
|
||||||
content = '%s:%s' %(log.gatewayName, log.logContent)
|
if log.gatewayName:
|
||||||
|
content = '%s:%s' %(log.gatewayName, log.logContent)
|
||||||
|
else:
|
||||||
|
content = '%s:%s' %('MainEngine', log.logContent)
|
||||||
|
printLog(content)
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------
|
||||||
|
def processCtaLogEvent(event):
|
||||||
|
"""处理CTA模块日志事件"""
|
||||||
|
log = event.dict_['data']
|
||||||
|
content = '%s:%s' %('CTA Engine', log.logContent)
|
||||||
printLog(content)
|
printLog(content)
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
@ -39,12 +49,14 @@ def runChildProcess():
|
|||||||
printLog(u'主引擎创建成功')
|
printLog(u'主引擎创建成功')
|
||||||
|
|
||||||
ee.register(EVENT_LOG, processLogEvent)
|
ee.register(EVENT_LOG, processLogEvent)
|
||||||
ee.register(EVENT_CTA_LOG, processLogEvent)
|
ee.register(EVENT_CTA_LOG, processCtaLogEvent)
|
||||||
printLog(u'注册日志事件监听')
|
printLog(u'注册日志事件监听')
|
||||||
|
|
||||||
me.connect('CTP')
|
me.connect('CTP')
|
||||||
printLog(u'连接CTP接口')
|
printLog(u'连接CTP接口')
|
||||||
|
|
||||||
|
sleep(5) # 等待CTP接口初始化
|
||||||
|
|
||||||
cta = me.appDict[ctaStrategy.appName]
|
cta = me.appDict[ctaStrategy.appName]
|
||||||
|
|
||||||
cta.loadSetting()
|
cta.loadSetting()
|
||||||
@ -101,4 +113,7 @@ def runParentProcess():
|
|||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
runParentProcess()
|
runChildProcess()
|
||||||
|
|
||||||
|
# 尽管同样实现了无人值守,但强烈建议每天启动时人工检查,为自己的PNL负责
|
||||||
|
# runParentProcess()
|
@ -20,7 +20,10 @@ def printLog(content):
|
|||||||
def processLogEvent(event):
|
def processLogEvent(event):
|
||||||
"""处理日志事件"""
|
"""处理日志事件"""
|
||||||
log = event.dict_['data']
|
log = event.dict_['data']
|
||||||
content = '%s:%s' %(log.gatewayName, log.logContent)
|
if log.gatewayName:
|
||||||
|
content = '%s:%s' %(log.gatewayName, log.logContent)
|
||||||
|
else:
|
||||||
|
content = '%s:%s' %('MainEngine', log.logContent)
|
||||||
printLog(content)
|
printLog(content)
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
@ -88,4 +91,5 @@ def runParentProcess():
|
|||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
runParentProcess()
|
runChildProcess()
|
||||||
|
#runParentProcess()
|
@ -6,6 +6,6 @@
|
|||||||
|
|
||||||
* DataRecording:全自动行情记录工具(无需用户每日定时重启)
|
* DataRecording:全自动行情记录工具(无需用户每日定时重启)
|
||||||
|
|
||||||
* CtaTrading:纯命令行模式的CTA策略交易(尽管同样实现了无人值守,但强烈建议每天启动时人工检查,为自己的PNL负责)
|
* CtaTrading:无图形界面模式的CTA策略交易
|
||||||
|
|
||||||
* CtaBacktesting:CTA策略的回测和优化
|
* CtaBacktesting:CTA策略的回测和优化
|
7
vnpy/trader/app/dataRecorder/DR_setting.csv
Normal file
7
vnpy/trader/app/dataRecorder/DR_setting.csv
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
gateway,symbol,exchange,currency,product,tick,bar,active
|
||||||
|
CTP,IF1709,,,,y,y,IF0000
|
||||||
|
CTP,IC1709,,,,y,,
|
||||||
|
CTP,m1709,,,,y,,
|
||||||
|
SGIT,IH1709,,,,y,y,IH0000
|
||||||
|
LTS,600036,SZSE,,,y,,
|
||||||
|
IB,EUR.USD,IDEALPRO,USD,Íâ»ã,y,y,
|
|
@ -1,32 +0,0 @@
|
|||||||
{
|
|
||||||
"working": false,
|
|
||||||
|
|
||||||
"tick":
|
|
||||||
[
|
|
||||||
["m1609", "XSPEED"],
|
|
||||||
["IF1606", "SGIT"],
|
|
||||||
["IH1606", "SGIT"],
|
|
||||||
["IH1606", "SGIT"],
|
|
||||||
["IC1606", "SGIT"],
|
|
||||||
["IC1606", "SGIT"],
|
|
||||||
["600036", "LTS", "SZSE"],
|
|
||||||
["EUR.USD", "IB", "IDEALPRO", "USD", "外汇"]
|
|
||||||
],
|
|
||||||
|
|
||||||
"bar":
|
|
||||||
[
|
|
||||||
["IF1605", "SGIT"],
|
|
||||||
["IF1606", "SGIT"],
|
|
||||||
["IH1606", "SGIT"],
|
|
||||||
["IH1606", "SGIT"],
|
|
||||||
["IC1606", "SGIT"],
|
|
||||||
["IC1606", "SGIT"]
|
|
||||||
],
|
|
||||||
|
|
||||||
"active":
|
|
||||||
{
|
|
||||||
"IF0000": "IF1605",
|
|
||||||
"IH0000": "IH1605",
|
|
||||||
"IC0000": "IC1605"
|
|
||||||
}
|
|
||||||
}
|
|
@ -6,7 +6,8 @@
|
|||||||
使用DR_setting.json来配置需要收集的合约,以及主力合约代码。
|
使用DR_setting.json来配置需要收集的合约,以及主力合约代码。
|
||||||
'''
|
'''
|
||||||
|
|
||||||
import json
|
#import json
|
||||||
|
import csv
|
||||||
import os
|
import os
|
||||||
import copy
|
import copy
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
@ -27,7 +28,7 @@ from vnpy.trader.app.dataRecorder.language import text
|
|||||||
class DrEngine(object):
|
class DrEngine(object):
|
||||||
"""数据记录引擎"""
|
"""数据记录引擎"""
|
||||||
|
|
||||||
settingFileName = 'DR_setting.json'
|
settingFileName = 'DR_setting.csv'
|
||||||
path = os.path.abspath(os.path.dirname(__file__))
|
path = os.path.abspath(os.path.dirname(__file__))
|
||||||
settingFileName = os.path.join(path, settingFileName)
|
settingFileName = os.path.join(path, settingFileName)
|
||||||
|
|
||||||
@ -57,84 +58,58 @@ class DrEngine(object):
|
|||||||
# 载入设置,订阅行情
|
# 载入设置,订阅行情
|
||||||
self.loadSetting()
|
self.loadSetting()
|
||||||
|
|
||||||
|
# 启动数据插入线程
|
||||||
|
self.start()
|
||||||
|
|
||||||
|
# 注册事件监听
|
||||||
|
self.registerEvent()
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
def loadSetting(self):
|
def loadSetting(self):
|
||||||
"""载入设置"""
|
"""加载配置"""
|
||||||
with open(self.settingFileName) as f:
|
with open(self.settingFileName) as f:
|
||||||
drSetting = json.load(f)
|
drSetting = csv.DictReader(f)
|
||||||
|
|
||||||
# 如果working设为False则不启动行情记录功能
|
for d in drSetting:
|
||||||
working = drSetting['working']
|
# 读取配置
|
||||||
if not working:
|
gatewayName = d['gateway']
|
||||||
return
|
symbol = d['symbol']
|
||||||
|
exchange = d['symbol']
|
||||||
if 'tick' in drSetting:
|
currency = d['currency']
|
||||||
l = drSetting['tick']
|
productClass = d['product']
|
||||||
|
recordTick = d['tick']
|
||||||
|
recordBar = d['bar']
|
||||||
|
activeSymbol = d['active']
|
||||||
|
|
||||||
for setting in l:
|
if exchange:
|
||||||
symbol = setting[0]
|
vtSymbol = '.'.join([symbol, exchange])
|
||||||
|
else:
|
||||||
vtSymbol = symbol
|
vtSymbol = symbol
|
||||||
|
|
||||||
req = VtSubscribeReq()
|
|
||||||
req.symbol = setting[0]
|
|
||||||
|
|
||||||
# 针对LTS和IB接口,订阅行情需要交易所代码
|
|
||||||
if len(setting)>=3:
|
|
||||||
req.exchange = setting[2]
|
|
||||||
vtSymbol = '.'.join([symbol, req.exchange])
|
|
||||||
|
|
||||||
# 针对IB接口,订阅行情需要货币和产品类型
|
|
||||||
if len(setting)>=5:
|
|
||||||
req.currency = setting[3]
|
|
||||||
req.productClass = setting[4]
|
|
||||||
|
|
||||||
self.mainEngine.subscribe(req, setting[1])
|
|
||||||
|
|
||||||
tick = VtTickData() # 该tick实例可以用于缓存部分数据(目前未使用)
|
|
||||||
self.tickDict[vtSymbol] = tick
|
|
||||||
|
|
||||||
if 'bar' in drSetting:
|
|
||||||
l = drSetting['bar']
|
|
||||||
|
|
||||||
for setting in l:
|
# 订阅行情
|
||||||
symbol = setting[0]
|
req = VtSubscribeReq()
|
||||||
vtSymbol = symbol
|
req.symbol = symbol
|
||||||
|
req.exchange = exchange
|
||||||
req = VtSubscribeReq()
|
req.currency = currency
|
||||||
req.symbol = symbol
|
req.productClass = productClass
|
||||||
|
self.mainEngine.subscribe(req, gatewayName)
|
||||||
if len(setting)>=3:
|
|
||||||
req.exchange = setting[2]
|
|
||||||
vtSymbol = '.'.join([symbol, req.exchange])
|
|
||||||
|
|
||||||
if len(setting)>=5:
|
|
||||||
req.currency = setting[3]
|
|
||||||
req.productClass = setting[4]
|
|
||||||
|
|
||||||
self.mainEngine.subscribe(req, setting[1])
|
|
||||||
|
|
||||||
bar = VtBarData()
|
|
||||||
self.barDict[vtSymbol] = bar
|
|
||||||
|
|
||||||
if 'active' in drSetting:
|
|
||||||
d = drSetting['active']
|
|
||||||
|
|
||||||
# 注意这里的vtSymbol对于IB和LTS接口,应该后缀.交易所
|
# 设置需要记录的数据
|
||||||
for activeSymbol, vtSymbol in d.items():
|
if recordTick:
|
||||||
|
self.tickDict[vtSymbol] = VtTickData()
|
||||||
|
|
||||||
|
if recordBar:
|
||||||
|
self.barDict[vtSymbol] = VtBarData()
|
||||||
|
|
||||||
|
if activeSymbol:
|
||||||
self.activeSymbolDict[vtSymbol] = activeSymbol
|
self.activeSymbolDict[vtSymbol] = activeSymbol
|
||||||
|
|
||||||
# 启动数据插入线程
|
|
||||||
self.start()
|
|
||||||
|
|
||||||
# 注册事件监听
|
|
||||||
self.registerEvent()
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
def procecssTickEvent(self, event):
|
def procecssTickEvent(self, event):
|
||||||
"""处理行情推送"""
|
"""处理行情推送"""
|
||||||
tick = event.dict_['data']
|
tick = event.dict_['data']
|
||||||
vtSymbol = tick.vtSymbol
|
vtSymbol = tick.vtSymbol
|
||||||
|
|
||||||
# 转化Tick格式
|
# 转化Tick格式
|
||||||
if not tick.datetime:
|
if not tick.datetime:
|
||||||
tick.datetime = datetime.strptime(' '.join([tick.date, tick.time]), '%Y%m%d %H:%M:%S.%f')
|
tick.datetime = datetime.strptime(' '.join([tick.date, tick.time]), '%Y%m%d %H:%M:%S.%f')
|
||||||
|
Loading…
Reference in New Issue
Block a user