添加价差交易的持仓和日志显示

This commit is contained in:
vn.py 2017-06-15 14:43:49 +08:00
parent e8fbab872d
commit 7ed32dca4b
4 changed files with 178 additions and 41 deletions

View File

@ -268,13 +268,14 @@ class CtaEngineManager(QtWidgets.QWidget):
#---------------------------------------------------------------------- #----------------------------------------------------------------------
def closeEvent(self, event): def closeEvent(self, event):
"""关闭窗口时的事件""" """关闭窗口时的事件"""
reply = QtWidgets.QMessageBox.question(self, text.SAVE_POSITION_DATA, if self.isVisible():
text.SAVE_POSITION_QUESTION, QtWidgets.QMessageBox.Yes | reply = QtWidgets.QMessageBox.question(self, text.SAVE_POSITION_DATA,
QtWidgets.QMessageBox.No, QtWidgets.QMessageBox.No) text.SAVE_POSITION_QUESTION, QtWidgets.QMessageBox.Yes |
QtWidgets.QMessageBox.No, QtWidgets.QMessageBox.No)
if reply == QtWidgets.QMessageBox.Yes:
self.ctaEngine.savePosition() if reply == QtWidgets.QMessageBox.Yes:
self.ctaEngine.savePosition()
event.accept() event.accept()

View File

