슈퍼 포물선형 원자로

PSAR ATR EMA SIGMOID
생성 날짜: 2025-10-23 16:10:01 마지막으로 수정됨: 2025-10-23 16:10:01
복사: 0 클릭수: 165
avatar of ianzeng123 ianzeng123
2
집중하다
329
수행원

슈퍼 포물선형 원자로 슈퍼 포물선형 원자로

전통적 PSAR은 죽었고, 적응은 최선입니다.

여러분이 알고 있는 모든 패러블리 SAR 전략을 잊으세요. 이 HyperSAR Reactor는 고전적인 PSAR을 역사의 쓰레기통으로 바로 보내줍니다. 전통적인 PSAR은 고정된 파라미터를 사용한다. 여기서 동적 강도를 조정한다.

역동적인 단계 조절 메커니즘은 고정 변수 버전보다 약 30%의 가짜 신호를 줄인 것으로 나타났습니다. 시장의 변동이 심해지면 알고리즘은 자동으로 민감도를 높이고 시장이 평온할 때 더 보수적으로 변합니다. 이것은 전통적인 기술 분석이 아니라 양적 거래의 진화입니다.

수학 모델링은 주관적인 판단을 억제합니다.

핵심 혁신은 시그모이드 함수를 도입하여 시장의 강도를 모델링하는 것이다. ATR에 대한 가격 경사율의 비율을 계산함으로써 시스템은 현재 트렌드의 “순수성”을 정량화 할 수 있다. 강도 증가는 4.5로 설정되어 있으며, 중심점은 0.45로 설정되어 있으며, 이는 트렌드 강도가 절벽을 초과할 때 시스템이 반응 속도를 크게 향상 시킨다는 것을 의미한다.

구체적으로 말하자면: 기본 걸음 길이는 0.04, 동적 증강 인자 0.03, 최대 가속 인자 1.0 ᄂ. 강한 트렌드에서, 효과적인 걸음 길이는 0.07 이상으로, 전통적인 PSAR보다 75% 더 빨리 트렌드 전환을 잡습니다. 반면, 흔들리는 시장에서, 걸음 길이는 0.04 근처에 유지하여 과도한 거래를 피합니다.

자료는 거짓말을 하지 않는다: 이 구성 요소는 리스크 조정 수익률이 더 높다는 것을 보여준다.

다중 필터로 방화벽을 구축

단순한 기술 지표 신호는 전쟁터에 있는 것 같았습니다. HyperSAR Reactor는 세 가지 방어선을 배치했습니다.

첫 번째: 보호구역 확정○ 0.5배의 ATR의 확인 거리를 설정하여, 가격이 신호를 발동하기 위해 분명히 PSAR 궤도를 뚫어야 합니다. ○ 이것은 90%의 노이즈 거래를 직접 필터링합니다.

두 번째: 변동률 관제현재 ATR이 30주기 평균의 1.0배 이상에 달해야 입장을 열 수 있다. 낮은 변동성 환경에서 휴식을 강제하고,横盘에서 반복적으로 당겨지는 것을 피한다.

세번째로, 트렌드 시스템 식별○ 하위 신호는 54주기 하향 트렌드 확인과 함께 작동해야 한다. ○ 91주기 EMA는 장기 트렌드 기준으로, 명확한 곰 시장 환경에서만 하위 조작이 허용된다.

그 결과, 가짜 신호는 60% 감소했지만, 진짜 트렌드 신호는 하나도 빠지지 않았습니다.

이윤보다 위험을 통제하는 것이 더 중요합니다.

스톱 로직은 동적 PSAR 궤도 추적을 사용하며, 고정 비율 스톱보다 100배 더 똑똑하다. 다중 헤드 스톱은 1.0배의 ATR로 설정되어 있으며, 공허 헤드는 고정 스톱을 설정하지 않는다 (하향 추세가 일반적으로 더 오래 지속되기 때문에).

냉각 기간 메커니즘은 감정적인 연속 거래를 방지한다. 매번 포지션을 열고 나서 강제적으로 기다려야 하며, 동일한 변동에서 반복적으로 입출력을 피한다. 수수료는 0.05%, 슬라이드 5 베이시스 포인트로 설정되어 있으며, 이것들은 실장 거래의 실제 비용이다.

