커뮤니티

수식 부탁드립니다.

프로필 이미지
사노소이
2026-01-08 14:35:41
85
글번호 229653
답변완료

//──────────────────────────────────────────────

// INPUTS

//──────────────────────────────────────────────

use_long  = input.bool(true,  "Use Long Settings",  group="Strategy")

use_short = input.bool(true,  "Use Short Settings", group="Strategy")

use_dynamic_mult = input.bool(true, "Use Dynamic Multiplier", group="Dynamic Adaptation")


len_long   = input.int(20, "Long Length",  group="Long Settings")

mult_long  = input.float(1.0, "Long Multiplier",  step=0.1, group="Long Settings")


len_short  = input.int(20, "Short Length", group="Short Settings")

mult_short = input.float(1.0, "Short Multiplier", step=0.1, group="Short Settings")


src = close


//──────────────────────────────────────────────

// Dynamic Multiplier

//──────────────────────────────────────────────

f_dynamic_mult(base_mult, atr_length, use_dynamic) =>

    if use_dynamic

        volatility_factor = ta.atr(atr_length) / ta.atr(atr_length)[20]

        adjusted_mult = base_mult * math.sqrt(volatility_factor)

        math.min(math.max(adjusted_mult, base_mult * 0.5), base_mult * 2)

    else

        base_mult


dynamic_mult_long  = f_dynamic_mult(mult_long,  len_long, use_dynamic_mult)

dynamic_mult_short = f_dynamic_mult(mult_short, len_short, use_dynamic_mult)


//──────────────────────────────────────────────

// ATR Band

//──────────────────────────────────────────────

deltaAtr_long  = dynamic_mult_long  * ta.atr(len_long)

deltaAtr_short = dynamic_mult_short * ta.atr(len_short)


midb_long  = ta.sma(src, len_long)

midb_short = ta.sma(src, len_short)


upperb_long  = midb_long  + deltaAtr_long

lowerb_long  = midb_long  - deltaAtr_long

upperb_short = midb_short + deltaAtr_short

lowerb_short = midb_short - deltaAtr_short


//──────────────────────────────────────────────

// Trend Detection

//──────────────────────────────────────────────

trendUp_long    = close > upperb_long

trendDown_long  = close < lowerb_long

trendUp_short   = close > upperb_short

trendDown_short = close < lowerb_short


//──────────────────────────────────────────────

// Trend State Machine

//──────────────────────────────────────────────

var int trendState = 0

trendState :=

     use_long  and trendUp_long    ?  1 :

     use_long  and trendDown_long  ? -1 :

     use_short and trendUp_short   ?  1 :

     use_short and trendDown_short ? -1 :

     nz(trendState[1], 0)


//──────────────────────────────────────────────

// Signal start detection

//──────────────────────────────────────────────

trend_started = trendState != trendState[1]

long_signal   = trend_started and trendState ==  1

short_signal  = trend_started and trendState == -1


//──────────────────────────────────────────────

// Signal Markers

//──────────────────────────────────────────────

plotshape(long_signal, title="Long Signal", style=shape.labelup, location=location.belowbar, color=color.blue, size=size.small, text="LONG", textcolor = color.white)

plotshape(short_signal, title="Short Signal", style=shape.labeldown, location=location.abovebar, color=color.red, size=size.small, text="SHORT", textcolor = color.white)


//──────────────────────────────────────────────

// ATR Band Visualization

//──────────────────────────────────────────────

// Long Bands

plot(use_long ? midb_long : na, title="Long Mid (Length)", color=color.new(color.blue, 0), linewidth=1, style=plot.style_line)

plot(use_long ? upperb_long : na, title="Long Upper ATR Band", color=color.new(color.blue, 40), linewidth=1, style=plot.style_line)

plot(use_long ? lowerb_long : na, title="Long Lower ATR Band", color=color.new(color.blue, 40), linewidth=1, style=plot.style_line)


// Short Bands

plot(use_short ? midb_short : na, title="Short Mid (Length)", color=color.new(color.red, 0), linewidth=1, style=plot.style_line)

plot(use_short ? upperb_short : na, title="Short Upper ATR Band", color=color.new(color.red, 40), linewidth=1, style=plot.style_line)

