1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
strategy(title = "RSI전략샘플")
// rsi일수
rsiDays = input(type = integer, title = "RSI일수", defval = 10, minval = 3, maxval = 20, step = 1)
// 트레일링 스탑 일수
TSDays = input(type = integer, title = "TS일수", defval = 10, minval = 3, maxval = 200, step = 1)
// 매수시 사용할 RSI값
EntryRSIValue = input(type = integer, title = "RSI매수조건", defval = 30, minval = 10, maxval = 50, step = 10)
// 매도시 사용할 RSI값
ExitRSIValue = input(type = integer, title = "RSI매도조건", defval = 80, minval = 50, maxval = 100, step = 10)
// rsi계산
rs = rsi(close, rsiDays)
rsMA = sma(rs, rsiDays)
// rsi표시
plot(rs, color=black)
plot(rsMA, color = gray)
hline(EntryRSIValue, color=blue, linestyle=dashed, linewidth=1)
hline(ExitRSIValue, color=red, linestyle=dashed, linewidth=1)
// rsi30이하의 지점에서 rsi가 rsiMA를 골든크로스할 경우 매수
isEntryPoint = crossover(rs, rsMA) and rs[1] < EntryRSIValue and rsMA[1] < EntryRSIValue
strategy.entry("long", true, 1, when = isEntryPoint)
// 최저치 구하기
Lowest(TSDays) => ser = lowest(low, TSDays)
lowest = Lowest(TSDays)
// rsi가70이상이면 익절 또는 트레일링 스탑에 걸리면 손절
isExitPoint = crossunder(rs, ExitRSIValue) or (low == lowest)
strategy.close("long", when = isExitPoint)
|