vn.py官网
开源量化社区
Member
avatar
加入于:
帖子: 12
声望: 0

我想要当前交易时刻的前几根k线数据合成加载到ArrayManager里用来计算指标
就是不知道用什么办法
self.load_bar(10)加载出来的数据都不知是几十天前的
description

Member
avatar
加入于:
帖子: 470
声望: 25

图形界面上显示出的ArrayManager计算的指标就是用最新的数据来计算的,self.load_bar(10)是load了10天的数据来初始化的。

Administrator
avatar
加入于:
帖子: 4997
声望: 292

请在打印日志时,除了价格外,也打印下K线的datetime时间戳,我们看看是什么问题

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

用Python的交易员 wrote:

请在打印日志时,除了价格外,也打印下K线的datetime时间戳,我们看看是什么问题
打印的时间显示是九、十天前的
description

description

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

青青子荆 wrote:

图形界面上显示出的ArrayManager计算的指标就是用最新的数据来计算的,self.load_bar(10)是load了10天的数据来初始化的。

虽然是用最新的数据来计算的,但是加载的历史数据跟最新数据之间有断层

要等最新数据合成了几根k线,计算出来的指标才是正确的,我要是用一个小时的k线策略,总不能等几个小时后计算正确再启动策略吧

我想知道怎么获取到初始化时当前时刻往回数的十天的数据

Member
avatar
加入于:
帖子: 470
声望: 25

load_bar函数是load当前时刻往回数的10天数据,如果打印出来有问题请确认一下数据库中是否有足够的数据。

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

青青子荆 wrote:

load_bar函数是load当前时刻往回数的10天数据,如果打印出来有问题请确认一下数据库中是否有足够的数据。

更新了数据管理的数据,初始化的数据还是只有那两天的

description

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

当我k线合成改成合成1小时,把self.load_bar(10)也改成self.load_bar(10, interval=Interval.HOUR)后

可以加载到现在交易时刻的数据了,但新的问题又出现了,获取到的历史k线没有收盘价,只有open、high、low的数据

self.write_log("%s 1小时k线 open:%s close:%s high:%s low:%s" % (bar.datetime, open1[-1], close[-1], high[-1], low[-1]))打印

description

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

唉,数据管理那是可以看的到有收盘价的数据的

另外刚更新的1小时k线也不会同步到数据库那,是不是数据管理的数据库跟初始化获取的数据不是同一个数据库的

Member
avatar
加入于:
帖子: 470
声望: 25

首先请确认一下你的数据是从接口还是数据库获取的,可以打印cta_strategy/engine文件里的load_bar()函数。

description

然后打印策略里的on_bar()函数,看看bar.close和bar.datetime的输出。

description

另外,合成的小时线不会更新到数据库,数据库里是下载的数据。

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

engine.py->print:bar BarData(gateway_name='BINANCES', symbol='LINKUSDT', exchange=<Exchange.BINANCE: 'BINANCE'>, datetime=datetime.datetime(2021, 4, 2, 14, 0, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>), interval=<Interval.HOUR: '1h'>, volume=254690.31, open_interest=0, open_price=30.379, high_price=30.426, low_price=30.172, close_price=30.314)

策略on_hour_bar->print:bar BarData(gateway_name='BINANCES', symbol='LINKUSDT', exchange=<Exchange.BINANCE: 'BINANCE'>, datetime=datetime.datetime(2021, 4, 2, 14, 0, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>), interval=None, volume=254690.31, open_interest=0, open_price=30.379, high_price=30.426, low_price=30.172, close_price=0)

这是策略init里的代码,不知是不是写错了,才导致engine.py的load_bar传到策略文件的close_price为0

self.bg = BarGenerator(self.on_bar, 1, self.on_hour_bar, interval=Interval.HOUR)
self.am = ArrayManager()

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

self.load_bar(10)加载的数据,1分钟还是一小时的我的初始化数据都是cta_strategy/engine文件bars = self.main_engine.query_history(req, contract.gateway_name)取得的,这个是取接口的数据的吗

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

1小时的问题解决了,初始化时1分钟的历史数据不对应该是币安接口的问题,我换到火币的接口就没有问题了

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

老师好,我遇到跟你一样的问题,1小时的你是怎么解决的,能分享下吗?感谢!

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

同问,1小时的close_price为0是什么原因?提问给官方人员,他们说测试不出这个问题

Member
avatar
加入于:
帖子: 470
声望: 25

