Skip to content

Commit

Permalink
Merge branch 'dev' into dev
Browse files Browse the repository at this point in the history
  • Loading branch information
vnpy authored Dec 12, 2019
2 parents a3bddf8 + 68e589d commit 1c0674b
Show file tree
Hide file tree
Showing 22 changed files with 108 additions and 146 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# Python
*.pyc
*.pyo
*.egg-info/

# Jupyter
Expand Down Expand Up @@ -33,4 +34,4 @@ _static
_templates

# Misc
.DS_Store
.DS_Store
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,8 @@ vn.py是一套基于Python的开源量化交易系统开发框架,于2015年1

* script_trader:脚本策略模块,针对多标的组合类交易策略设计,同时也可以直接在命令行中实现REPL指令形式的交易,不支持回测功能

* portfolio_manager:投资组合模块,面向各类基本面交易策略,以独立的策略子账户为基础,提供交易仓位的自动跟踪以及盈亏实时统计功能

* rpc_service:RPC服务模块,允许将某一VN Trader进程启动为服务端,作为统一的行情和交易路由通道,允许多客户端同时连接,实现多进程分布式系统

* csv_loader:CSV历史数据加载器,用于加载CSV格式文件中的历史数据到平台数据库中,用于策略的回测研究以及实盘初始化等功能,支持自定义数据表头格式
Expand All @@ -130,7 +132,7 @@ vn.py是一套基于Python的开源量化交易系统开发框架,于2015年1

## 环境准备

