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

想实现的目的就是想获得过滤条件满足时,bar的数据信息。

找到一个func,如下:
def valuewhen(condition, source, occurrence):
return pd.Series(source) \
.reindex(pd.Series(condition[condition]).index) \
.shift(-occurrence) \
.reindex(pd.Series(source).index) \
.ffill()

但是算的过程中获得的总是Nan。

大佬们有没有func改进的建议或者有没有别的方法

Member
avatar
加入于:
帖子: 7
声望: 1

可以参考一下示例策略boll_channel_strategy的on_15min_bar函数中具体的实现逻辑。
另外直接使用自带的ArrayManager调取bar的数据信息即可,无需自己写函数。

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

VN神经蛙 wrote:

可以参考一下示例策略boll_channel_strategy的on_15min_bar函数中具体的实现逻辑。
另外直接使用自带的ArrayManager调取bar的数据信息即可,无需自己写函数。
thx,我是想测一个策略,右侧交易。等一个形态走完后确认信号,然后想获取这个形态中bar的数据信息

Member
avatar
加入于:
帖子: 7
声望: 1

单凭文字描述不太确定你的意思,方便贴一下策略吗

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

VN神经蛙 wrote:

单凭文字描述不太确定你的意思,方便贴一下策略吗
抱歉,几天没看,下面是trading view的一段代码,想在vnpy中实现,thx

zigzag() =>
_isUp = close >= open
_isDown = close <= open
_direction = _isUp[1] and _isDown ? -1 : _isDown[1] and _isUp ? 1 : nz(_direction[1])
_zigzag = _isUp[1] and _isDown and _direction[1] != -1 ? highest(2) : _isDown[1] and _isUp and _direction[1] != 1 ? lowest(2) : na

_ticker = useHA ? heikenashi(tickerid) : tickerid
sz = useAltTF ? (change(time(tf)) != 0 ? security(_ticker, tf, zigzag()) : na) : zigzag()

plot(sz, title='zigzag', color=black, linewidth=2)

// ||--- Pattern Recognition:

x = valuewhen(sz, sz, 4)
a = valuewhen(sz, sz, 3)
b = valuewhen(sz, sz, 2)
c = valuewhen(sz, sz, 1)
d = valuewhen(sz, sz, 0)

xab = (abs(b-a)/abs(x-a))
xad = (abs(a-d)/abs(x-a))
abc = (abs(b-c)/abs(a-b))
bcd = (abs(c-d)/abs(b-c))

Member
avatar
加入于:
帖子: 7
声望: 1

首先你代码的逻辑还需要自己优化一下,例如_isUp和_isDown只需要保留一个

其次判断形态需要用到的价格数据都可以用ArrayManager调取,在策略的on_bar函数下写具体逻辑去一步一步判断
比方说判断is_up:

def on_bar(self, bar: BarData):
        am = self.am
        am.update_bar(bar)
        if not am.inited:
            return
        self.is_up: np.ndarray = am.close > am.open  # 用array缓存is_up,注意am.close和am.open本身都是np.ndarray格式

至于判断每个形态是否走完,需要先在init函数下面缓存一个array用于记录,然后在on_bar里面不断更新缓存。如果需要统计一段时间内该形态出现的次数,就可以从缓存中读取数据并统计

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)
        self.am = ArrayManager()
        self.is_zigzag: np.ndarray = np.zeros(200)  # 根据自己的需要修改缓存的数据量

""""""中间其他函数略""""""
def on_bar(self, bar: BarData):
        self.is_zigzag[:-1] = self.is_zigzag[1:]
        self.is_zigzag[-1] = zigzag  # 将是否出现形态的判断结果写入缓存

不太熟悉trading view,所以具体的策略实现还是需要自己去探索了,可以先捋顺策略的逻辑,再多参考Gitee上vnpy的源码来实现策略

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

沪公网安备 31011502017034号

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