miyy wrote:

同问,1小时的close_price为0是什么原因?提问给官方人员,他们说测试不出这个问题

请问具体交易的是什么品种,是在on_bar还是在on_hour_bar下为0呢?

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

币安永续合约,是在on_hour_bar下为0。是最近的版本才有这个问题。

Member
avatar
加入于:
帖子: 470
声望: 25

请问是初始化的时候为0还是生成时候为0呢?策略中bg和load_bar是怎么写的呢?
请问别的接口也出现了同样的问题吗?如果别的接口也出现了类似的问题,可能是BarGenerater有问题。否则的话可以去接口文件下,在query_history函数里打印一下传来的数据。

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

除了币安,别的接口也有这个问题,我在AtrRsiStrategy策略上改为1h策略,用OKEX V5测试的,最新版本VNPY,如下是策略代码,:

from vnpy.app.cta_strategy import (
CtaTemplate,
StopOrder,
TickData,
BarData,
TradeData,
OrderData,
BarGenerator,
ArrayManager,
)

from vnpy.trader.constant import Interval

class AtrRsiStrategy(CtaTemplate):
""""""

author = "用Python的交易员"

atr_length = 22
atr_ma_length = 10
rsi_length = 5
rsi_entry = 16
trailing_percent = 0.8
fixed_size = 1

atr_value = 0
atr_ma = 0
rsi_value = 0
rsi_buy = 0
rsi_sell = 0
intra_trade_high = 0
intra_trade_low = 0
intra_trade_open = 0
intra_trade_close = 0

parameters = [
    "atr_length",
    "atr_ma_length",
    "rsi_length",
    "rsi_entry",
    "trailing_percent",
    "fixed_size"
]
variables = [
    "atr_value",
    "atr_ma",
    "rsi_value",
    "rsi_buy",
    "rsi_sell",
    "intra_trade_high",
    "intra_trade_low",
    "intra_trade_open",
    "intra_trade_close"
]

def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
    """"""
    super().__init__(cta_engine, strategy_name, vt_symbol, setting)
    self.bg = BarGenerator(self.on_bar, 1, self.on_1h_bar, interval = Interval.HOUR)
    self.am = ArrayManager()

def on_init(self):
    """
    Callback when strategy is inited.
    """
    self.write_log("策略初始化")

    self.rsi_buy = 50 + self.rsi_entry
    self.rsi_sell = 50 - self.rsi_entry

    self.load_bar(days=10, interval = Interval.HOUR)

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.
    """
    self.bg.update_tick(tick)

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

def on_1h_bar(self, bar: BarData):
    """
    Callback of new bar data update.
    """
    self.cancel_all()

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

    atr_array = am.atr(self.atr_length, array=True)
    self.atr_value = atr_array[-1]
    self.atr_ma = atr_array[-self.atr_ma_length:].mean()
    self.rsi_value = am.rsi(self.rsi_length)

    if self.pos == 0:
        self.intra_trade_high = bar.high_price
        self.intra_trade_low = bar.low_price
        self.intra_trade_open = bar.open_price
        self.intra_trade_close = bar.close_price


        if self.atr_value > self.atr_ma:
            if self.rsi_value > self.rsi_buy:
                self.buy(bar.close_price + 5, self.fixed_size)
            elif self.rsi_value < self.rsi_sell:
                self.short(bar.close_price - 5, self.fixed_size)

    elif self.pos > 0:
        self.intra_trade_high = max(self.intra_trade_high, bar.high_price)
        self.intra_trade_low = bar.low_price

        long_stop = self.intra_trade_high * \
            (1 - self.trailing_percent / 100)
        self.sell(long_stop, abs(self.pos), stop=True)

    elif self.pos < 0:
        self.intra_trade_low = min(self.intra_trade_low, bar.low_price)
        self.intra_trade_high = bar.high_price

        short_stop = self.intra_trade_low * \
            (1 + self.trailing_percent / 100)
        self.cover(short_stop, abs(self.pos), stop=True)

    self.put_event()

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

description

Member
avatar
加入于:
帖子: 3033
声望: 174

如果觉得交易接口传来的小时线有问题,应该loadbar传入小时的interval然后在on bar函数下打印。
要基于合成的一小时bar交易的话,请load_bar的时候去load分钟线,你现在这么写load_bar加载的是小时线,然后你on_1hour_barb变成了基于on_bar传进来的小时线去合成小时线了

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

沪公网安备 31011502017034号