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

description

我把vnpy自带的turtle策略修改了一下,我想基于15min级别进行交易,但是如图所示的数值一直都没有变化过,我想知道是什么问题?
代码如下所示:

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

`def init(self, cta_engine, strategy_name, vt_symbol, setting):
super().init(cta_engine, strategy_name, vt_symbol, setting)

self.bg15min = BarGenerator(self.on_bar,15,self.on_15min_bar)

self.am15min = ArrayManager()

def on_init(self):
self.write_log("策略初始化")
self.load_bar(20)

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

def on_stop(self):
self.write_log("策略停止")

def on_tick(self, tick: TickData):
self.bg15min.update_tick(tick)

def on_bar(self, bar: BarData):
self.bg15min.update_bar(bar)

def on_15min_bar(self, bar: BarData):

self.cancel_all()

am = self.am15min

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


if not self.pos:
    self.entry_up, self.entry_down = self.am.donchian(
        self.entry_window)
self.exit_up, self.exit_down = self.am.donchian(self.exit_window)
if not self.pos:
    #计算atr值
    self.atr_value = self.am.atr(self.atr_window)
    self.long_entry = 0
    self.short_entry = 0
    self.long_stop = 0
    self.short_stop = 0`
Member
avatar
加入于:
帖子: 52
声望: 0

请问是不是哪里出现问题才会导致entry_up及之后的变量一直没有变化?
我有推送足够多的数据,策略是成功运行的,如果用我未更改的vnpy自带的turtle策略,运行是没有任何问题的,但是更改之后,这些变量一直没有任何变化。

Member
avatar
加入于:
帖子: 1653
声望: 121

如果是指图形界面数据没有刷新的话,查下是否漏了put_event函数调用

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

`class ver_two_TS_Strategy(CtaTemplate):
""""""
author = "用Python的交易员"

entry_window = 20

exit_window = 10

atr_window = 20

fixed_size = 1


entry_up = 0
entry_down = 0

exit_up = 0
exit_down = 0

atr_value = 0

long_entry = 0
short_entry = 0

long_stop = 0
short_stop = 0

parameters = ["entry_window", "exit_window", "atr_window", "fixed_size"]
variables = ["entry_up", "entry_down", "exit_up", "exit_down", "atr_value"]

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

    self.bg15min = BarGenerator(self.on_bar,15,self.on_15min_bar)

    self.am15min = ArrayManager()

def on_init(self):

    self.write_log("策略初始化")
    self.load_bar(20)

def on_start(self):
    """
    Callback when strategy is started.
    """
    #策略启动时,调用此函数
    self.write_log("策略启动")

def on_stop(self):
    """
    Callback when strategy is stopped.
    """
    self.write_log("策略停止")

def on_tick(self, tick: TickData):
    """
    Callback of new tick data update.
    """
    #接受tick数据用于合成bar数据
    self.bg15min.update_tick(tick)

#需要修改on_bar函数名称进行调用
#def on_bar(self, bar: BarData):
    #self.bg15min.update_bar(bar)

def on_15min_bar(self, bar: BarData):

    self.cancel_all()

    am = self.am15min

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

    if not self.pos:
        self.entry_up, self.entry_down = self.am.donchian(
            self.entry_window)


    self.exit_up, self.exit_down = self.am.donchian(self.exit_window)

    #无持仓时
    if not self.pos:
        #计算atr值
        self.atr_value = self.am.atr(self.atr_window)
        self.long_entry = 0
        self.short_entry = 0
        self.long_stop = 0
        self.short_stop = 0

        self.send_buy_orders(self.entry_up)
        self.send_short_orders(self.entry_down)

    elif self.pos > 0:

        self.send_buy_orders(self.entry_up)

        sell_price = max(self.long_stop, self.exit_down)

        self.sell(sell_price, abs(self.pos), True)


    elif self.pos < 0:
        self.send_short_orders(self.entry_down)

        cover_price = min(self.short_stop, self.exit_up)
        self.cover(cover_price, abs(self.pos), True)

    #更新图形界面
    self.put_event()

def on_trade(self, trade: TradeData):
    """
    Callback of new trade data update.
    """

    if trade.direction == Direction.LONG:

        self.long_entry = trade.price

        self.long_stop = self.long_entry - 2 * self.atr_value
    else:
        self.short_entry = trade.price
        self.short_stop = self.short_entry + 2 * self.atr_value

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

def send_buy_orders(self, price):

    t = self.pos / self.fixed_size

    if t < 1:
        self.buy(price, self.fixed_size, True)

    if t < 2:
        self.buy(price + self.atr_value * 0.5, self.fixed_size, True)

    if t < 3:
        self.buy(price + self.atr_value, self.fixed_size, True)

    if t < 4:
        self.buy(price + self.atr_value * 1.5, self.fixed_size, True)

def send_short_orders(self, price):
    """"""
    #发送空头委托时调用
    t = self.pos / self.fixed_size

    if t > -1:
        self.short(price, self.fixed_size, True)

    if t > -2:
        self.short(price - self.atr_value * 0.5, self.fixed_size, True)

    if t > -3:
        self.short(price - self.atr_value, self.fixed_size, True)

    if t > -4:
        self.short(price - self.atr_value * 1.5, self.fixed_size, True)

`

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

