Ahr999 in TradingView

近段时间开始关注 BTC 大饼现货,并且在找机会逐步进场持有。其中我主要是通过 Ahr999 指标来判断入场时机,这个指数来自于《囤比特币》

具体的定义可参考

Ahr999 = ((比特币价格/200日定投成本) * (比特币价格/指数增长估值)

  • 指数增长估值= 10^[5.84 * log(币龄) - 17.01]
  • 币龄 = 当前日期距离2009年1月3日的天数
  • 200日定投成本 使用几何平均值

通常认为:

  • Ahr999 < 0.45 时,表示市场极度恐慌,是很好的买入机会
  • Ahr999 > 1.2 时,表示市场可能过热,需要注意风险
  • 0.45 < Ahr999 < 1.2 时,属于相对合理区间

最开始打算是直接写个脚本跑在服务器上,定时计算,进入合适的区间就发 tg 消息提醒。写好调试好发现,我的服务器限于网络环境,无法调用 API 拿到数据,只能放弃。又转念一想,其实也算是个交易指标,干脆拿去 TradingView 上搞一个,写个指标画出来,并且加一个通知,如果指标跌破区间,就通过 TradingView 发邮件提醒。通过这个过程,也学习一下 TradingView 的脚本编写。

具体效果见下图

以下脚本代码主要通过 AI 辅助写出,有需要的话可以自取添加指标。这里指标只能针对日区间数据,需要把变更区间设置成 1d.

//@version=6
indicator('BTC AHR999 Index', overlay = false)

// 确保在日线图表上使用
if not timeframe.isdaily
    runtime.error('请在日线图表上使用此指标')

// 计算币龄(从2009年1月3日开始)
GENESIS_TIMESTAMP = timestamp('2009-01-03')
days_since_genesis = (time - GENESIS_TIMESTAMP) / (1000 * 60 * 60 * 24)

// 计算指数增长估值
// formula: 10^(5.84 * log(币龄) - 17.01)
exp_growth = math.pow(10, 5.84 * math.log10(days_since_genesis) - 17.01)

// 计算200日定投成本(简单移动平均)
// sma_200 = ta.sma(close, 200)
f_gma(src, len) =>
    sum_logs = 0.0
    for i = 0 to len - 1 by 1
        sum_logs := sum_logs + math.log(src[i])
        sum_logs
    math.exp(sum_logs / len)

length = input.int(200, 'Length', minval = 1)
gma_200 = f_gma(close, length)

// 计算 AHR999 指数
// formula: (比特币价格/200日定投成本) * (比特币价格/指数增长估值)
ahr999 = close / gma_200 * (close / exp_growth)

// 为了使所有指标在同一个视图中可见,进行数值缩放
scale_factor = 1000 // 可以根据需要调整这个缩放因子
scaled_close = close / scale_factor
scaled_gma_200 = gma_200 / scale_factor
scaled_exp_growth = exp_growth / scale_factor

// 绘制所有指标
plot(ahr999, 'AHR999', color = color.blue, linewidth = 2, precision=3)
plot(scaled_close, '当日收盘价', color = color.green, linewidth = 1, precision=3)
plot(scaled_gma_200, '200日定投成本', color = color.orange, linewidth = 1, precision=3)
plot(scaled_exp_growth, '指数增长估值', color = color.purple, linewidth = 1, precision=3)

// 添加 AHR999 的参考线
hline(0.45, '极度抄底区', color = color.green, linestyle = hline.style_dashed)
hline(1.2, '中性', color = color.gray)
hline(4, '极度卖出区', color = color.red, linestyle = hline.style_dashed)

// 添加图例说明
var tbl = table.new(position.top_right, 4, 2, bgcolor = color.new(color.black, 70))
table.cell(tbl, 0, 0, '指标', text_color = color.white)
table.cell(tbl, 0, 1, '实际值', text_color = color.white)
table.cell(tbl, 1, 0, '收盘价', text_color = color.green)
table.cell(tbl, 1, 1, str.tostring(close, format.volume), text_color = color.green)
table.cell(tbl, 2, 0, '200MA', text_color = color.orange)
table.cell(tbl, 2, 1, str.tostring(gma_200, format.volume), text_color = color.orange)
table.cell(tbl, 3, 0, '指数估值', text_color = color.purple)
table.cell(tbl, 3, 1, str.tostring(exp_growth, format.volume), text_color = color.purple)