Merge pull request #288 from vnpy/dev

Dev
This commit is contained in:
vn.py 2017-04-12 22:39:53 +08:00 committed by GitHub
commit 41a8d2f7df
14 changed files with 109 additions and 45 deletions

3
.gitignore vendored
View File

@ -1,4 +1,4 @@
# C++源代码 # C++源代码
ipch/ ipch/
Release/ Release/
@ -50,3 +50,4 @@ vn.lts/build/*
vn.trader/ctaAlgo/data/* vn.trader/ctaAlgo/data/*
vn.trader/build/* vn.trader/build/*
vn.trader/dist/* vn.trader/dist/*
*.bak

View File

@ -7,5 +7,5 @@
"mongoLogging": true, "mongoLogging": true,
"darkStyle": true, "darkStyle": true,
"language": "English" "language": "english"
} }

View File

@ -436,6 +436,52 @@ def loadTdxCsv(fileName, dbName, symbol):
print u'插入完毕,耗时:%s' % (time()-start) print u'插入完毕,耗时:%s' % (time()-start)
#----------------------------------------------------------------------
def loadTBCsv(fileName, dbName, symbol):
"""将TradeBlazer导出的csv格式的历史数据插入到Mongo数据库中
数据样本
//时间,开盘价,最高价,最低价,收盘价,成交量,持仓量
2017/04/05 09:00,3200,3240,3173,3187,312690,2453850
"""
import csv
start = time()
print u'开始读取CSV文件%s中的数据插入到%s%s' %(fileName, dbName, symbol)
# 锁定集合,并创建索引
host, port, logging = loadMongoSetting()
client = pymongo.MongoClient(host, port)
collection = client[dbName][symbol]
collection.ensure_index([('datetime', pymongo.ASCENDING)], unique=True)
# 读取数据和插入到数据库
reader = csv.reader(file(fileName, 'r'))
for d in reader:
if len(d[0]) > 10:
bar = CtaBarData()
bar.vtSymbol = symbol
bar.symbol = symbol
bar.datetime = datetime.strptime(d[0], '%Y/%m/%d %H:%M')
bar.date = bar.datetime.date().strftime('%Y%m%d')
bar.time = bar.datetime.time().strftime('%H:%M:%S')
bar.open = float(d[1])
bar.high = float(d[2])
bar.low = float(d[3])
bar.close = float(d[4])
bar.volume = float(d[5])
bar.openInterest = float(d[6])
flt = {'datetime': bar.datetime}
collection.update_one(flt, {'$set':bar.__dict__}, upsert=True)
print '%s \t %s' % (bar.date, bar.time)
print u'插入完毕,耗时:%s' % (time()-start)
if __name__ == '__main__': if __name__ == '__main__':
## 简单的测试脚本可以写在这里 ## 简单的测试脚本可以写在这里
#from time import sleep #from time import sleep

View File

@ -5,7 +5,7 @@ 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__), '..', '..'))
@ -16,8 +16,8 @@ SETTING_FILENAME = os.path.join(path, SETTING_FILENAME)
try: try:
f = file(SETTING_FILENAME) f = file(SETTING_FILENAME)
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() f.close()
except: except:
traceback.print_exc() traceback.print_exc()

View File

@ -5,7 +5,7 @@ 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__), '..', '..'))
@ -16,8 +16,8 @@ SETTING_FILENAME = os.path.join(path, SETTING_FILENAME)
try: try:
f = file(SETTING_FILENAME) f = file(SETTING_FILENAME)
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() f.close()
except: except:
traceback.print_exc() traceback.print_exc()

View File

@ -1,7 +1,7 @@
{ {
"brokerID": "9999", "brokerID": "9999",
"tdAddress": "tcp://180.168.146.187:10000", "tdAddress": "tcp://180.168.146.187:10000",
"password": "simnow申请", "password": "19890624",
"mdAddress": "tcp://180.168.212.228:41213", "mdAddress": "tcp://180.168.146.187:10010",
"userID": "simnow申请" "userID": "000300"
} }

View File

@ -710,6 +710,7 @@ class CtpTdApi(TdApi):
pos.positionProfit += data['PositionProfit'] pos.positionProfit += data['PositionProfit']
# 计算持仓均价 # 计算持仓均价
if pos.position:
pos.price = (cost + data['PositionCost']) / pos.position pos.price = (cost + data['PositionCost']) / pos.position
# 读取冻结 # 读取冻结

View File

@ -5,10 +5,10 @@ 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__), '..', '..', '..'))
SETTING_FILENAME = 'VT_setting.json' SETTING_FILENAME = 'VT_setting.json'
SETTING_FILENAME = os.path.join(path, SETTING_FILENAME) SETTING_FILENAME = os.path.join(path, SETTING_FILENAME)
@ -16,8 +16,8 @@ SETTING_FILENAME = os.path.join(path, SETTING_FILENAME)
try: try:
f = file(SETTING_FILENAME) f = file(SETTING_FILENAME)
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() f.close()
except: except:
traceback.print_exc() traceback.print_exc()

View File

@ -5,10 +5,10 @@ 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__), '..', '..', '..'))
SETTING_FILENAME = 'VT_setting.json' SETTING_FILENAME = 'VT_setting.json'
SETTING_FILENAME = os.path.join(path, SETTING_FILENAME) SETTING_FILENAME = os.path.join(path, SETTING_FILENAME)
@ -16,8 +16,8 @@ SETTING_FILENAME = os.path.join(path, SETTING_FILENAME)
try: try:
f = file(SETTING_FILENAME) f = file(SETTING_FILENAME)
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() f.close()
except: except:
traceback.print_exc() traceback.print_exc()

View File

@ -4,7 +4,7 @@ import json
import os import os
# 默认设置 # 默认设置
from Chinese import text, constant from chinese import text, constant
# 获取目录上级路径 # 获取目录上级路径
path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
@ -15,8 +15,8 @@ SETTING_FILENAME = os.path.join(path, SETTING_FILENAME)
try: try:
f = file(SETTING_FILENAME) f = file(SETTING_FILENAME)
setting = json.load(f) setting = json.load(f)
if setting['language'] == 'English': if setting['language'] == 'english':
from English import text, constant from english import text, constant
f.close() f.close()
except: except:
pass pass

View File

@ -124,3 +124,10 @@ CONNECT = u'连接'
CPU_MEMORY_INFO = u'CPU使用率{cpu}% 内存使用率:{memory}%' CPU_MEMORY_INFO = u'CPU使用率{cpu}% 内存使用率:{memory}%'
CONFIRM_EXIT = u'确认退出?' CONFIRM_EXIT = u'确认退出?'
GATEWAY_NOT_EXIST = u'接口不存在:{gateway}'
DATABASE_CONNECTING_COMPLETED = u'MongoDB连接成功'
DATABASE_CONNECTING_FAILED = u'MongoDB连接失败'
DATA_INSERT_FAILED = u'数据插入失败MongoDB没有连接'
DATA_QUERY_FAILED = u'数据查询失败MongoDB没有连接'
DATA_UPDATE_FAILED = u'数据更新失败MongoDB没有连接'

View File

@ -87,11 +87,11 @@ ASK_PRICE_3 = u'Ask Price 3'
ASK_PRICE_4 = u'Ask Price 4' ASK_PRICE_4 = u'Ask Price 4'
ASK_PRICE_5 = u'Ask Price 5' ASK_PRICE_5 = u'Ask Price 5'
BID_VOLUME_1 = u'Bid Price 1' BID_VOLUME_1 = u'Bid Volume 1'
BID_VOLUME_2 = u'Bid Price 2' BID_VOLUME_2 = u'Bid Volume 2'
BID_VOLUME_3 = u'Bid Price 3' BID_VOLUME_3 = u'Bid Volume 3'
BID_VOLUME_4 = u'Bid Price 4' BID_VOLUME_4 = u'Bid Volume 4'
BID_VOLUME_5 = u'Bid Price 5' BID_VOLUME_5 = u'Bid Volume 5'
ASK_VOLUME_1 = u'Ask Volume 1' ASK_VOLUME_1 = u'Ask Volume 1'
ASK_VOLUME_2 = u'Ask Volume 2' ASK_VOLUME_2 = u'Ask Volume 2'
ASK_VOLUME_3 = u'Ask Volume 3' ASK_VOLUME_3 = u'Ask Volume 3'
@ -124,3 +124,10 @@ CONNECT = u'Connect '
CPU_MEMORY_INFO = u'CPU Usage{cpu}% Memory Usage{memory}%' CPU_MEMORY_INFO = u'CPU Usage{cpu}% Memory Usage{memory}%'
CONFIRM_EXIT = u'Confirm Exit' CONFIRM_EXIT = u'Confirm Exit'
GATEWAY_NOT_EXIST = u"Can't find the gateway{gateway}"
DATABASE_CONNECTING_COMPLETED = u'MongoDB is connected.'
DATABASE_CONNECTING_FAILED = u'Failed to connect to MongoDB.'
DATA_INSERT_FAILED = u'Data insert failedplease connect MongoDB first.'
DATA_QUERY_FAILED = u'Data query failed, please connect MongoDB first.'
DATA_UPDATE_FAILED = u'Data update failed, please connect MongoDB first.'

View File

@ -5,7 +5,7 @@ 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__), '..', '..'))
@ -16,8 +16,8 @@ SETTING_FILENAME = os.path.join(path, SETTING_FILENAME)
try: try:
f = file(SETTING_FILENAME) f = file(SETTING_FILENAME)
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() f.close()
except: except:
traceback.print_exc() traceback.print_exc()

View File

@ -10,6 +10,7 @@ from pymongo.errors import ConnectionFailure
from eventEngine import * from eventEngine import *
from vtGateway import * from vtGateway import *
from vtFunction import loadMongoSetting from vtFunction import loadMongoSetting
from language import text
from gateway import GATEWAY_DICT from gateway import GATEWAY_DICT
from ctaStrategy.ctaEngine import CtaEngine from ctaStrategy.ctaEngine import CtaEngine
@ -75,7 +76,7 @@ class MainEngine(object):
# 接口连接后自动执行数据库连接的任务 # 接口连接后自动执行数据库连接的任务
self.dbConnect() self.dbConnect()
else: else:
self.writeLog(u'接口不存在:%s' %gatewayName) self.writeLog(text.GATEWAY_NOT_EXIST.format(gateway=gatewayName))
#---------------------------------------------------------------------- #----------------------------------------------------------------------
def subscribe(self, subscribeReq, gatewayName): def subscribe(self, subscribeReq, gatewayName):
@ -84,7 +85,7 @@ class MainEngine(object):
gateway = self.gatewayDict[gatewayName] gateway = self.gatewayDict[gatewayName]
gateway.subscribe(subscribeReq) gateway.subscribe(subscribeReq)
else: else:
self.writeLog(u'接口不存在:%s' %gatewayName) self.writeLog(text.GATEWAY_NOT_EXIST.format(gateway=gatewayName))
#---------------------------------------------------------------------- #----------------------------------------------------------------------
def sendOrder(self, orderReq, gatewayName): def sendOrder(self, orderReq, gatewayName):
@ -97,7 +98,7 @@ class MainEngine(object):
gateway = self.gatewayDict[gatewayName] gateway = self.gatewayDict[gatewayName]
return gateway.sendOrder(orderReq) return gateway.sendOrder(orderReq)
else: else:
self.writeLog(u'接口不存在:%s' %gatewayName) self.writeLog(text.GATEWAY_NOT_EXIST.format(gateway=gatewayName))
#---------------------------------------------------------------------- #----------------------------------------------------------------------
def cancelOrder(self, cancelOrderReq, gatewayName): def cancelOrder(self, cancelOrderReq, gatewayName):
@ -106,7 +107,8 @@ class MainEngine(object):
gateway = self.gatewayDict[gatewayName] gateway = self.gatewayDict[gatewayName]
gateway.cancelOrder(cancelOrderReq) gateway.cancelOrder(cancelOrderReq)
else: else:
self.writeLog(u'接口不存在:%s' %gatewayName) self.writeLog(text.GATEWAY_NOT_EXIST.format(gateway=gatewayName))
#---------------------------------------------------------------------- #----------------------------------------------------------------------
def qryAccount(self, gatewayName): def qryAccount(self, gatewayName):
@ -115,7 +117,7 @@ class MainEngine(object):
gateway = self.gatewayDict[gatewayName] gateway = self.gatewayDict[gatewayName]
gateway.qryAccount() gateway.qryAccount()
else: else:
self.writeLog(u'接口不存在:%s' %gatewayName) self.writeLog(text.GATEWAY_NOT_EXIST.format(gateway=gatewayName))
#---------------------------------------------------------------------- #----------------------------------------------------------------------
def qryPosition(self, gatewayName): def qryPosition(self, gatewayName):
@ -124,7 +126,7 @@ class MainEngine(object):
gateway = self.gatewayDict[gatewayName] gateway = self.gatewayDict[gatewayName]
gateway.qryPosition() gateway.qryPosition()
else: else:
self.writeLog(u'接口不存在:%s' %gatewayName) self.writeLog(text.GATEWAY_NOT_EXIST.format(gateway=gatewayName))
#---------------------------------------------------------------------- #----------------------------------------------------------------------
def exit(self): def exit(self):
@ -165,14 +167,14 @@ class MainEngine(object):
# 调用server_info查询服务器状态防止服务器异常并未连接成功 # 调用server_info查询服务器状态防止服务器异常并未连接成功
self.dbClient.server_info() self.dbClient.server_info()
self.writeLog(u'MongoDB连接成功') self.writeLog(text.DATABASE_CONNECTING_COMPLETED)
# 如果启动日志记录,则注册日志事件监听函数 # 如果启动日志记录,则注册日志事件监听函数
if logging: if logging:
self.eventEngine.register(EVENT_LOG, self.dbLogging) self.eventEngine.register(EVENT_LOG, self.dbLogging)
except ConnectionFailure: except ConnectionFailure:
self.writeLog(u'MongoDB连接失败') self.writeLog(text.DATABASE_CONNECTING_FAILED)
#---------------------------------------------------------------------- #----------------------------------------------------------------------
def dbInsert(self, dbName, collectionName, d): def dbInsert(self, dbName, collectionName, d):
@ -182,7 +184,7 @@ class MainEngine(object):
collection = db[collectionName] collection = db[collectionName]
collection.insert_one(d) collection.insert_one(d)
else: else:
self.writeLog(u'数据插入失败MongoDB没有连接') self.writeLog(text.DATA_INSERT_FAILED)
#---------------------------------------------------------------------- #----------------------------------------------------------------------
def dbQuery(self, dbName, collectionName, d): def dbQuery(self, dbName, collectionName, d):
@ -196,7 +198,7 @@ class MainEngine(object):
else: else:
return [] return []
else: else:
self.writeLog(u'数据查询失败MongoDB没有连接') self.writeLog(text.DATA_QUERY_FAILED)
return [] return []
#---------------------------------------------------------------------- #----------------------------------------------------------------------
@ -207,7 +209,7 @@ class MainEngine(object):
collection = db[collectionName] collection = db[collectionName]
collection.replace_one(flt, d, upsert) collection.replace_one(flt, d, upsert)
else: else:
self.writeLog(u'数据更新失败MongoDB没有连接') self.writeLog(text.DATA_UPDATE_FAILED)
#---------------------------------------------------------------------- #----------------------------------------------------------------------
def dbLogging(self, event): def dbLogging(self, event):