ui界面如图,成交记录为空,无委托发出(委托记录也是空的)
代码如下(和内置的双均线策略比对修改过,目前几乎是完全一样的):
from vnpy_ctastrategy import (
CtaTemplate,
StopOrder,
TickData,
BarData,
TradeData,
OrderData,
BarGenerator,
ArrayManager,
)
class DemoStrategy(CtaTemplate):
""""""
author: str = "abc"
#定义参数(parameter列表)
fast_window = 10
slow_window = 20
#定义变量(t时刻均线的数值和t-1时刻均线的数值,ma0是当前数值)
fast_ma0 = 0.0
fast_ma1 = 0.0
slow_ma0 = 0.0
slow_ma1 = 0.0
parameters: list = [
"fast_window",
"slow_window"
]
variables: list = [
"fast_ma0",
"fast_ma1",
"slow_ma0",
"slow_ma1"
]
def __init__(
self,
cta_engine,
strategy_name: str,
vt_symbol: str,
setting: dict,
) -> None:
super().__init__(cta_engine, strategy_name, vt_symbol, setting)
self.bg = BarGenerator(self, on_bar)
self.am = ArrayManager()
def on_init(self):
"""写策略日志,策略初始化"""
self.write_log("策略初始化")
"""加载均线"""
self.load_bar(10)
def on_start(self):
"""启动"""
self.write_log("策略启动")
self.put_event()
def on_stop(self):
"""停止"""
self.write_log("策略停止")
self.put_event()
def on_tick(self, tick:TickData):
self.bg.update_tick(tick)
"""双均线策略"""
def on_bar(self, bar:BarData):
"""k线更新"""
am = self.am
am.update_bar(bar)
if am.inited:
return
#计算技术指标
fast_ma = am.sma(self.fast_window, array = True)
self.fast_ma0 = fast_ma[-1]
self.fast_ma1 = fast_ma[-2]
slow_ma = am.sma(self.fast_window, array = True)
self.slow_ma0 = slow_ma[-1]
self.slow_ma1 = slow_ma[-2]
#判断均线交叉
cross_over = (self.fast_ma0 > self.slow_ma0 and
self.fast_ma1 < self.slow_ma1)
cross_below = (self.fast_ma0 < self.slow_ma0 and
self.fast_ma1 > self.slow_ma1)
#如果金叉,做多(空仓时,非空仓可不操作,有空单先平空单,price为挂单价格,5只是一个示例)
if cross_over:
price = bar.close_price + 5
if self.pos == 0:
self.buy(price, 1)
elif self.pos < 0:
self.cover(price, 1)
self.buy(price, 1)
#如果死叉,做空,仓位为零时做空,不为零时先平仓
elif cross_below:
price = bar.close_price - 5
if self.pos == 0:
self.short(price, 1)
elif self.pos > 0:
self.sell(price, 1)
self.short(price, 1)
#更新图形界面
self.put_event()
#实盘交易合成:任何国内交易所几乎只提供tick数据
def on_order(self, order: OrderData):
"""
Callback of new order data update.
"""
pass
def on_trade(self, trade: TradeData):
"""
Callback of new trade data update.
"""
self.put_event()
def on_stop_order(self, stop_order: StopOrder):
"""
Callback of stop order update.
"""
pass