[Add]新增从CSV启动篮子算法或者加载算法配置到数据库
This commit is contained in:
parent
6ae70b391d
commit
920ee7fbb1
3
examples/CryptoTrader/algoBasket.csv
Normal file
3
examples/CryptoTrader/algoBasket.csv
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
templateName,settingName,vtSymbol,direction,targetPrice,totalVolume,time,interval,priceLevel,minVolume
|
||||||
|
TWAP,BUY_BTC_TWAP,BTCUSD.BITFINEX,多,4000,10,200,10,3,1
|
||||||
|
TWAP,SELL_BTC_TWAP,BTCUSD.BITFINEX,空,9000,10,200,10,3,1
|
|
@ -21,15 +21,15 @@ class TwapAlgo(AlgoTemplate):
|
|||||||
"""Constructor"""
|
"""Constructor"""
|
||||||
super(TwapAlgo, self).__init__(engine, setting, algoName)
|
super(TwapAlgo, self).__init__(engine, setting, algoName)
|
||||||
|
|
||||||
# 参数
|
# 参数,强制类型转换,保证从CSV加载的配置正确
|
||||||
self.vtSymbol = setting['vtSymbol'] # 合约代码
|
self.vtSymbol = str(setting['vtSymbol']) # 合约代码
|
||||||
self.direction = setting['direction'] # 买卖
|
self.direction = unicode(setting['direction']) # 买卖
|
||||||
self.targetPrice = setting['targetPrice'] # 目标价格
|
self.targetPrice = float(setting['targetPrice']) # 目标价格
|
||||||
self.totalVolume = setting['totalVolume'] # 总数量
|
self.totalVolume = float(setting['totalVolume']) # 总数量
|
||||||
self.time = setting['time'] # 执行时间
|
self.time = int(setting['time']) # 执行时间
|
||||||
self.interval = setting['interval'] # 执行间隔
|
self.interval = int(setting['interval']) # 执行间隔
|
||||||
self.minVolume = setting['minVolume'] # 最小委托数量
|
self.minVolume = float(setting['minVolume']) # 最小委托数量
|
||||||
self.priceLevel = setting['priceLevel'] # 使用第几档价格委托
|
self.priceLevel = int(setting['priceLevel']) # 使用第几档价格委托
|
||||||
|
|
||||||
# 变量
|
# 变量
|
||||||
self.orderSize = self.totalVolume / (self.time / self.interval)
|
self.orderSize = self.totalVolume / (self.time / self.interval)
|
||||||
|
@ -1,5 +1,9 @@
|
|||||||
# encoding: UTF-8
|
# encoding: UTF-8
|
||||||
|
|
||||||
|
import csv
|
||||||
|
import traceback
|
||||||
|
from collections import OrderedDict
|
||||||
|
|
||||||
from vnpy.event import Event
|
from vnpy.event import Event
|
||||||
from vnpy.trader.uiQt import QtCore, QtWidgets
|
from vnpy.trader.uiQt import QtCore, QtWidgets
|
||||||
|
|
||||||
@ -26,7 +30,7 @@ class StopButton(QtWidgets.QPushButton):
|
|||||||
self.setText(u'停止')
|
self.setText(u'停止')
|
||||||
self.clicked.connect(self.stopAlgo)
|
self.clicked.connect(self.stopAlgo)
|
||||||
else:
|
else:
|
||||||
self.setText(u'全部停止')
|
self.setText(u'停止全部算法')
|
||||||
self.clicked.connect(self.stopAll)
|
self.clicked.connect(self.stopAll)
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
@ -388,17 +392,32 @@ class AlgoManager(QtWidgets.QWidget):
|
|||||||
""""""
|
""""""
|
||||||
self.setWindowTitle(u'算法交易')
|
self.setWindowTitle(u'算法交易')
|
||||||
|
|
||||||
self.tab = QtWidgets.QTabWidget()
|
buttonWidth = 400
|
||||||
self.buttonStop = StopButton(self.algoEngine)
|
buttonHeight = 60
|
||||||
|
|
||||||
self.tab.setMaximumWidth(400)
|
self.tab = QtWidgets.QTabWidget()
|
||||||
self.buttonStop.setMaximumWidth(400)
|
self.tab.setMaximumWidth(buttonWidth)
|
||||||
self.buttonStop.setFixedHeight(100)
|
|
||||||
|
self.buttonStop = StopButton(self.algoEngine)
|
||||||
|
self.buttonStop.setMaximumWidth(buttonWidth)
|
||||||
|
self.buttonStop.setFixedHeight(buttonHeight)
|
||||||
|
|
||||||
|
self.buttonAddAlgo = QtWidgets.QPushButton(u'启动篮子算法')
|
||||||
|
self.buttonAddAlgo.setStyleSheet("color:white;background-color:green")
|
||||||
|
self.buttonAddAlgo.clicked.connect(self.addAlgoFromCsv)
|
||||||
|
self.buttonAddAlgo.setFixedHeight(buttonHeight)
|
||||||
|
|
||||||
|
self.buttonSaveSetting = QtWidgets.QPushButton(u'加载算法配置')
|
||||||
|
self.buttonSaveSetting.setStyleSheet("color:white;background-color:blue")
|
||||||
|
self.buttonSaveSetting.clicked.connect(self.saveSettingFromCsv)
|
||||||
|
self.buttonSaveSetting.setFixedHeight(buttonHeight)
|
||||||
|
|
||||||
vbox1 = QtWidgets.QVBoxLayout()
|
vbox1 = QtWidgets.QVBoxLayout()
|
||||||
vbox1.addWidget(self.tab)
|
vbox1.addWidget(self.tab)
|
||||||
vbox1.addStretch()
|
vbox1.addStretch()
|
||||||
vbox1.addWidget(self.buttonStop)
|
vbox1.addWidget(self.buttonStop)
|
||||||
|
vbox1.addWidget(self.buttonAddAlgo)
|
||||||
|
vbox1.addWidget(self.buttonSaveSetting)
|
||||||
|
|
||||||
workingMonitor = AlgoStatusMonitor(self.algoEngine, AlgoStatusMonitor.MODE_WORKING)
|
workingMonitor = AlgoStatusMonitor(self.algoEngine, AlgoStatusMonitor.MODE_WORKING)
|
||||||
historyMonitor = AlgoStatusMonitor(self.algoEngine, AlgoStatusMonitor.MODE_HISTORY)
|
historyMonitor = AlgoStatusMonitor(self.algoEngine, AlgoStatusMonitor.MODE_HISTORY)
|
||||||
@ -431,6 +450,45 @@ class AlgoManager(QtWidgets.QWidget):
|
|||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
def addAlgoWidget(self, widgetClass):
|
def addAlgoWidget(self, widgetClass):
|
||||||
""""""
|
"""添加算法控制组件 """
|
||||||
w = widgetClass(self.algoEngine)
|
w = widgetClass(self.algoEngine)
|
||||||
self.tab.addTab(w, w.templateName)
|
self.tab.addTab(w, w.templateName)
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------
|
||||||
|
def loadCsv(self, path):
|
||||||
|
"""读取CSV配置文件"""
|
||||||
|
try:
|
||||||
|
with open(unicode(path)) as f:
|
||||||
|
buf = [line.encode('UTF-8') for line in f]
|
||||||
|
|
||||||
|
reader = csv.DictReader(buf)
|
||||||
|
l = []
|
||||||
|
|
||||||
|
for d in reader:
|
||||||
|
setting = OrderedDict()
|
||||||
|
for name in reader.fieldnames:
|
||||||
|
setting[str(name)] = d[name]
|
||||||
|
l.append(setting)
|
||||||
|
|
||||||
|
return l
|
||||||
|
|
||||||
|
except:
|
||||||
|
msg = traceback.format_exc()
|
||||||
|
self.algoEngine.writeLog(u'读取CSV文件失败:\n' + msg)
|
||||||
|
return []
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------
|
||||||
|
def saveSettingFromCsv(self):
|
||||||
|
"""从CSV加载配置到数据库"""
|
||||||
|
path, fileType = QtWidgets.QFileDialog.getOpenFileName(self, u'加载算法配置', '', 'CSV(*.csv)')
|
||||||
|
l = self.loadCsv(path)
|
||||||
|
for setting in l:
|
||||||
|
self.algoEngine.saveAlgoSetting(setting)
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------
|
||||||
|
def addAlgoFromCsv(self):
|
||||||
|
"""从CSV启动一篮子算法"""
|
||||||
|
path, fileType = QtWidgets.QFileDialog.getOpenFileName(self, u'启动篮子算法', '', 'CSV(*.csv) ')
|
||||||
|
l = self.loadCsv(path)
|
||||||
|
for setting in l:
|
||||||
|
self.algoEngine.addAlgo(setting)
|
@ -375,7 +375,7 @@ class BasicMonitor(QtWidgets.QTableWidget):
|
|||||||
self.menu.close()
|
self.menu.close()
|
||||||
|
|
||||||
# 获取想要保存的文件名
|
# 获取想要保存的文件名
|
||||||
path = QtWidgets.QFileDialog.getSaveFileName(self, vtText.SAVE_DATA, '', 'CSV(*.csv)')
|
path, fileType = QtWidgets.QFileDialog.getSaveFileName(self, vtText.SAVE_DATA, '', 'CSV(*.csv)')
|
||||||
|
|
||||||
try:
|
try:
|
||||||
#if not path.isEmpty():
|
#if not path.isEmpty():
|
||||||
|
Loading…
Reference in New Issue
Block a user