该策略基于市场极端下跌时的统计特性进行交易。通过对回撤的统计分析,利用标准差衡量市场波动的极端程度,在市场出现超出正常范围的下跌时进行买入。策略的核心思想是捕捉市场恐慌情绪导致的超跌机会,通过数学统计方法识别市场非理性行为带来的投资机会。
策略采用滚动时间窗口计算价格的最大回撤和回撤的统计特征。首先计算过去50个周期内的最高价,然后计算当前收盘价相对最高价的回撤百分比。接着计算回撤的均值和标准差,设置-1倍标准差作为触发阈值。当市场回撤超过均值减去设定倍数的标准差时,表明市场可能出现超跌,此时进入多头头寸。持仓35个周期后自动平仓。策略还绘制了回撤曲线以及一倍、两倍和三倍标准差水平线,用于直观判断市场的超跌程度。
该策略通过统计学方法捕捉市场超跌机会,具有良好的理论基础和实用价值。策略逻辑简单清晰,参数可调整性强,适合作为基础策略进行扩展和优化。通过增加其他技术指标和风险控制措施,可以进一步提升策略的稳定性和盈利能力。在实盘交易中,建议结合市场环境和交易品种特点,谨慎设置参数,做好风险控制。
/*backtest
start: 2019-12-23 08:00:00
end: 2024-11-28 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Buy When There's Blood in the Streets Strategy", overlay=false, shorttitle="BloodInTheStreets")
//This strategy identifies opportunities to buy during extreme market drawdowns based on standard deviation thresholds.
//It calculates the maximum drawdown over a user-defined lookback period, identifies extreme deviations from the mean,
//and triggers long entries when specific conditions are met. The position is exited after a defined number of bars.
// User Inputs
lookbackPeriod = input.int(50, title="Lookback Period", minval=1, tooltip="Period to calculate the highest high for drawdown")
stdDevLength = input.int(50, title="Standard Deviation Length", minval=1, tooltip="Length of the period to calculate standard deviation")
stdDevThreshold = input.float(-1.0, title="Standard Deviation Threshold", tooltip="Trigger level for long entry based on deviations")
exitBars = input.int(35, title="Exit After (Bars)", minval=1, tooltip="Number of bars after which to exit the trade")
// Drawdown Calculation
peakHigh = ta.highest(high, lookbackPeriod)
drawdown = ((close - peakHigh) / peakHigh) * 100
// Standard Deviation Calculation
drawdownStdDev = ta.stdev(drawdown, stdDevLength)
meanDrawdown = ta.sma(drawdown, stdDevLength)
// Define Standard Deviation Levels
stdDev1 = meanDrawdown - drawdownStdDev
stdDev2 = meanDrawdown - 2 * drawdownStdDev
stdDev3 = meanDrawdown - 3 * drawdownStdDev
// Plot Drawdown and Levels
plot(drawdown, color=color.red, linewidth=2, title="Drawdown (%)")
plot(meanDrawdown, color=color.blue, linewidth=2, title="Mean Drawdown")
plot(stdDev1, color=color.green, linewidth=1, title="1st Std Dev")
plot(stdDev2, color=color.orange, linewidth=1, title="2nd Std Dev")
plot(stdDev3, color=color.purple, linewidth=1, title="3rd Std Dev")
// Entry Condition
var float entryBar = na
goLong = drawdown <= meanDrawdown + stdDevThreshold * drawdownStdDev
if (goLong and strategy.position_size == 0)
strategy.entry("Long", strategy.long)
entryBar := bar_index
// Exit Condition
if (strategy.position_size > 0 and not na(entryBar) and bar_index - entryBar >= exitBars)
strategy.close("Long")