BackTrader 中文文档(二十九)(2)

简介: BackTrader 中文文档(二十九)

BackTrader 中文文档(二十九)(1)https://developer.aliyun.com/article/1505504

绝对强度直方图

原文:www.backtrader.com/recipes/indicators/ash/ash/

这是一个看起来起源于外汇世界的指标,可能在 fxcodebase.com,但似乎很难追踪实际起源是什么。

潜在地首先在 LUA 中实现:

同样还提到,更新和修订的 LUA 版本可在以下位置找到:

同一站点托管了一个 MQL4 版本:

另一个 MQL5 版本可以在这里找到:

所有版本都似乎很复杂,由于语言和平台实现的原因,MQL5 版本有 227 行代码(当然包括一些注释),并且有轻微的差异,因此有必要确定一个合适的定义。在查看不同版本后的伪代码定义:

# p0 is the current price and p1 is the previous price
  if mode is RSI:
    bulls = 0.5 * abs(p0 - p1) + p0 - p1
    bears = 0.5 * abs(p0 - p1) - p0 + p1
  elif mode is STOCH:
    bulls = p0 - lowest(period)
    bears = highest(period - p1
  avgbulls = moving_average(bulls, period)
  avgbears = moving_average(bears, period)
  smoothedbulls = moving_average(bulls, smoothing_period) / pointsize
  smoothedbears = moving_average(bears, smoothing_period) / pointsize
  ash = smoothedbulls - smoothedbears

RSI / STOCH 命名是原始实现者选择的,pointsize 也被称为 pipsize,反映了其 外汇 起源。目前尚不清楚 平滑平均值 是否必须与以前的移动平均值相同,一些版本似乎使用已经平均化的价格而不是标准价格。移动平均线是使用 整数 选择的。

一些决定

  • 该指标将使用数据提供的原始价格进行计算。如果用户希望在平均价格上运行指标,可以传递它,而不是传递原始价格。
  • RSI 模式中的 0.5 倍乘数将作为参数
  • 移动平均线不会被任何类型的 整数 选择。在 backtrader 中,可以将实际所需的移动平均线作为参数传递。
  • 平滑移动平均线,除非作为参数指定,否则将与指标中已使用的移动平均线相同
  • 除非用户将值指定为参数,否则将不使用 pointsize

这里是实现

class ASH(bt.Indicator):
    alias = ('AbsoluteStrengthOscilator',)
    lines = ('ash', 'bulls', 'bears',)  # output lines
    # customize the plotting of the *ash* line
    plotlines = dict(ash=dict(_method='bar', alpha=0.33, width=0.66))
    RSI, STOCH = range(0, 2)  # enum values for the parameter mode
    params = dict(
        period=9,
        smoothing=2,
        mode=RSI,
        rsifactor=0.5,
        movav=bt.ind.WMA,  # WeightedMovingAverage
        smoothav=None,  # use movav if not specified
        pointsize=None,  # use only if specified
    )
    def __init__(self):
        # Start calcs according to selected mode
        if self.p.mode == self.RSI:
            p0p1 = self.data - self.data(-1)  # used twice below
            half_abs_p0p1 = self.p.rsifactor * abs(p0p1)  # used twice below
            bulls = half_abs_p0p1 + p0p1
            bears = half_abs_p0p1 - p0p1
        else:
            bulls = self.data - bt.ind.Lowest(self.data, period=self.p.period)
            bears = bt.ind.Highest(self.data, period=self.p.period) - self.data
        avbulls = self.p.movav(bulls, period=self.p.period)
        avbears = self.p.movav(bears, period=self.p.period)
        # choose smoothing average and smooth the already averaged values
        smoothav = self.p.smoothav or self.p.movav  # choose smoothav
        smoothbulls = smoothav(avbulls, period=self.p.smoothing)
        smoothbears = smoothav(avbears, period=self.p.smoothing)
        if self.p.pointsize:  # apply only if it makes sense
            smoothbulls /= self.p.pointsize
            smoothbears /= self.p.pointsize
        # Assign the final values to the output lines
        self.l.bulls = smoothbulls
        self.l.bears = smoothbears
        self.l.ash = smoothbulls - smoothbears

这里展示了指标的工作方式



BackTrader 中文文档(二十九)(3)https://developer.aliyun.com/article/1505507

相关文章
|
6月前
|
存储 API
BackTrader 中文文档(二十九)(4)
BackTrader 中文文档(二十九)
82 0
|
6月前
|
算法 索引
BackTrader 中文文档(二十九)(1)
BackTrader 中文文档(二十九)
57 0
|
6月前
BackTrader 中文文档(二十九)(3)
BackTrader 中文文档(二十九)
50 0
|
6月前
|
存储 算法 C++
BackTrader 中文文档(二十八)(3)
BackTrader 中文文档(二十八)
59 0
|
6月前
|
Python
BackTrader 中文文档(二十八)(1)
BackTrader 中文文档(二十八)
41 0
|
6月前
BackTrader 中文文档(二十八)(2)
BackTrader 中文文档(二十八)
47 0
|
6月前
|
测试技术 C语言 Python
BackTrader 中文文档(二十八)(4)
BackTrader 中文文档(二十八)
44 0
|
6月前
|
索引
BackTrader 中文文档(二十七)(3)
BackTrader 中文文档(二十七)
53 0
|
6月前
|
存储 数据库连接 数据库
BackTrader 中文文档(二十七)(4)
BackTrader 中文文档(二十七)
45 0
|
6月前
|
算法 索引 Python
BackTrader 中文文档(二十七)(2)
BackTrader 中文文档(二十七)
61 0