Merge branch 'dev' of https://github.com/vnpy/vnpy into dev

This commit is contained in:
vn.py 2018-06-11 17:12:55 +08:00
commit 8d1e429d65
53 changed files with 248 additions and 132 deletions

View 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
1 templateName settingName vtSymbol direction targetPrice totalVolume time interval priceLevel minVolume
2 TWAP BUY_BTC_TWAP BTCUSD.BITFINEX 4000 10 200 10 3 1
3 TWAP SELL_BTC_TWAP BTCUSD.BITFINEX 9000 10 200 10 3 1

View File

@ -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)

View File

@ -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)

View File

@ -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 = []

View File

@ -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))

View File

@ -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

View File

@ -3,6 +3,7 @@
''' '''
动态载入所有的策略类 动态载入所有的策略类
''' '''
from __future__ import print_function
import os import os
import importlib import importlib

View File

@ -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'行情记录'

View File

@ -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

View File

@ -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服务'

View File

@ -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

View File

@ -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

View File

@ -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:

View File

@ -159,9 +159,11 @@ class CalendarManager(QtWidgets.QWidget):
#---------------------------------------------------------------------- #----------------------------------------------------------------------
def runCalendarEditor(): def runCalendarEditor():
"""运行日历编辑器""" """运行日历编辑器"""
reload(sys) try: # Python 2
sys.setdefaultencoding('utf8') reload(sys)
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))

View File

@ -3,6 +3,7 @@
''' '''
动态载入所有的策略类 动态载入所有的策略类
''' '''
from __future__ import print_function
import os import os
import importlib import importlib

View File

@ -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 *

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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)
#---------------------------------------------------------------------- #----------------------------------------------------------------------

View File

@ -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]

View File

@ -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'

View File

@ -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'

View File

@ -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

View File

@ -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'

View File

@ -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

View File

@ -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

View File

@ -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'

View File

@ -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):

View File

@ -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'

View File

@ -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)

View File

@ -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'

View File

@ -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):

View File

@ -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()

View File

@ -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'

View File

@ -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'

View File

@ -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'

View File

@ -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):

View File

@ -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'

View File

@ -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':

View File

@ -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'

View File

@ -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'

View File

@ -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'

View File

@ -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]))
######################################################################## ########################################################################

View File

@ -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'

View File

@ -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'

View File

@ -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])

View File

@ -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))
#---------------------------------------------------------------------- #----------------------------------------------------------------------

View File

@ -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'

View File

@ -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 *

View File

@ -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'

View File

@ -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'

View File

@ -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():