Merge branch 'dev' of https://github.com/vnpy/vnpy into dev
This commit is contained in:
commit
8d1e429d65
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)
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
@ -390,17 +394,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)
|
||||||
@ -433,6 +452,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)
|
@ -5,6 +5,7 @@
|
|||||||
可以使用和实盘相同的代码进行回测。
|
可以使用和实盘相同的代码进行回测。
|
||||||
'''
|
'''
|
||||||
from __future__ import division
|
from __future__ import division
|
||||||
|
from __future__ import print_function
|
||||||
|
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
@ -112,7 +113,7 @@ class BacktestingEngine(object):
|
|||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
def output(self, content):
|
def output(self, content):
|
||||||
"""输出内容"""
|
"""输出内容"""
|
||||||
print str(datetime.now()) + "\t" + content
|
print(str(datetime.now()) + "\t" + content)
|
||||||
|
|
||||||
#------------------------------------------------
|
#------------------------------------------------
|
||||||
# 参数设置相关
|
# 参数设置相关
|
||||||
@ -1213,11 +1214,11 @@ class OptimizationSetting(object):
|
|||||||
return
|
return
|
||||||
|
|
||||||
if end < start:
|
if end < start:
|
||||||
print u'参数起始点必须不大于终止点'
|
print(u'参数起始点必须不大于终止点')
|
||||||
return
|
return
|
||||||
|
|
||||||
if step <= 0:
|
if step <= 0:
|
||||||
print u'参数布进必须大于0'
|
print(u'参数布进必须大于0')
|
||||||
return
|
return
|
||||||
|
|
||||||
l = []
|
l = []
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
3. 将交易开拓者导出的历史数据载入到MongoDB中的函数
|
3. 将交易开拓者导出的历史数据载入到MongoDB中的函数
|
||||||
4. 将OKEX下载的历史数据载入到MongoDB中的函数
|
4. 将OKEX下载的历史数据载入到MongoDB中的函数
|
||||||
"""
|
"""
|
||||||
|
from __future__ import print_function
|
||||||
|
|
||||||
import csv
|
import csv
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
@ -26,7 +27,7 @@ def downloadEquityDailyBarts(self, symbol):
|
|||||||
"""
|
"""
|
||||||
下载股票的日行情,symbol是股票代码
|
下载股票的日行情,symbol是股票代码
|
||||||
"""
|
"""
|
||||||
print u'开始下载%s日行情' %symbol
|
print(u'开始下载%s日行情' %symbol)
|
||||||
|
|
||||||
# 查询数据库中已有数据的最后日期
|
# 查询数据库中已有数据的最后日期
|
||||||
cl = self.dbClient[DAILY_DB_NAME][symbol]
|
cl = self.dbClient[DAILY_DB_NAME][symbol]
|
||||||
@ -62,20 +63,20 @@ def downloadEquityDailyBarts(self, symbol):
|
|||||||
bar.datetime = datetime.strptime(bar.date, '%Y%m%d')
|
bar.datetime = datetime.strptime(bar.date, '%Y%m%d')
|
||||||
bar.volume = d.get('volume')
|
bar.volume = d.get('volume')
|
||||||
except KeyError:
|
except KeyError:
|
||||||
print d
|
print(d)
|
||||||
|
|
||||||
flt = {'datetime': bar.datetime}
|
flt = {'datetime': bar.datetime}
|
||||||
self.dbClient[DAILY_DB_NAME][symbol].update_one(flt, {'$set':bar.__dict__}, upsert=True)
|
self.dbClient[DAILY_DB_NAME][symbol].update_one(flt, {'$set':bar.__dict__}, upsert=True)
|
||||||
|
|
||||||
print u'%s下载完成' %symbol
|
print(u'%s下载完成' %symbol)
|
||||||
else:
|
else:
|
||||||
print u'找不到合约%s' %symbol
|
print(u'找不到合约%s' %symbol)
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
def loadMcCsv(fileName, dbName, symbol):
|
def loadMcCsv(fileName, dbName, symbol):
|
||||||
"""将Multicharts导出的csv格式的历史数据插入到Mongo数据库中"""
|
"""将Multicharts导出的csv格式的历史数据插入到Mongo数据库中"""
|
||||||
start = time()
|
start = time()
|
||||||
print u'开始读取CSV文件%s中的数据插入到%s的%s中' %(fileName, dbName, symbol)
|
print(u'开始读取CSV文件%s中的数据插入到%s的%s中' %(fileName, dbName, symbol))
|
||||||
|
|
||||||
# 锁定集合,并创建索引
|
# 锁定集合,并创建索引
|
||||||
client = pymongo.MongoClient(globalSetting['mongoHost'], globalSetting['mongoPort'])
|
client = pymongo.MongoClient(globalSetting['mongoHost'], globalSetting['mongoPort'])
|
||||||
@ -99,15 +100,15 @@ def loadMcCsv(fileName, dbName, symbol):
|
|||||||
|
|
||||||
flt = {'datetime': bar.datetime}
|
flt = {'datetime': bar.datetime}
|
||||||
collection.update_one(flt, {'$set':bar.__dict__}, upsert=True)
|
collection.update_one(flt, {'$set':bar.__dict__}, upsert=True)
|
||||||
print bar.date, bar.time
|
print(bar.date, bar.time)
|
||||||
|
|
||||||
print u'插入完毕,耗时:%s' % (time()-start)
|
print(u'插入完毕,耗时:%s' % (time()-start))
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
def loadTbCsv(fileName, dbName, symbol):
|
def loadTbCsv(fileName, dbName, symbol):
|
||||||
"""将TradeBlazer导出的csv格式的历史分钟数据插入到Mongo数据库中"""
|
"""将TradeBlazer导出的csv格式的历史分钟数据插入到Mongo数据库中"""
|
||||||
start = time()
|
start = time()
|
||||||
print u'开始读取CSV文件%s中的数据插入到%s的%s中' %(fileName, dbName, symbol)
|
print(u'开始读取CSV文件%s中的数据插入到%s的%s中' %(fileName, dbName, symbol))
|
||||||
|
|
||||||
# 锁定集合,并创建索引
|
# 锁定集合,并创建索引
|
||||||
client = pymongo.MongoClient(globalSetting['mongoHost'], globalSetting['mongoPort'])
|
client = pymongo.MongoClient(globalSetting['mongoHost'], globalSetting['mongoPort'])
|
||||||
@ -132,15 +133,15 @@ def loadTbCsv(fileName, dbName, symbol):
|
|||||||
|
|
||||||
flt = {'datetime': bar.datetime}
|
flt = {'datetime': bar.datetime}
|
||||||
collection.update_one(flt, {'$set':bar.__dict__}, upsert=True)
|
collection.update_one(flt, {'$set':bar.__dict__}, upsert=True)
|
||||||
print bar.date, bar.time
|
print(bar.date, bar.time)
|
||||||
|
|
||||||
print u'插入完毕,耗时:%s' % (time()-start)
|
print(u'插入完毕,耗时:%s' % (time()-start))
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
def loadTbPlusCsv(fileName, dbName, symbol):
|
def loadTbPlusCsv(fileName, dbName, symbol):
|
||||||
"""将TB极速版导出的csv格式的历史分钟数据插入到Mongo数据库中"""
|
"""将TB极速版导出的csv格式的历史分钟数据插入到Mongo数据库中"""
|
||||||
start = time()
|
start = time()
|
||||||
print u'开始读取CSV文件%s中的数据插入到%s的%s中' %(fileName, dbName, symbol)
|
print(u'开始读取CSV文件%s中的数据插入到%s的%s中' %(fileName, dbName, symbol))
|
||||||
|
|
||||||
# 锁定集合,并创建索引
|
# 锁定集合,并创建索引
|
||||||
client = pymongo.MongoClient(globalSetting['mongoHost'], globalSetting['mongoPort'])
|
client = pymongo.MongoClient(globalSetting['mongoHost'], globalSetting['mongoPort'])
|
||||||
@ -167,9 +168,9 @@ def loadTbPlusCsv(fileName, dbName, symbol):
|
|||||||
bar.openInterest = d[7]
|
bar.openInterest = d[7]
|
||||||
flt = {'datetime': bar.datetime}
|
flt = {'datetime': bar.datetime}
|
||||||
collection.update_one(flt, {'$set':bar.__dict__}, upsert=True)
|
collection.update_one(flt, {'$set':bar.__dict__}, upsert=True)
|
||||||
print bar.date, bar.time
|
print(bar.date, bar.time)
|
||||||
|
|
||||||
print u'插入完毕,耗时:%s' % (time()-start)
|
print(u'插入完毕,耗时:%s' % (time()-start))
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
"""
|
"""
|
||||||
@ -186,7 +187,7 @@ def loadTdxCsv(fileName, dbName, symbol):
|
|||||||
"""将通达信导出的csv格式的历史分钟数据插入到Mongo数据库中"""
|
"""将通达信导出的csv格式的历史分钟数据插入到Mongo数据库中"""
|
||||||
start = time()
|
start = time()
|
||||||
date_correct = ""
|
date_correct = ""
|
||||||
print u'开始读取CSV文件%s中的数据插入到%s的%s中' %(fileName, dbName, symbol)
|
print(u'开始读取CSV文件%s中的数据插入到%s的%s中' %(fileName, dbName, symbol))
|
||||||
|
|
||||||
# 锁定集合,并创建索引
|
# 锁定集合,并创建索引
|
||||||
client = pymongo.MongoClient(globalSetting['mongoHost'], globalSetting['mongoPort'])
|
client = pymongo.MongoClient(globalSetting['mongoHost'], globalSetting['mongoPort'])
|
||||||
@ -218,7 +219,7 @@ def loadTdxCsv(fileName, dbName, symbol):
|
|||||||
flt = {'datetime': bar.datetime}
|
flt = {'datetime': bar.datetime}
|
||||||
collection.update_one(flt, {'$set':bar.__dict__}, upsert=True)
|
collection.update_one(flt, {'$set':bar.__dict__}, upsert=True)
|
||||||
|
|
||||||
print u'插入完毕,耗时:%s' % (time()-start)
|
print(u'插入完毕,耗时:%s' % (time()-start))
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
"""
|
"""
|
||||||
@ -231,7 +232,7 @@ def loadTdxLc1(fileName, dbName, symbol):
|
|||||||
"""将通达信导出的lc1格式的历史分钟数据插入到Mongo数据库中"""
|
"""将通达信导出的lc1格式的历史分钟数据插入到Mongo数据库中"""
|
||||||
start = time()
|
start = time()
|
||||||
|
|
||||||
print u'开始读取通达信Lc1文件%s中的数据插入到%s的%s中' %(fileName, dbName, symbol)
|
print(u'开始读取通达信Lc1文件%s中的数据插入到%s的%s中' %(fileName, dbName, symbol))
|
||||||
|
|
||||||
# 锁定集合,并创建索引
|
# 锁定集合,并创建索引
|
||||||
client = pymongo.MongoClient(globalSetting['mongoHost'], globalSetting['mongoPort'])
|
client = pymongo.MongoClient(globalSetting['mongoHost'], globalSetting['mongoPort'])
|
||||||
@ -267,13 +268,13 @@ def loadTdxLc1(fileName, dbName, symbol):
|
|||||||
flt = {'datetime': bar.datetime}
|
flt = {'datetime': bar.datetime}
|
||||||
collection.update_one(flt, {'$set':bar.__dict__}, upsert=True)
|
collection.update_one(flt, {'$set':bar.__dict__}, upsert=True)
|
||||||
|
|
||||||
print u'插入完毕,耗时:%s' % (time()-start)
|
print(u'插入完毕,耗时:%s' % (time()-start))
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
def loadOKEXCsv(fileName, dbName, symbol):
|
def loadOKEXCsv(fileName, dbName, symbol):
|
||||||
"""将OKEX导出的csv格式的历史分钟数据插入到Mongo数据库中"""
|
"""将OKEX导出的csv格式的历史分钟数据插入到Mongo数据库中"""
|
||||||
start = time()
|
start = time()
|
||||||
print u'开始读取CSV文件%s中的数据插入到%s的%s中' %(fileName, dbName, symbol)
|
print(u'开始读取CSV文件%s中的数据插入到%s的%s中' %(fileName, dbName, symbol))
|
||||||
|
|
||||||
# 锁定集合,并创建索引
|
# 锁定集合,并创建索引
|
||||||
client = pymongo.MongoClient(globalSetting['mongoHost'], globalSetting['mongoPort'])
|
client = pymongo.MongoClient(globalSetting['mongoHost'], globalSetting['mongoPort'])
|
||||||
@ -304,5 +305,5 @@ def loadOKEXCsv(fileName, dbName, symbol):
|
|||||||
collection.update_one(flt, {'$set':bar.__dict__}, upsert=True)
|
collection.update_one(flt, {'$set':bar.__dict__}, upsert=True)
|
||||||
print('%s \t %s' % (bar.date, bar.time))
|
print('%s \t %s' % (bar.date, bar.time))
|
||||||
|
|
||||||
print u'插入完毕,耗时:%s' % (time()-start)
|
print(u'插入完毕,耗时:%s' % (time()-start))
|
||||||
|
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
# encoding: UTF-8
|
# encoding: UTF-8
|
||||||
|
|
||||||
|
from __future__ import absolute_import
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
import traceback
|
import traceback
|
||||||
@ -10,4 +11,4 @@ from .chinese import text
|
|||||||
# 是否要使用英文
|
# 是否要使用英文
|
||||||
from vnpy.trader.vtGlobal import globalSetting
|
from vnpy.trader.vtGlobal import globalSetting
|
||||||
if globalSetting['language'] == 'english':
|
if globalSetting['language'] == 'english':
|
||||||
from english import text
|
from .english import text
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
'''
|
'''
|
||||||
动态载入所有的策略类
|
动态载入所有的策略类
|
||||||
'''
|
'''
|
||||||
|
from __future__ import print_function
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import importlib
|
import importlib
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
# encoding: UTF-8
|
# encoding: UTF-8
|
||||||
|
|
||||||
from drEngine import DrEngine
|
from __future__ import absolute_import
|
||||||
from uiDrWidget import DrEngineManager
|
from .drEngine import DrEngine
|
||||||
|
from .uiDrWidget import DrEngineManager
|
||||||
|
|
||||||
appName = 'DataRecorder'
|
appName = 'DataRecorder'
|
||||||
appDisplayName = u'行情记录'
|
appDisplayName = u'行情记录'
|
||||||
|
@ -1,13 +1,14 @@
|
|||||||
# encoding: UTF-8
|
# encoding: UTF-8
|
||||||
|
|
||||||
|
from __future__ import absolute_import
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
import traceback
|
import traceback
|
||||||
|
|
||||||
# 默认设置
|
# 默认设置
|
||||||
from chinese import text
|
from .chinese import text
|
||||||
|
|
||||||
# 是否要使用英文
|
# 是否要使用英文
|
||||||
from vnpy.trader.vtGlobal import globalSetting
|
from vnpy.trader.vtGlobal import globalSetting
|
||||||
if globalSetting['language'] == 'english':
|
if globalSetting['language'] == 'english':
|
||||||
from english import text
|
from .english import text
|
@ -1,7 +1,8 @@
|
|||||||
# encoding: UTF-8
|
# encoding: UTF-8
|
||||||
|
|
||||||
from jsEngine import JsEngine
|
from __future__ import absolute_import
|
||||||
from uiJsWidget import JsEngineManager
|
from .jsEngine import JsEngine
|
||||||
|
from .uiJsWidget import JsEngineManager
|
||||||
|
|
||||||
appName = 'JaqsService'
|
appName = 'JaqsService'
|
||||||
appDisplayName = u'Jaqs服务'
|
appDisplayName = u'Jaqs服务'
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
from __future__ import print_function
|
||||||
import zmq
|
import zmq
|
||||||
import Queue
|
import Queue
|
||||||
import threading
|
import threading
|
||||||
@ -108,11 +109,11 @@ class JRpcServer :
|
|||||||
#client_addr_map[client_id] = identity
|
#client_addr_map[client_id] = identity
|
||||||
self._on_data_arrived(identity, data)
|
self._on_data_arrived(identity, data)
|
||||||
|
|
||||||
except zmq.error.Again, e:
|
except zmq.error.Again as e:
|
||||||
#print "RECV timeout: ", e
|
#print "RECV timeout: ", e
|
||||||
pass
|
pass
|
||||||
except Exception, e:
|
except Exception as e:
|
||||||
print("_recv_run:", e)
|
print(("_recv_run:", e))
|
||||||
|
|
||||||
def _callback_run(self):
|
def _callback_run(self):
|
||||||
while not self._should_close:
|
while not self._should_close:
|
||||||
@ -120,12 +121,12 @@ class JRpcServer :
|
|||||||
r = self._callback_queue.get(timeout = 1)
|
r = self._callback_queue.get(timeout = 1)
|
||||||
if r :
|
if r :
|
||||||
r()
|
r()
|
||||||
except Queue.Empty, e:
|
except Queue.Empty as e:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
except Exception, e:
|
except Exception as e:
|
||||||
traceback.print_exc(e)
|
traceback.print_exc(e)
|
||||||
print "_callback_run", type(e), e
|
print("_callback_run", type(e), e)
|
||||||
|
|
||||||
def _async_call(self, func):
|
def _async_call(self, func):
|
||||||
self._callback_queue.put( func )
|
self._callback_queue.put( func )
|
||||||
@ -164,12 +165,12 @@ class JRpcServer :
|
|||||||
#print "RECV", msg
|
#print "RECV", msg
|
||||||
|
|
||||||
if not msg:
|
if not msg:
|
||||||
print "wrong message format"
|
print("wrong message format")
|
||||||
return
|
return
|
||||||
|
|
||||||
method = msg['method'] if msg.has_key('method') else None
|
method = msg['method'] if 'method' in msg else None
|
||||||
|
|
||||||
call_id = msg['id'] if msg.has_key('id') and msg['id'] else None
|
call_id = msg['id'] if 'id' in msg and msg['id'] else None
|
||||||
|
|
||||||
if call_id and method:
|
if call_id and method:
|
||||||
if method == ".sys.heartbeat":
|
if method == ".sys.heartbeat":
|
||||||
@ -183,8 +184,8 @@ class JRpcServer :
|
|||||||
if self.on_call :
|
if self.on_call :
|
||||||
self._async_call( lambda : self.on_call(identity, msg))
|
self._async_call( lambda : self.on_call(identity, msg))
|
||||||
|
|
||||||
except Exception, e:
|
except Exception as e:
|
||||||
print( "_on_data_arrived:", e)
|
print(( "_on_data_arrived:", e))
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
# encoding: UTF-8
|
# encoding: UTF-8
|
||||||
|
|
||||||
|
from __future__ import absolute_import
|
||||||
import json
|
import json
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
|
|
||||||
import jrpc_server
|
from . import jrpc_server
|
||||||
|
|
||||||
from vnpy.event import Event
|
from vnpy.event import Event
|
||||||
from vnpy.trader.vtFunction import getJsonPath
|
from vnpy.trader.vtFunction import getJsonPath
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
import jrpc_server
|
from __future__ import print_function
|
||||||
|
from __future__ import absolute_import
|
||||||
|
from . import jrpc_server
|
||||||
import time
|
import time
|
||||||
import pandas as pd
|
import pandas as pd
|
||||||
from qdata.database import DatabaseConn
|
from qdata.database import DatabaseConn
|
||||||
@ -15,7 +17,7 @@ db = None
|
|||||||
def on_call(client_id, req):
|
def on_call(client_id, req):
|
||||||
|
|
||||||
if req['method'] != '.sys.heartbeat':
|
if req['method'] != '.sys.heartbeat':
|
||||||
print "on_call", req
|
print("on_call", req)
|
||||||
|
|
||||||
if req['method'] == 'auth.login':
|
if req['method'] == 'auth.login':
|
||||||
server.send_rsp(client_id, req, result = { "username" : "fixme", "name": "fixme" })
|
server.send_rsp(client_id, req, result = { "username" : "fixme", "name": "fixme" })
|
||||||
@ -25,7 +27,7 @@ def on_call(client_id, req):
|
|||||||
server.send_rsp(client_id, req, error=[-1, "unknown method"])
|
server.send_rsp(client_id, req, error=[-1, "unknown method"])
|
||||||
return
|
return
|
||||||
|
|
||||||
if not req.has_key('params'):
|
if 'params' not in req:
|
||||||
server.send_rsp(client_id, req, error=[-1, "missing params"])
|
server.send_rsp(client_id, req, error=[-1, "missing params"])
|
||||||
return
|
return
|
||||||
|
|
||||||
@ -55,7 +57,7 @@ def run():
|
|||||||
server = jrpc_server.JRpcServer()
|
server = jrpc_server.JRpcServer()
|
||||||
server.on_call = on_call
|
server.on_call = on_call
|
||||||
addr = "tcp://%s:%s"%(st.HOST, st.PORT)
|
addr = "tcp://%s:%s"%(st.HOST, st.PORT)
|
||||||
print "listen at " + addr
|
print("listen at " + addr)
|
||||||
server.listen(addr)
|
server.listen(addr)
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
|
@ -159,9 +159,11 @@ class CalendarManager(QtWidgets.QWidget):
|
|||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
def runCalendarEditor():
|
def runCalendarEditor():
|
||||||
"""运行日历编辑器"""
|
"""运行日历编辑器"""
|
||||||
|
try: # Python 2
|
||||||
reload(sys)
|
reload(sys)
|
||||||
sys.setdefaultencoding('utf8')
|
sys.setdefaultencoding('utf8')
|
||||||
|
except NameError: # Python 3
|
||||||
|
pass
|
||||||
app = QtWidgets.QApplication(sys.argv)
|
app = QtWidgets.QApplication(sys.argv)
|
||||||
app.setFont(QtGui.QFont(u'微软雅黑', 12))
|
app.setFont(QtGui.QFont(u'微软雅黑', 12))
|
||||||
|
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
'''
|
'''
|
||||||
动态载入所有的策略类
|
动态载入所有的策略类
|
||||||
'''
|
'''
|
||||||
|
from __future__ import print_function
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import importlib
|
import importlib
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
# encoding: UTF-8
|
# encoding: UTF-8
|
||||||
|
|
||||||
|
from __future__ import absolute_import
|
||||||
from vnpy.event import Event
|
from vnpy.event import Event
|
||||||
|
|
||||||
from vnpy.trader.vtConstant import DIRECTION_LONG, DIRECTION_SHORT, OFFSET_OPEN, OFFSET_CLOSE, PRICETYPE_LIMITPRICE
|
from vnpy.trader.vtConstant import DIRECTION_LONG, DIRECTION_SHORT, OFFSET_OPEN, OFFSET_CLOSE, PRICETYPE_LIMITPRICE
|
||||||
@ -7,7 +8,7 @@ from vnpy.trader.vtObject import VtOrderReq
|
|||||||
from vnpy.trader.vtEvent import EVENT_TICK, EVENT_TRADE
|
from vnpy.trader.vtEvent import EVENT_TICK, EVENT_TRADE
|
||||||
from vnpy.trader.uiBasicWidget import WorkingOrderMonitor, PositionMonitor
|
from vnpy.trader.uiBasicWidget import WorkingOrderMonitor, PositionMonitor
|
||||||
|
|
||||||
from uiOmBase import *
|
from .uiOmBase import *
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -5,6 +5,8 @@ from __future__ import division
|
|||||||
import os
|
import os
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
|
from six import text_type
|
||||||
|
|
||||||
from vnpy.event import Event
|
from vnpy.event import Event
|
||||||
|
|
||||||
from .omBase import EVENT_OM_LOG
|
from .omBase import EVENT_OM_LOG
|
||||||
@ -113,7 +115,7 @@ class OmManager(QtWidgets.QWidget):
|
|||||||
def initOmEngine(self):
|
def initOmEngine(self):
|
||||||
"""初始化引擎"""
|
"""初始化引擎"""
|
||||||
path = os.getcwd()
|
path = os.getcwd()
|
||||||
fileName = unicode(self.comboSettingFile.currentText())
|
fileName = text_type(self.comboSettingFile.currentText())
|
||||||
fileName = os.path.join(path, fileName)
|
fileName = os.path.join(path, fileName)
|
||||||
result = self.omEngine.initEngine(fileName)
|
result = self.omEngine.initEngine(fileName)
|
||||||
|
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
# encoding: UTF-8
|
# encoding: UTF-8
|
||||||
|
|
||||||
|
from __future__ import absolute_import
|
||||||
from .rmEngine import RmEngine
|
from .rmEngine import RmEngine
|
||||||
from .uiRmWidget import RmEngineManager
|
from .uiRmWidget import RmEngineManager
|
||||||
|
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
# encoding: UTF-8
|
# encoding: UTF-8
|
||||||
|
|
||||||
|
from __future__ import absolute_import
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
import traceback
|
import traceback
|
||||||
@ -10,4 +11,4 @@ from .chinese import text
|
|||||||
# 是否要使用英文
|
# 是否要使用英文
|
||||||
from vnpy.trader.vtGlobal import globalSetting
|
from vnpy.trader.vtGlobal import globalSetting
|
||||||
if globalSetting['language'] == 'english':
|
if globalSetting['language'] == 'english':
|
||||||
from english import text
|
from .english import text
|
||||||
|
@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
|
|
||||||
|
from six import text_type
|
||||||
|
|
||||||
from vnpy.event import Event
|
from vnpy.event import Event
|
||||||
from vnpy.trader.uiQt import QtWidgets, QtCore
|
from vnpy.trader.uiQt import QtWidgets, QtCore
|
||||||
from vnpy.trader.uiBasicWidget import (BasicMonitor, BasicCell, PnlCell,
|
from vnpy.trader.uiBasicWidget import (BasicMonitor, BasicCell, PnlCell,
|
||||||
@ -338,7 +340,7 @@ class StModeComboBox(QtWidgets.QComboBox):
|
|||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
def setMode(self):
|
def setMode(self):
|
||||||
"""设置模式"""
|
"""设置模式"""
|
||||||
mode = unicode(self.currentText())
|
mode = text_type(self.currentText())
|
||||||
self.algoEngine.setAlgoMode(self.spreadName, mode)
|
self.algoEngine.setAlgoMode(self.spreadName, mode)
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
|
@ -353,11 +353,11 @@ class GatewayApi(BitfinexApi):
|
|||||||
|
|
||||||
# 常规行情更新
|
# 常规行情更新
|
||||||
if channel == 'ticker':
|
if channel == 'ticker':
|
||||||
tick.volume = l[-3]
|
tick.volume = float(l[-3])
|
||||||
tick.highPrice = l[-2]
|
tick.highPrice = float(l[-2])
|
||||||
tick.lowPrice = l[-1]
|
tick.lowPrice = float(l[-1])
|
||||||
tick.lastPrice = l[-4]
|
tick.lastPrice = float(l[-4])
|
||||||
tick.openPrice = tick.lastPrice - l[4]
|
tick.openPrice = float(tick.lastPrice - l[4])
|
||||||
# 深度报价更新
|
# 深度报价更新
|
||||||
elif channel == 'book':
|
elif channel == 'book':
|
||||||
bid = self.bidDict.setdefault(symbol, {})
|
bid = self.bidDict.setdefault(symbol, {})
|
||||||
@ -365,12 +365,20 @@ class GatewayApi(BitfinexApi):
|
|||||||
|
|
||||||
if len(l) > 3:
|
if len(l) > 3:
|
||||||
for price, count, amount in l:
|
for price, count, amount in l:
|
||||||
|
price = float(price)
|
||||||
|
count = int(count)
|
||||||
|
amount = float(amount)
|
||||||
|
|
||||||
if amount > 0:
|
if amount > 0:
|
||||||
bid[price] = amount
|
bid[price] = amount
|
||||||
else:
|
else:
|
||||||
ask[price] = -amount
|
ask[price] = -amount
|
||||||
else:
|
else:
|
||||||
price, count, amount = l
|
price, count, amount = l
|
||||||
|
price = float(price)
|
||||||
|
count = int(count)
|
||||||
|
amount = float(amount)
|
||||||
|
|
||||||
if not count:
|
if not count:
|
||||||
if price in bid:
|
if price in bid:
|
||||||
del bid[price]
|
del bid[price]
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
# encoding: UTF-8
|
# encoding: UTF-8
|
||||||
|
|
||||||
|
from __future__ import absolute_import
|
||||||
from vnpy.trader import vtConstant
|
from vnpy.trader import vtConstant
|
||||||
from cshshlpGateway import CshshlpGateway
|
from .cshshlpGateway import CshshlpGateway
|
||||||
|
|
||||||
gatewayClass = CshshlpGateway
|
gatewayClass = CshshlpGateway
|
||||||
gatewayName = 'CSHSHLP'
|
gatewayName = 'CSHSHLP'
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
# encoding: UTF-8
|
# encoding: UTF-8
|
||||||
|
|
||||||
|
from __future__ import absolute_import
|
||||||
from vnpy.trader import vtConstant
|
from vnpy.trader import vtConstant
|
||||||
from ctpGateway import CtpGateway
|
from .ctpGateway import CtpGateway
|
||||||
|
|
||||||
gatewayClass = CtpGateway
|
gatewayClass = CtpGateway
|
||||||
gatewayName = 'CTP'
|
gatewayName = 'CTP'
|
||||||
|
@ -1,15 +1,16 @@
|
|||||||
# encoding: UTF-8
|
# encoding: UTF-8
|
||||||
|
|
||||||
|
from __future__ import absolute_import
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
import traceback
|
import traceback
|
||||||
|
|
||||||
# 默认设置
|
# 默认设置
|
||||||
from chinese import text
|
from .chinese import text
|
||||||
|
|
||||||
# 获取全局配置
|
# 获取全局配置
|
||||||
from vnpy.trader.vtGlobal import globalSetting
|
from vnpy.trader.vtGlobal import globalSetting
|
||||||
|
|
||||||
# 打开配置文件,读取语言配置
|
# 打开配置文件,读取语言配置
|
||||||
if globalSetting['language'] == 'english':
|
if globalSetting['language'] == 'english':
|
||||||
from english import text
|
from .english import text
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
# encoding: UTF-8
|
# encoding: UTF-8
|
||||||
|
|
||||||
|
from __future__ import absolute_import
|
||||||
from vnpy.trader import vtConstant
|
from vnpy.trader import vtConstant
|
||||||
from femasGateway import FemasGateway
|
from .femasGateway import FemasGateway
|
||||||
|
|
||||||
gatewayClass = FemasGateway
|
gatewayClass = FemasGateway
|
||||||
gatewayName = 'FEMAS'
|
gatewayName = 'FEMAS'
|
||||||
|
@ -5,6 +5,7 @@ vn.femas的gateway接入
|
|||||||
|
|
||||||
考虑到飞马只对接期货(目前只有中金所), vtSymbol直接使用symbol
|
考虑到飞马只对接期货(目前只有中金所), vtSymbol直接使用symbol
|
||||||
'''
|
'''
|
||||||
|
from __future__ import print_function
|
||||||
|
|
||||||
|
|
||||||
import os
|
import os
|
||||||
@ -599,10 +600,10 @@ class FemasTdApi(TdApi):
|
|||||||
# 如果登录成功,推送日志信息
|
# 如果登录成功,推送日志信息
|
||||||
if error['ErrorID'] == 0:
|
if error['ErrorID'] == 0:
|
||||||
for k, v in data.items():
|
for k, v in data.items():
|
||||||
print k, ':', v
|
print(k, ':', v)
|
||||||
if data['MaxOrderLocalID']:
|
if data['MaxOrderLocalID']:
|
||||||
self.localID = int(data['MaxOrderLocalID']) # 目前最大本地报单号
|
self.localID = int(data['MaxOrderLocalID']) # 目前最大本地报单号
|
||||||
print 'id now', self.localID
|
print('id now', self.localID)
|
||||||
|
|
||||||
self.loginStatus = True
|
self.loginStatus = True
|
||||||
self.gateway.mdConnected = True
|
self.gateway.mdConnected = True
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
# encoding: UTF-8
|
# encoding: UTF-8
|
||||||
|
|
||||||
|
from __future__ import absolute_import
|
||||||
from vnpy.trader import vtConstant
|
from vnpy.trader import vtConstant
|
||||||
from .futuGateway import FutuGateway
|
from .futuGateway import FutuGateway
|
||||||
|
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
# encoding: UTF-8
|
# encoding: UTF-8
|
||||||
|
|
||||||
|
from __future__ import absolute_import
|
||||||
from vnpy.trader import vtConstant
|
from vnpy.trader import vtConstant
|
||||||
from fxcmGateway import FxcmGateway
|
from .fxcmGateway import FxcmGateway
|
||||||
|
|
||||||
gatewayClass = FxcmGateway
|
gatewayClass = FxcmGateway
|
||||||
gatewayName = 'FXCM'
|
gatewayName = 'FXCM'
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
# encoding: UTF-8
|
# encoding: UTF-8
|
||||||
|
|
||||||
|
from __future__ import print_function
|
||||||
import os
|
import os
|
||||||
import json
|
import json
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
@ -434,22 +435,22 @@ class Api(FxcmApi):
|
|||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
def onOpenTrade(self, data, reqid):
|
def onOpenTrade(self, data, reqid):
|
||||||
"""开仓回调"""
|
"""开仓回调"""
|
||||||
print data, reqid
|
print(data, reqid)
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
def onCloseTrade(self, data, reqid):
|
def onCloseTrade(self, data, reqid):
|
||||||
"""平仓回调"""
|
"""平仓回调"""
|
||||||
print data, reqid
|
print(data, reqid)
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
def onChangeOrder(self, data, reqid):
|
def onChangeOrder(self, data, reqid):
|
||||||
"""改单回调"""
|
"""改单回调"""
|
||||||
print data, reqid
|
print(data, reqid)
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
def onDeleteOrder(self, data, reqid):
|
def onDeleteOrder(self, data, reqid):
|
||||||
"""撤单回调"""
|
"""撤单回调"""
|
||||||
print data, reqid
|
print(data, reqid)
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
def onPriceUpdate(self, data):
|
def onPriceUpdate(self, data):
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
# encoding: UTF-8
|
# encoding: UTF-8
|
||||||
|
|
||||||
|
from __future__ import absolute_import
|
||||||
from vnpy.trader import vtConstant
|
from vnpy.trader import vtConstant
|
||||||
from huobiGateway import HuobiGateway
|
from .huobiGateway import HuobiGateway
|
||||||
|
|
||||||
gatewayClass = HuobiGateway
|
gatewayClass = HuobiGateway
|
||||||
gatewayName = 'HUOBI'
|
gatewayName = 'HUOBI'
|
||||||
|
@ -3,8 +3,8 @@
|
|||||||
'''
|
'''
|
||||||
vn.sec的gateway接入
|
vn.sec的gateway接入
|
||||||
'''
|
'''
|
||||||
|
from __future__ import print_function
|
||||||
|
|
||||||
import os
|
|
||||||
import json
|
import json
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
from copy import copy
|
from copy import copy
|
||||||
@ -12,7 +12,7 @@ from math import pow
|
|||||||
|
|
||||||
from vnpy.api.huobi import TradeApi, DataApi
|
from vnpy.api.huobi import TradeApi, DataApi
|
||||||
from vnpy.trader.vtGateway import *
|
from vnpy.trader.vtGateway import *
|
||||||
from vnpy.trader.vtFunction import getJsonPath, getTempPath
|
from vnpy.trader.vtFunction import getJsonPath
|
||||||
|
|
||||||
|
|
||||||
# 委托状态类型映射
|
# 委托状态类型映射
|
||||||
@ -29,11 +29,9 @@ statusMapReverse['canceled'] = STATUS_CANCELLED
|
|||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
def print_dict(d):
|
def print_dict(d):
|
||||||
""""""
|
""""""
|
||||||
print '-' * 30
|
print('-' * 30)
|
||||||
l = d.keys()
|
for key in sorted(d):
|
||||||
l.sort()
|
print('%s:%s' % (key, d[key]))
|
||||||
for k in l:
|
|
||||||
print '%s:%s' %(k, d[k])
|
|
||||||
|
|
||||||
|
|
||||||
########################################################################
|
########################################################################
|
||||||
@ -60,7 +58,7 @@ class HuobiGateway(VtGateway):
|
|||||||
def connect(self):
|
def connect(self):
|
||||||
"""连接"""
|
"""连接"""
|
||||||
try:
|
try:
|
||||||
f = file(self.filePath)
|
f = open(self.filePath)
|
||||||
except IOError:
|
except IOError:
|
||||||
log = VtLogData()
|
log = VtLogData()
|
||||||
log.gatewayName = self.gatewayName
|
log.gatewayName = self.gatewayName
|
||||||
@ -295,7 +293,7 @@ class HuobiDataApi(DataApi):
|
|||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
def onTradeDetail(self, data):
|
def onTradeDetail(self, data):
|
||||||
"""成交细节推送"""
|
"""成交细节推送"""
|
||||||
print data
|
print(data)
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
def onMarketDetail(self, data):
|
def onMarketDetail(self, data):
|
||||||
@ -698,7 +696,7 @@ class HuobiTradeApi(TradeApi):
|
|||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
def onGetMatchResult(self, data, reqid):
|
def onGetMatchResult(self, data, reqid):
|
||||||
"""查询单一成交回调"""
|
"""查询单一成交回调"""
|
||||||
print reqid, data
|
print(reqid, data)
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
def onPlaceOrder(self, data, reqid):
|
def onPlaceOrder(self, data, reqid):
|
||||||
@ -722,4 +720,4 @@ class HuobiTradeApi(TradeApi):
|
|||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
def onBatchCancel(self, data, reqid):
|
def onBatchCancel(self, data, reqid):
|
||||||
"""批量撤单回调"""
|
"""批量撤单回调"""
|
||||||
print reqid, data
|
print(reqid, data)
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
# encoding: UTF-8
|
# encoding: UTF-8
|
||||||
|
|
||||||
|
from __future__ import absolute_import
|
||||||
from vnpy.trader import vtConstant
|
from vnpy.trader import vtConstant
|
||||||
from ibGateway import IbGateway
|
from .ibGateway import IbGateway
|
||||||
|
|
||||||
gatewayClass = IbGateway
|
gatewayClass = IbGateway
|
||||||
gatewayName = 'IB'
|
gatewayName = 'IB'
|
||||||
|
@ -10,6 +10,7 @@ Interactive Brokers的gateway接入,已经替换为vn.ib封装。
|
|||||||
4. 目前只支持股票和期货交易,ib api里期权合约的确定是基于Contract对象的多个字段,比较复杂暂时没做
|
4. 目前只支持股票和期货交易,ib api里期权合约的确定是基于Contract对象的多个字段,比较复杂暂时没做
|
||||||
5. 海外市场的交易规则和国内有很多细节上的不同,所以一些字段类型的映射可能不合理,如果发现问题欢迎指出
|
5. 海外市场的交易规则和国内有很多细节上的不同,所以一些字段类型的映射可能不合理,如果发现问题欢迎指出
|
||||||
'''
|
'''
|
||||||
|
from __future__ import print_function
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import json
|
import json
|
||||||
@ -375,7 +376,7 @@ class IbWrapper(IbApi):
|
|||||||
newtick = copy(tick)
|
newtick = copy(tick)
|
||||||
self.gateway.onTick(newtick)
|
self.gateway.onTick(newtick)
|
||||||
else:
|
else:
|
||||||
print field
|
print(field)
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
def tickSize(self, tickerId, field, size):
|
def tickSize(self, tickerId, field, size):
|
||||||
@ -385,7 +386,7 @@ class IbWrapper(IbApi):
|
|||||||
key = tickFieldMap[field]
|
key = tickFieldMap[field]
|
||||||
tick.__setattr__(key, size)
|
tick.__setattr__(key, size)
|
||||||
else:
|
else:
|
||||||
print field
|
print(field)
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
def tickOptionComputation(self, tickerId, tickType, impliedVol, delta, optPrice, pvDividend, gamma, vega, theta, undPrice):
|
def tickOptionComputation(self, tickerId, tickType, impliedVol, delta, optPrice, pvDividend, gamma, vega, theta, undPrice):
|
||||||
|
@ -1,11 +1,12 @@
|
|||||||
# encoding: UTF-8
|
# encoding: UTF-8
|
||||||
|
|
||||||
|
from __future__ import absolute_import
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
import traceback
|
import traceback
|
||||||
|
|
||||||
# 默认设置
|
# 默认设置
|
||||||
from chinese import text
|
from .chinese import text
|
||||||
|
|
||||||
# 获取目录上级路径
|
# 获取目录上级路径
|
||||||
path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', '..'))
|
path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', '..'))
|
||||||
@ -14,10 +15,9 @@ SETTING_FILENAME = os.path.join(path, SETTING_FILENAME)
|
|||||||
|
|
||||||
# 打开配置文件,读取语言配置
|
# 打开配置文件,读取语言配置
|
||||||
try:
|
try:
|
||||||
f = file(SETTING_FILENAME)
|
with open(SETTING_FILENAME) as f:
|
||||||
setting = json.load(f)
|
setting = json.load(f)
|
||||||
if setting['language'] == 'english':
|
if setting['language'] == 'english':
|
||||||
from english import text
|
from .english import text
|
||||||
f.close()
|
except Exception:
|
||||||
except:
|
|
||||||
traceback.print_exc()
|
traceback.print_exc()
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
# encoding: UTF-8
|
# encoding: UTF-8
|
||||||
|
|
||||||
|
from __future__ import absolute_import
|
||||||
from vnpy.trader import vtConstant
|
from vnpy.trader import vtConstant
|
||||||
from ksgoldGateway import KsgoldGateway
|
from .ksgoldGateway import KsgoldGateway
|
||||||
|
|
||||||
gatewayClass = KsgoldGateway
|
gatewayClass = KsgoldGateway
|
||||||
gatewayName = 'KSGOLD'
|
gatewayName = 'KSGOLD'
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
# encoding: UTF-8
|
# encoding: UTF-8
|
||||||
|
|
||||||
|
from __future__ import absolute_import
|
||||||
from vnpy.trader import vtConstant
|
from vnpy.trader import vtConstant
|
||||||
from ksotpGateway import KsotpGateway
|
from .ksotpGateway import KsotpGateway
|
||||||
|
|
||||||
gatewayClass = KsotpGateway
|
gatewayClass = KsotpGateway
|
||||||
gatewayName = 'KSOTP'
|
gatewayName = 'KSOTP'
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
# encoding: UTF-8
|
# encoding: UTF-8
|
||||||
|
|
||||||
|
from __future__ import absolute_import
|
||||||
from vnpy.trader import vtConstant
|
from vnpy.trader import vtConstant
|
||||||
from lbankGateway import LbankGateway
|
from .lbankGateway import LbankGateway
|
||||||
|
|
||||||
gatewayClass = LbankGateway
|
gatewayClass = LbankGateway
|
||||||
gatewayName = 'LBANK'
|
gatewayName = 'LBANK'
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
'''
|
'''
|
||||||
vn.lhang的gateway接入
|
vn.lhang的gateway接入
|
||||||
'''
|
'''
|
||||||
|
from __future__ import print_function
|
||||||
|
|
||||||
|
|
||||||
import os
|
import os
|
||||||
@ -244,11 +245,11 @@ class LbankApi(LbankApi):
|
|||||||
# ----------------------------------------------------------------------
|
# ----------------------------------------------------------------------
|
||||||
def onGetTrades(self, data, req, reqID):
|
def onGetTrades(self, data, req, reqID):
|
||||||
"""查询历史成交"""
|
"""查询历史成交"""
|
||||||
print data, reqID
|
print(data, reqID)
|
||||||
|
|
||||||
# ----------------------------------------------------------------------
|
# ----------------------------------------------------------------------
|
||||||
def onGetKline(self, data, req, reqID):
|
def onGetKline(self, data, req, reqID):
|
||||||
print data, reqID
|
print(data, reqID)
|
||||||
|
|
||||||
# ----------------------------------------------------------------------
|
# ----------------------------------------------------------------------
|
||||||
def onGetUserInfo(self, data, req, reqID):
|
def onGetUserInfo(self, data, req, reqID):
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
# encoding: UTF-8
|
# encoding: UTF-8
|
||||||
|
|
||||||
|
from __future__ import absolute_import
|
||||||
from vnpy.trader import vtConstant
|
from vnpy.trader import vtConstant
|
||||||
from ltsGateway import LtsGateway
|
from .ltsGateway import LtsGateway
|
||||||
|
|
||||||
gatewayClass = LtsGateway
|
gatewayClass = LtsGateway
|
||||||
gatewayName = 'LTS'
|
gatewayName = 'LTS'
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
'''
|
'''
|
||||||
vn.lts的gateway接入
|
vn.lts的gateway接入
|
||||||
'''
|
'''
|
||||||
|
from __future__ import print_function
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import json
|
import json
|
||||||
@ -980,7 +981,7 @@ class LtsQryApi(QryApi):
|
|||||||
elif data['ProductClass'] == '8':
|
elif data['ProductClass'] == '8':
|
||||||
contract.productClass = PRODUCT_EQUITY
|
contract.productClass = PRODUCT_EQUITY
|
||||||
else:
|
else:
|
||||||
print data['ProductClass']
|
print(data['ProductClass'])
|
||||||
|
|
||||||
# 期权类型
|
# 期权类型
|
||||||
if data['InstrumentType'] == '1':
|
if data['InstrumentType'] == '1':
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
# encoding: UTF-8
|
# encoding: UTF-8
|
||||||
|
|
||||||
|
from __future__ import absolute_import
|
||||||
from vnpy.trader import vtConstant
|
from vnpy.trader import vtConstant
|
||||||
from oandaGateway import OandaGateway
|
from .oandaGateway import OandaGateway
|
||||||
|
|
||||||
gatewayClass = OandaGateway
|
gatewayClass = OandaGateway
|
||||||
gatewayName = 'OANDA'
|
gatewayName = 'OANDA'
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
# encoding: UTF-8
|
# encoding: UTF-8
|
||||||
|
|
||||||
|
from __future__ import absolute_import
|
||||||
from vnpy.trader import vtConstant
|
from vnpy.trader import vtConstant
|
||||||
from qdpGateway import QdpGateway
|
from .qdpGateway import QdpGateway
|
||||||
|
|
||||||
gatewayClass = QdpGateway
|
gatewayClass = QdpGateway
|
||||||
gatewayName = 'QDP'
|
gatewayName = 'QDP'
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
# encoding: UTF-8
|
# encoding: UTF-8
|
||||||
|
|
||||||
|
from __future__ import absolute_import
|
||||||
from vnpy.trader import vtConstant
|
from vnpy.trader import vtConstant
|
||||||
from secGateway import SecGateway
|
from .secGateway import SecGateway
|
||||||
|
|
||||||
gatewayClass = SecGateway
|
gatewayClass = SecGateway
|
||||||
gatewayName = 'SEC'
|
gatewayName = 'SEC'
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
'''
|
'''
|
||||||
vn.sec的gateway接入
|
vn.sec的gateway接入
|
||||||
'''
|
'''
|
||||||
|
from __future__ import print_function
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import json
|
import json
|
||||||
@ -50,11 +51,11 @@ exchangeMapReverse = {v:k for k,v in exchangeMap.items()}
|
|||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
def print_dict(d):
|
def print_dict(d):
|
||||||
""""""
|
""""""
|
||||||
print '-' * 30
|
print('-' * 30)
|
||||||
l = d.keys()
|
l = d.keys()
|
||||||
l.sort()
|
l.sort()
|
||||||
for k in l:
|
for k in l:
|
||||||
print '%s:%s' %(k, d[k])
|
print('%s:%s' %(k, d[k]))
|
||||||
|
|
||||||
|
|
||||||
########################################################################
|
########################################################################
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
# encoding: UTF-8
|
# encoding: UTF-8
|
||||||
|
|
||||||
|
from __future__ import absolute_import
|
||||||
from vnpy.trader import vtConstant
|
from vnpy.trader import vtConstant
|
||||||
from sgitGateway import SgitGateway
|
from .sgitGateway import SgitGateway
|
||||||
|
|
||||||
gatewayClass = SgitGateway
|
gatewayClass = SgitGateway
|
||||||
gatewayName = 'SGIT'
|
gatewayName = 'SGIT'
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
# encoding: UTF-8
|
# encoding: UTF-8
|
||||||
|
|
||||||
|
from __future__ import absolute_import
|
||||||
from vnpy.trader import vtConstant
|
from vnpy.trader import vtConstant
|
||||||
from shzdGateway import ShzdGateway
|
from .shzdGateway import ShzdGateway
|
||||||
|
|
||||||
gatewayClass = ShzdGateway
|
gatewayClass = ShzdGateway
|
||||||
gatewayName = 'SHZD'
|
gatewayName = 'SHZD'
|
||||||
|
@ -8,6 +8,7 @@ vn.shzd的gateway接入
|
|||||||
3. 持仓全部平光后,再次查询时会没有该合约的推送(和CTP不同),为了避免最后平仓
|
3. 持仓全部平光后,再次查询时会没有该合约的推送(和CTP不同),为了避免最后平仓
|
||||||
不更新的情况,使用缓存机制来处理
|
不更新的情况,使用缓存机制来处理
|
||||||
'''
|
'''
|
||||||
|
from __future__ import print_function
|
||||||
|
|
||||||
|
|
||||||
import os
|
import os
|
||||||
@ -721,9 +722,9 @@ class ShzdGatewayApi(ShzdApi):
|
|||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
def printDict(d):
|
def printDict(d):
|
||||||
"""打印字典"""
|
"""打印字典"""
|
||||||
print '-' * 50
|
print('-' * 50)
|
||||||
l = d.keys()
|
l = d.keys()
|
||||||
l.sort()
|
l.sort()
|
||||||
for k in l:
|
for k in l:
|
||||||
print k, ':', d[k]
|
print(k, ':', d[k])
|
||||||
|
|
@ -570,7 +570,7 @@ class TkproDataApi(object):
|
|||||||
tick.lowerLimit = data['limit_down']
|
tick.lowerLimit = data['limit_down']
|
||||||
|
|
||||||
self.gateway.onTick(tick)
|
self.gateway.onTick(tick)
|
||||||
except Exception, e:
|
except Exception as e:
|
||||||
self.writeLog(u'行情更新失败,错误信息:%s' % str(e))
|
self.writeLog(u'行情更新失败,错误信息:%s' % str(e))
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
# encoding: UTF-8
|
# encoding: UTF-8
|
||||||
|
|
||||||
|
from __future__ import absolute_import
|
||||||
from vnpy.trader import vtConstant
|
from vnpy.trader import vtConstant
|
||||||
from windGateway import WindGateway
|
from .windGateway import WindGateway
|
||||||
|
|
||||||
gatewayClass = WindGateway
|
gatewayClass = WindGateway
|
||||||
gatewayName = 'WIND'
|
gatewayName = 'WIND'
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
'''
|
'''
|
||||||
Wind Python API的gateway接入
|
Wind Python API的gateway接入
|
||||||
'''
|
'''
|
||||||
|
from __future__ import print_function
|
||||||
|
|
||||||
from copy import copy
|
from copy import copy
|
||||||
|
|
||||||
@ -11,7 +12,7 @@ w = None
|
|||||||
try:
|
try:
|
||||||
from WindPy import w
|
from WindPy import w
|
||||||
except ImportError:
|
except ImportError:
|
||||||
print u'请先安装WindPy接口'
|
print(u'请先安装WindPy接口')
|
||||||
|
|
||||||
from vnpy.trader.vtGateway import *
|
from vnpy.trader.vtGateway import *
|
||||||
|
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
# encoding: UTF-8
|
# encoding: UTF-8
|
||||||
|
|
||||||
|
from __future__ import absolute_import
|
||||||
from vnpy.trader import vtConstant
|
from vnpy.trader import vtConstant
|
||||||
from xspeedGateway import XspeedGateway
|
from .xspeedGateway import XspeedGateway
|
||||||
|
|
||||||
gatewayClass = XspeedGateway
|
gatewayClass = XspeedGateway
|
||||||
gatewayName = 'XSPEED'
|
gatewayName = 'XSPEED'
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
# encoding: UTF-8
|
# encoding: UTF-8
|
||||||
|
|
||||||
|
from __future__ import absolute_import
|
||||||
from vnpy.trader import vtConstant
|
from vnpy.trader import vtConstant
|
||||||
from xtpGateway import XtpGateway
|
from .xtpGateway import XtpGateway
|
||||||
|
|
||||||
gatewayClass = XtpGateway
|
gatewayClass = XtpGateway
|
||||||
gatewayName = 'XTP'
|
gatewayName = 'XTP'
|
||||||
|
@ -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