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

问题1:
同样的bar为什么在一个函数里是5分钟K线,又在另一个函数里是10分钟K线呢?

def on_5min_bar(self, bar: BarData):
am = self.am
am.update_bar(bar) 为什么这里的bar是5分钟呢?

def on_10min_bar(self, bar: BarData):
am = self.am
am.update_bar(bar) 为什么这里的bar是10分钟呢?

以下AI的回答:
这个问题涉及到金融市场的数据处理,尤其是在使用不同时间框架的K线数据进行交易策略开发时常见。在你提供的代码片段中,on_5min_bar和on_10min_bar函数分别处理不同时间周期的K线数据。原因在于
虽然他们的内部逻辑(如更新数据、进行计算等)可能相似或相同,但是这两个函数被设计用来响应特定的时间间隔的数据更新(一个是5分钟,一个是10分钟),所以会出你所说的情况。

如何区分5分钟和10分钟K线
触发机制: 这些函数通常由不同的触发事件调用。例如,在一个交易系统中,可能有一个计时器或监听器,

当5分钟K线数据更新时,触发on_5min_bar函数,此时bar就是5分钟K线;
当10分钟K线数据更新时,触发on_10min_bar函数,此时bar就是10分钟K线。

数据源: 每个函数接收的bar参数代表一个特定时间段的K线数据。这个数据通常是由市场数据提供商按照不同的时间间隔生成并发送的,例如每5分钟或每10分钟更新一次。

代码结构
函数定义: 你的函数on_5min_bar和on_10min_bar通过名称就已经隐含了它们处理的是不同时间框架的数据。
数据处理: 函数内部,调用am.update_bar(bar)实际上是将传入的bar数据(无论是5分钟还是10分钟的数据)更新到某个数据管理系统(如am)中。这里am可能是一个累积/聚合数据的类实例,用于进一步的数据分析或交易信号生成。

实际应用
在实际应用中,确保正确的数据被送到正确的处理函数是很重要的,通常需要在数据传入系统之前就对其进行正确的分类和调度。这样的设计允许策略开发者针对不同的数据粒度制定不同的交易逻辑和管理策略。

总结来说,每个函数处理的K线时间长度由触发这些函数的事件决定,这些事件依据K线数据的生成频率来区分。

另一回答:
在交易策略或回测系统中,不同的K线周期(如1分钟、5分钟、10分钟等)通常是通过不同的回调函数或处理函数来处理的。在您提供的代码片段中,on_5min_bar 和 on_10min_bar 函数分别处理5分钟和10分钟的K线数据。

这里的 bar 之所以在 on_5min_bar 函数中是5分钟K线,在 on_10min_bar 函数中是10分钟K线,是因为这些函数是分别设计用来处理相应周期的K线数据的。通常,这样的设计是通过某种机制(可能是内部的事件驱动或回调函数注册)来实现的,该机制在特定周期的K线数据准备好时调用相应的处理函数。

例如,在vn.py这样的量化交易框架中,您可能会设置一个BarGenerator来监听实时数据流或历史数据,并根据设置的周期(如5分钟或10分钟)来生成不同周期的K线数据。当5分钟K线完成时,on_5min_bar 函数会被调用,并传入这个5分钟的K线数据。同理,当10分钟K线完成时,on_10min_bar 函数会被调用,并传入这个10分钟的K线数据。

简单来说,不同的回调函数处理不同周期的K线数据,是因为它们在设计时就被指定用来处理特定周期的K线。在您的策略代码中,您应该已经定义了这些回调函数,并且将它们与相应的K线周期进行了关联。

请注意,这里的 bar 变量只是一个参数,它代表当前处理的K线数据。在不同的函数调用中,传入的 bar 参数值会根据上下文(即当前的K线周期)而有所不同。因此,尽管变量名都是 bar,但它们代表的数据内容和周期是不同的。

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

问题2:
请问self.bg05的 self是指谁的实例,是类DemoStrategy_05M()的实例吗?

Python代码如下:
class DemoStrategy_05M(CtaTemplate):
pass

def init(
self,
cta_engine: Any,
strategy_name: str,
vt_symbol: str,
setting: dict,
):
super().init(cta_engine, strategy_name, vt_symbol, setting)

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

self.am = ArrayManager()

以下AI的回答:
在提供的Python代码中,self 是指向 DemoStrategy_05M 类实例的引用。当你在 DemoStrategy_05M 类的方法中看到 self,它表示当前这个方法的调用者是 DemoStrategy_05M 的一个具体实例。

self.bg05 是 DemoStrategy_05M 类实例的一个属性。当 DemoStrategy_05M 的一个实例被创建时,init 方法会被调用,进而初始化这个实例的属性。在这个例子中,self.bg05 被初始化为一个 BarGenerator 对象,用于生成5分钟周期的K线数据。

BarGenerator 对象的初始化参数 self.on_bar 和 self.on_5min_bar 是 DemoStrategy_05M 实例的方法。这意味着,
当 BarGenerator 生成一个新的1分钟K线时,它会调用 self.on_bar 方法;
当 BarGenerator 合成一个新的5分钟K线时,它会调用 self.on_5min_bar 方法。

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

问题3:
on_window_bar是 Callable,
on_window_bar = self.on_5min_bar
是不是意味着:
当执行on_window_bar(self.window_bar)时,就是执行self.on_5min_bar(self.window_bar)呢?
以上我的理解对吗?

您的理解是正确的。在Python中,函数和方法都是可调用的对象,也称为Callable。on_window_bar 被设置为 self.on_5min_bar,这实际上是将 on_5min_bar 方法的引用赋值给了 on_window_bar。

当 BarGenerator 内部触发了合成K线的事件并且需要调用 on_window_bar 时,由于 on_window_bar 被设置为 self.on_5min_bar,它实际上会调用 self.on_5min_bar 方法。这意味着

任何传递给 on_window_bar 的参数(例如 self.window_bar,尽管在您的代码片段中没有直接显示这样的调用)都会被传递给 self.on_5min_bar。

所以,当您看到如下调用:

on_window_bar(some_bar_data) 实际上等同于 self.on_5min_bar(some_bar_data)

这里的 some_bar_data 应该是一个K线数据对象,代表合成的5分钟K线。因为 on_window_bar 和 self.on_5min_bar 指向同一个方法,所以它们的行为是完全相同的。

在您的 DemoStrategy_05M 类中,这种设置使得 BarGenerator 能够在合适的时机自动调用 self.on_5min_bar,从而允许您的策略逻辑处理这些合成的5分钟K线数据。这是事件驱动编程中常见的模式,特别是在交易系统和量化策略中。

另一回答
你的理解基本正确。在这段代码中,当on_window_bar被调用时,实际上是在调用self.on_5min_bar方法,并将参数self.window_bar传递给它。所以你可以将on_window_bar(self.window_bar)理解为执行self.on_5min_bar(self.window_bar)。

Administrator
avatar
加入于:
帖子: 4510
声望: 322

非常感谢整理

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

沪公网安备 31011502017034号

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