VeighNa量化社区
你的开源社区量化交易平台
Member
avatar
加入于:
帖子: 13
声望: 0

class JasonTrendStrategy(CtaTemplate):
""" """

author = "Smart Trader"

#定义参数
maTrend_fast_window = 5
maTrend_slow_window = 20

fast_window = 10
slow_window = 20

def __init__(
    self,
    cta_engine: Any,
    strategy_name: str,
    vt_symbol: str,
    setting: dict,
    ):            

    super().__init__(cta_engine,strategy_name,vt_symbol,setting)

    #定义2个周期的bg函数
    self.bg15min = BarGenerator(self.on_bar,
                window=15, 
                on_window_bar=self.on_15min_bar, 
                interval=Interval.MINUTE)

    self.bg5min = BarGenerator(self.on_bar,
                window=5,
                on_window_bar=self.on_5min_bar,
                interval=Interval.MINUTE)

    self.bg = BarGenerator(self.on_bar)

    #定义2个周期的am
    self.am15min = ArrayManager()
    self.am5min = ArrayManager()
    self.am = ArrayManager()




def on_init(self):
    """策略初始化"""
    #注册
    self.write_log('策略初始化')
    self.load_bar(10)

def on_start(self):
    """启动"""
    self.write_log('策略启动')

def on_stop(self):
    """停止"""
    self.write_log('策略停止')
def on_tick(self,tick:TickData):
    """Tick更新"""
    self.bg15min.update_tick(tick)
    self.bg5min.update_tick(tick)#bg会自动判断当前分钟是否已经走完,合成1分钟线
    self.bg.update_tick(tick)


    #定义2个周期的 on_bar 函数
def on_bar(self,bar:BarData):
    """k线更新,切记先更新长周期,再更新短周期"""
    self.bg15min.update_bar(bar)#将1小时K线合成1小时K线
    self.bg5min.update_bar(bar)#将1分钟K线合成15分钟K线

    am = self.am
    am.update_bar(bar)
    if not am.inited:
        return

    trend_lt = am.sma(20, array= True)
    last_trend = trend_lt[-1]
    pre_trend = trend_lt[-2]
    str_t = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())
    print('1m',str_t,last_trend)


#定义2个周期的on_hour或者min_bar函数
def on_15min_bar(self,bar:BarData):#执行2H的K线,只做判断,不做买卖
    am = self.am15min

    am.update_bar(bar)
    if not am.inited:
        return
    trend_lt = am.sma(20, array= True)
    last_15_trend = trend_lt[-1]
    pre_15_trend = trend_lt[-2]

    str_t = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())
    print('**15m',str_t,last_15_trend)


def on_5min_bar(self,bar:BarData):#执行15分钟的K线 做出判断并且发出买卖信号
    self.cancel_all

    am = self.am5min

    am.update_bar(bar)
    if not am.inited:
        return

    trend_lt = am.sma(20, array= True)
    last_5_trend = trend_lt[-1]
    pre_5_trend = trend_lt[-2]

    str_t = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())
    print('5m**',str_t,last_5_trend)



打印出来的日志是:
15m 2021-03-10 20:00:26 1821.5195000000003
5m
2021-03-10 20:00:26 1819.6295000000005
1m 2021-03-10 20:00:26 1817.7245000000007
1m 2021-03-10 20:01:27 1817.9080000000006
1m 2021-03-10 20:01:27 1817.9950000000003
1m 2021-03-10 20:01:27 1818.0655000000002
1m 2021-03-10 20:02:27 1818.4440000000002
1m 2021-03-10 20:02:27 1819.0145
1m 2021-03-10 20:02:27 1819.5835
1m 2021-03-10 20:03:26 1820.1965
1m 2021-03-10 20:03:26 1820.7814999999996
1m 2021-03-10 20:03:26 1821.2854999999995
1m 2021-03-10 20:04:26 1821.6954999999994
1m 2021-03-10 20:04:26 1822.0555000000004
1m 2021-03-10 20:04:26 1822.5295000000006
5m 2021-03-10 20:05:26 1819.760500000001
1m 2021-03-10 20:05:26 1822.9360000000001
5m
2021-03-10 20:05:26 1819.895000000001
1m 2021-03-10 20:05:26 1823.3905
5m** 2021-03-10 20:05:26 1819.671000000001
1m 2021-03-10 20:05:26 1823.953

每根一分钟线,都会打印三次,且值不一样
是怎么触发的?

Member
avatar
加入于:
帖子: 13
声望: 0

1分钟的可以解释为三个周期每个触发一次
5分钟的也触发三次是怎么来的?

Member
avatar
加入于:
帖子: 4300
声望: 268

请打印传进来的bar或者bar.datetime,这样会直观一点。
多周期策略请参考示例策略multi_timeframe_strategy

Member
avatar
加入于:
帖子: 23
声望: 0

solmyr wrote:

1分钟的可以解释为三个周期每个触发一次
5分钟的也触发三次是怎么来的?
str_t = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())
print('5m**',str_t,last_5_trend)
这个不对吧,打印的是本地时间,应该是bar.dt

© 2015-2022 微信 18391752892
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】