예스스탁
예스스탁 답변
2025-08-13 11:17:20
안녕하세요
예스스탁입니다.
input : length(2);
input : percent(1.5);
input : hllength(20);
var : src(0),srcl(0);
src = highest(high, hllength);
srcl = lowest(low, hllength);
// === VAR moving-average function (fixed VAR type)
#Var_Func(src, length) =>
var : valpha(0),vud1(0),vdd1(0),vUD(0),vDD(0),vCMO(0),MAvg(0);
var : valpha2(0),vud12(0),vdd12(0),vUD2(0),vDD2(0),vCMO2(0),MAvgl(0);
valpha = 2 / (length + 1);
vud1 = iff(src > src[1] , src - src[1] , 0);
vdd1 = iff(src < src[1] , src[1] - src , 0);
vUD = AccumN(vud1, 9);
vDD = AccumN(vdd1, 9);
vCMO = IFf(IsNan((vUD - vDD) / (vUD + vDD))==true,0,(vUD - vDD) / (vUD + vDD));
MAvg = iff(IsNan(valpha * abs(vCMO) * src)==true,0,valpha * abs(vCMO) * src) + (1 - valpha * abs(vCMO)) * iff(isnan(MAvg[1])==true,0,MAvg[1]);
valpha2 = 2 / (length + 1);
vud12 = iff(src > src[1] , src - src[1] , 0);
vdd12 = iff(src < src[1] , src[1] - src , 0);
vUD2 = AccumN(vud12, 9);
vDD2 = AccumN(vdd12, 9);
vCMO2 = IFf(IsNan((vUD2 - vDD2) / (vUD2 + vDD2))==true,0,(vUD2 - vDD2) / (vUD2 + vDD2));
MAvgl = iff(IsNan(valpha2 * abs(vCMO2) * srcl)==true,0,valpha2 * abs(vCMO2) * srcl) + (1 - valpha2 * abs(vCMO2)) * iff(isnan(MAvgl[1])==true,0,MAvgl[1]);
var : fark(0),longStop(0),longStopPrev(0),shortStop(0),shortStopPrev(0),dir(0),MT(0),HOTT(0);
fark = MAvg * percent * 0.01;
longStop = MAvg - fark;
longStopPrev = iff(IsNan(longStop[1]) ==true,longStop,longStop[1]);
longStop = iff(MAvg > longStopPrev , max(longStop, longStopPrev) , longStop);
shortStop = MAvg + fark;
shortStopPrev = iff(IsNan(shortStop[1]) == true, shortStop, shortStop[1]);
shortStop = iff(MAvg < shortStopPrev , min(shortStop, shortStopPrev) , shortStop);
dir = 1;
dir = iff(IsNan(dir[1])==true, dir,dir[1]);
dir = iff(dir == -1 and MAvg > shortStopPrev , 1 , IFf(dir == 1 and MAvg < longStopPrev , -1 , dir));
MT = iff(dir == 1 , longStop , shortStop);
HOTT = iff(MAvg > MT , MT * (200 + percent) / 200 , MT * (200 - percent) / 200);
var : farkl(0),longStopl(0),longStopPrevl(0),shortStopl(0),shortStopPrevl(0),dirl(0),MTl(0),LOTT(0);
farkl = MAvgl * percent * 0.01;
longStopl = MAvgl - farkl;
longStopPrevl = iff(isnan(longStopl[1])==true,longStopl,longStopl[1]);
longStopl = iff(MAvgl > longStopPrevl , max(longStopl, longStopPrevl) , longStopl);
shortStopl = MAvgl + farkl;
shortStopPrevl = iff(isnan(shortStopl[1]), shortStopl, shortStopl[1]);
shortStopl = iff(MAvgl < shortStopPrevl , min(shortStopl, shortStopPrevl) , shortStopl);
dirl = 1;
dirl = iff(isnan(dirl[1]) == true, dirl,dirl[1]);
dirl = iff(dirl == -1 and MAvgl > shortStopPrevl , 1 , iff(dirl == 1 and MAvgl < longStopPrevl , -1 , dirl));
MTl = iff(dirl == 1 , longStopl , shortStopl);
LOTT = iff(MAvgl > MTl , MTl * (200 + percent) / 200 , MTl * (200 - percent) / 200);
// === Plot only HOTT & LOTT
plot1(HOTT[2], "HOTT");
plot2(LOTT[2], "LOTT");
즐거운 하루되세요
> 사노소이 님이 쓴 글입니다.
> 제목 : 수식 부탁드립니다
> 지표식 부탁 드립니다.
//@version=5
indicator("HL Optimized Trend Tracker", overlay=true)
// === inputs
length = input.int(2, "Period", minval=1)
percent = input.float(1.5, "Optimization Coeff", step=0.1, minval=0)
hllength = input.int(20, "Highest and Lowest Length", minval=1)
// === highest / lowest series used as VAR source
src = ta.highest(high, hllength)
srcl = ta.lowest(low, hllength)
// === VAR moving-average function (fixed VAR type)
Var_Func(src, length) =>
valpha = 2 / (length + 1)
vud1 = src > src[1] ? src - src[1] : 0
vdd1 = src < src[1] ? src[1] - src : 0
vUD = math.sum(vud1, 9)
vDD = math.sum(vdd1, 9)
vCMO = nz((vUD - vDD) / (vUD + vDD))
VAR = 0.0
VAR := nz(valpha * math.abs(vCMO) * src) + (1 - valpha * math.abs(vCMO)) * nz(VAR[1])
VAR
// === compute VAR-based MAs (top & low)
MAvg = Var_Func(src, length)
MAvgl = Var_Func(srcl, length)
// === HOTT (top) logic
fark = MAvg * percent * 0.01
longStop = MAvg - fark
longStopPrev = nz(longStop[1], longStop)
longStop := MAvg > longStopPrev ? math.max(longStop, longStopPrev) : longStop
shortStop = MAvg + fark
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := MAvg < shortStopPrev ? math.min(shortStop, shortStopPrev) : shortStop
dir = 1
dir := nz(dir[1], dir)
dir := dir == -1 and MAvg > shortStopPrev ? 1 : dir == 1 and MAvg < longStopPrev ? -1 : dir
MT = dir == 1 ? longStop : shortStop
HOTT = MAvg > MT ? MT * (200 + percent) / 200 : MT * (200 - percent) / 200
// === LOTT (low) logic (mirror)
farkl = MAvgl * percent * 0.01
longStopl = MAvgl - farkl
longStopPrevl = nz(longStopl[1], longStopl)
longStopl := MAvgl > longStopPrevl ? math.max(longStopl, longStopPrevl) : longStopl
shortStopl = MAvgl + farkl
shortStopPrevl = nz(shortStopl[1], shortStopl)
shortStopl := MAvgl < shortStopPrevl ? math.min(shortStopl, shortStopPrevl) : shortStopl
dirl = 1
dirl := nz(dirl[1], dirl)
dirl := dirl == -1 and MAvgl > shortStopPrevl ? 1 : dirl == 1 and MAvgl < longStopPrevl ? -1 : dirl
MTl = dirl == 1 ? longStopl : shortStopl
LOTT = MAvgl > MTl ? MTl * (200 + percent) / 200 : MTl * (200 - percent) / 200
// === Plot only HOTT & LOTT
plot(nz(HOTT[2]), title="HOTT", color=color.blue, linewidth=2)
plot(nz(LOTT[2]), title="LOTT", color=color.red, linewidth=2)