"""
不要用来跑实盘, CincoStrategy策略还有很多需要迭代的地方, 以下代码仅供学习参考使用
"""
from typing import Any
from vnpy.app.cta_strategy import (ArrayManager, BarData, BarGenerator,
CtaTemplate, OrderData, StopOrder, TickData,
TradeData)
class CincoStrategy(CtaTemplate):
""""""
author = "Post-Truth"
boll_window = 42
boll_dev = 2
trailing_long = 0.65
trailing_short = 0.7
atr_window = 10
risk_level = 100
boll_up = 0
boll_down = 0
trading_size = 0
intra_trade_high = 0
intra_trade_low = 0
long_stop = 0
short_stop = 0
atr_value = 0
parameters = [
"boll_window",
"boll_dev",
"trailing_long",
"trailing_short",
"fixed_size",
"atr_window",
"risk_level",
]
variables = [
"boll_up",
"boll_down",
"trading_size",
"intra_trade_high",
"intra_trade_low",
"long_stop",
"short_stop",
"atr_value",
]
def __init__(
self,
cta_engine: Any,
strategy_name: str,
vt_symbol: str,
setting: dict,
):
""""""
super().__init__(cta_engine, strategy_name, vt_symbol, setting)
self.bar_generator_15 = BarGenerator(
on_bar=self.on_bar,
window=15,
on_window_bar=self.on_15min_bar,
interval=Interval.MINITE
)
self.array_manager_15 = ArrayManager()
def on_init(self):
"""
Callback when strategy is inited.
"""
pass
def on_start(self):
"""
Callback when strategy is started.
"""
pass
def on_stop(self):
"""
Callback when strategy is stopped.
"""
pass
def on_tick(self, tick: TickData):
"""
Callback of new tick data update.
"""
self.bar_generator_15.update_tick(tick)
def on_bar(self, bar: BarData):
"""
Callback of new bar data update.
"""
self.bar_generator_15.update_bar(bar)
def on_15min_bar(self, bar: BarData):
self.cancel_all()
self.array_manager_15.update_bar(bar)
if self.array_manager_15.inited is False:
return
self.boll_up, self.boll_down = self.array_manager_15.boll(self.boll_window, self.boll_dev)
boll_width = self.boll_up - self.boll_down
if self.pos == 0:
self.atr_value = self.array_manager_15.atr(self.atr_window)
self.trading_size = int(self.risk_level / self.atr_value)
self.intra_trade_high = bar.high_price
self.intra_trade_low = bar.low_price
self.long_stop = 0
self.short_stop = 0
self.buy(self.boll_up, self.trading_size, stop=True)
self.short(self.boll_down, self.trading_size, stop=True)
elif self.pos > 0:
self.intra_trade_high = max(self.intra_trade_high, bar.high_price)
self.long_stop = self.intra_trade_high - self.trailing_long * boll_width
self.sell(self.long_stop, self.trading_size, stop=True)
elif self.pos < 0:
self.intra_trade_low = min(self.intra_trade_low, bar.low_price)
self.short_stop = self.intra_trade_low + self.trailing_short * boll_width
self.cover(self.short_stop, self.trading_size, stop=True)
def on_trade(self, trade: TradeData):
"""
Callback of new trade data update.
"""
pass
def on_order(self, order: OrderData):
"""
Callback of new order data update.
"""
pass
def on_stop_order(self, stop_order: StopOrder):
"""
Callback of stop order update.
"""
pass