[Add] add load history data function to cta live trading engine

This commit is contained in:
vn.py 2019-02-16 10:13:22 +08:00
parent e29345503b
commit 95052ce822
6 changed files with 116 additions and 138 deletions

3
.gitignore vendored
View File

@ -1,6 +1,9 @@
# Python
*.pyc
# Jupyter
.ipynb_checkpoints
# IDE
.vscode
.idea

View File

@ -1,84 +0,0 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#%%\n",
"from vnpy.app.cta_strategy.backtesting import BacktestingEngine\n",
"from vnpy.app.cta_strategy.strategies.turtle_signal_strategy import (\n",
" TurtleSignalStrategy,\n",
")\n",
"from datetime import datetime"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#%%\n",
"engine = BacktestingEngine()\n",
"engine.set_parameters(\n",
" vt_symbol=\"IF88.CFFEX\",\n",
" interval=\"1m\",\n",
" start=datetime(2013, 1, 1),\n",
" end=datetime(2015, 3, 30),\n",
" rate=0,\n",
" slippage=0,\n",
" size=300,\n",
" pricetick=0.2,\n",
" capital=1_000_000,\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": false
},
"outputs": [],
"source": [
"#%%\n",
"engine.add_strategy(TurtleSignalStrategy, {})\n",
"engine.load_data()\n",
"engine.run_backtesting()\n",
"df = engine.calculate_result()\n",
"engine.calculate_statistics()\n",
"engine.show_chart()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.1"
}
},
"nbformat": 4,
"nbformat_minor": 2
}

File diff suppressed because one or more lines are too long

View File

@ -165,13 +165,13 @@ class BacktestingEngine:
mode: BacktestingMode = BacktestingMode.BAR,
):
""""""
self.mode = mode # 1
self.vt_symbol = vt_symbol # 2
self.mode = mode
self.vt_symbol = vt_symbol
self.interval = interval
self.rate = rate # 3
self.slippage = slippage # 4
self.size = size #
self.pricetick = pricetick #
self.rate = rate
self.slippage = slippage
self.size = size
self.pricetick = pricetick
self.start = start
self.symbol, exchange_str = self.vt_symbol.split(".")
@ -790,6 +790,12 @@ class BacktestingEngine:
msg = f"{self.datetime}\t{msg}"
self.logs.append(msg)
def send_email(self, msg: str, strategy: CtaTemplate = None):
"""
Send email to default receiver.
"""
pass
def get_engine_type(self):
"""
Return engine type.

View File

@ -7,6 +7,7 @@ import traceback
from collections import defaultdict
from pathlib import Path
from typing import Any, Callable
from datetime import datetime, timedelta
from vnpy.event import Event, EventEngine
from vnpy.trader.engine import BaseEngine, MainEngine
@ -19,6 +20,7 @@ from vnpy.trader.object import (
from vnpy.trader.event import EVENT_TICK, EVENT_ORDER, EVENT_TRADE
from vnpy.trader.constant import Direction, PriceType, Interval
from vnpy.trader.utility import get_temp_path
from vnpy.trader.database import DbTickData, DbBarData
from .base import (
EVENT_CTA_LOG,
@ -46,19 +48,19 @@ class CtaEngine(BaseEngine):
super(CtaEngine, self).__init__(
main_engine, event_engine, "CtaStrategy")
self.setting_file = None # setting file object
self.setting_file = None # setting file object
self.classes = {} # class_name: stategy_class
self.strategies = {} # strategy_name: strategy
self.classes = {} # class_name: stategy_class
self.strategies = {} # strategy_name: strategy
self.symbol_strategy_map = defaultdict(
list) # vt_symbol: strategy list
list) # vt_symbol: strategy list
self.orderid_strategy_map = {} # vt_orderid: strategy
self.strategy_orderid_map = defaultdict(
set) # strategy_name: orderid list
set) # strategy_name: orderid list
self.stop_order_count = 0 # for generating stop_orderid
self.stop_orders = {} # stop_orderid: stop_order
self.stop_order_count = 0 # for generating stop_orderid
self.stop_orders = {} # stop_orderid: stop_order
def init_engine(self):
"""
@ -320,11 +322,40 @@ class CtaEngine(BaseEngine):
self, vt_symbol: str, days: int, interval: Interval, callback: Callable
):
""""""
pass
end = datetime.now()
start = end - timedelta(days)
s = (
DbBarData.select()
.where(
(DbBarData.vt_symbol == vt_symbol) &
(DbBarData.interval == interval) &
(DbBarData.datetime >= start) &
(DbBarData.datetime <= end)
)
.order_by(DbBarData.datetime)
)
for bar in s:
callback(bar)
def load_tick(self, vt_symbol: str, days: int, callback: Callable):
""""""
pass
end = datetime.now()
start = end - timedelta(days)
s = (
DbTickData.select()
.where(
(DbBarData.vt_symbol == vt_symbol) &
(DbBarData.datetime >= start) &
(DbBarData.datetime <= end)
)
.order_by(DbBarData.datetime)
)
for tick in s:
callback(tick)
def call_strategy_func(
self, strategy: CtaTemplate, func: Callable, params: Any = None
@ -586,3 +617,14 @@ class CtaEngine(BaseEngine):
log = LogData(msg=msg, gateway_name="CtaStrategy")
event = Event(type=EVENT_CTA_LOG, data=log)
self.event_engine.put(event)
def send_email(self, msg: str, strategy: CtaTemplate = None):
"""
Send email to default receiver.
"""
if strategy:
subject = f"{strategy.name}"
else:
subject = "CTA策略引擎"
self.main_engine.send_email(subject, msg)

View File

@ -226,3 +226,14 @@ class CtaTemplate(ABC):
Put an strategy data event for ui update.
"""
self.cta_engine.put_strategy_event(self)
def send_email(self, msg):
"""
Send email to default receiver.
"""
self.cta_engine.send_email(msg, self)
def save_variables(self):
"""
"""
self.cta_engine.save_strategy_variables(self)