MTF wrote:

如果是指图形界面数据没有刷新的话,查下是否漏了put_event函数调用

这是全部代码了,并没有漏掉put_event函数,您可以帮我看看问题出在哪里吗,谢谢您
现在是图形界面数据都显示为0了

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

description

现在是这样了,同一个品种运行别的策略是图形界面是正常更新没有问题的,但是这个不行

Member
avatar
加入于:
帖子: 1653
声望: 121

需要修改on_bar函数名称进行调用

def on_bar(self, bar: BarData):

#self.bg15min.update_bar(bar)

这段调用被你注释了,所以不会合成15分钟K线,也就导致不会触发后续的指标计算

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

MTF wrote:

需要修改on_bar函数名称进行调用

def on_bar(self, bar: BarData):

#self.bg15min.update_bar(bar)

这段调用被你注释了,所以不会合成15分钟K线,也就导致不会触发后续的指标计算

我取消掉了注释,这个策略运行起来其图形界面变量仍然显示为0,请问我是不是有其他地方写错了呢?不知道问题出在哪了

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

casf wrote:

MTF wrote:

需要修改on_bar函数名称进行调用

def on_bar(self, bar: BarData):

#self.bg15min.update_bar(bar)

这段调用被你注释了,所以不会合成15分钟K线,也就导致不会触发后续的指标计算

