
This is a multi-level entry strategy based on dynamic All-Time High (ATH) tracking. The strategy monitors price retracements from ATH, implements batch purchases at different decline levels, and sells all positions when the price approaches ATH. It effectively utilizes market volatility through systematic position building to reduce overall holding costs.
The core logic includes the following key elements: 1. Dynamic ATH Tracking: Continuously updates historical highs and resets buy markers when new highs are broken 2. Three-level Decline Triggers: Sets entry points at 10%, 15%, and 20% retracements 3. Fixed Capital Management: Uses the same amount ($1000) for each purchase 4. Recovery Exit Mechanism: Closes all positions when price recovers to within 5% of ATH The strategy uses this progressive position building approach to gradually lower average holding costs during declines and locks in profits through unified exits during market rebounds.
This strategy effectively utilizes market volatility through systematic batch position building and unified exit mechanisms. Successful strategy operation depends on sufficient market volatility and ultimate upward trends. Through proper risk control and parameter optimization, the strategy can maintain stable performance across different market environments.
/*backtest
start: 2019-12-23 08:00:00
end: 2024-12-18 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © bsticks22
//@version=6
strategy("Long-term Bean Dip (v.1)", overlay=true)
// === Inputs ===
dip1 = input.float(10.0, "First Dip (%)", step=0.1) // 10%
dip2 = input.float(15.0, "Second Dip (%)", step=0.1) // 15%
dip3 = input.float(20.0, "Third Dip (%)", step=0.1) // 20%
recovery_threshold = input.float(5.0, "Sell when within X% of ATH", step=0.1) // 5%
buy_amount = input.float(50000.0, "Buy Amount ($)", step=100) // $1000 increments
// === Variables ===
var float all_time_high = na
var bool dip1_bought = false
var bool dip2_bought = false
var bool dip3_bought = false
// === Update All-Time High ===
if na(all_time_high)
all_time_high := high
else
// Update ATH to the previous bar's high to exclude current bar's high
all_time_high := math.max(all_time_high[1], high[1])
if high[1] > all_time_high[1]
// New ATH reached on the previous bar
dip1_bought := false
dip2_bought := false
dip3_bought := false
// === Calculate Percentage Drop from ATH ===
percent_drop = (all_time_high - close) / all_time_high * 100.0
// === Define Dip Conditions ===
buyDip1 = (percent_drop >= dip1) and not dip1_bought
buyDip2 = (percent_drop >= dip2) and not dip2_bought
buyDip3 = (percent_drop >= dip3) and not dip3_bought
// === Calculate Quantity to Buy ===
qty1 = buy_amount / close
// === Execute Buys on Dips ===
if buyDip1
strategy.entry("Dip1 Buy", strategy.long, qty=qty1)
dip1_bought := true
if buyDip2
strategy.entry("Dip2 Buy", strategy.long, qty=qty1)
dip2_bought := true
if buyDip3
strategy.entry("Dip3 Buy", strategy.long, qty=qty1)
dip3_bought := true
// === Sell Condition: Recovery to Within X% of ATH ===
sell_condition = close >= all_time_high * (1 - recovery_threshold / 100.0)
// === Execute Sell on Recovery ===
if sell_condition and strategy.position_size > 0
strategy.close_all()
// === Plotting ===
plot(all_time_high, title="All-Time High", color=color.new(color.blue, 0))
plot(all_time_high * (1 - dip1 / 100.0), title="Dip1 Level", color=color.new(color.green, 50), style=plot.style_linebr)
plot(all_time_high * (1 - dip2 / 100.0), title="Dip2 Level", color=color.new(color.orange, 50), style=plot.style_linebr)
plot(all_time_high * (1 - dip3 / 100.0), title="Dip3 Level", color=color.new(color.red, 50), style=plot.style_linebr)
plot(all_time_high * (1 - recovery_threshold / 100.0), title="Recovery Level", color=color.new(color.purple, 50), style=plot.style_linebr)
// === Plot Buy and Sell Signals ===
plotshape(buyDip1, title="Dip1 Buy", location=location.belowbar, color=color.green, style=shape.labelup, text="Buy10%")
plotshape(buyDip2, title="Dip2 Buy", location=location.belowbar, color=color.orange, style=shape.labelup, text="Buy15%")
plotshape(buyDip3, title="Dip3 Buy", location=location.belowbar, color=color.red, style=shape.labelup, text="Buy20%")
plotshape(sell_condition and strategy.position_size > 0, title="Sell", location=location.abovebar, color=color.purple, style=shape.labeldown, text="Sell")
// === Alerts ===
alertcondition(buyDip1, title="Dip1 Buy", message="Price dipped 10% from ATH, buying $1000")
alertcondition(buyDip2, title="Dip2 Buy", message="Price dipped 15% from ATH, buying $1000")
alertcondition(buyDip3, title="Dip3 Buy", message="Price dipped 20% from ATH, buying $1000")
alertcondition(sell_condition and strategy.position_size > 0, title="Sell at Recovery", message="Price recovered to within 5% of ATH, selling all")