修改BarData和TickData数据类型

This commit is contained in:
vn.py 2017-05-15 16:26:14 +08:00
parent 426f92caac
commit b043f45f30
17 changed files with 111 additions and 188 deletions

1
.gitignore vendored
View File

@ -39,6 +39,7 @@ Release/
*.local *.local
*.temp *.temp
*.vt *.vt
*.log
vn.ctp/build/* vn.ctp/build/*
vn.lts/build/* vn.lts/build/*

View File

@ -13,6 +13,7 @@ import multiprocessing
import pymongo import pymongo
from vnpy.trader.vtGlobal import globalSetting from vnpy.trader.vtGlobal import globalSetting
from vnpy.trader.vtObject import VtTickData, VtBarData
from vnpy.trader.vtConstant import * from vnpy.trader.vtConstant import *
from vnpy.trader.vtGateway import VtOrderData, VtTradeData from vnpy.trader.vtGateway import VtOrderData, VtTradeData
@ -127,10 +128,10 @@ class BacktestingEngine(object):
# 首先根据回测模式,确认要使用的数据类 # 首先根据回测模式,确认要使用的数据类
if self.mode == self.BAR_MODE: if self.mode == self.BAR_MODE:
dataClass = CtaBarData dataClass = VtBarData
func = self.newBar func = self.newBar
else: else:
dataClass = CtaTickData dataClass = VtTickData
func = self.newTick func = self.newTick
# 载入初始化需要用的数据 # 载入初始化需要用的数据
@ -163,10 +164,10 @@ class BacktestingEngine(object):
# 首先根据回测模式,确认要使用的数据类 # 首先根据回测模式,确认要使用的数据类
if self.mode == self.BAR_MODE: if self.mode == self.BAR_MODE:
dataClass = CtaBarData dataClass = VtBarData
func = self.newBar func = self.newBar
else: else:
dataClass = CtaTickData dataClass = VtTickData
func = self.newTick func = self.newTick
self.output(u'开始回测') self.output(u'开始回测')

View File

@ -35,8 +35,6 @@ ENGINETYPE_TRADING = 'trading' # 实盘
# CTA引擎中涉及的数据类定义 # CTA引擎中涉及的数据类定义
from vnpy.trader.vtConstant import EMPTY_UNICODE, EMPTY_STRING, EMPTY_FLOAT, EMPTY_INT from vnpy.trader.vtConstant import EMPTY_UNICODE, EMPTY_STRING, EMPTY_FLOAT, EMPTY_INT
from vnpy.trader.vtObject import VtBarData as CtaBarData
from vnpy.trader.vtObject import VtTickData as CtaTickData
######################################################################## ########################################################################

View File

@ -27,6 +27,7 @@ from datetime import datetime, timedelta
from vnpy.event import Event from vnpy.event import Event
from vnpy.trader.vtEvent import * from vnpy.trader.vtEvent import *
from vnpy.trader.vtConstant import * from vnpy.trader.vtConstant import *
from vnpy.trader.vtObject import VtTickData, VtBarData
from vnpy.trader.vtGateway import VtSubscribeReq, VtOrderReq, VtCancelOrderReq, VtLogData from vnpy.trader.vtGateway import VtSubscribeReq, VtOrderReq, VtCancelOrderReq, VtLogData
from vnpy.trader.vtFunction import todayDate from vnpy.trader.vtFunction import todayDate
@ -252,19 +253,14 @@ class CtaEngine(object):
# 推送tick到对应的策略实例进行处理 # 推送tick到对应的策略实例进行处理
if tick.vtSymbol in self.tickStrategyDict: if tick.vtSymbol in self.tickStrategyDict:
# 将vtTickData数据转化为ctaTickData
ctaTick = CtaTickData()
d = ctaTick.__dict__
for key in d.keys():
if key != 'datetime':
d[key] = tick.__getattribute__(key)
# 添加datetime字段 # 添加datetime字段
ctaTick.datetime = datetime.strptime(' '.join([tick.date, tick.time]), '%Y%m%d %H:%M:%S.%f') if not tick.datetime:
tick.datetime = datetime.strptime(' '.join([tick.date, tick.time]), '%Y%m%d %H:%M:%S.%f')
# 逐个推送到策略实例中 # 逐个推送到策略实例中
l = self.tickStrategyDict[tick.vtSymbol] l = self.tickStrategyDict[tick.vtSymbol]
for strategy in l: for strategy in l:
self.callStrategyFunc(strategy, strategy.onTick, ctaTick) self.callStrategyFunc(strategy, strategy.onTick, tick)
#---------------------------------------------------------------------- #----------------------------------------------------------------------
def processOrderEvent(self, event): def processOrderEvent(self, event):
@ -330,7 +326,7 @@ class CtaEngine(object):
#---------------------------------------------------------------------- #----------------------------------------------------------------------
def insertData(self, dbName, collectionName, data): def insertData(self, dbName, collectionName, data):
"""插入数据到数据库这里的data可以是CtaTickData或者CtaBarData""" """插入数据到数据库这里的data可以是VtTickData或者VtBarData"""
self.mainEngine.dbInsert(dbName, collectionName, data.__dict__) self.mainEngine.dbInsert(dbName, collectionName, data.__dict__)
#---------------------------------------------------------------------- #----------------------------------------------------------------------
@ -343,7 +339,7 @@ class CtaEngine(object):
l = [] l = []
for d in barData: for d in barData:
bar = CtaBarData() bar = VtBarData()
bar.__dict__ = d bar.__dict__ = d
l.append(bar) l.append(bar)
return l return l
@ -358,7 +354,7 @@ class CtaEngine(object):
l = [] l = []
for d in tickData: for d in tickData:
tick = CtaTickData() tick = VtTickData()
tick.__dict__ = d tick.__dict__ = d
l.append(tick) l.append(tick)
return l return l

View File

@ -15,8 +15,8 @@ import pymongo
from vnpy.trader.vtGlobal import globalSetting from vnpy.trader.vtGlobal import globalSetting
from vnpy.trader.vtConstant import * from vnpy.trader.vtConstant import *
from vnpy.trader.vtObject import VtBarData
from vnpy.trader.ctaStrategy.ctaBase import *
from vnpy.trader.ctaStrategy.datayesClient import DatayesClient from vnpy.trader.ctaStrategy.datayesClient import DatayesClient
@ -137,7 +137,7 @@ class HistoryDataEngine(object):
unique=True) unique=True)
for d in data: for d in data:
bar = CtaBarData() bar = VtBarData()
bar.vtSymbol = symbol bar.vtSymbol = symbol
bar.symbol = symbol bar.symbol = symbol
try: try:
@ -205,7 +205,7 @@ class HistoryDataEngine(object):
unique=True) unique=True)
for d in data: for d in data:
bar = CtaBarData() bar = VtBarData()
bar.vtSymbol = symbol bar.vtSymbol = symbol
bar.symbol = symbol bar.symbol = symbol
try: try:
@ -289,7 +289,7 @@ class HistoryDataEngine(object):
unique=True) unique=True)
for d in data: for d in data:
bar = CtaBarData() bar = VtBarData()
bar.vtSymbol = symbol bar.vtSymbol = symbol
bar.symbol = symbol bar.symbol = symbol
try: try:
@ -340,7 +340,7 @@ def downloadEquityDailyBarts(self, symbol):
unique=True) unique=True)
for index, d in data.iterrows(): for index, d in data.iterrows():
bar = CtaBarData() bar = VtBarData()
bar.vtSymbol = symbol bar.vtSymbol = symbol
bar.symbol = symbol bar.symbol = symbol
try: try:
@ -378,7 +378,7 @@ def loadMcCsv(fileName, dbName, symbol):
# 读取数据和插入到数据库 # 读取数据和插入到数据库
reader = csv.DictReader(file(fileName, 'r')) reader = csv.DictReader(file(fileName, 'r'))
for d in reader: for d in reader:
bar = CtaBarData() bar = VtBarData()
bar.vtSymbol = symbol bar.vtSymbol = symbol
bar.symbol = symbol bar.symbol = symbol
bar.open = float(d['Open']) bar.open = float(d['Open'])
@ -412,7 +412,7 @@ def loadTdxCsv(fileName, dbName, symbol):
# 读取数据和插入到数据库 # 读取数据和插入到数据库
reader = csv.reader(file(fileName, 'r')) reader = csv.reader(file(fileName, 'r'))
for d in reader: for d in reader:
bar = CtaBarData() bar = VtBarData()
bar.vtSymbol = symbol bar.vtSymbol = symbol
bar.symbol = symbol bar.symbol = symbol
bar.open = float(d[2]) bar.open = float(d[2])

View File

@ -13,6 +13,7 @@
import talib import talib
import numpy as np import numpy as np
from vnpy.trader.vtObject import VtBarData
from vnpy.trader.vtConstant import EMPTY_STRING from vnpy.trader.vtConstant import EMPTY_STRING
from vnpy.trader.ctaStrategy.ctaTemplate import CtaTemplate from vnpy.trader.ctaStrategy.ctaTemplate import CtaTemplate
@ -124,7 +125,7 @@ class AtrRsiStrategy(CtaTemplate):
if self.bar: if self.bar:
self.onBar(self.bar) self.onBar(self.bar)
bar = CtaBarData() bar = VtBarData()
bar.vtSymbol = tick.vtSymbol bar.vtSymbol = tick.vtSymbol
bar.symbol = tick.symbol bar.symbol = tick.symbol
bar.exchange = tick.exchange bar.exchange = tick.exchange

View File

@ -6,6 +6,7 @@ DualThrust交易策略
from datetime import time from datetime import time
from vnpy.trader.vtObject import VtBarData
from vnpy.trader.vtConstant import EMPTY_STRING from vnpy.trader.vtConstant import EMPTY_STRING
from vnpy.trader.ctaStrategy.ctaTemplate import CtaTemplate from vnpy.trader.ctaStrategy.ctaTemplate import CtaTemplate
@ -100,7 +101,7 @@ class DualThrustStrategy(CtaTemplate):
if self.bar: if self.bar:
self.onBar(self.bar) self.onBar(self.bar)
bar = CtaBarData() bar = VtBarData()
bar.vtSymbol = tick.vtSymbol bar.vtSymbol = tick.vtSymbol
bar.symbol = tick.symbol bar.symbol = tick.symbol
bar.exchange = tick.exchange bar.exchange = tick.exchange

View File

@ -11,7 +11,9 @@
也希望社区能做出一个解决了以上潜在风险的Demo出来 也希望社区能做出一个解决了以上潜在风险的Demo出来
""" """
from __future__ import division
from vnpy.trader.vtObject import VtBarData
from vnpy.trader.vtConstant import EMPTY_STRING, EMPTY_FLOAT from vnpy.trader.vtConstant import EMPTY_STRING, EMPTY_FLOAT
from vnpy.trader.ctaStrategy.ctaTemplate import CtaTemplate from vnpy.trader.ctaStrategy.ctaTemplate import CtaTemplate
@ -101,7 +103,7 @@ class EmaDemoStrategy(CtaTemplate):
if self.bar: if self.bar:
self.onBar(self.bar) self.onBar(self.bar)
bar = CtaBarData() bar = VtBarData()
bar.vtSymbol = tick.vtSymbol bar.vtSymbol = tick.vtSymbol
bar.symbol = tick.symbol bar.symbol = tick.symbol
bar.exchange = tick.exchange bar.exchange = tick.exchange

View File

@ -15,6 +15,7 @@ from __future__ import division
import talib import talib
import numpy as np import numpy as np
from vnpy.trader.vtObject import VtBarData
from vnpy.trader.vtConstant import EMPTY_STRING from vnpy.trader.vtConstant import EMPTY_STRING
from vnpy.trader.ctaStrategy.ctaTemplate import CtaTemplate from vnpy.trader.ctaStrategy.ctaTemplate import CtaTemplate
@ -110,7 +111,7 @@ class KkStrategy(CtaTemplate):
if self.bar: if self.bar:
self.onBar(self.bar) self.onBar(self.bar)
bar = CtaBarData() bar = VtBarData()
bar.vtSymbol = tick.vtSymbol bar.vtSymbol = tick.vtSymbol
bar.symbol = tick.symbol bar.symbol = tick.symbol
bar.exchange = tick.exchange bar.exchange = tick.exchange
@ -154,7 +155,7 @@ class KkStrategy(CtaTemplate):
else: else:
# 如果没有缓存则新建 # 如果没有缓存则新建
if not self.fiveBar: if not self.fiveBar:
fiveBar = CtaBarData() fiveBar = VtBarData()
fiveBar.vtSymbol = bar.vtSymbol fiveBar.vtSymbol = bar.vtSymbol
fiveBar.symbol = bar.symbol fiveBar.symbol = bar.symbol

View File

@ -4,7 +4,7 @@
# WeChat/QQ: 28888502 # WeChat/QQ: 28888502
from vtConstant import * from vtConstant import *
from ctaBase import * from vnpy.trader.vtObject import VtBarData
from datetime import datetime from datetime import datetime
@ -240,7 +240,7 @@ class CtaLineBar(object):
def __firstTick(self,tick): def __firstTick(self,tick):
""" K线的第一个Tick数据""" """ K线的第一个Tick数据"""
self.bar = CtaBarData() # 创建新的K线 self.bar = VtBarData() # 创建新的K线
self.bar.vtSymbol = tick.vtSymbol self.bar.vtSymbol = tick.vtSymbol
self.bar.symbol = tick.symbol self.bar.symbol = tick.symbol

View File

@ -9,6 +9,7 @@ same as CTA engine. Real trading code can be directly used for backtesting.
from __future__ import division from __future__ import division
from vnpy.trader.vtObject import VtTickData, VtBarData
from ctaBacktesting import * from ctaBacktesting import *
class BacktestEngineMultiTF(BacktestingEngine): class BacktestEngineMultiTF(BacktestingEngine):
@ -84,10 +85,10 @@ class BacktestEngineMultiTF(BacktestingEngine):
# 首先根据回测模式,确认要使用的数据类 # 首先根据回测模式,确认要使用的数据类
# Choose data type based on backtest mode # Choose data type based on backtest mode
if self.mode == self.BAR_MODE: if self.mode == self.BAR_MODE:
self.dataClass = CtaBarData self.dataClass = VtBarData
self.func = self.newBar self.func = self.newBar
else: else:
self.dataClass = CtaTickData self.dataClass = VtTickData
self.func = self.newTick self.func = self.newTick
# Load initializing data # Load initializing data
@ -164,7 +165,7 @@ class BacktestEngineMultiTF(BacktestingEngine):
if (data is not None) and (data['datetime'] <= self.dt): if (data is not None) and (data['datetime'] <= self.dt):
try: try:
temp[info_symbol] = CtaBarData() temp[info_symbol] = VtBarData()
temp[info_symbol].__dict__ = data temp[info_symbol].__dict__ = data
self.infobar[info_symbol] = next(self.InfoCursor[info_symbol]) self.infobar[info_symbol] = next(self.InfoCursor[info_symbol])
except StopIteration: except StopIteration:

View File

@ -3,6 +3,7 @@
This file tweaks ctaTemplate Module to suit multi-TimeFrame strategies. This file tweaks ctaTemplate Module to suit multi-TimeFrame strategies.
""" """
from strategyAtrRsi import * from strategyAtrRsi import *
from ctaBase import * from ctaBase import *
from ctaTemplate import CtaTemplate from ctaTemplate import CtaTemplate

View File

@ -6,6 +6,7 @@ CTA模块相关的GUI控制组件
from vnpy.event import Event from vnpy.event import Event
from vnpy.trader.vtEvent import *
from vnpy.trader.uiBasicWidget import QtGui, QtCore, QtWidgets, BasicCell from vnpy.trader.uiBasicWidget import QtGui, QtCore, QtWidgets, BasicCell
from vnpy.trader.ctaStrategy.language import text from vnpy.trader.ctaStrategy.language import text
@ -44,7 +45,7 @@ class CtaValueMonitor(QtWidgets.QTableWidget):
col = 0 col = 0
for k, v in data.items(): for k, v in data.items():
cell = QtGui.QTableWidgetItem(unicode(v)) cell = QtWidgets.QTableWidgetItem(unicode(v))
self.keyCellDict[k] = cell self.keyCellDict[k] = cell
self.setItem(0, col, cell) self.setItem(0, col, cell)
col += 1 col += 1
@ -86,26 +87,26 @@ class CtaStrategyManager(QtWidgets.QGroupBox):
self.paramMonitor.setFixedHeight(height) self.paramMonitor.setFixedHeight(height)
self.varMonitor.setFixedHeight(height) self.varMonitor.setFixedHeight(height)
buttonInit = QtGui.QPushButton(text.INIT) buttonInit = QtWidgets.QPushButton(text.INIT)
buttonStart = QtGui.QPushButton(text.START) buttonStart = QtWidgets.QPushButton(text.START)
buttonStop = QtGui.QPushButton(text.STOP) buttonStop = QtWidgets.QPushButton(text.STOP)
buttonInit.clicked.connect(self.init) buttonInit.clicked.connect(self.init)
buttonStart.clicked.connect(self.start) buttonStart.clicked.connect(self.start)
buttonStop.clicked.connect(self.stop) buttonStop.clicked.connect(self.stop)
hbox1 = QtGui.QHBoxLayout() hbox1 = QtWidgets.QHBoxLayout()
hbox1.addWidget(buttonInit) hbox1.addWidget(buttonInit)
hbox1.addWidget(buttonStart) hbox1.addWidget(buttonStart)
hbox1.addWidget(buttonStop) hbox1.addWidget(buttonStop)
hbox1.addStretch() hbox1.addStretch()
hbox2 = QtGui.QHBoxLayout() hbox2 = QtWidgets.QHBoxLayout()
hbox2.addWidget(self.paramMonitor) hbox2.addWidget(self.paramMonitor)
hbox3 = QtGui.QHBoxLayout() hbox3 = QtWidgets.QHBoxLayout()
hbox3.addWidget(self.varMonitor) hbox3.addWidget(self.varMonitor)
vbox = QtGui.QVBoxLayout() vbox = QtWidgets.QVBoxLayout()
vbox.addLayout(hbox1) vbox.addLayout(hbox1)
vbox.addLayout(hbox2) vbox.addLayout(hbox2)
vbox.addLayout(hbox3) vbox.addLayout(hbox3)
@ -172,11 +173,11 @@ class CtaEngineManager(QtWidgets.QWidget):
self.setWindowTitle(text.CTA_STRATEGY) self.setWindowTitle(text.CTA_STRATEGY)
# 按钮 # 按钮
loadButton = QtGui.QPushButton(text.LOAD_STRATEGY) loadButton = QtWidgets.QPushButton(text.LOAD_STRATEGY)
initAllButton = QtGui.QPushButton(text.INIT_ALL) initAllButton = QtWidgets.QPushButton(text.INIT_ALL)
startAllButton = QtGui.QPushButton(text.START_ALL) startAllButton = QtWidgets.QPushButton(text.START_ALL)
stopAllButton = QtGui.QPushButton(text.STOP_ALL) stopAllButton = QtWidgets.QPushButton(text.STOP_ALL)
savePositionButton = QtGui.QPushButton(text.SAVE_POSITION_DATA) savePositionButton = QtWidgets.QPushButton(text.SAVE_POSITION_DATA)
loadButton.clicked.connect(self.load) loadButton.clicked.connect(self.load)
initAllButton.clicked.connect(self.initAll) initAllButton.clicked.connect(self.initAll)
@ -185,16 +186,16 @@ class CtaEngineManager(QtWidgets.QWidget):
savePositionButton.clicked.connect(self.ctaEngine.savePosition) savePositionButton.clicked.connect(self.ctaEngine.savePosition)
# 滚动区域放置所有的CtaStrategyManager # 滚动区域放置所有的CtaStrategyManager
self.scrollArea = QtGui.QScrollArea() self.scrollArea = QtWidgets.QScrollArea()
self.scrollArea.setWidgetResizable(True) self.scrollArea.setWidgetResizable(True)
# CTA组件的日志监控 # CTA组件的日志监控
self.ctaLogMonitor = QtGui.QTextEdit() self.ctaLogMonitor = QtWidgets.QTextEdit()
self.ctaLogMonitor.setReadOnly(True) self.ctaLogMonitor.setReadOnly(True)
self.ctaLogMonitor.setMaximumHeight(200) self.ctaLogMonitor.setMaximumHeight(200)
# 设置布局 # 设置布局
hbox2 = QtGui.QHBoxLayout() hbox2 = QtWidgets.QHBoxLayout()
hbox2.addWidget(loadButton) hbox2.addWidget(loadButton)
hbox2.addWidget(initAllButton) hbox2.addWidget(initAllButton)
hbox2.addWidget(startAllButton) hbox2.addWidget(startAllButton)
@ -202,7 +203,7 @@ class CtaEngineManager(QtWidgets.QWidget):
hbox2.addWidget(savePositionButton) hbox2.addWidget(savePositionButton)
hbox2.addStretch() hbox2.addStretch()
vbox = QtGui.QVBoxLayout() vbox = QtWidgets.QVBoxLayout()
vbox.addLayout(hbox2) vbox.addLayout(hbox2)
vbox.addWidget(self.scrollArea) vbox.addWidget(self.scrollArea)
vbox.addWidget(self.ctaLogMonitor) vbox.addWidget(self.ctaLogMonitor)
@ -211,8 +212,8 @@ class CtaEngineManager(QtWidgets.QWidget):
#---------------------------------------------------------------------- #----------------------------------------------------------------------
def initStrategyManager(self): def initStrategyManager(self):
"""初始化策略管理组件界面""" """初始化策略管理组件界面"""
w = QtGui.QWidget() w = QtWidgets.QWidget()
vbox = QtGui.QVBoxLayout() vbox = QtWidgets.QVBoxLayout()
for name in self.ctaEngine.strategyDict.keys(): for name in self.ctaEngine.strategyDict.keys():
strategyManager = CtaStrategyManager(self.ctaEngine, self.eventEngine, name) strategyManager = CtaStrategyManager(self.ctaEngine, self.eventEngine, name)
@ -266,11 +267,11 @@ class CtaEngineManager(QtWidgets.QWidget):
#---------------------------------------------------------------------- #----------------------------------------------------------------------
def closeEvent(self, event): def closeEvent(self, event):
"""关闭窗口时的事件""" """关闭窗口时的事件"""
reply = QtGui.QMessageBox.question(self, text.SAVE_POSITION_DATA, reply = QtWidgets.QMessageBox.question(self, text.SAVE_POSITION_DATA,
text.SAVE_POSITION_QUESTION, QtGui.QMessageBox.Yes | text.SAVE_POSITION_QUESTION, QtWidgets.QMessageBox.Yes |
QtGui.QMessageBox.No, QtGui.QMessageBox.No) QtWidgets.QMessageBox.No, QtWidgets.QMessageBox.No)
if reply == QtGui.QMessageBox.Yes: if reply == QtWidgets.QMessageBox.Yes:
self.ctaEngine.savePosition() self.ctaEngine.savePosition()
event.accept() event.accept()

View File

@ -6,12 +6,6 @@
from __future__ import division from __future__ import division
# 把vn.trader根目录添加到python环境变量中
import sys
sys.path.append('..')
# 数据库名称 # 数据库名称
SETTING_DB_NAME = 'VnTrader_Setting_Db' SETTING_DB_NAME = 'VnTrader_Setting_Db'
TICK_DB_NAME = 'VnTrader_Tick_Db' TICK_DB_NAME = 'VnTrader_Tick_Db'
@ -21,77 +15,3 @@ MINUTE_DB_NAME = 'VnTrader_1Min_Db'
# CTA引擎中涉及的数据类定义 # CTA引擎中涉及的数据类定义
from vnpy.trader.vtConstant import EMPTY_UNICODE, EMPTY_STRING, EMPTY_FLOAT, EMPTY_INT from vnpy.trader.vtConstant import EMPTY_UNICODE, EMPTY_STRING, EMPTY_FLOAT, EMPTY_INT
########################################################################
class DrBarData(object):
"""K线数据"""
#----------------------------------------------------------------------
def __init__(self):
"""Constructor"""
self.vtSymbol = EMPTY_STRING # vt系统代码
self.symbol = EMPTY_STRING # 代码
self.exchange = EMPTY_STRING # 交易所
self.open = EMPTY_FLOAT # OHLC
self.high = EMPTY_FLOAT
self.low = EMPTY_FLOAT
self.close = EMPTY_FLOAT
self.date = EMPTY_STRING # bar开始的时间日期
self.time = EMPTY_STRING # 时间
self.datetime = None # python的datetime时间对象
self.volume = EMPTY_INT # 成交量
self.openInterest = EMPTY_INT # 持仓量
########################################################################
class DrTickData(object):
"""Tick数据"""
#----------------------------------------------------------------------
def __init__(self):
"""Constructor"""
self.vtSymbol = EMPTY_STRING # vt系统代码
self.symbol = EMPTY_STRING # 合约代码
self.exchange = EMPTY_STRING # 交易所代码
# 成交数据
self.lastPrice = EMPTY_FLOAT # 最新成交价
self.volume = EMPTY_INT # 最新成交量
self.openInterest = EMPTY_INT # 持仓量
self.upperLimit = EMPTY_FLOAT # 涨停价
self.lowerLimit = EMPTY_FLOAT # 跌停价
# tick的时间
self.date = EMPTY_STRING # 日期
self.time = EMPTY_STRING # 时间
self.datetime = None # python的datetime时间对象
# 五档行情
self.bidPrice1 = EMPTY_FLOAT
self.bidPrice2 = EMPTY_FLOAT
self.bidPrice3 = EMPTY_FLOAT
self.bidPrice4 = EMPTY_FLOAT
self.bidPrice5 = EMPTY_FLOAT
self.askPrice1 = EMPTY_FLOAT
self.askPrice2 = EMPTY_FLOAT
self.askPrice3 = EMPTY_FLOAT
self.askPrice4 = EMPTY_FLOAT
self.askPrice5 = EMPTY_FLOAT
self.bidVolume1 = EMPTY_INT
self.bidVolume2 = EMPTY_INT
self.bidVolume3 = EMPTY_INT
self.bidVolume4 = EMPTY_INT
self.bidVolume5 = EMPTY_INT
self.askVolume1 = EMPTY_INT
self.askVolume2 = EMPTY_INT
self.askVolume3 = EMPTY_INT
self.askVolume4 = EMPTY_INT
self.askVolume5 = EMPTY_INT

View File

@ -17,7 +17,7 @@ from threading import Thread
from vnpy.event import Event from vnpy.event import Event
from vnpy.trader.vtEvent import * from vnpy.trader.vtEvent import *
from vnpy.trader.vtFunction import todayDate from vnpy.trader.vtFunction import todayDate
from vnpy.trader.vtGateway import VtSubscribeReq, VtLogData from vnpy.trader.vtObject import VtSubscribeReq, VtLogData, VtBarData, VtTickData
from vnpy.trader.dataRecorder.drBase import * from vnpy.trader.dataRecorder.drBase import *
from vnpy.trader.dataRecorder.language import text from vnpy.trader.dataRecorder.language import text
@ -90,8 +90,8 @@ class DrEngine(object):
self.mainEngine.subscribe(req, setting[1]) self.mainEngine.subscribe(req, setting[1])
drTick = DrTickData() # 该tick实例可以用于缓存部分数据目前未使用 tick = VtTickData() # 该tick实例可以用于缓存部分数据目前未使用
self.tickDict[vtSymbol] = drTick self.tickDict[vtSymbol] = tick
if 'bar' in drSetting: if 'bar' in drSetting:
l = drSetting['bar'] l = drSetting['bar']
@ -113,7 +113,7 @@ class DrEngine(object):
self.mainEngine.subscribe(req, setting[1]) self.mainEngine.subscribe(req, setting[1])
bar = DrBarData() bar = VtBarData()
self.barDict[vtSymbol] = bar self.barDict[vtSymbol] = bar
if 'active' in drSetting: if 'active' in drSetting:
@ -136,34 +136,30 @@ class DrEngine(object):
vtSymbol = tick.vtSymbol vtSymbol = tick.vtSymbol
# 转化Tick格式 # 转化Tick格式
drTick = DrTickData() if not tick.datetime:
d = drTick.__dict__ tick.datetime = datetime.strptime(' '.join([tick.date, tick.time]), '%Y%m%d %H:%M:%S.%f')
for key in d.keys():
if key != 'datetime':
d[key] = tick.__getattribute__(key)
drTick.datetime = datetime.strptime(' '.join([tick.date, tick.time]), '%Y%m%d %H:%M:%S.%f')
# 更新Tick数据 # 更新Tick数据
if vtSymbol in self.tickDict: if vtSymbol in self.tickDict:
self.insertData(TICK_DB_NAME, vtSymbol, drTick) self.insertData(TICK_DB_NAME, vtSymbol, tick)
if vtSymbol in self.activeSymbolDict: if vtSymbol in self.activeSymbolDict:
activeSymbol = self.activeSymbolDict[vtSymbol] activeSymbol = self.activeSymbolDict[vtSymbol]
self.insertData(TICK_DB_NAME, activeSymbol, drTick) self.insertData(TICK_DB_NAME, activeSymbol, tick)
# 发出日志 # 发出日志
self.writeDrLog(text.TICK_LOGGING_MESSAGE.format(symbol=drTick.vtSymbol, self.writeDrLog(text.TICK_LOGGING_MESSAGE.format(symbol=tick.vtSymbol,
time=drTick.time, time=tick.time,
last=drTick.lastPrice, last=tick.lastPrice,
bid=drTick.bidPrice1, bid=tick.bidPrice1,
ask=drTick.askPrice1)) ask=tick.askPrice1))
# 更新分钟线数据 # 更新分钟线数据
if vtSymbol in self.barDict: if vtSymbol in self.barDict:
bar = self.barDict[vtSymbol] bar = self.barDict[vtSymbol]
# 如果第一个TICK或者新的一分钟 # 如果第一个TICK或者新的一分钟
if not bar.datetime or bar.datetime.minute != drTick.datetime.minute: if not bar.datetime or bar.datetime.minute != tick.datetime.minute:
if bar.vtSymbol: if bar.vtSymbol:
newBar = copy.copy(bar) newBar = copy.copy(bar)
self.insertData(MINUTE_DB_NAME, vtSymbol, newBar) self.insertData(MINUTE_DB_NAME, vtSymbol, newBar)
@ -179,25 +175,25 @@ class DrEngine(object):
low=bar.low, low=bar.low,
close=bar.close)) close=bar.close))
bar.vtSymbol = drTick.vtSymbol bar.vtSymbol = tick.vtSymbol
bar.symbol = drTick.symbol bar.symbol = tick.symbol
bar.exchange = drTick.exchange bar.exchange = tick.exchange
bar.open = drTick.lastPrice bar.open = tick.lastPrice
bar.high = drTick.lastPrice bar.high = tick.lastPrice
bar.low = drTick.lastPrice bar.low = tick.lastPrice
bar.close = drTick.lastPrice bar.close = tick.lastPrice
bar.date = drTick.date bar.date = tick.date
bar.time = drTick.time bar.time = tick.time
bar.datetime = drTick.datetime bar.datetime = tick.datetime
bar.volume = drTick.volume bar.volume = tick.volume
bar.openInterest = drTick.openInterest bar.openInterest = tick.openInterest
# 否则继续累加新的K线 # 否则继续累加新的K线
else: else:
bar.high = max(bar.high, drTick.lastPrice) bar.high = max(bar.high, tick.lastPrice)
bar.low = min(bar.low, drTick.lastPrice) bar.low = min(bar.low, tick.lastPrice)
bar.close = drTick.lastPrice bar.close = tick.lastPrice
#---------------------------------------------------------------------- #----------------------------------------------------------------------
def registerEvent(self): def registerEvent(self):
@ -206,7 +202,7 @@ class DrEngine(object):
#---------------------------------------------------------------------- #----------------------------------------------------------------------
def insertData(self, dbName, collectionName, data): def insertData(self, dbName, collectionName, data):
"""插入数据到数据库这里的data可以是CtaTickData或者CtaBarData""" """插入数据到数据库这里的data可以是VtTickData或者VtBarData"""
self.queue.put((dbName, collectionName, data.__dict__)) self.queue.put((dbName, collectionName, data.__dict__))
#---------------------------------------------------------------------- #----------------------------------------------------------------------

View File

@ -6,8 +6,11 @@
import json import json
from qtpy import QtWidgets, QtGui, QtCore
from vnpy.event import Event from vnpy.event import Event
from vnpy.trader.uiBasicWidget import QtWidgets, QtGui, QtCore from vnpy.trader.vtEvent import *
from vnpy.trader.dataRecorder.language import text from vnpy.trader.dataRecorder.language import text
@ -56,40 +59,40 @@ class DrEngineManager(QtWidgets.QWidget):
self.setWindowTitle(text.DATA_RECORDER) self.setWindowTitle(text.DATA_RECORDER)
# 记录合约配置监控 # 记录合约配置监控
tickLabel = QtGui.QLabel(text.TICK_RECORD) tickLabel = QtWidgets.QLabel(text.TICK_RECORD)
self.tickTable = QtGui.QTableWidget() self.tickTable = QtWidgets.QTableWidget()
self.tickTable.setColumnCount(2) self.tickTable.setColumnCount(2)
self.tickTable.verticalHeader().setVisible(False) self.tickTable.verticalHeader().setVisible(False)
self.tickTable.setEditTriggers(QtGui.QTableWidget.NoEditTriggers) self.tickTable.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
self.tickTable.horizontalHeader().setResizeMode(QtGui.QHeaderView.Stretch) self.tickTable.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch)
self.tickTable.setAlternatingRowColors(True) self.tickTable.setAlternatingRowColors(True)
self.tickTable.setHorizontalHeaderLabels([text.CONTRACT_SYMBOL, text.GATEWAY]) self.tickTable.setHorizontalHeaderLabels([text.CONTRACT_SYMBOL, text.GATEWAY])
barLabel = QtGui.QLabel(text.BAR_RECORD) barLabel = QtWidgets.QLabel(text.BAR_RECORD)
self.barTable = QtGui.QTableWidget() self.barTable = QtWidgets.QTableWidget()
self.barTable.setColumnCount(2) self.barTable.setColumnCount(2)
self.barTable.verticalHeader().setVisible(False) self.barTable.verticalHeader().setVisible(False)
self.barTable.setEditTriggers(QtGui.QTableWidget.NoEditTriggers) self.barTable.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
self.barTable.horizontalHeader().setResizeMode(QtGui.QHeaderView.Stretch) self.barTable.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch)
self.barTable.setAlternatingRowColors(True) self.barTable.setAlternatingRowColors(True)
self.barTable.setHorizontalHeaderLabels([text.CONTRACT_SYMBOL, text.GATEWAY]) self.barTable.setHorizontalHeaderLabels([text.CONTRACT_SYMBOL, text.GATEWAY])
activeLabel = QtGui.QLabel(text.DOMINANT_CONTRACT) activeLabel = QtWidgets.QLabel(text.DOMINANT_CONTRACT)
self.activeTable = QtGui.QTableWidget() self.activeTable = QtWidgets.QTableWidget()
self.activeTable.setColumnCount(2) self.activeTable.setColumnCount(2)
self.activeTable.verticalHeader().setVisible(False) self.activeTable.verticalHeader().setVisible(False)
self.activeTable.setEditTriggers(QtGui.QTableWidget.NoEditTriggers) self.activeTable.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
self.activeTable.horizontalHeader().setResizeMode(QtGui.QHeaderView.Stretch) self.activeTable.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch)
self.activeTable.setAlternatingRowColors(True) self.activeTable.setAlternatingRowColors(True)
self.activeTable.setHorizontalHeaderLabels([text.DOMINANT_SYMBOL, text.CONTRACT_SYMBOL]) self.activeTable.setHorizontalHeaderLabels([text.DOMINANT_SYMBOL, text.CONTRACT_SYMBOL])
# 日志监控 # 日志监控
self.logMonitor = QtGui.QTextEdit() self.logMonitor = QtWidgets.QTextEdit()
self.logMonitor.setReadOnly(True) self.logMonitor.setReadOnly(True)
self.logMonitor.setMinimumHeight(600) self.logMonitor.setMinimumHeight(600)
# 设置布局 # 设置布局
grid = QtGui.QGridLayout() grid = QtWidgets.QGridLayout()
grid.addWidget(tickLabel, 0, 0) grid.addWidget(tickLabel, 0, 0)
grid.addWidget(barLabel, 0, 1) grid.addWidget(barLabel, 0, 1)
@ -98,7 +101,7 @@ class DrEngineManager(QtWidgets.QWidget):
grid.addWidget(self.barTable, 1, 1) grid.addWidget(self.barTable, 1, 1)
grid.addWidget(self.activeTable, 1, 2) grid.addWidget(self.activeTable, 1, 2)
vbox = QtGui.QVBoxLayout() vbox = QtWidgets.QVBoxLayout()
vbox.addLayout(grid) vbox.addLayout(grid)
vbox.addWidget(self.logMonitor) vbox.addWidget(self.logMonitor)
self.setLayout(vbox) self.setLayout(vbox)

View File

@ -85,7 +85,7 @@ class MainEngine(object):
gateway.connect() gateway.connect()
# 接口连接后自动执行数据库连接的任务 # 接口连接后自动执行数据库连接的任务
#self.dbConnect() self.dbConnect()
#---------------------------------------------------------------------- #----------------------------------------------------------------------
def subscribe(self, subscribeReq, gatewayName): def subscribe(self, subscribeReq, gatewayName):