위험 경고: 역사적인 회귀는 미래의 수익을 의미하지 않습니다. 이 전략은 불안한 시장에서 잘 작동하지 않으며, 연속적인 손실의 위험이 남아 있습니다. 포지션 관리와 포트폴리오 분산과 함께 강력히 권장됩니다.

실전 배치 가이드

가장 적합한 환경: 중간 높은 변동률의 트렌디 시장. 암호화폐, 상품 선물, 변동성 주식은 이상적인 지표입니다.

피하는 시장저 변동률의 수평 분석, 언론이 주도하는 폭파, 유동성이 극히 낮은 소수 품종.

변수 조정 제안: 강도 증가는 지표의 특성에 따라 조정할 수 있으며, 변동률이 높은 품종은 3.5로 낮출 수 있으며, 안정된 품종은 5.5로 향상시킬 수 있습니다. 확인된 방충 지역은 고주파 품종에서 0.3배 ATR로 낮출 수 있습니다.

위치 추천단일 신호는 총 자금의 10%를 초과하지 않으며, 3가지 이상의 관련 없는 품종을 보유하지 않는다.

이것은 또 다른 “마법 지표”가 아니라 수학 모델링에 기반한 체계화된 거래 방법입니다. 올바른 시장 환경에서, 그것은 당신의 수익 증폭기가 될 것입니다. 잘못된 환경에서, 엄격한 위험 관리가 당신의 자본을 보호 할 것입니다.

전략 소스 코드
/*backtest
start: 2024-10-23 00:00:00
end: 2025-10-21 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"XRP_USDT","balance":5000}]
*/

// This Pine Script® code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © exlux
//@version=6
strategy("HyperSAR Reactor ", shorttitle="HyperSAR ", overlay=true, pyramiding=0,
     initial_capital=100000, default_qty_type=strategy.percent_of_equity, default_qty_value=100,
     commission_type=strategy.commission.percent, commission_value=0.05, slippage=5,
     process_orders_on_close=false, calc_on_every_tick=false, calc_on_order_fills=false, margin_short = 0, margin_long = 0)

// =============== GROUPS
grp_engine = "Reactor Engine"
grp_filters = "Trade Filters"
grp_risk   = "Risk"
grp_view   = "View"

// =============== ENGINE INPUTS  (your defaults)
start_af   = input.float(0.02, "Start AF",  minval=0.0, maxval=1.0, step=0.01, group=grp_engine)
max_af     = input.float(1.00, "Max AF",    minval=0.0, maxval=1.0, step=0.01, group=grp_engine)
base_step  = input.float(0.04, "Base step", minval=0.0, maxval=1.0, step=0.01, group=grp_engine)

reg_len    = input.int  (18,   "Strength window", minval=5,  group=grp_engine)
atr_len    = input.int  (16,   "ATR length",      minval=5,  group=grp_engine)
alpha_gain = input.float(4.5,  "Strength gain",   minval=0.5, step=0.5, group=grp_engine)
alpha_ctr  = input.float(0.45, "Strength center", minval=0.1, step=0.05, group=grp_engine)
boost_k    = input.float(0.03, "Boost factor",    minval=0.0, step=0.01, group=grp_engine)

af_smooth    = input.float(0.50, "AF smoothing",    minval=0.0, maxval=1.0, step=0.05, group=grp_engine)
trail_smooth = input.float(0.35, "Trail smoothing", minval=0.0, maxval=1.0, step=0.05, group=grp_engine)

allow_long   = input.bool(true,  "Allow Long",  group=grp_engine)
allow_short  = input.bool(true,  "Allow Short", group=grp_engine)

// =============== FILTERS  (your defaults)
confirm_buf_atr = input.float(0.50, "Flip confirm buffer ATR", minval=0.0, step=0.05, group=grp_filters)
cooldown_bars   = input.int  (0,    "Cooldown bars after entry", minval=0, group=grp_filters)
vol_len         = input.int  (30,   "Vol gate length", minval=5, group=grp_filters)
vol_thr         = input.float(1.00, "Vol gate ratio ATR over mean", minval=0.5, step=0.05, group=grp_filters)

require_bear_regime = input.bool(true, "Gate shorts by bear regime", group=grp_filters)
bias_len            = input.int (54,   "Bear bias window", minval=10, group=grp_filters)
bias_ma_len         = input.int (91,   "Bias MA length",  minval=20, group=grp_filters)