* 推荐使用vn.py团队为量化交易专门打造的Python发行版[VNStudio-2.0.7](https://download.vnpy.com/vnstudio-2.0.7.exe),内置了最新版的vn.py框架以及VN Station量化管理平台,无需手动安装
* 推荐使用vn.py团队为量化交易专门打造的Python发行版[VNStudio-2.0.8](https://download.vnpy.com/vnstudio-2.0.8.exe),内置了最新版的vn.py框架以及VN Station量化管理平台,无需手动安装
* 支持的系统版本:Windows 7以上/Windows Server 2008以上/Ubuntu 18.04 LTS
* 支持的Python版本:Python 3.7 64位(**注意必须是Python 3.7 64位版本**

Expand Down
64 changes: 0 additions & 64 deletions appveyor.yml

This file was deleted.

1 change: 1 addition & 0 deletions docs/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ vn.py项目文档
data_recoder.md
algo_trader.md
script_trader.md
spread_trading.md
rpc_service.md
gateway.md
database.md
Expand Down
8 changes: 4 additions & 4 deletions examples/vn_trader/run.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from vnpy.gateway.bitmex import BitmexGateway
# from vnpy.gateway.futu import FutuGateway
# from vnpy.gateway.ib import IbGateway
# from vnpy.gateway.ctp import CtpGateway
from vnpy.gateway.ctp import CtpGateway
# from vnpy.gateway.ctptest import CtptestGateway
# from vnpy.gateway.mini import MiniGateway
# from vnpy.gateway.sopt import SoptGateway
Expand Down Expand Up @@ -36,7 +36,7 @@
# from vnpy.app.cta_strategy import CtaStrategyApp
# from vnpy.app.csv_loader import CsvLoaderApp
# from vnpy.app.algo_trading import AlgoTradingApp
# from vnpy.app.cta_backtester import CtaBacktesterApp
from vnpy.app.cta_backtester import CtaBacktesterApp
# from vnpy.app.data_recorder import DataRecorderApp
# from vnpy.app.risk_manager import RiskManagerApp
# from vnpy.app.script_trader import ScriptTraderApp
Expand All @@ -54,7 +54,7 @@ def main():
main_engine = MainEngine(event_engine)

# main_engine.add_gateway(BinanceGateway)
# main_engine.add_gateway(CtpGateway)
main_engine.add_gateway(CtpGateway)
# main_engine.add_gateway(CtptestGateway)
# main_engine.add_gateway(MiniGateway)
# main_engine.add_gateway(SoptGateway)
Expand Down Expand Up @@ -83,7 +83,7 @@ def main():
main_engine.add_gateway(BybitGateway)

# main_engine.add_app(CtaStrategyApp)
# main_engine.add_app(CtaBacktesterApp)
main_engine.add_app(CtaBacktesterApp)
# main_engine.add_app(CsvLoaderApp)
# main_engine.add_app(AlgoTradingApp)
# main_engine.add_app(DataRecorderApp)
Expand Down
1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ pymysql
psycopg2
mongoengine
numpy
pandas==0.24.2
matplotlib
seaborn
futu-api
Expand Down
7 changes: 6 additions & 1 deletion vnpy/app/cta_strategy/backtesting.py
Original file line number Diff line number Diff line change
Expand Up @@ -895,7 +895,12 @@ def cross_stop_order(self):
self.strategy.on_trade(trade)

def load_bar(
self, vt_symbol: str, days: int, interval: Interval, callback: Callable
self,
vt_symbol: str,
days: int,
interval: Interval,
callback: Callable,
use_database: bool
):
""""""
self.days = days
Expand Down
38 changes: 21 additions & 17 deletions vnpy/app/cta_strategy/engine.py
Original file line number Diff line number Diff line change
Expand Up @@ -514,29 +514,33 @@ def load_bar(
vt_symbol: str,
days: int,
interval: Interval,
callback: Callable[[BarData], None]
callback: Callable[[BarData], None],
use_database: bool
):
""""""
symbol, exchange = extract_vt_symbol(vt_symbol)
end = datetime.now()
start = end - timedelta(days)
bars = []

# Pass gateway and RQData if use_database set to True
if not use_database:
# Query bars from gateway if available
contract = self.main_engine.get_contract(vt_symbol)

if contract and contract.history_data:
req = HistoryRequest(
symbol=symbol,
exchange=exchange,
interval=interval,
start=start,
end=end
)
bars = self.main_engine.query_history(req, contract.gateway_name)

# Query bars from gateway if available
contract = self.main_engine.get_contract(vt_symbol)

if contract and contract.history_data:
req = HistoryRequest(
symbol=symbol,
exchange=exchange,
interval=interval,
start=start,
end=end
)
bars = self.main_engine.query_history(req, contract.gateway_name)

# Try to query bars from RQData, if not found, load from database.
else:
bars = self.query_bar_from_rq(symbol, exchange, interval, start, end)
# Try to query bars from RQData, if not found, load from database.
else:
bars = self.query_bar_from_rq(symbol, exchange, interval, start, end)

if not bars:
bars = database_manager.load_bar_data(
Expand Down
4 changes: 1 addition & 3 deletions vnpy/app/cta_strategy/strategies/atr_rsi_strategy.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,7 @@ class AtrRsiStrategy(CtaTemplate):

def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
""""""
super(AtrRsiStrategy, self).__init__(
cta_engine, strategy_name, vt_symbol, setting
)
super().__init__(cta_engine, strategy_name, vt_symbol, setting)
self.bg = BarGenerator(self.on_bar)
self.am = ArrayManager()

Expand Down
4 changes: 1 addition & 3 deletions vnpy/app/cta_strategy/strategies/boll_channel_strategy.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,7 @@ class BollChannelStrategy(CtaTemplate):

def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
""""""
super(BollChannelStrategy, self).__init__(
cta_engine, strategy_name, vt_symbol, setting
)
super().__init__(cta_engine, strategy_name, vt_symbol, setting)

self.bg = BarGenerator(self.on_bar, 15, self.on_15min_bar)
self.am = ArrayManager()
Expand Down
4 changes: 1 addition & 3 deletions vnpy/app/cta_strategy/strategies/double_ma_strategy.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,7 @@ class DoubleMaStrategy(CtaTemplate):

def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
""""""
super(DoubleMaStrategy, self).__init__(
cta_engine, strategy_name, vt_symbol, setting
)
super().__init__(cta_engine, strategy_name, vt_symbol, setting)

self.bg = BarGenerator(self.on_bar)
self.am = ArrayManager()
Expand Down
6 changes: 2 additions & 4 deletions vnpy/app/cta_strategy/strategies/dual_thrust_strategy.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,11 @@ class DualThrustStrategy(CtaTemplate):
short_entered = False

parameters = ["k1", "k2", "fixed_size"]
variables = ["range", "long_entry", "short_entry", "exit_time"]
variables = ["range", "long_entry", "short_entry"]

def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
""""""
super(DualThrustStrategy, self).__init__(
cta_engine, strategy_name, vt_symbol, setting
)
super().__init__(cta_engine, strategy_name, vt_symbol, setting)

self.bg = BarGenerator(self.on_bar)
self.am = ArrayManager()
Expand Down
10 changes: 4 additions & 6 deletions vnpy/app/cta_strategy/strategies/multi_signal_strategy.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ class RsiSignal(CtaSignal):

def __init__(self, rsi_window: int, rsi_level: float):
"""Constructor"""
super(RsiSignal, self).__init__()
super().__init__()

self.rsi_window = rsi_window
self.rsi_level = rsi_level
Expand Down Expand Up @@ -55,7 +55,7 @@ class CciSignal(CtaSignal):

def __init__(self, cci_window: int, cci_level: float):
""""""
super(CciSignal, self).__init__()
super().__init__()

self.cci_window = cci_window
self.cci_level = cci_level
Expand Down Expand Up @@ -94,7 +94,7 @@ class MaSignal(CtaSignal):

def __init__(self, fast_window: int, slow_window: int):
""""""
super(MaSignal, self).__init__()
super().__init__()

self.fast_window = fast_window
self.slow_window = slow_window
Expand Down Expand Up @@ -151,9 +151,7 @@ class MultiSignalStrategy(TargetPosTemplate):

def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
""""""
super(MultiSignalStrategy, self).__init__(
cta_engine, strategy_name, vt_symbol, setting
)
super().__init__(cta_engine, strategy_name, vt_symbol, setting)

self.rsi_signal = RsiSignal(self.rsi_window, self.rsi_level)
self.cci_signal = CciSignal(self.cci_window, self.cci_level)
Expand Down
4 changes: 1 addition & 3 deletions vnpy/app/cta_strategy/strategies/multi_timeframe_strategy.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,7 @@ class MultiTimeframeStrategy(CtaTemplate):

def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
""""""
super(MultiTimeframeStrategy, self).__init__(
cta_engine, strategy_name, vt_symbol, setting
)
super().__init__(cta_engine, strategy_name, vt_symbol, setting)

self.rsi_long = 50 + self.rsi_signal
self.rsi_short = 50 - self.rsi_signal
Expand Down
4 changes: 1 addition & 3 deletions vnpy/app/cta_strategy/strategies/turtle_signal_strategy.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,7 @@ class TurtleSignalStrategy(CtaTemplate):

def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
""""""
super(TurtleSignalStrategy, self).__init__(
cta_engine, strategy_name, vt_symbol, setting
)
super().__init__(cta_engine, strategy_name, vt_symbol, setting)

self.bg = BarGenerator(self.on_bar)
self.am = ArrayManager()
Expand Down
9 changes: 8 additions & 1 deletion vnpy/app/cta_strategy/template.py
Original file line number Diff line number Diff line change
Expand Up @@ -223,14 +223,21 @@ def load_bar(
days: int,
interval: Interval = Interval.MINUTE,
callback: Callable = None,
use_database: bool = False
):
"""
Load historical bar data for initializing strategy.
"""
if not callback:
callback = self.on_bar

self.cta_engine.load_bar(self.vt_symbol, days, interval, callback)
self.cta_engine.load_bar(
self.vt_symbol,
days,
interval,
callback,
use_database
)

def load_tick(self, days: int):
"""
Expand Down
2 changes: 1 addition & 1 deletion vnpy/app/spread_trading/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -287,7 +287,7 @@ def calculate_pos(self):
if long_pos > 0:
self.net_pos = long_pos
else:
self.net_pos = short_pos
self.net_pos = -short_pos

def clear_price(self):
""""""
Expand Down
5 changes: 3 additions & 2 deletions vnpy/gateway/bybit/bybit_gateway.py
Original file line number Diff line number Diff line change
Expand Up @@ -532,8 +532,9 @@ def query_history(self, req: HistoryRequest) -> List[BarData]:
else:
data = resp.json()

ret_msg = data["ret_msg"]
if ret_msg != "ok":
ret_code = data["ret_code"]
if ret_code:
ret_msg = data["ret_msg"]
msg = f"获取历史数据出错,错误信息:{ret_msg}"
self.gateway.write_log(msg)
break
Expand Down
Loading

0 comments on commit 1c0674b

Please sign in to comment.