複数期間のSARトレンド追跡適応型ストップロス最適化戦略

PSAR AF EP SAR SL TS MM
作成日: 2025-02-18 13:48:30 最終変更日: 2025-02-18 13:48:30
コピー: 1 クリック数: 391
1
フォロー
1617
フォロワー

複数期間のSARトレンド追跡適応型ストップロス最適化戦略

概要

この戦略は,伝統的なパラボリックラインSAR ((Parabolic Stop and Reverse) の指標に基づいて,多周期的なトレンド判断と自己適応の止損機構を組み合わせて,深度最適化されています. この戦略は,ダイナミック加速因子 (AF) の調整方法を採用し,極限点 (EP) の継続的な更新を通じて市場動向を追跡し,上昇傾向を精密に把握し,リスクを制御します.

戦略原則

戦略の中核となるロジックは、次の主要な要素に基づいています。

  1. 動的SAR計算:初期加速因子 ((AF),増量値,最大値の3つのパラメータを使用して,傾向強度に応じて動的にSAR値を調整する.
  2. トレンド判定機構:SAR値と価格位置の関係を比較してトレンドの方向を判断し,SARが価格を横切るとトレンド反転信号を触発する.
  3. 入場論理:上昇傾向が確認され,ポジションが持っていない場合,次の周期予測のSAR値を,入場注文としてストップ・ロスの設定として使用する.
  4. 止損最適化:前1-2のK線の極限値をSAR調整基準として採用し,止損の正確性とタイミングを向上させる.

戦略的優位性

  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相关的图形