// =============== RISK  (your defaults)
tp_long_atr  = input.float(1.0, "TP long ATR",  minval=0.0, step=0.25, group=grp_risk)
tp_short_atr = input.float(0.0, "TP short ATR", minval=0.0, step=0.25, group=grp_risk)

// =============== HELPERS
sigmoid(x, g, c) => 1.0 / (1.0 + math.exp(-g * (x - c)))
slope_per_bar(src, len) =>
    corr = ta.correlation(src, float(bar_index), len)
    sy   = ta.stdev(src, len)
    sx   = ta.stdev(float(bar_index), len)
    nz(corr, 0.0) * nz(sy, 0.0) / nz(sx, 1.0)

atr = ta.atr(atr_len)
drift = math.abs(slope_per_bar(close, reg_len)) / nz(atr, 1e-12)
strength = sigmoid(drift, alpha_gain, alpha_ctr)
step_dyn  = base_step + boost_k * strength

vol_ok   = atr / ta.sma(atr, vol_len) >= vol_thr
trend_ma = ta.ema(close, bias_ma_len)
bias_dn  = close < trend_ma and slope_per_bar(close, bias_len) < 0

// =============== ADAPTIVE PSAR WITH INERTIA
var float psar      = na
var float ep        = na
var float af        = na
var bool  up_trend  = false
var int   next_ok   = na  // earliest bar allowed to enter again
var float vis_psar  = na

init_now = na(psar)
if init_now
    up_trend := close >= open
    ep       := up_trend ? high : low
    psar     := up_trend ? low  : high
    af       := start_af
    next_ok  := bar_index

float next_psar = na
bool flipped = false

if up_trend
    next_psar := psar + af * (ep - psar)
    next_psar := math.min(next_psar, nz(low[1], low), nz(low[2], low))
    if close < next_psar
        up_trend := false
        psar     := ep
        ep       := low
        af       := start_af
        flipped  := true
    else
        // monotone trail with inertia
        mid = psar + trail_smooth * (next_psar - psar)
        psar := math.max(psar, mid)
        if high > ep
            ep := high
            new_af = math.min(af + step_dyn, max_af)
            af := af + af_smooth * (new_af - af)
else
    next_psar := psar + af * (ep - psar)
    next_psar := math.max(next_psar, nz(high[1], high), nz(high[2], high))
    if close > next_psar
        up_trend := true
        psar     := ep
        ep       := high
        af       := start_af
        flipped  := true
    else
        mid = psar + trail_smooth * (next_psar - psar)
        psar := math.min(psar, mid)
        if low < ep
            ep := low
            new_af = math.min(af + step_dyn, max_af)
            af := af + af_smooth * (new_af - af)

// visual only
vis_psar := na(vis_psar[1]) ? psar : vis_psar[1] + 0.35 * (psar - vis_psar[1])
vis_psar := up_trend ? math.max(nz(vis_psar[1], vis_psar), vis_psar) : math.min(nz(vis_psar[1], vis_psar), vis_psar)

// =============== ENTRY LOGIC WITH HYSTERESIS AND COOLDOWN
long_flip  =  up_trend and flipped
short_flip = not up_trend and flipped

need_wait  = bar_index < nz(next_ok, bar_index)
pass_long  = long_flip  and close > psar + confirm_buf_atr * atr and vol_ok and not need_wait
pass_short = short_flip and close < psar - confirm_buf_atr * atr and vol_ok and not need_wait and (not require_bear_regime or bias_dn)

// =============== ORDERS
if allow_long and pass_long
    strategy.entry("Long", strategy.long)
    next_ok := bar_index + cooldown_bars

if allow_short and pass_short
    strategy.entry("Short", strategy.short)
    next_ok := bar_index + cooldown_bars

if allow_long
    if pass_short
        strategy.close("Long")

if allow_short
    if pass_long
        strategy.close("Short")

// if strategy.position_size > 0
//     strategy.exit("Lx", from_entry="Long",  stop=psar, limit = tp_long_atr  > 0 ? strategy.opentrades.entry_price(0) + tp_long_atr  * atr : na)
if strategy.position_size < 0
    strategy.exit("Sx", from_entry="Short", stop=psar, limit = tp_short_atr > 0 ? strategy.opentrades.entry_price(0) - tp_short_atr * atr : na)