我取消掉了注释,这个策略运行起来其图形界面变量仍然显示为0,请问我是不是有其他地方写错了呢?不知道问题出在哪了
代码如下:
```
from vnpy_ctastrategy import (
CtaTemplate,
StopOrder,
Direction,
TickData,
BarData,
TradeData,
OrderData,
BarGenerator,
ArrayManager,
)

from vnpy.trader.constant import Interval
class ver_two_TS_Strategy(CtaTemplate):
""""""
author = "用Python的交易员"

entry_window = 20

exit_window = 10

atr_window = 20

fixed_size = 1


entry_up = 0
entry_down = 0

exit_up = 0
exit_down = 0

atr_value = 0

long_entry = 0
short_entry = 0

long_stop = 0
short_stop = 0


parameters = ["entry_window", "exit_window", "atr_window", "fixed_size"]
variables = ["entry_up", "entry_down", "exit_up", "exit_down", "atr_value"]

def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
    """"""
    # 类的初始化

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


    self.bg15min = BarGenerator(self.on_bar, 15, self.on_15min_bar, interval=Interval.MINUTE)

    self.am = ArrayManager()

def on_init(self):

    self.write_log("策略初始化")
    self.load_bar(20)

def on_start(self):

    self.write_log("策略启动")

def on_stop(self):

    self.write_log("策略停止")

def on_tick(self, tick: TickData):

    self.bg15min.update_tick(tick)


def on_bar(self, bar: BarData):
    self.bg15min.update_bar(bar)

def on_15min_bar(self, bar: BarData):
    self.cancel_all()

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

    if not self.pos:
        self.entry_up, self.entry_down = self.am.donchian(
            self.entry_window)


    self.exit_up, self.exit_down = self.am.donchian(self.exit_window)

    # 无持仓时
    if not self.pos:
        # 计算atr值
        self.atr_value = self.am.atr(self.atr_window)
        self.long_entry = 0
        self.short_entry = 0
        self.long_stop = 0
        self.short_stop = 0
        self.send_buy_orders(self.entry_up)
        self.send_short_orders(self.entry_down)

    elif self.pos > 0:
        self.send_buy_orders(self.entry_up)

        sell_price = max(self.long_stop, self.exit_down)

        self.sell(sell_price, abs(self.pos), True)


    elif self.pos < 0:
        self.send_short_orders(self.entry_down)

        cover_price = min(self.short_stop, self.exit_up)
        self.cover(cover_price, abs(self.pos), True)

    # 更新图形界面
    self.put_event()

def on_trade(self, trade: TradeData):
    if trade.direction == Direction.LONG:

        self.long_entry = trade.price
        self.long_stop = self.long_entry - 2 * self.atr_value
    else:
        self.short_entry = trade.price
        self.short_stop = self.short_entry + 2 * self.atr_value

def on_order(self, order: OrderData):

    pass

def on_stop_order(self, stop_order: StopOrder):

    pass

def send_buy_orders(self, price):

    t = self.pos / self.fixed_size

    if t < 1:
        self.buy(price, self.fixed_size, True)

    if t < 2:
        self.buy(price + self.atr_value * 0.5, self.fixed_size, True)

    if t < 3:
        self.buy(price + self.atr_value, self.fixed_size, True)

    if t < 4:
        self.buy(price + self.atr_value * 1.5, self.fixed_size, True)

def send_short_orders(self, price):

    t = self.pos / self.fixed_size

    if t > -1:
        self.short(price, self.fixed_size, True)

    if t > -2:
        self.short(price - self.atr_value * 0.5, self.fixed_size, True)

    if t > -3:
        self.short(price - self.atr_value, self.fixed_size, True)

    if t > -4:
        self.short(price - self.atr_value * 1.5, self.fixed_size, True)

```

Member
avatar
加入于:
帖子: 5049
声望: 303

可以自己先在on_bar和on_15min_bar下打印看看有没有收到bar。如果收到了话然后再在on_15min_bar打印排查一下是不是被策略逻辑过滤了,比如是否满足self.am.inited条件

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

xiaohe wrote:

可以自己先在on_bar和on_15min_bar下打印看看有没有收到bar。如果收到了话然后再在on_15min_bar打印排查一下是不是被策略逻辑过滤了,比如是否满足self.am.inited条件
谢谢您的提醒。
请问我用这个15min级别的策略可以直接做回测吗?会不会因为是15min级别的所以没法做呢

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

xiaohe wrote:

可以自己先在on_bar和on_15min_bar下打印看看有没有收到bar。如果收到了话然后再在on_15min_bar打印排查一下是不是被策略逻辑过滤了,比如是否满足self.am.inited条件
我按照您说的方法测试了一下,在on_bar底下打印bar或者任何内容都是成功的
但是on_15min_bar这个函数应该是根本没有在策略运行的时候被调用
我无论在on_15min_bar函数的任何位置打印东西都没有结果,比如最开头或者中间或者结尾打印一个print('a'),都没有任何输出
在on_bar函数里的打印都是可以输出的,on_15min_bar函数及以后函数的打印都没有输出
请问这会是什么问题呢

© 2015-2022 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

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