Skip to content

Commit

Permalink
Merge pull request vnpy#630 from vnpy/beta
Browse files Browse the repository at this point in the history
Beta
  • Loading branch information
vnpy committed Dec 8, 2017
2 parents 4bca563 + f1a7856 commit 16c616e
Show file tree
Hide file tree
Showing 210 changed files with 49,746 additions and 3,825 deletions.
18 changes: 9 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ vn.py是基于Python的开源量化交易程序开发框架,起源于国内私

### 项目结构

1. 丰富的Python交易和数据API接口(vnpy.api),基本覆盖了国内外所有常规交易品种(股票、期货、期权、外汇、外盘、比特币),具体包括:
1. 丰富的Python交易API接口(vnpy.api),基本覆盖了国内外所有常规交易品种(股票、期货、期权、外汇、外盘、比特币),具体包括:

- CTP(ctp)

Expand Down Expand Up @@ -41,9 +41,7 @@ vn.py是基于Python的开源量化交易程序开发框架,起源于国内私

- 火币(huobi)

- 链行(lhang)

- 通联数据(datayes)
- LBank(lbank)

2. 简洁易用的事件驱动引擎(vnpy.event),作为事件驱动型交易程序的核心

Expand All @@ -53,7 +51,7 @@ vn.py是基于Python的开源量化交易程序开发框架,起源于国内私

* 同时登录多个交易接口,在一套界面上监控多种市场的行情和多种资产账户的资金、持仓、委托、成交情况

* 支持跨市场套利(CTP期货和LTS证券)、境内外套利(CTP期货和IB外盘)、多市场数据整合实时预测走势(CTP的股指期货数据、IB的外盘A50数据、Wind的行业指数数据)等策略应用
* 支持跨市场套利(CTP期货和XTP证券)、境内外套利(CTP期货和IB外盘)、多市场数据整合实时预测走势(CTP的股指期货数据、IB的外盘A50数据、Wind的行业指数数据)等策略应用

* CTA策略引擎模块,在保持易用性的同时,允许用户针对CTA类策略运行过程中委托的报撤行为进行细粒度控制(降低交易滑点、实现高频策略)

