예스스탁
예스스탁 답변
2025-09-15 10:36:21.0
안녕하세요
예스스탁입니다.
#{----------- Inputs -----------}
input: DI_Length(14);
input: DI_Source(1); # { 1=Close, 2=Open, 3=High, 4=Low, 5=Typical(H+L+C)/3 }
input: RSI_Length(14);
#{ RSI Smoothing / BB }
input: MA_Type(1); # { 0=None, 1=SMA, 2=SMA+BB, 3=EMA, 4=RMA, 5=WMA, 6=VWMA }
input: MA_Len(14);
input: BB_Mult(2.0);
#{ Divergence }
input: CalcDivergence(false);
input: LB_Left(5);
input: LB_Right(5);
input: RangeLower(5);
input: RangeUpper(60);
#{ Colors }
input: DiUpColor(RGB(14,187,35)); #{ ≈ #0ebb23 }
input: DiDnColor(Red);
input: LevelColor(Gray);
input: RsiColor(RGB(126,87,194)); #{ ≈ #7E57C2 }
input: BBColor(Green);
input: BullColor(Green);
input: BearColor(Red);
#{----------- Vars -----------}
vars:
srcVal(0), smaDI(0), di(0), scaledDi(0),
chg(0), up(0), dn(0), upRMA(0), dnRMA(0), rsi(0),
rsiMA(0), rsiStDev(0), rsiBB_Up(0), rsiBB_Dn(0),
bullCond(false), bearCond(false),
rsiPivotLow(0), rsiPrevPivotLow(0), pxPivotLow(0), pxPrevPivotLow(0),
rsiPivotHigh(0), rsiPrevPivotHigh(0), pxPivotHigh(0), pxPrevPivotHigh(0),
pivBarsL(0), pivBarsH(0),
lblBull(0), lblBear(0);
#{----------- Source 선택 -----------}
if DI_Source == 1 then
srcVal = Close;
else if DI_Source == 2 then
srcVal = Open;
else if DI_Source == 3 then
srcVal = High;
else if DI_Source == 4 then
srcVal = Low;
else
srcVal = (High + Low + Close) / 3;
#{----------- Disparity Index -----------}
smaDI = ma(srcVal, DI_Length);
if smaDI <> 0 then
di = 100 * (srcVal - smaDI) / smaDI;
else
di = 0;
scaledDi = 20 * di + 50;
#{ 색상 }
vars: diColor(0);
if scaledDi >= 50 then diColor = DiUpColor; else diColor = DiDnColor;
Plot1(scaledDi, "Scaled DI", diColor);
Plot2(50, "DI 50", LevelColor);
#{----------- RSI (Wilder RMA) -----------}
chg = Close - Close[1];
up = MaxList(chg, 0);
dn = MaxList(-chg, 0);
if CurrentBar == 1 then begin
upRMA = up;
dnRMA = dn;
end else begin
upRMA = (upRMA[1] * (RSI_Length - 1) + up) / RSI_Length;
dnRMA = (dnRMA[1] * (RSI_Length - 1) + dn) / RSI_Length;
end;
if dnRMA == 0 then
rsi = 100;
else if upRMA == 0 then
rsi = 0;
else
rsi = 100 - (100 / (1 + upRMA / dnRMA));
Plot3(rsi, "RSI", RsiColor);
#{ RSI 레벨 라인: 70/60/50/40/30 }
Plot4(70, "RSI 70", LevelColor);
Plot5(60, "RSI 60", LevelColor);
Plot6(50, "RSI 50", LevelColor);
Plot7(40, "RSI 40", LevelColor);
Plot8(30, "RSI 30", LevelColor);
#{----------- RSI Smoothing / BB -----------}
#{ MA_Type: 0=None, 1=SMA, 2=SMA+BB, 3=EMA, 4=RMA, 5=WMA, 6=VWMA }
if MA_Type == 1 or MA_Type == 2 then
rsiMA = ma(rsi, MA_Len);
else if MA_Type == 3 then
rsiMA = Ema(rsi, MA_Len);
else if MA_Type == 4 then begin
if CurrentBar == 1 then rsiMA = rsi;
else rsiMA = (rsiMA[1] * (MA_Len - 1) + rsi) / MA_Len;
end
else if MA_Type == 5 then
rsiMA = WMa(rsi, MA_Len);
else if MA_Type == 6 then
rsiMA = AccumN(rsi * Volume, MA_Len) / AccumN(Volume, MA_Len);
else
rsiMA = 0;
if MA_Type >= 1 then
Plot9(rsiMA, "RSI_MA", Yellow);
if MA_Type == 2 then begin
rsiStDev = Std(rsi, MA_Len);
rsiBB_Up = rsiMA + rsiStDev * BB_Mult;
rsiBB_Dn = rsiMA - rsiStDev * BB_Mult;
Plot10(rsiBB_Up, "RSI_BB_Up", BBColor);
Plot11(rsiBB_Dn, "RSI_BB_Dn", BBColor);
end;
#{----------- Regular Divergence -----------}
if CalcDivergence then begin
#{ RSI Pivot Low }
if SwingLow(1, rsi, LB_Left, LB_Right, pivBarsL)!= -1 then begin
rsiPivotLow = rsi[pivBarsL];
pxPivotLow = Low[LB_Right];
bullCond = (rsiPrevPivotLow <> 0) and (pxPrevPivotLow <> 0)
and (pxPivotLow < pxPrevPivotLow) #{ Price LL }
and (rsiPivotLow > rsiPrevPivotLow) #{ RSI HL }
and (pivBarsL >= RangeLower and pivBarsL <= RangeUpper);
if bullCond then begin
lblBull = Text_New(sDate[LB_Right], sTime[LB_Right], rsiPivotLow, " Bull ");
Text_SetStyle(lblBull, 2, 0);
Text_SetColor(lblBull, BullColor);
end;
rsiPrevPivotLow = rsiPivotLow;
pxPrevPivotLow = pxPivotLow;
end;
#{ RSI Pivot High }
if SwingHigh(1, rsi, LB_Left, LB_Right, pivBarsH) != -1 then begin
rsiPivotHigh = rsi[pivBarsH];
pxPivotHigh = High[LB_Right];
bearCond = (rsiPrevPivotHigh <> 0) and (pxPrevPivotHigh <> 0)
and (pxPivotHigh > pxPrevPivotHigh) #{ Price HH }
and (rsiPivotHigh < rsiPrevPivotHigh) # { RSI LH }
and (pivBarsH >= RangeLower and pivBarsH <= RangeUpper);
if bearCond then begin
lblBear = Text_New(sDate[LB_Right], sTime[LB_Right], rsiPivotHigh, " Bear ");
Text_SetStyle(lblBear, 2, 1);
Text_SetColor(lblBear, BearColor);
end;
rsiPrevPivotHigh = rsiPivotHigh;
pxPrevPivotHigh = pxPivotHigh;
end;
end;
즐거운 하루되세요
> 윤호석 님이 쓴 글입니다.
> 제목 : 부탁드립니다 항상 감사합니다
> {==========================================
Disparity Index + RSI (YesLanguage version)
- DI = 100 * (src - SMA(src,L)) / SMA(src,L)
- scaledDI = 20 * DI + 50
- RSI = Wilder RMA
- RSI MA/BB 옵션: 0=None, 1=SMA, 2=SMA+BB, 3=EMA, 4=RMA, 5=WMA, 6=VWMA
- Regular Bullish/Bearish Divergence (라벨)
==========================================}
{----------- Inputs -----------}
input: DI_Length(14);
input: DI_Source(1); { 1=Close, 2=Open, 3=High, 4=Low, 5=Typical(H+L+C)/3 }
input: RSI_Length(14);
{ RSI Smoothing / BB }
input: MA_Type(1); { 0=None, 1=SMA, 2=SMA+BB, 3=EMA, 4=RMA, 5=WMA, 6=VWMA }
input: MA_Len(14);
input: BB_Mult(2.0);
{ Divergence }
input: CalcDivergence(false);
input: LB_Left(5);
input: LB_Right(5);
input: RangeLower(5);
input: RangeUpper(60);
{ Colors }
input: DiUpColor(RGB(14,187,35)); { ≈ #0ebb23 }
input: DiDnColor(Red);
input: LevelColor(Gray);
input: RsiColor(RGB(126,87,194)); { ≈ #7E57C2 }
input: BBColor(Green);
input: BullColor(Green);
input: BearColor(Red);
{----------- Vars -----------}
vars:
srcVal(0), smaDI(0), di(0), scaledDi(0),
chg(0), up(0), dn(0), upRMA(0), dnRMA(0), rsi(0),
rsiMA(0), rsiStDev(0), rsiBB_Up(0), rsiBB_Dn(0),
bullCond(false), bearCond(false),
rsiPivotLow(0), rsiPrevPivotLow(0), pxPivotLow(0), pxPrevPivotLow(0),
rsiPivotHigh(0), rsiPrevPivotHigh(0), pxPivotHigh(0), pxPrevPivotHigh(0),
pivBarsL(0), pivBarsH(0),
lblBull(0), lblBear(0);
{----------- Source 선택 -----------}
if DI_Source = 1 then
srcVal = Close
else if DI_Source = 2 then
srcVal = Open
else if DI_Source = 3 then
srcVal = High
else if DI_Source = 4 then
srcVal = Low
else
srcVal = (High + Low + Close) / 3;
{----------- Disparity Index -----------}
smaDI = Average(srcVal, DI_Length);
if smaDI <> 0 then
di = 100 * (srcVal - smaDI) / smaDI
else
di = 0;
scaledDi = 20 * di + 50;
{ 색상 }
vars: diColor(0);
if scaledDi >= 50 then diColor = DiUpColor else diColor = DiDnColor;
Plot1(scaledDi, "Scaled DI", diColor);
Plot2(50, "DI 50", LevelColor);
{----------- RSI (Wilder RMA) -----------}
chg = Close - Close[1];
up = MaxList(chg, 0);
dn = MaxList(-chg, 0);
if CurrentBar = 1 then begin
upRMA = up;
dnRMA = dn;
end else begin
upRMA = (upRMA[1] * (RSI_Length - 1) + up) / RSI_Length;
dnRMA = (dnRMA[1] * (RSI_Length - 1) + dn) / RSI_Length;
end;
if dnRMA = 0 then
rsi = 100
else if upRMA = 0 then
rsi = 0
else
rsi = 100 - (100 / (1 + upRMA / dnRMA));
Plot3(rsi, "RSI", RsiColor);
{ RSI 레벨 라인: 70/60/50/40/30 }
Plot4(70, "RSI 70", LevelColor);
Plot5(60, "RSI 60", LevelColor);
Plot6(50, "RSI 50", LevelColor);
Plot7(40, "RSI 40", LevelColor);
Plot8(30, "RSI 30", LevelColor);
{----------- RSI Smoothing / BB -----------}
{ MA_Type: 0=None, 1=SMA, 2=SMA+BB, 3=EMA, 4=RMA, 5=WMA, 6=VWMA }
if MA_Type = 1 or MA_Type = 2 then
rsiMA = Average(rsi, MA_Len)
else if MA_Type = 3 then
rsiMA = XAverage(rsi, MA_Len)
else if MA_Type = 4 then begin
if CurrentBar = 1 then rsiMA = rsi
else rsiMA = (rsiMA[1] * (MA_Len - 1) + rsi) / MA_Len;
end
else if MA_Type = 5 then
rsiMA = WAverage(rsi, MA_Len)
else if MA_Type = 6 then
rsiMA = Summation(rsi * Volume, MA_Len) / Summation(Volume, MA_Len)
else
rsiMA = 0;
if MA_Type >= 1 then
Plot9(rsiMA, "RSI_MA", Yellow);
if MA_Type = 2 then begin
rsiStDev = StdDev(rsi, MA_Len);
rsiBB_Up = rsiMA + rsiStDev * BB_Mult;
rsiBB_Dn = rsiMA - rsiStDev * BB_Mult;
Plot10(rsiBB_Up, "RSI_BB_Up", BBColor);
Plot11(rsiBB_Dn, "RSI_BB_Dn", BBColor);
end;
{----------- Regular Divergence -----------}
if CalcDivergence then begin
{ RSI Pivot Low }
if SwingLow(rsi, LB_Left, LB_Right, pivBarsL) then begin
rsiPivotLow = rsi[pivBarsL];
pxPivotLow = Low[LB_Right];
bullCond = (rsiPrevPivotLow <> 0) and (pxPrevPivotLow <> 0)
and (pxPivotLow < pxPrevPivotLow) { Price LL }
and (rsiPivotLow > rsiPrevPivotLow) { RSI HL }
and (pivBarsL >= RangeLower and pivBarsL <= RangeUpper);
if bullCond then begin
lblBull = Text_New(sDate[LB_Right], sTime[LB_Right], rsiPivotLow, " Bull ");
Text_SetStyle(lblBull, 2, 0);
Text_SetColor(lblBull, BullColor);
end;
rsiPrevPivotLow = rsiPivotLow;
pxPrevPivotLow = pxPivotLow;
end;
{ RSI Pivot High }
if SwingHigh(rsi, LB_Left, LB_Right, pivBarsH) then begin
rsiPivotHigh = rsi[pivBarsH];
pxPivotHigh = High[LB_Right];
bearCond = (rsiPrevPivotHigh <> 0) and (pxPrevPivotHigh <> 0)
and (pxPivotHigh > pxPrevPivotHigh) { Price HH }
and (rsiPivotHigh < rsiPrevPivotHigh) { RSI LH }
and (pivBarsH >= RangeLower and pivBarsH <= RangeUpper);
if bearCond then begin
lblBear = Text_New(sDate[LB_Right], sTime[LB_Right], rsiPivotHigh, " Bear ");
Text_SetStyle(lblBear, 2, 1);
Text_SetColor(lblBear, BearColor);
end;
rsiPrevPivotHigh = rsiPivotHigh;
pxPrevPivotHigh = pxPivotHigh;
end;
end;
수정부탁드립니다