
Chiến lược này được tối ưu hóa sâu dựa trên các chỉ số SAR ((Parabolic Stop and Reverse) dựa trên đường parabola truyền thống, kết hợp với phán đoán xu hướng đa chu kỳ và cơ chế dừng lỗ thích ứng. Chiến lược sử dụng phương thức điều chỉnh nhân tố gia tốc động (AF) để theo dõi xu hướng thị trường thông qua việc cập nhật liên tục điểm cực đoan (EP) để nắm bắt chính xác xu hướng tăng và kiểm soát rủi ro.
Logic cốt lõi của chiến lược này dựa trên các yếu tố chính sau:
Chiến lược này có khả năng kết hợp hiệu quả giữa theo dõi xu hướng và kiểm soát rủi ro bằng cách tối ưu hóa sâu sắc các chỉ số PSAR cổ điển. Tính năng tự điều chỉnh của chiến lược và cơ chế dừng lỗ hoàn thiện làm cho nó có giá trị ứng dụng thực tế mạnh mẽ.
/*backtest
start: 2024-02-19 00:00:00
end: 2025-02-16 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=6
strategy("A股抛物线策略(仅做多)- 完全移除SAR绘图", overlay=true)
// 参数设置
start = input.float(0.02, "起始加速因子")
increment = input.float(0.02, "加速因子增量")
maximum = input.float(0.2, "加速因子最大值")
// 定义变量(var保证变量在整个历史数据中保持状态)
var bool uptrend = true // 默认初始化为上升趋势
var float EP = na // 极值点:上升趋势时为最高价,下降趋势时为最低价
var float SAR = na // 当前K线的SAR
var float AF = start // 当前加速因子
var float nextBarSAR = na // 下一根K线的预测SAR
//【1】初始化:针对第一根K线(bar_index==0)
if bar_index == 0
// 使用首根K线收盘价初始化
SAR := close
nextBarSAR := close
EP := close
uptrend := true
//【2】从第二根K线开始(bar_index>=1)计算SAR
if bar_index >= 1
// 先将上一根K线计算得到的 nextBarSAR 赋给当前SAR
SAR := nz(nextBarSAR, SAR)
// 第2根K线(bar_index==1)做初始化,利用上一根K线(bar_index==0)的高低价
if bar_index == 1
if close > close[1]
uptrend := true
EP := high
SAR := low[1]
else
uptrend := false
EP := low
SAR := high[1]
AF := start
nextBarSAR := SAR + AF * (EP - SAR)
else
// 记录是否处于趋势反转的首根K线,方便后续判断
var bool firstTrendBar = false
firstTrendBar := false
// 检测趋势反转:
// 在上升趋势中,如果当前SAR超过最低价,则认为发生反转
if uptrend
if SAR > low
firstTrendBar := true
uptrend := false
// 反转时,SAR取上一次极值与当前最高价中的较大者,极值改为当前最低价
SAR := math.max(EP, high)
EP := low
AF := start
// 注意:原代码在上升趋势中还有个判断 SAR < high 的分支,但通常反转判据只需检测SAR是否穿过低点即可
else
// 在下降趋势中,如果当前SAR低于最高价,则认为反转为上升趋势
if SAR < high
firstTrendBar := true
uptrend := true
SAR := math.min(EP, low)
EP := high
AF := start
// 若非反转情形,则更新极值和加速因子
if not firstTrendBar
if uptrend
if high > EP
EP := high
AF := math.min(AF + increment, maximum)
else
if low < EP
EP := low
AF := math.min(AF + increment, maximum)
// 调整SAR,确保其不超过最近1-2根K线的最低价(上升趋势)或最高价(下降趋势)
if uptrend
SAR := math.min(SAR, low[1])
if bar_index > 1
SAR := math.min(SAR, low[2])
else
SAR := math.max(SAR, high[1])
if bar_index > 1
SAR := math.max(SAR, high[2])
// 计算下一根K线的预测SAR
nextBarSAR := SAR + AF * (EP - SAR)
//【3】交易逻辑(仅做多)
if barstate.isconfirmed
// 当出现上升趋势且当前无多头仓位时进场做多(以预测的下一根K线SAR为止损触发价)
if uptrend and strategy.position_size <= 0
strategy.entry("Long", strategy.long, stop=nextBarSAR, comment="Long Entry")
// 当趋势转为下降且持有多头时平仓
if not uptrend and strategy.position_size > 0
strategy.close("Long", comment="Long Exit")
// 绘图部分完全移除,不再绘制任何与SAR相关的图形