다중 기간 SAR 추세 추적 적응형 손절매 최적화 전략

PSAR AF EP SAR SL TS MM
생성 날짜: 2025-02-18 13:48:30 마지막으로 수정됨: 2025-02-18 13:48:30
복사: 1 클릭수: 391
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

다중 기간 SAR 추세 추적 적응형 손절매 최적화 전략

개요

이 전략은 전통적인 패러블라인 SAR ((Parabolic Stop and Reverse) 지표에 기반하여 심도 최적화를 수행하고, 다중 주기적 추세 판단과 자율적 손실 중지 메커니즘을 결합한다. 전략은 동적 가속 인자 ((AF) 조정 방식을 채택하여 극한점 ((EP) 의 지속적인 업데이트를 통해 시장 추세를 추적하여 상승 추세를 정확하게 파악하고 위험을 제어한다.

전략 원칙

전략의 핵심 논리는 다음과 같은 핵심 요소에 기초합니다.

  1. 동적 SAR 계산: 초기 가속 인자 ((AF), 증가 값 및 최대 값 세 개의 파라미터를 사용하여 트렌드 강도에 따라 동적으로 SAR 값을 조정한다.
  2. 트렌드 결정 메커니즘: SAR값과 가격 위치 관계를 비교하여 트렌드 방향을 판단하고, SAR가 가격을 통과하면 트렌드 역전 신호를 발동한다.
  3. 입시 논리: 상승 추세를 확인하고 지분을 보유하지 않은 경우, 다음 주기 예측된 SAR 값을 사용하여 입시 주문을 설정하는 스톱 로즈.
  4. 스톱 손실 최적화: SAR 조정 기준으로 상반기 1-2 K 선의 극치를 사용하여 스톱 손실의 정확성과 적시에 대한 개선.

전략적 이점

  1. 자기 적응력: 동적으로 가속 인자를 조정하여, 전략은 시장의 변동 강도에 따라 자동으로 매개 변수를 조정할 수 있다.
  2. 리스크 제어: 예측 가능한 SAR 값을 사용하여 손실을 중지하여 손실의 예측성과 유효성을 보장합니다.
  3. 트렌드 파악 정확성: 여러 가지 트렌드 확인 메커니즘으로, 가짜 돌파구가 발생할 위험을 줄여줍니다.
  4. 계산 논리 엄격: 변수 상태 유지 메커니즘을 적용하여 전략의 역사 재검토에서의 안정성을 보장한다.

전략적 위험

  1. 흔들림 시장의 위험: 가로판 흔들림 시장에서 종종 잘못된 신호를 유발할 수 있으며, 이로 인해 연속적인 중단 손실이 발생할 수 있습니다. 대책: 변동률 필터를 도입하여 낮은 변동률 환경에서 거래 빈도를 줄일 수 있다.
  2. 슬라이드 포인트 영향: 예측 SAR 상쇄는 높은 변동성 시장에서 슬라이드 포인트 위험에 직면할 수 있다. 대응방안: 합리적인 점유율을 설정하고 품종 특성에 따라 변수를 조정하는 것이 좋습니다.
  3. 트렌드 반전 지연: 급격한 반전 시에는 손실 지연이 발생할 수 있다. 대응방법: 단기주기동량 지표 보조 판단과 결합하여 손해정지 민감도를 높일 수 있다.

전략 최적화 방향

  1. 다주기 연동: 여러 시간 주기의 트렌드 확인 메커니즘을 추가하여 신호 신뢰도를 높이는 것이 좋습니다.
  2. 동적 변수 최적화: 시장 변동률에 따라 동적으로 조정 가능한 가속 인자의 변수 설정.
  3. 손해 차단 메커니즘 개선: ATR 기반의 동적 손해 차단 밴드를 도입하여 손해 차단의 유연성을 높였다.
  4. 포지션 관리 최적화: 변동율에 기반한 동적 포지션 관리 메커니즘을 추가한다.

요약하다

이 전략은 고전적인 PSAR 지표에 대한 깊이 있는 최적화를 통해 트렌드 추적과 위험 제어의 효과적인 결합을 실현한다. 전략의 자기 적응 특성과 완성된 스톱 로스 메커니즘은 강력한 실전 응용 가치를 갖는다. 제안된 최적화 방향에 의해 전략의 안정성과 수익성이 더욱 향상될 전망이다.

전략 소스 코드
/*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相关的图形