@ -11,6 +11,8 @@ from vnpy.trader.vtConstant import (EMPTY_INT, EMPTY_FLOAT,
EVENT_SPREADTRADING_TICK = 'eSpreadTradingTick.' EVENT_SPREADTRADING_TICK = 'eSpreadTradingTick.'
EVENT_SPREADTRADING_POS = 'eSpreadTradingPos.'
EVENT_SPREADTRADING_LOG = 'eSpreadTradingLog'

View File

@ -1,14 +1,18 @@
# encoding: UTF-8 # encoding: UTF-8
import json import json
import traceback
from copy import copy from copy import copy
from vnpy.event import Event from vnpy.event import Event
from vnpy.trader.vtFunction import getJsonPath from vnpy.trader.vtFunction import getJsonPath
from vnpy.trader.vtEvent import EVENT_TICK, EVENT_TRADE, EVENT_POSITION from vnpy.trader.vtEvent import EVENT_TICK, EVENT_TRADE, EVENT_POSITION
from vnpy.trader.vtObject import VtSubscribeReq from vnpy.trader.vtObject import VtSubscribeReq, VtLogData
from vnpy.trader.vtConstant import (DIRECTION_LONG, DIRECTION_SHORT,
OFFSET_OPEN, OFFSET_CLOSE)
from .stBase import StLeg, StSpread, EVENT_SPREADTRADING_TICK from .stBase import (StLeg, StSpread, EVENT_SPREADTRADING_TICK,
EVENT_SPREADTRADING_POS, EVENT_SPREADTRADING_LOG)
######################################################################## ########################################################################
@ -33,11 +37,18 @@ class StEngine(object):
#---------------------------------------------------------------------- #----------------------------------------------------------------------
def loadSetting(self): def loadSetting(self):
"""加载配置""" """加载配置"""
with open(self.settingFilePath) as f: try:
l = json.load(f) with open(self.settingFilePath) as f:
l = json.load(f)
for setting in l:
self.createSpread(setting) for setting in l:
result, msg = self.createSpread(setting)
self.writeLog(msg)
self.writeLog(u'价差配置加载完成')
except:
content = u'价差配置加载出错,原因:' + traceback.format_exc()
self.writeLog(content)
#---------------------------------------------------------------------- #----------------------------------------------------------------------
def saveSetting(self): def saveSetting(self):
@ -53,7 +64,7 @@ class StEngine(object):
# 检查价差重名 # 检查价差重名
if setting['name'] in self.spreadDict: if setting['name'] in self.spreadDict:
msg = u'%s价差重名' %setting['name'] msg = u'%s价差存在重名' %setting['name']
return result, msg return result, msg
# 检查腿是否已使用 # 检查腿是否已使用
@ -132,21 +143,89 @@ class StEngine(object):
spread = self.vtSymbolSpreadDict[tick.vtSymbol] spread = self.vtSymbolSpreadDict[tick.vtSymbol]
spread.calculatePrice() spread.calculatePrice()
# 推送价差更新 # 推送价差行情更新
newSpread = copy(spread) newSpread = copy(spread)
event = Event(EVENT_SPREADTRADING_TICK)
event.dict_['data'] = newSpread event1 = Event(EVENT_SPREADTRADING_TICK+spread.name)
self.eventEngine.put(event) event1.dict_['data'] = newSpread
self.eventEngine.put(event1)
event2 = Event(EVENT_SPREADTRADING_TICK)
event2.dict_['data'] = newSpread
self.eventEngine.put(event2)
#---------------------------------------------------------------------- #----------------------------------------------------------------------
def processTradeEvent(self, event): def processTradeEvent(self, event):
"""""" """处理成交推送"""
pass # 检查成交是否需要处理
trade = event.dict_['data']
if trade.vtSymbol not in self.legDict:
return
# 更新腿持仓
leg = self.legDict[trade.vtSymbol]
direction = trade.direction
offset = trade.offst
if direction == DIRECTION_LONG:
if offset == OFFSET_OPEN:
leg.longPos += trade.volume
else:
leg.shortPos -= trade.volume
else:
if offset == OFFSET_OPEN:
leg.shortPos += trade.volume
else:
leg.longPos -= trade.volume
leg.netPos = leg.longPos - leg.shortPos
# 更新价差持仓
spread = self.vtSymbolSpreadDict[trade.vtSymbol]
spread.calculatePos()
# 推送价差持仓更新
newSpread = copy(spread)
event1 = Event(EVENT_SPREADTRADING_POS+spread.name)
event1.dict_['data'] = newSpread
self.eventEngine.put(event1)
event2 = Event(EVENT_SPREADTRADING_POS)
event2.dict_['data'] = newSpread
self.eventEngine.put(event2)
#---------------------------------------------------------------------- #----------------------------------------------------------------------
def processPositionEvent(self, event): def processPositionEvent(self, event):
"""""" """处理持仓推送"""
pass # 检查持仓是否需要处理
pos = event.dict_['data']
if pos.vtSymbol not in self.legDict:
return
# 更新腿持仓
leg = self.legDict[trade.vtSymbol]
direction = pos.direction
if direction == DIRECTION_LONG:
leg.longPos = pos.position
else:
leg.shortPos = pos.position
leg.netPos = leg.longPos - leg.shortPos
# 更新价差持仓
spread = self.vtSymbolSpreadDict[trade.vtSymbol]
spread.calculatePos()
# 推送价差持仓更新
newSpread = copy(spread)
event1 = Event(EVENT_SPREADTRADING_POS+spread.name)
event1.dict_['data'] = newSpread
self.eventEngine.put(event1)
event2 = Event(EVENT_SPREADTRADING_POS)
event2.dict_['data'] = newSpread
self.eventEngine.put(event2)
#---------------------------------------------------------------------- #----------------------------------------------------------------------
def registerEvent(self): def registerEvent(self):
@ -160,7 +239,7 @@ class StEngine(object):
"""订阅行情""" """订阅行情"""
contract = self.mainEngine.getContract(vtSymbol) contract = self.mainEngine.getContract(vtSymbol)
if not contract: if not contract:
return self.writeLog(u'订阅行情失败,找不到该合约%s' %vtSymbol)
req = VtSubscribeReq() req = VtSubscribeReq()
req.symbol = contract.symbol req.symbol = contract.symbol
@ -168,6 +247,16 @@ class StEngine(object):
self.mainEngine.subscribe(req, contract.gatewayName) self.mainEngine.subscribe(req, contract.gatewayName)
#----------------------------------------------------------------------
def writeLog(self, content):
"""发出日志"""
log = VtLogData()
log.logContent = content
event = Event(EVENT_SPREADTRADING_LOG)
event.dict_['data'] = log
self.eventEngine.put(event)
#---------------------------------------------------------------------- #----------------------------------------------------------------------
def stop(self): def stop(self):
"""停止""" """停止"""

View File

@ -3,23 +3,23 @@
from collections import OrderedDict from collections import OrderedDict
from vnpy.trader.uiQt import QtWidgets from vnpy.trader.uiQt import QtWidgets
from vnpy.trader.uiBasicWidget import (BasicMonitor, BasicCell, from vnpy.trader.uiBasicWidget import (BasicMonitor, BasicCell, PnlCell,
AskCell, BidCell, BASIC_FONT) AskCell, BidCell, BASIC_FONT)
from .stBase import EVENT_SPREADTRADING_TICK from .stBase import (EVENT_SPREADTRADING_TICK, EVENT_SPREADTRADING_POS,
EVENT_SPREADTRADING_LOG)
######################################################################## ########################################################################
class StTickMonitor(BasicMonitor): class StTickMonitor(BasicMonitor):
"""""" """价差行情监控"""
#---------------------------------------------------------------------- #----------------------------------------------------------------------
def __init__(self, mainEngine, eventEngine, parent=None): def __init__(self, mainEngine, eventEngine, parent=None):
"""Constructor""" """Constructor"""
super(StTickMonitor, self).__init__(mainEngine, eventEngine, parent) super(StTickMonitor, self).__init__(mainEngine, eventEngine, parent)
# 设置表头有序字典
d = OrderedDict() d = OrderedDict()
d['name'] = {'chinese':u'价差名称', 'cellType':BasicCell} d['name'] = {'chinese':u'价差名称', 'cellType':BasicCell}
d['bidPrice'] = {'chinese':u'买价', 'cellType':BidCell} d['bidPrice'] = {'chinese':u'买价', 'cellType':BidCell}
@ -30,22 +30,60 @@ class StTickMonitor(BasicMonitor):
d['symbol'] = {'chinese':u'代码', 'cellType':BasicCell} d['symbol'] = {'chinese':u'代码', 'cellType':BasicCell}
self.setHeaderDict(d) self.setHeaderDict(d)
# 设置数据键
self.setDataKey('name') self.setDataKey('name')
# 设置监控事件类型
self.setEventType(EVENT_SPREADTRADING_TICK) self.setEventType(EVENT_SPREADTRADING_TICK)
# 设置字体
self.setFont(BASIC_FONT) self.setFont(BASIC_FONT)
# 初始化表格
self.initTable() self.initTable()
# 注册事件监听
self.registerEvent() self.registerEvent()
########################################################################
class StPosMonitor(BasicMonitor):
"""价差持仓监控"""
#----------------------------------------------------------------------
def __init__(self, mainEngine, eventEngine, parent=None):
"""Constructor"""
super(StPosMonitor, self).__init__(mainEngine, eventEngine, parent)
d = OrderedDict()
d['name'] = {'chinese':u'价差名称', 'cellType':BasicCell}
d['netPos'] = {'chinese':u'净仓', 'cellType':PnlCell}
d['longPos'] = {'chinese':u'多仓', 'cellType':BasicCell}
d['shortPos'] = {'chinese':u'空仓', 'cellType':BasicCell}
d['symbol'] = {'chinese':u'代码', 'cellType':BasicCell}
self.setHeaderDict(d)
self.setDataKey('name')
self.setEventType(EVENT_SPREADTRADING_POS)
self.setFont(BASIC_FONT)
self.initTable()
self.registerEvent()
########################################################################
class StLogMonitor(BasicMonitor):
"""价差日志监控"""
#----------------------------------------------------------------------
def __init__(self, mainEngine, eventEngine, parent=None):
"""Constructor"""
super(StLogMonitor, self).__init__(mainEngine, eventEngine, parent)
d = OrderedDict()
d['logTime'] = {'chinese':u'时间', 'cellType':BasicCell}
d['logContent'] = {'chinese':u'日志', 'cellType':BasicCell}
self.setHeaderDict(d)
self.setEventType(EVENT_SPREADTRADING_LOG)
self.setFont(BASIC_FONT)
self.initTable()
self.registerEvent()
######################################################################## ########################################################################
class StManager(QtWidgets.QWidget): class StManager(QtWidgets.QWidget):
"""""" """"""
@ -73,15 +111,22 @@ class StManager(QtWidgets.QWidget):
# 创建组件 # 创建组件
tickMonitor = StTickMonitor(self.mainEngine, self.eventEngine) tickMonitor = StTickMonitor(self.mainEngine, self.eventEngine)
posMonitor = StPosMonitor(self.mainEngine, self.eventEngine)
logMonitor = StLogMonitor(self.mainEngine, self.eventEngine)
# 设置布局 # 设置布局
hbox = QtWidgets.QHBoxLayout() hbox1 = QtWidgets.QHBoxLayout()
hbox.addWidget(buttonLoadSetting) hbox1.addWidget(buttonLoadSetting)
hbox.addStretch() hbox1.addStretch()
hbox2 = QtWidgets.QHBoxLayout()
hbox2.addWidget(tickMonitor)
hbox2.addWidget(posMonitor)
vbox = QtWidgets.QVBoxLayout() vbox = QtWidgets.QVBoxLayout()
vbox.addLayout(hbox) vbox.addLayout(hbox1)
vbox.addWidget(tickMonitor) vbox.addLayout(hbox2)
vbox.addWidget(logMonitor)
self.setLayout(vbox) self.setLayout(vbox)