이 전략은 여러 가지 기술적 지표를 종합적으로 사용하여 가격 추세를 판단하여 구매 및 판매 신호를 발송합니다.
이 전략은 다음과 같은 몇 가지 기술 지표에 기초하여 가격 추세를 판단합니다.
슈퍼 트렌드 지표 ((SuperTrend): ATR에 의해 계산된 상도와 하도, 가격이 상도를 돌파하는 데 더 많은 것을 하고, 하도를 돌파하는 데 더 많은 것을 한다.
간단한 이동 평균 ((SMA): 가격이 상단 SMA를 넘어서 고가되고, 하단 SMA를 넘어서 공허하다.
동력 지표 ((Momentum): 가격 동력은 긍정적으로 더하고, 부정적으로 더했다.
MACD: DIFF는 DEA선을 상향으로 돌파하고, DEA선을 하향으로 돌파하고,
헐헤드 (Bull and Bear): 헐헤드 (Bull and Bear) 는 헐헤드 (Bull and Bear) 보다 헐헤드 (Bull and Bear) 는 헐헤드 (Bull and Bear) 보다 헐헤드 (Bull and Bear) 입니다.
RSI: RSI 상단 30선으로 넘어가고, 하단 70선으로 넘어가고
양선阴线: 연속 N根阴线空空, 연속 N根阳线多;
CCI: CCI는 100보다 더 많고, 100보다 적은 하락입니다.
DMI: DMI 멀티 헤드 라인이 빈 헤드 라인보다 더 많고, 빈 헤드 라인보다 더 많고, 빈 헤드 라인보다 빈 헤드 라인이 더 많고, 빈 헤드 라인이 더 많고, 빈 헤드 라인이 더 많고
시장의 파동: 가격이 상승하는 파동이 많고, 하락하는 파동이 빈다는 판단;
무작위 지표: 무작위 지표 위에 20줄을 더하고, 아래 80줄을 텅 비게 한다.
이 인디캐터에서 계산한 결과는 위 또는 아래 방향으로 1 또는 -1의 점수를 준다. 모든 인디캐터의 점수를 합하면 총점수를 얻는다. 총점수 위에 0선을 통과하면 구매 신호가 발생하며, 총점수 아래 0선을 통과하면 판매 신호가 발생한다.
이 다중 지표 조합 전략의 가장 큰 장점은 신뢰성이 높으며, 여러 지표의 통합 사용으로 트렌드 방향을 판단할 수 있기 때문에 가짜 신호를 효과적으로 줄여서 신호를 더 신뢰할 수 있습니다. 단일 지표와 비교하여 이 조합 전략의 신뢰성과 안정성이 더 좋습니다.
또 다른 장점은 전략의 유연성과 사용자 정의성이 강하다는 것입니다. 지표의 종류와 매개 변수 설치는 다른 시장에 따라 조정할 수 있으므로 전략이 다른 실황 환경에 더 잘 적응 할 수 있습니다. 또한 피드백 결과에 따라 지표의 무게를 조정할 수 있습니다.
이 조합 전략에는 몇 가지 위험도 있습니다.
선택된 지표들 사이에 연관성이 너무 높으면 반복된 신호의 위험이 발생한다. 이것은 서로 다른 시장 환경에 따라 연관성이 낮은 지표들을 선택하여 조합하는 것이 필요하다.
표시자 수가 너무 많으면 계산 시간이 너무 길으면 신호 발송의 시에 영향을 미치게 된다. 표시자 수와 성에 대한 관계를 가해야 한다.
지표 변수 설정이 잘못되면 전략 효과에 영향을 미치며, 최적의 변수를 찾기 위해 충분한 재검토가 필요합니다.
시장 단계에 따라 지표의 효과도 달라진다. 점검을 통해 지속적으로 효과를 확인해야 한다.
이러한 전략은 다음과 같은 측면에서 최적화될 수 있습니다.
지표의 종류와 수를 최적화하여 최적의 조합을 선택합니다.
각 지표의 파라미터 설정을 최적화합니다.
중요한 지표의 무게를 높이기 위해 지표의 무게 비율을 조정합니다.
거래량이 급증하는 것과 같은 조건적 필터링을 추가하여 가짜 돌파구를 방지합니다.
모형 포트폴리지를 사용하여 기계 학습 알고리즘을 통해 최적의 전략 포트폴리지를 자동으로 찾습니다.
종합적으로 설명하자면, 이러한 다중 지표 조합 전략은 각종 지표의 장점을 활용하여, 조합으로 트렌드 방향을 판단하여, 가짜 신호를 줄이고, 신호의 신뢰성을 향상시킬 수 있다. 지표의 선택, 매개 변수 설정, 무게 분배 등을 최적화함으로써, 전략의 안정성을 지속적으로 향상시킬 수 있다. 이러한 조합 전략은 지표 신호 안정성에 대한 요구가 높은 전략 거래자에게 적합하다.
/*backtest
start: 2023-01-01 00:00:00
end: 2023-10-06 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("Super indicator ", overlay=true, precision=2, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.075)
/////////////// Time Frame ///////////////
_0 = input(false, "════════ Test Period ═══════")
testStartYear = input(2017, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)
testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)
testPeriod() =>true
hilow = ((high - low)*100)
openclose = ((close - open)*100)
vol1 = (volume / hilow)
spreadvol = (openclose * vol1)
VPT = spreadvol + cum(spreadvol)
window_len = 28
v_len = 14
price_spread = stdev(high-low, window_len)
vp = spreadvol + cum(spreadvol)
smooth = sma(vp, v_len)
v_spread = stdev(vp - smooth, window_len)
shadow = (vp - smooth) / v_spread * price_spread
out1 = shadow > 0 ? high + shadow : low + shadow
//plot(out, style=line,linewidth=3, color=color)
len=5
vpt=ema(out1,len)
// INPUTS //
st_mult =3
st_period = 7
// CALCULATIONS //
up_lev = vpt - (st_mult * atr(st_period))
dn_lev = vpt + (st_mult * atr(st_period))
up_trend = 0.0
up_trend := close[1] > up_trend[1] ? max(up_lev, up_trend[1]) : up_lev
down_trend = 0.0
down_trend := close[1] < down_trend[1] ? min(dn_lev, down_trend[1]) : dn_lev
// Calculate trend var
trend10 = 0
trend10 := close > down_trend[1] ? 1: close < up_trend[1] ? -1 : nz(trend10[1], 1)
// Calculate SuperTrend Line
st_line = trend10 ==1 ? up_trend : down_trend
//
src = input(close, title="Source")
//sma
sma20 = sma(src, 20)
smapoint = 0
smapoint := src > sma20 ? smapoint + 1 : smapoint - 1
//AO
ao = sma(hl2,5) - sma(hl2,34)
aopoint = ao > 0 ? 1 : ao < 0 ? -1 : 0
//momentum
mom = src - src[14]
mompoint = mom > 0 ? 1 : mom < 0 ? -1 : 0
//MACD
fast_ma = ema(src, 12)
slow_ma = ema(src, 26)
macd = fast_ma - slow_ma
signal = ema(macd, 9)
hist = macd - signal
histpoint = hist > hist[1] ? 3 : -3
//Bull bear
Length = 30
r1=iff(close[1]<open,max(open-close[1],high-low),high-low)
r2=iff(close[1]>open,max(close[1]-open,high-low),high-low)
bull=iff(close==open,iff(high-close==close-low,iff(close[1]>open,max(high-open,close-low),r1),iff(high-close>close-low,iff(close[1]<open, max(high-close[1],close-low), high-open),r1)),iff(close<open,iff(close[1]<open,max(high-close[1],close-low), max(high-open,close-low)),r1))
bear=iff(close==open,iff(high-close==close-low,iff(close[1]<open,max(open-low,high-close),r2),iff(high-close>close-low,r2,iff(close[1]>open,max(close[1]-low,high-close), open-low))),iff(close<open,r2,iff(close[1]>open,max(close[1]-low,high-close),max(open-low,high-close))))
colors=iff(sma(bull-bear,Length)>0, color.green, color.red)
// barcolor(colors)
bbpoint = sma(bull-bear,Length)>0 ? 1 : -1
//UO
length7 = 7,
length14 = 14,
length28 = 28
average(bp, tr_, length) => sum(bp, length) / sum(tr_, length)
high_ = max(high, src[1])
low_ = min(low, src[1])
bp = src - low_
tr_ = high_ - low_
avg7 = average(bp, tr_, length7)
avg14 = average(bp, tr_, length14)
avg28 = average(bp, tr_, length28)
uoout = 100 * (4*avg7 + 2*avg14 + avg28)/7
uopoint = uoout > 70 ? 1 : uoout < 30 ? -1 : 0
//IC
conversionPeriods = 9
basePeriods = 26
laggingSpan2Periods = 52
displacement = 26
donchian(len) => avg(lowest(len), highest(len))
baseLine = donchian(basePeriods)
icpoint = src > baseLine ? 1 : -1
//HMA
hullma = wma(2*wma(src, 9/2)-wma(src, 21), round(sqrt(21)))
hmapoint = src > hullma ? 2 : -2
//
//
trendDetectionLength =4
float trend = na
float wave = na
float vol = na
mov = close>close[1] ? 1 : close<close[1] ? -1 : 0
trend := (mov != 0) and (mov != mov[1]) ? mov : nz(trend[1])
isTrending = rising(close, trendDetectionLength) or falling(close, trendDetectionLength)
wave := (trend != nz(wave[1])) and isTrending ? trend : nz(wave[1])
vol := wave == wave[1] ? (nz(vol[1])+volume) : volume
up1 = wave == 1 ? vol : 0
dn1 = wave == 1 ? 0 : vol
Weis= up1 > dn1 ? 2 : -2
//
roclen =20
ccilen =21
dilen = 5
dirmov(len) =>
up = change(high)
down = -change(low)
truerange = rma(tr, len)
plus = fixnan(100 * rma(up > down and up > 0 ? up : 0, len) / truerange)
minus = fixnan(100 * rma(down > up and down > 0 ? down : 0, len) / truerange)
[plus, minus]
f_draw_infopanel(_x, _y, _line, _text, _color)=>
_rep_text = ""
for _l = 0 to _line
_rep_text := _rep_text + "\n"
_rep_text := _rep_text + _text
var label _la = na
label.delete(_la)
_la := label.new(
x=_x, y=_y,
text=_rep_text, xloc=xloc.bar_time, yloc=yloc.price,
color=color.black, style=label.style_labelup, textcolor=_color, size=size.normal)
TD = 0
TS = 0
TD := close > close[4] ? nz(TD[1]) + 1 : 0
TS := close < close[4] ? nz(TS[1]) + 1 : 0
TDUp = TD - valuewhen(TD < TD[1], TD , 1 )
TDDn = TS - valuewhen(TS < TS[1], TS , 1 )
td = TDUp > 0 ? 2 : TDDn > 0 ? -2 : 0
roc = roc(close, roclen)
Roc=roc > 0 ? 1 : -1
cci = cci(close, ccilen)
CCI=cci > 0? 2 : -2
[plus, minus] = dirmov(dilen)
dmi = plus - minus
DMI= dmi >= 0? 2 : -2
//
STT=trend10 == 1 ? 1 : -1
//
periods = 2
smooth1 = 14
price = close
fn(src, length) =>
MA_s= 0.0
MA_s:=(src + nz(MA_s[1] * (length-1)))/length
MA_s
r11 = ema( price, periods )
r22 = iff( price > r11, price - r11, 0 )
r3 = iff( price < r11, r11 - price, 0 )
r4 = fn( r22, smooth1 )
r5 = fn( r3, smooth1 )
rr = iff( r5 == 0, 100, 100 - ( 100 / ( 1 + ( r4 / r5 ) ) ) )
length = 20,fast = 7,slow = 13
//
src10 = rr
er = abs(change(src,length))/sum(abs(change(src10)),length)
dev = er*stdev(src10*2,fast) + (1-er)*stdev(src10*2,slow)
a = 0.
a := bar_index < 9 ? src10 : src10 > a[1] + dev ? src10 : src10 < a[1] - dev ? src10 : a[1]
//
rsi=fixnan(a > a[1] ? 3 : a < a[1] ?-3 : na)
//
totalpoints =rsi+td+STT+Roc+DMI+ CCI+Weis+smapoint + aopoint + mompoint + histpoint + bbpoint + icpoint + hmapoint
//
piz=input(1)
tt=sma(totalpoints,piz)
//
zero=0
down = crossunder(tt, 0)
up = crossover(tt, -0)
//Alerts
/////// Alerts /////
alertcondition(down,title="sell")
alertcondition(up,title="buy")
//
/////////////// Strategy ///////////////
long = up
short = down
strategy.entry("Long", strategy.long, when = long)
strategy.entry("Short", strategy.short, when = short)