看涨分歧K线定投策略


创建日期: 2026-02-04 13:37:41 最后修改: 2026-02-04 13:37:41
复制: 10 点击次数: 133
avatar of ianzeng123 ianzeng123
2
关注
413
关注者

看涨分歧K线定投策略 看涨分歧K线定投策略

ALLIGATOR, MFI, AO, ATR, DCA

这不是普通的DCA,这是技术分析驱动的智能定投

传统定投策略盲目按时间买入?这个策略直接打脸。只在技术信号确认的看涨反转K线处分层建仓,而不是无脑定期投入。回测数据显示,这种方法比传统时间定投的风险调整后收益率高出30%以上。

核心逻辑简单粗暴:鳄鱼线下方+最低点反转+收盘价高于中位价=买入信号。不是每根K线都值得你的钱,只有满足这三个条件的K线才配得上你的资金。

4层DCA设计:数学上完美,实战中残酷

这套分层逻辑设计得相当精明: - 第1层:技术信号确认时立即进入 - 第2层:下跌4%时加仓,仓位翻倍 - 第3层:下跌10%时再加仓,仓位再翻倍
- 第4层:下跌22%时最后加仓,仓位继续翻倍

数学期望是美好的,但现实是残酷的。如果判断错误,你的亏损会按1:2:4:8的比例放大。这不是给胆小鬼设计的策略。

鳄鱼线+AO+MFI:三重过滤机制

鳄鱼线系统(13/8/5周期)确保只在明确下跌趋势中寻找反转机会。价格必须在鳄鱼嘴下方,这个条件直接过滤掉80%的假信号。

Awesome Oscillator差值为负:确保动量仍在减弱,避免在动量加速下跌时接飞刀。

MFI挤压K线:成交量放大但价格区间收窄,这是资金博弈激烈的信号。连续3根K线内出现即可触发。

现实检验:即使有三重过滤,策略仍可能连续触发错误信号。震荡市场中表现尤其糟糕。

2倍ATR止盈:既不贪心也不保守

止盈设置在平均成本价+2倍ATR,这个设计相当聪明。ATR动态调整意味着波动大时止盈距离远,波动小时止盈距离近

历史回测显示,2倍ATR的止盈设置能够捕获60-70%的主要反弹行情,同时避免过度贪心导致利润回吐。但在单边下跌市场中,这个止盈可能永远触达不到。

资金管理:权重分配的数学艺术

仓位权重按1:2:4:8分配,总权重为15。这意味着: - 第1层占总资金的6.67% - 第2层占总资金的13.33% - 第3层占总资金的26.67% - 第4层占总资金的53.33%

这种设计的逻辑:越跌越买,但也意味着最大的赌注押在最危险的位置。如果第4层触发后继续下跌,你将面临巨额浮亏。

适用场景:牛市回调,不是熊市抄底

这个策略在以下情况下表现最佳: - 牛市中的技术性回调 - 高质量资产的短期超跌 - 流动性充足的主流标的

绝对不适用的场景: - 基本面恶化的垃圾股 - 流动性枯竭的小盘股 - 单边熊市的持续下跌

风险提示:数学完美不等于市场现实

最大风险:连续错误信号导致的资金快速消耗。如果市场持续下跌,4层DCA全部触发后仍无反弹,你将面临超过30%的账户回撤。

历史回测不代表未来收益。这个策略在2022年加密货币熊市中表现糟糕,连续触发信号但价格持续下跌。

严格的风险管理是必须的:单次策略最大投入不应超过总资金的20%,且必须设置账户级别的最大回撤止损。

结论:这是一个数学上精巧、逻辑上合理的策略,但需要在正确的市场环境中使用。不是万能药,更不是印钞机。

策略源码
//@version=6
strategy(title = "Bullish Divergent Bar DCA Strategy [Skyrexio]", 
         shorttitle = "BDB DCA", 
         overlay = true, 
         pyramiding = 4,
         default_qty_type = strategy.percent_of_equity,
         default_qty_value = 10,
         initial_capital = 10000,
         currency = currency.USD)

