커뮤니티
문의드립니다
input : 익절틱수(40000),손절틱수(520);
var : Ema100(0);
ema100 = ema(close, 100);
input : atrPeriod(10),factor(3);
var : src(0), alpha(0),ATRV(0),upperBand(0),lowerBand(0),direction(0),SuperTrend(C);
if CurrentBar > 1 Then
{
src = (H+L)/2;
alpha = 1 / atrPeriod ;
ATRV = IFf(IsNan(ATRV[1]) == true, ma(TrueRange,atrPeriod) , alpha * TrueRange + (1 - alpha) * IFf(isnan(ATRV[1])==true,0,ATRV[1]));
upperBand = src + factor * AtrV;
lowerBand = src - factor * AtrV;
if lowerBand > lowerBand[1] or close[1] < lowerBand[1] Then
lowerBand = lowerBand;
Else
lowerBand = lowerBand[1];
if upperBand < upperBand[1] or close[1] > upperBand[1] Then
upperBand = upperBand;
Else
upperBand = upperBand[1];
if C > UpperBand Then
direction = 1;
if C < LowerBand Then
direction = -1;
if direction == 1 Then
SuperTrend = lowerband;
Else
SuperTrend = upperband;
}
var : R(0),A(0),longCondition(False),shortCondition(False);
R = rsi(14);
A = adx(14);
longCondition = close > ema100 and direction > 0 and R > 50 and A > 25;
shortCondition = close < ema100 and direction < 0 and R <50 and A > 25;
var : S3(0);
if longCondition == true Then
S3 = 1;
if shortCondition == true Then
S3 = -1;
input : atrMult(4.5);
input : atrlen(12);
input : rsmlen(3);
input : tplen(14);
var : i(0),sum(0),source(0);
var : atrValue1(0),upperLevel(0),lowerLevel(0);
var : previousLowerLevel(0),previousUpperLevel(0);
var : trendDirection(Nan),superTrendValue(Nan);
var : previousTrend(0);
if CurrentBar > 1 Then
{
sum = 0;
for i = 0 to rsmlen-1
{
sum = sum + c[i]*c[i];
}
source = sqrt(sum/rsmlen);
alpha = 1 / atrlen ;
atrValue1 = IFf(IsNan(atrValue1[1]) == true, ma(TrueRange,atrlen) , alpha * TrueRange + (1 - alpha) * IFf(isnan(atrValue1[1])==true,0,atrValue1[1]));
upperLevel = source + atrMult * atrValue1;
lowerLevel = source - atrMult * atrValue1;
previousLowerLevel = iff(isnan(lowerLevel[1])==true,0,lowerLevel[1]);
previousUpperLevel = iff(isnan(upperLevel[1])==true,0,upperLevel[1]);
// Ensure continuity of lower and upper bands
lowerLevel = iff(lowerLevel > previousLowerLevel or source[1] < previousLowerLevel , lowerLevel , previousLowerLevel);
upperLevel = iff(upperLevel < previousUpperLevel or source[1] > previousUpperLevel , upperLevel , previousUpperLevel);
// Determine direction and SuperTrend
previousTrend = superTrendValue[1];
// Initialize direction
if IsNan(atrValue1[1]) == true Then
trendDirection = 1;
else if previousTrend == previousUpperLevel Then
trendDirection = iff(source > upperLevel , -1 , 1);
else
trendDirection = iff(source < lowerLevel , 1 , -1);
// Set SuperTrend value based on direction
superTrendValue = iff(trendDirection == -1 , lowerLevel , upperLevel);
}
var : dist(0),chg(0),lvlCol(0);
var : tp1(0),tp2(0),tp3(0),tp4(0),tp5(0),tp6(0),tp7(0);
var : printedtp1(0),printedtp2(0),printedtp3(0),printedtp4(0),printedtp5(0),printedtp6(0),printedtp7(0);
dist = abs(close-superTrendValue);
lvlCol = iff(trendDirection > 0 , red , green);
var : key1(0);
var : key2(0);
var : key3(0);
var : key4(0);
var : key5(0);
var : key6(0);
var : key7(0);
if CrossUp(trendDirection, 0) or CrossDown(trendDirection, 0) Then
{
//TL_Delete(keys);
printedtp1 = 0;
printedtp2 = 0;
printedtp3 = 0;
printedtp4 = 0;
printedtp5 = 0;
printedtp6 = 0;
printedtp7 = 0;
chg = abs(superTrendValue-superTrendValue[1]);
tp1 = superTrendValue[1] + IFF(trendDirection > 0 , -chg , chg);
tp2 = superTrendValue[1] + IFF(trendDirection > 0 , -chg * 2 , chg * 2);
tp3 = superTrendValue[1] + IFF(trendDirection > 0 , -chg * 3 , chg * 3);
tp4 = superTrendValue[1] + IFF(trendDirection > 0 , -chg * 4 , chg * 4);
tp5 = superTrendValue[1] + IFF(trendDirection > 0 , -chg * 5 , chg * 5);
tp6 = superTrendValue[1] + IFF(trendDirection > 0 , -chg * 6 , chg * 6);
tp7 = superTrendValue[1] + IFF(trendDirection > 0 , -chg * 7 , chg * 7);
key1 = TL_new(sdate[1],stime[1],tp1, sDate,sTime, tp1);
TL_SetColor(Key1,lvlCol);
TL_SetSize(Key1,2);
printedtp1 = 1;
}
Else
TL_SetEnd(key1,sDate,sTime,TP1);
var : u(0),d(0),alp(0),ur(0),dr(0),rs(0),tp(False);
u = max(dist - dist[1], 0);
d = max(dist[1] - dist, 0);
alp = 1/tplen;
ur = IFf(IsNan(ur[1]) == true, ma(u,tplen) , alp * u + (1 - alp) * IFf(isnan(ur[1])==true,0,ur[1]));
dr = IFf(IsNan(dr[1]) == true, ma(d,tplen) , alp * d + (1 - alp) * IFf(isnan(dr[1])==true,0,dr[1]));
rs = ur / dr;
R = 100 - 100 / (1 + rs);
tp = CrossDown(R, 60);
var : extreme(0);
var : extreme_tp1_dist(0);
var : extreme_tp2_dist(0);
var : extreme_tp3_dist(0);
var : extreme_tp4_dist(0);
var : extreme_tp5_dist(0);
var : extreme_tp6_dist(0);
var : extreme_tp7_dist(0);
extreme = iff(trendDirection > 0 , low , high);
extreme_tp1_dist = abs(extreme - tp1);
extreme_tp2_dist = abs(extreme - tp2);
extreme_tp3_dist = abs(extreme - tp3);
extreme_tp4_dist = abs(extreme - tp4);
extreme_tp5_dist = abs(extreme - tp5);
extreme_tp6_dist = abs(extreme - tp6);
extreme_tp7_dist = abs(extreme - tp7);
var : tx(0),S2(0);
if tp and trendDirection > 0 Then
// ==========================================
// 2. S2 슈퍼트렌드 & RSI 구간 점수 (수정본)
// ==========================================
// 기존의 CrossDown(R, 60) 대신 '구간' 점수로 변경하여
// 다른 지표(S1, S3)와 합산 점수를 맞추기 쉽게 만들었습니다.
if trendDirection > 0 Then // 슈퍼트렌드 상승 구간
{
if R > 50 Then
S2 = 1; // RSI가 50 위면 매수 힘 우세 (+1점)
Else
S2 = 0;
}
else if trendDirection < 0 Then // 슈퍼트렌드 하락 구간
{
if R < 50 Then
S2 = -1; // RSI가 50 아래면 매도 힘 우세 (-1점)
Else
S2 = 0;
}
else
{
S2 = 0;
}
// 차트 시각화용 (기존 X 표시는 그대로 둡니다)
if tp and trendDirection > 0 Then
{
tx = Text_New(sDate,sTime,L,"X");
Text_SetStyle(tx,2,0);
Text_SetColor(tx,Red);
Text_SetSize(tx,20);
Text_SetBold(tx,1);
}
if tp and trendDirection < 0 Then
{
tx = Text_New(sDate,sTime,H,"X");
Text_SetStyle(tx,2,1);
Text_SetColor(tx,Green);
Text_SetSize(tx,20);
Text_SetBold(tx,1);
}
if printedtp2 == 0 and extreme_tp2_dist < extreme_tp1_dist Then
{
key2 = TL_new(sdate[1],stime[1],tp2, sDate,sTime, tp2);
TL_SetColor(Key2,lvlCol);
TL_SetSize(Key2,2);
printedtp2 = 1;
}
Else
{
if printedtp2 == 1 Then
TL_SetEnd(key2,sDate,sTime,TP2);
}
if printedtp3 == 0 and extreme_tp3_dist < extreme_tp2_dist Then
{
key3 = TL_new(sdate[1],stime[1],tp3, sDate,sTime, tp3);
TL_SetColor(Key3,lvlCol);
TL_SetSize(Key3,2);
printedtp3 = 1;
}
Else
{
if printedtp3 == 1 Then
TL_SetEnd(key3,sDate,sTime,TP3);
}
if printedtp4 == 0 and extreme_tp4_dist < extreme_tp3_dist Then
{
key4 = TL_new(sdate[1],stime[1],tp4, sDate,sTime, tp4);
TL_SetColor(Key4,lvlCol);
TL_SetSize(Key4,2);
printedtp4 = 1;
}
Else
{
if printedtp4 == 1 Then
TL_SetEnd(key4,sDate,sTime,TP4);
}
if printedtp5 == 0 and extreme_tp5_dist < extreme_tp4_dist Then
{
key5 = TL_new(sdate[1],stime[1],tp5, sDate,sTime, tp5);
TL_SetColor(Key5,lvlCol);
TL_SetSize(Key5,2);
printedtp5 = 1;
}
Else
{
if printedtp5 == 1 Then
TL_SetEnd(key5,sDate,sTime,TP5);
}
if printedtp6 == 0 and extreme_tp6_dist < extreme_tp5_dist Then
{
key6 = TL_new(sdate[1],stime[1],tp6, sDate,sTime, tp6);
TL_SetColor(Key6,lvlCol);
TL_SetSize(Key6,2);
printedtp6 = 1;
}
Else
{
if printedtp6 == 1 Then
TL_SetEnd(key6,sDate,sTime,TP6);
}
if printedtp7 == 0 and extreme_tp7_dist < extreme_tp6_dist Then
{
key7 = TL_new(sdate[1],stime[1],tp7, sDate,sTime, tp7);
TL_SetColor(Key7,lvlCol);
TL_SetSize(Key7,2);
printedtp7 = 1;
}
Else
{
if printedtp7 == 1 Then
TL_SetEnd(key7,sDate,sTime,TP7);
}
// 1. 매수 진입: S2(RSI) + S3(표준슈트) 합이 1점일 때
if MarketPosition <= 0 and (S2 + S3 == 1) Then
Buy("매수");
// 2. 매수 청산: 합이 0 이하로 떨어지면 (힘 빠지면 탈출)
if MarketPosition == 1 and (S2 + S3 <= 0) Then
ExitLong("매수청산");
// 3. 매도 진입: 합이 -2점일 때 (둘 다 하락 신호)
if MarketPosition >= 0 and (S2 + S3 == -21) Then
Sell("매도");
// 4. 매도 청산: 합이 0 이상으로 올라오면 (반등하면 탈출)
if MarketPosition == -1 and (S2 + S3 >= 0) Then
ExitShort("매도청산");
수고많으십니다
문의드릴 내용은 위 수식에서
매수 같은 경우
실제 신호보다 40틱 낮은 가격에 왔을때 매수
매도 같은 경우
실제 신호보다 40틱 높은 가격에 왔을때 매도
이렇게 진입이 이루어 지게 부탁드리겠습니다
청산은 기존과 똑 같습니다
감사합니다
답변 1
예스스탁 예스스탁 답변
2026-05-11 16:48:55