Expand Down Expand Up @@ -148,10 +146,11 @@ from vnpy.trader.uiMainWindow import MainWindow
# 加载底层接口
from vnpy.trader.gateway import (ctpGateway, oandaGateway, ibGateway,
huobiGateway, okcoinGateway)
tkproGateway)
if system == 'Windows':
from vnpy.trader.gateway import femasGateway, xspeedGateway
from vnpy.trader.gateway import (femasGateway, xspeedGateway,
futuGateway, secGateway)
if system == 'Linux':
from vnpy.trader.gateway import xtpGateway
Expand All @@ -174,14 +173,15 @@ def main():
# 添加交易接口
me.addGateway(ctpGateway)
me.addGateway(tkproGateway)
me.addGateway(oandaGateway)
me.addGateway(ibGateway)
me.addGateway(huobiGateway)
me.addGateway(okcoinGateway)
if system == 'Windows':
me.addGateway(femasGateway)
me.addGateway(xspeedGateway)
me.addGateway(secGateway)
me.addGateway(futuGateway)
if system == 'Linux':
me.addGateway(xtpGateway)
Expand Down
4 changes: 2 additions & 2 deletions docker/dockerTrader/tmp/CTP_connect.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"password": "325800",
"userID": "901201302",
"password": "",
"userID": "",
"brokerID": "1080",
"tdAddress": "tcp://180.169.112.52:41205",
"mdAddress": "tcp://180.169.112.52:41213"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@
"%matplotlib inline\n",
"\n",
"from vnpy.trader.app.ctaStrategy.ctaBacktesting import BacktestingEngine, OptimizationSetting, MINUTE_DB_NAME\n",
"from vnpy.trader.app.ctaStrategy.strategy.strategyAtrRsi import AtrRsiStrategy"
"from vnpy.trader.app.ctaStrategy.strategy.strategyAtrRsi import AtrRsiStrategy\n",
"from vnpy.trader.app.ctaStrategy.strategy.strategyMultiTimeframe import MultiTimeframeStrategy"
]
},
{
Expand Down Expand Up @@ -66,7 +67,8 @@
"source": [
"# 在引擎中创建策略对象\n",
"d = {'atrLength': 11} # 策略参数配置\n",
"engine.initStrategy(AtrRsiStrategy, d) # 创建策略对象"
"#engine.initStrategy(AtrRsiStrategy, d) # 创建策略对象\n",
"engine.initStrategy(MultiTimeframeStrategy, d) # 创建策略对象"
]
},
{
Expand Down

Large diffs are not rendered by default.

79 changes: 68 additions & 11 deletions examples/CtaBacktesting/backtesting_IF.ipynb

Large diffs are not rendered by default.

87 changes: 44 additions & 43 deletions examples/CtaBacktesting/backtesting_portfolio.ipynb

Large diffs are not rendered by default.

64 changes: 32 additions & 32 deletions examples/CtaBacktesting/backtesting_rb.ipynb

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion examples/CtaTrading/runCtaTrading.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ def runChildProcess():
me.connect('CTP')
le.info(u'连接CTP接口')

sleep(5) # 等待CTP接口初始化
sleep(10) # 等待CTP接口初始化

cta = me.getApp(ctaStrategy.appName)

Expand Down
5 changes: 5 additions & 0 deletions examples/FutuDataService/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
## 富途证券历史数据服务

本数据服务主要用于获取港股、美股的日内行情数据(1分钟线)更新,默认设置为每日5点自动运行。

使用前请参考futuquant的[使用文档](https://futunnopen.github.io/futuquant/setup/Hist_KLine_Download_Intro.html),配置富途牛牛客户端的历史数据自动更新功能。
6 changes: 6 additions & 0 deletions examples/FutuDataService/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"MONGO_HOST": "localhost",
"MONGO_PORT": 27017,

"SYMBOLS": ["HK.00001", "HK.00002"]
}
94 changes: 94 additions & 0 deletions examples/FutuDataService/dataService.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
# encoding: UTF-8

import sys
import json
from datetime import datetime, timedelta
from time import time, sleep

from pymongo import MongoClient, ASCENDING

from vnpy.trader.vtObject import VtBarData
from vnpy.trader.app.ctaStrategy.ctaBase import MINUTE_DB_NAME

import futuquant as ft

# 加载配置
config = open('config.json')
setting = json.load(config)

MONGO_HOST = setting['MONGO_HOST']
MONGO_PORT = setting['MONGO_PORT']
SYMBOLS = setting['SYMBOLS']

mc = MongoClient(MONGO_HOST, MONGO_PORT) # Mongo连接
db = mc[MINUTE_DB_NAME] # 数据库
quote = ft.OpenQuoteContext() # 富途行情接口
today = datetime.now().date()
startDate = (today - timedelta(10)).strftime('%Y-%m-%d') # 数据下载起始日期


#----------------------------------------------------------------------
def generateVtBar(row):
"""生成K线"""
bar = VtBarData()

bar.symbol = row['code']
bar.exchange = ''
bar.vtSymbol = bar.symbol
bar.open = row['open']
bar.high = row['high']
bar.low = row['low']
bar.close = row['close']
bar.volume = row['volume']
bar.datetime = datetime.strptime(row['time_key'], '%Y-%m-%d %H:%M:%S')
bar.date = bar.datetime.strftime("%Y%m%d")
bar.time = bar.datetime.strftime("%H:%M:%S")

return bar

#----------------------------------------------------------------------
def downMinuteBarBySymbol(symbol):
"""下载某一合约的分钟线数据"""
start = time()

cl = db[symbol]
cl.ensure_index([('datetime', ASCENDING)], unique=True) # 添加索引

code, data = quote.get_history_kline(symbol, start=startDate, ktype='K_1M')
if code:
print u'合约%s数据下载失败:%s' %(symbol, data)
return

data = data.sort_index()

for ix, row in data.iterrows():
bar = generateVtBar(row)
d = bar.__dict__
flt = {'datetime': bar.datetime}
cl.replace_one(flt, d, True)

end = time()
cost = (end - start) * 1000

print u'合约%s数据下载完成%s - %s,耗时%s毫秒' %(symbol, data.iloc[0]['time_key'],
data.iloc[-1]['time_key'], cost)


#----------------------------------------------------------------------
def downloadAllMinuteBar():
"""下载所有配置中的合约的分钟线数据"""
print '-' * 50
print u'开始下载合约分钟线数据'
print '-' * 50

# 添加下载任务
for symbol in SYMBOLS:
downMinuteBarBySymbol(str(symbol))

print '-' * 50
print u'合约分钟线数据下载完成'
print '-' * 50




11 changes: 11 additions & 0 deletions examples/FutuDataService/downloadData.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# encoding: UTF-8

"""
立即下载数据到数据库中,用于手动执行更新操作。
"""

from dataService import *


if __name__ == '__main__':
downloadAllMinuteBar()
32 changes: 32 additions & 0 deletions examples/FutuDataService/runService.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# encoding: UTF-8

"""
定时服务,可无人值守运行,实现每日自动下载更新历史行情数据到数据库中。
"""

import time
import datetime

from dataService import downloadAllMinuteBar


if __name__ == '__main__':
taskCompletedDate = None

# 注意这里的任务时间,必须在富途牛牛更新完当日本地数据后
taskTime = datetime.time(hour=17, minute=0)

# 进入主循环
while True:
t = datetime.datetime.now()

# 每天到达任务下载时间后,执行数据下载的操作
if t.time() > taskTime and (taskCompletedDate is None or t.date() != taskCompletedDate):
downloadAllMinuteBar()

# 更新任务完成的日期
taskCompletedDate = t.date()
else:
print u'当前时间%s,任务定时%s' %(t, taskTime)

time.sleep(60)
7 changes: 7 additions & 0 deletions examples/OptionMaster/CTPSEC_connect.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"brokerID": "2001",
"mdAddress": "tcp://125.64.36.26:51213",
"tdAddress": "tcp://125.64.36.26:51205",
"userID": "请联系经纪商申请",
"password": "请联系经纪商申请"
}
7 changes: 7 additions & 0 deletions examples/OptionMaster/CTP_connect.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"brokerID": "2001",
"mdAddress": "tcp://125.64.36.26:51213",
"tdAddress": "tcp://125.64.36.26:51205",
"userID": "请联系经纪商申请",
"password": "请联系经纪商申请"
}
10 changes: 10 additions & 0 deletions examples/OptionMaster/RM_setting.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"orderFlowClear": 1,
"orderCancelLimit": 10,
"marginRatioLimit": 0.85,
"workingOrderLimit": 20,
"tradeLimit": 1000,
"orderSizeLimit": 100,
"active": false,
"orderFlowLimit": 50
}
6 changes: 6 additions & 0 deletions examples/OptionMaster/SEC_connect.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"accountID": "110100001088",
"password": "123456",
"mdAddress": "tcp://203.86.95.187:10915",
"tdAddress": "tcp://203.86.95.187:10910"
}
18 changes: 18 additions & 0 deletions examples/OptionMaster/VT_setting.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"fontFamily": "微软雅黑",
"fontSize": 12,

