VeighNa量化社区
你的开源社区量化交易平台
ld3762's Avatar
Member
离线
63 帖子
声望: 1

zly111 wrote:

目测是改了bargenerator然后实时行情不能正确推送到onbar或者ontick
你好,这是我按照模板改的5分钟的代码,是不是bargenerator这块出了什么问题呀。
from vnpy.app.cta_strategy import (
CtaTemplate,
StopOrder,
TickData,
BarData,
TradeData,
OrderData,
BarGenerator,
ArrayManager,
)

class shuangjunxian5min(CtaTemplate):
"""演示用的简单双均线"""

# 策略作者
author = "Smart Trader"

# 定义参数
fast_window = 10
slow_window = 20

# 定义变量
fast_ma0 = 0.0   
fast_ma1 = 0.0
slow_ma0 = 0.0
slow_ma1 = 0.0

# 添加参数和变量名到对应的列表
parameters = ["fast_window", "slow_window"]
variables = ["fast_ma0", "fast_ma1", "slow_ma0", "slow_ma1"]

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

    # K线合成器:从Tick合成分钟K线用
    self.bg = BarGenerator(self.on_bar, 5, self.on_5min_bar)

    # 时间序列容器:计算技术指标用
    self.am = ArrayManager(600)

def on_init(self):
    """
    当策略被初始化时调用该函数。
    """
    # 输出个日志信息,下同
    self.write_log("策略初始化")

    # 加载10天的历史数据用于初始化回放
    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):
    """  
    通过该函数收到Tick推送。
    """
    self.bg.update_tick(tick)

def on_bar(self, bar: BarData):
    """
    Callback of new bar data update.
    """
    self.bg.update_bar(bar)

def on_5min_bar(self, bar: BarData):
    """"""
    self.cancel_all()

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

    # 计算快速均线
    fast_ma = am.sma(self.fast_window, array=True)
    self.fast_ma0 = fast_ma[-1]     # T时刻数值
    self.fast_ma1 = fast_ma[-2]     # T-1时刻数值

    # 计算慢速均线
    slow_ma = am.sma(self.slow_window, array=True)
    self.slow_ma0 = slow_ma[-1]
    self.slow_ma1 = slow_ma[-2]

    # 判断是否金叉
    cross_over = (self.fast_ma0 > self.fast_ma1 and
                  self.slow_ma0 > self.slow_ma1)  

    # 判断是否死叉
    cross_below = (self.fast_ma0 < self.fast_ma1 and
                   self.slow_ma0 < self.slow_ma1)

    # 如果发生了金叉
    if cross_over:
        # 为了保证成交,在K线收盘价上加5发出限价单
        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()

def on_order(self, order: OrderData):
    """
    通过该函数收到委托状态更新推送。
    """
    pass

def on_trade(self, trade: TradeData):
    """
    通过该函数收到成交推送。
    """
    # 成交后策略逻辑仓位发生变化,需要通知界面更新。
    self.put_event()

def on_stop_order(self, stop_order: StopOrder):
    """
    通过该函数收到本地停止单推送。
    """
    pass

初始化之后变量没显示。数据没问题,用双均线1分钟的试过了,但是5分钟的就不行,可以回测,但是初始化之后变量不显示(昨天还是可以显示并且交易的)。
description

description

你好,请问现在用什么方法清洗数据呢 数据清洗脚本放电脑的哪个位置呢

论坛里帖子翻了好多,好像只有2.0以前的教程。

张国平 wrote:

不能直接用,因为2.0改成ORM,而且支持多个不同数据库类型,,最后表结构也不一样。要花些时间
你好,请问有相应的教程可以让新手照着学习吗?

我在论坛里看了一些教程,但是没找到该文件的位置。。。看了下面评论,说是2.0之前的版本才有这个文件。
description

比如tb下载的rb2005数据到昨天截止。然后今天开盘前导入下载的数据然后开始交易,变量却不显示,是不是之前下载的数据跑实盘用不了呀。。。。
description

description

张国平 wrote:

写个过滤程序把非交易时间的删除就可以,
你好,请问vnpy2.0版也是这样操作吗,我没找到\DataRecording\runDataCleaning.py这个文件。囧。。。。。

“添加策略”里面是没有shuangjunxian222这个策略的,为什么打开CTA策略之后会自动弹出这个呢。。。。。。
description

是因为am.close[]里面的参数需要整数型的的原因吗 ,用am.close[-1乘int(a乘b)]就可以回测。

假如我想写收盘价大于前(a+b)根开盘价做多 if (am.close[-1]> am.close[-1*self.a-self.b]是可以回测的。但是我想写大于前(a乘b)根做多, if (am.close[-1]> am.close[-1乘self.a乘self.b]却回测不了(乘号不显示,用“乘”代替),这是为什么呢? 是因为am.close[]里面的参数只能加减不能乘除嘛。如果是这样,有什么办法可以让里面的参数乘除的时候也可以回测呢

用Python的交易员 wrote:

不可以,这种写法是未来函数
可能我刚刚没表达好,用开盘价做条件。比如我想写 当根k线的开盘价高于前一根开盘价 就立马开多。当根k线发单,这种应该没未来函数的。

比如螺纹1min周期的k线, 当单根k线开盘价高于3010开多,低于3000开空。写代码回测发现如果前一根k线满足发单条件,下一根开盘才会发单。可以当前k线开盘价一旦满足条件就立刻发单吗。

倒数第二根开盘价是不是用bar.open_price[1]表示呀。。。。我这边编写出来没问题,但是回测就一直卡在 “历史数据加载完成” 这边。。。。。
description

比如 self.write_log("策略初始化") ; self.fast_ma0 = fast_ma[-1]

description
同一个策略 参数小会有变量 参数大就没有。。。。。

是总盈利/天数 还是总盈利/总亏损呢 还是其他的计算方法呢

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

沪公网安备 31011502017034号

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