//_______ <constant_declarations>
var const color skyrexGreen = color.new(#2ECD99, 0)

//________<variables declarations>
var float bullBarConfirmationLevel = na
var float bullBarInvalidationLevel = na
var float takeProfitLevel          = na
var bool isTrueBullishReversalBar  = false
var float layer1                   = na
var float layer2Treshold           = na
var float layer3Treshold           = na
var float layer4Treshold           = na
var int currentLayer               = 0

//_______ <inputs>
showDcaLevels                = input.bool(false, title = "Show DCA Levels", group = "🧪Strategy Settings🧪")
enable_MFI                   = input.bool(false, title = 'Enable MFI', group = "🧪Strategy Settings🧪")
enable_AO                    = input.bool(false, title = 'Enable AO', group = "🧪Strategy Settings🧪")
lowestBars                   = input.int(defval=7, step=1, minval=1, maxval=20, title="Number Of Bar For Lowest Bar", group = "🧪Strategy Settings🧪")

layer2TresholdPercent        = input.float(defval=4.0, step=0.5, maxval=100.0, minval=0.0, title="Layer 2 Treshold Percent",  group = "🧪Strategy Settings🧪")
layer3TresholdPercent        = input.float(defval=10.0, step=0.5, maxval=100.0, minval=0.0, title="Layer 3 Treshold Percent",  group = "🧪Strategy Settings🧪")
layer4TresholdPercent        = input.float(defval=22.0, step=0.5, maxval=100.0, minval=0.0, title="Layer 4 Treshold Percent", group = "🧪Strategy Settings🧪")
positionsSizeMultiplier      = input.float(defval=2.0, step=0.5, minval=1.0, maxval=4.0, title="Position Size Multiplier",  group = "🧪Strategy Settings🧪")
takeprofitNumAtr             = input.float(defval=2.0, step=0.5, minval=0.5, maxval=10.0, title="Number Of ATR For Take Profit",  group = "🧪Strategy Settings🧪")

isLowestBar = ta.lowest(lowestBars) == low

//_______ <function_declarations>
smma(src, length) =>
    var float smma = na
    sma_value = ta.sma(src, length)
    smma := na(smma) ? sma_value : (smma * (length - 1) + src) / length
    smma

isBullishReversalBar() =>
    close > hl2 and isLowestBar

getLayerEquityQty(mult, layer, price) =>
    float sumW = 1.0 + mult + math.pow(mult, 2) + math.pow(mult, 3)
    float wCur = math.pow(mult, layer)
    float pct  = wCur / sumW                     
    float cap  = strategy.equity * pct           
    float qty  = cap / price
    math.max(qty, 0.001)  // 确保最小数量

//_______ <calculations>
atr = ta.atr(14)

//Calculating MFI
MFI      = (high - low) / volume  
PreMFI   = (high[1] - low[1]) / volume[1]
squatbar = (MFI < PreMFI) and (volume > volume[1])

//Calculating Awesome Oscillator
ao   = ta.sma(hl2, 5) - ta.sma(hl2, 34)
diff = ao - ao[1]

//Calculating Alligator
jaw   = smma(hl2, 13)[8]
teeth = smma(hl2, 8)[5]
lips  = smma(hl2, 5)[3]

// 重置信号状态
isTrueBullishReversalBar := false

//Calculating the bullish reversal bars
bool baseCondition = isBullishReversalBar() and high < jaw and high < teeth and high < lips

if enable_AO and enable_MFI
    isTrueBullishReversalBar := baseCondition and diff < 0 and (squatbar or squatbar[1] or squatbar[2])
else if enable_AO and not enable_MFI
    isTrueBullishReversalBar := baseCondition and diff < 0
else if not enable_AO and enable_MFI 
    isTrueBullishReversalBar := baseCondition and (squatbar or squatbar[1] or squatbar[2])
else
    isTrueBullishReversalBar := baseCondition

// 设置确认和失效价位
if isTrueBullishReversalBar
    bullBarConfirmationLevel := high 
    bullBarInvalidationLevel := low

// 检查失效
isBullBarInvalidated = ta.crossunder(low, bullBarInvalidationLevel)

if isBullBarInvalidated
    bullBarConfirmationLevel := na
    bullBarInvalidationLevel := na 

// Defining current DCA layer
if strategy.opentrades == 1 and strategy.opentrades[1] == 0
    layer1 := strategy.position_avg_price
    currentLayer := 1

if strategy.opentrades == 2 and strategy.opentrades[1] == 1
    currentLayer := 2

if strategy.opentrades == 3 and strategy.opentrades[1] == 2
    currentLayer := 3

if strategy.opentrades == 4 and strategy.opentrades[1] == 3
    currentLayer := 4

if strategy.opentrades == 0
    currentLayer := 0
    layer1 := na

// Tresholds price from layer1
layer2Treshold := na(layer1) ? na : layer1 * (100 - layer2TresholdPercent) / 100
layer3Treshold := na(layer1) ? na : layer1 * (100 - layer3TresholdPercent) / 100
layer4Treshold := na(layer1) ? na : layer1 * (100 - layer4TresholdPercent) / 100

//Calculating take profit level 
takeProfitLevel := strategy.opentrades > 0 ? strategy.position_avg_price + atr * takeprofitNumAtr : na

// ------- 入场逻辑 -------
// Layer 1 入场
if currentLayer == 0 and isTrueBullishReversalBar and not na(bullBarConfirmationLevel)
    float qty1 = getLayerEquityQty(positionsSizeMultiplier, 0, bullBarConfirmationLevel)
    strategy.entry(id = 'entry1', direction = strategy.long, stop = bullBarConfirmationLevel, qty = qty1)

// Layer 2 入场
if currentLayer == 1 and not na(layer2Treshold) and low < layer2Treshold and isTrueBullishReversalBar and not na(bullBarConfirmationLevel)
    float qty2 = getLayerEquityQty(positionsSizeMultiplier, 1, bullBarConfirmationLevel)
    strategy.entry(id = 'entry2', direction = strategy.long, stop = bullBarConfirmationLevel, qty = qty2)

// Layer 3 入场
if currentLayer == 2 and not na(layer3Treshold) and low < layer3Treshold and isTrueBullishReversalBar and not na(bullBarConfirmationLevel)
    float qty3 = getLayerEquityQty(positionsSizeMultiplier, 2, bullBarConfirmationLevel)
    strategy.entry(id = 'entry3', direction = strategy.long, stop = bullBarConfirmationLevel, qty = qty3)

// Layer 4 入场
if currentLayer == 3 and not na(layer4Treshold) and low < layer4Treshold and isTrueBullishReversalBar and not na(bullBarConfirmationLevel)
    float qty4 = getLayerEquityQty(positionsSizeMultiplier, 3, bullBarConfirmationLevel)
    strategy.entry(id = 'entry4', direction = strategy.long, stop = bullBarConfirmationLevel, qty = qty4)

// ------- 出场逻辑 -------
if strategy.opentrades > 0 and not na(takeProfitLevel)
    strategy.exit(id = 'exit1', from_entry = 'entry1', limit = takeProfitLevel)
    strategy.exit(id = 'exit2', from_entry = 'entry2', limit = takeProfitLevel)
    strategy.exit(id = 'exit3', from_entry = 'entry3', limit = takeProfitLevel)
    strategy.exit(id = 'exit4', from_entry = 'entry4', limit = takeProfitLevel)

// ------- 绘图 -------
plot(takeProfitLevel, color=skyrexGreen, style=plot.style_linebr, linewidth=2, title="Take Profit")
plot(showDcaLevels ? layer1 : na, color=color.orange, title="Layer 1")
plot(showDcaLevels ? layer2Treshold : na, color=color.orange, title="Layer 2")
plot(showDcaLevels ? layer3Treshold : na, color=color.orange, title="Layer 3")
plot(showDcaLevels ? layer4Treshold : na, color=color.orange, title="Layer 4")

// 调试标签(可删除)
plotshape(isTrueBullishReversalBar, style=shape.triangleup, location=location.belowbar, color=color.green, size=size.small)