"mongoHost": "localhost",
"mongoPort": 27017,
"mongoLogging": true,

"darkStyle": true,
"language": "chinese",

"logActive": true,
"logLevel": "debug",
"logConsole": true,
"logFile": true,

"tdPenalty": ["IF", "IH", "IC"]
}
10 changes: 10 additions & 0 deletions examples/OptionMaster/ctpsecGateway/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# encoding: UTF-8

from vnpy.trader import vtConstant
from vnpy.trader.gateway.ctpGateway import CtpGateway

gatewayClass = CtpGateway
gatewayName = 'CTPSEC'
gatewayDisplayName = 'CTP证券'
gatewayType = vtConstant.GATEWAYTYPE_FUTURES
gatewayQryEnabled = True
57 changes: 57 additions & 0 deletions examples/OptionMaster/run.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
# encoding: UTF-8

# 重载sys模块,设置默认字符串编码方式为utf8
import sys
reload(sys)
sys.setdefaultencoding('utf8')

# 判断操作系统
import platform
system = platform.system()

# vn.trader模块
from vnpy.event import EventEngine
from vnpy.trader.vtEngine import MainEngine
from vnpy.trader.uiQt import createQApp
from vnpy.trader.uiMainWindow import MainWindow

# 加载底层接口
from vnpy.trader.gateway import (secGateway, ctpGateway)

import ctpsecGateway

# 加载上层应用
from vnpy.trader.app import (riskManager, optionMaster)


#----------------------------------------------------------------------
def main():
"""主程序入口"""
# 创建Qt应用对象
qApp = createQApp()

# 创建事件引擎
ee = EventEngine()

# 创建主引擎
me = MainEngine(ee)

# 添加交易接口
me.addGateway(secGateway)
me.addGateway(ctpGateway)
me.addGateway(ctpsecGateway)

# 添加上层应用
me.addApp(riskManager)
me.addApp(optionMaster)

# 创建主窗口
mw = MainWindow(me, ee)
mw.showMaximized()

# 在主线程中启动Qt事件循环
sys.exit(qApp.exec_())


if __name__ == '__main__':
main()
3 changes: 3 additions & 0 deletions examples/QuantosDataService/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# quantOS历史行情服务

请在[www.quantos.org](www.quantos.org)注册后,将用户名和TOKEN输入到配置文件config.json中,即可使用该服务。
10 changes: 10 additions & 0 deletions examples/QuantosDataService/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"MONGO_HOST": "localhost",
"MONGO_PORT": 27017,

"DATA_SERVER": "tcp://data.tushare.org:8910",
"USERNAME": "",
"TOKEN": "",

"SYMBOLS": ["510050.SSE", "510300.SSE"]
}
Loading

0 comments on commit 16c616e

Please sign in to comment.