plot(use_short ? lowerb_short : na, title="Short Lower ATR Band", color=color.new(color.red, 40), linewidth=1, style=plot.style_line)


지표
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2026-01-08 16:22:59

안녕하세요 예스스탁입니다. input : use_long(true); input : use_short(true); input : use_dynamic_mult(true); input : len_long(20); input : mult_long(1.0); input : len_short(20); input : mult_short(1.0); var : src(0),dynamic_mult_long(0),dynamic_mult_short(0); var : deltaAtr_long(0),deltaAtr_short(0); var : alpha1(0),ATRV1(0),alpha2(0),atrv2(0); var : midb_long(0),midb_short(0); src = close; Function f_dynamic_mult { input : base_mult(Numeric), atr_length(Numeric), use_dynamic(truefalse); var : alpha(0),ATRV(0),volatility_factor(0),adjusted_mult(0); if use_dynamic == true Then { alpha = 1 / atr_length ; ATRV = IFf(IsNan(ATRV[1]) == true, ma(TrueRange,atr_length) , alpha * TrueRange + (1 - alpha) * IFf(isnan(ATRV[1])==true,0,ATRV[1])); volatility_factor = ATRV/ATRV[20]; adjusted_mult = base_mult * sqrt(volatility_factor); f_dynamic_mult = min(max(adjusted_mult, base_mult * 0.5), base_mult * 2); } else { f_dynamic_mult = base_mult; } } EndFunction dynamic_mult_long = f_dynamic_mult(mult_long, len_long, use_dynamic_mult); dynamic_mult_short = f_dynamic_mult(mult_short, len_short, use_dynamic_mult); alpha1 = 1 / len_long ; ATRV1 = IFf(IsNan(ATRV1[1]) == true, ma(TrueRange,len_long) , alpha1 * TrueRange + (1 - alpha1) * IFf(isnan(ATRV1[1])==true,0,ATRV1[1])); alpha2 = 1 / len_short ; ATRV2 = IFf(IsNan(ATRV2[1]) == true, ma(TrueRange,len_long) , alpha2 * TrueRange + (1 - alpha2) * IFf(isnan(ATRV2[1])==true,0,ATRV2[1])); deltaAtr_long = dynamic_mult_long * atrv1; deltaAtr_short = dynamic_mult_short * atrv2; midb_long = ma(src, len_long); midb_short = ma(src, len_short); var : upperb_long(0),lowerb_long(0),upperb_short(0),lowerb_short(0); upperb_long = midb_long + deltaAtr_long; lowerb_long = midb_long - deltaAtr_long; upperb_short = midb_short + deltaAtr_short; lowerb_short = midb_short - deltaAtr_short; var : trendUp_long(False),trendDown_long(False),trendUp_short(False),trendDown_short(False); trendUp_long = close > upperb_long; trendDown_long = close < lowerb_long; trendUp_short = close > upperb_short; trendDown_short = close < lowerb_short; var : trendState(0); trendState = iff(use_long and trendUp_long, 1, Iff(use_long and trendDown_long, -1, iff(use_short and trendUp_short, 1, iff(use_short and trendDown_short , -1 , IFf(isnan(trendState[1]) ==true, 0,trendState[1]))))); var : trend_started(False),long_signal(False),short_signal(False); trend_started = trendState != trendState[1]; long_signal = trend_started and trendState == 1; short_signal = trend_started and trendState == -1; var : tx(0); if long_signal == true Then { tx = Text_New(sDate,sTime,L,"▲"); Text_SetStyle(tx,2,0); Text_SetColor(tx,Blue); } if short_signal == true Then { tx = Text_New(sDate,sTime,L,"▼"); Text_SetStyle(tx,2,0); Text_SetColor(tx,Red); } if use_long == true Then { plot1(midb_long,"Long Mid (Length)", blue); plot2(upperb_long,"Long Upper ATR Band", blue); plot3(lowerb_long,"Long Lower ATR Band", blue); } Else { NoPlot(1); NoPlot(2); NoPlot(3); } if use_short == true Then { plot4(midb_short,"Short Mid (Length)", red); plot5(upperb_short,"Short Upper ATR Band", red); plot6(lowerb_short,"Short Lower ATR Band", red); } Else { NoPlot(4); NoPlot(5); NoPlot(6); } 즐거운 하루 되세요