다중 지표 조합 전략

저자:차오장, 날짜: 2023-10-07 15:34:33
태그:

전반적인 설명

이 전략은 여러 가지 기술 지표를 결합하여 가격 추세를 판단하고 구매 및 판매 신호를 생성합니다.

전략 원칙

이 전략은 주로 다음과 같은 지표를 사용하여 가격 동향을 결정합니다.

  1. 슈퍼트렌드: 가격이 상위권 이상으로 넘어갈 때 구매하고, 하위권 아래로 넘어갈 때 판매합니다.

  2. SMA: 가격이 SMA를 넘을 때 구매하고, SMA를 넘을 때 판매합니다.

  3. 이멘텀: 이멘텀이 긍정적일 때 길게, 마이너스일 때 짧게 이동합니다.

  4. MACD: DIFF가 DEA를 넘어서면 구매하고, DEA를 넘어서면 판매합니다.

  5. 황소와 곰: 황소 힘 > 곰 힘, 그 반대의 경우 긴 이동.

  6. RSI: RSI가 30을 넘으면 구매하고, 70을 넘으면 판매합니다.

  7. 촛불: N 상승선 막대기 뒤에 장차, N 하락선 막대기 뒤에 단차.

  8. CCI: CCI가 100보다 높을 때 구매하고, CCI가 -100보다 낮을 때 판매합니다.

  9. DMI: DMI+>DMI-가 되면 길게 가거나, 그렇지 않으면 짧게 가세요.

  10. 시장 파동: 상승파에서 길고 하락파에서 짧습니다.

  11. 스토카스틱스: %K가 20을 넘으면 구매하고 80을 넘으면 판매합니다.

지표 신호는 상향 또는 하향 방향에 따라 1 또는 -1로 정량화됩니다. 총 포인트는 합쳐집니다. 총 포인트가 0을 넘을 때 구매하고 0을 넘을 때 판매합니다.

이점 분석

이 다중 지표 전략의 가장 큰 장점은 잘못된 신호를 필터링하기 위해 다양한 지표의 신호를 결합하여 더 높은 신뢰성입니다. 단일 지표 전략보다 더 강력합니다.

또 다른 장점은 다른 시장 조건에 따라 지표와 매개 변수를 사용자 정의 할 수있는 유연성입니다. 또한 지표 가중량은 백테스트 결과에 따라 조정 될 수 있습니다.

위험 분석

이러한 콤보 전략에서 주목해야 할 몇 가지 위험:

  1. 지표들 사이의 높은 상관관계는 중복된 신호를 생성할 수 있습니다. 지표들은 낮은 상관관계를 갖는 것으로 선택되어야 합니다.

  2. 너무 많은 지표가 신호를 지연시키는 것입니다. 지표의 양과 시점 사이의 타협이 있습니다.

  3. 부적절한 지표 매개 변수는 전략 성과에 영향을 미칩니다. 최적의 매개 변수는 철저한 백테스팅을 통해 찾아야 합니다.

  4. 지표의 효율성은 시장 체제마다 다릅니다. 롤링 백테스트는 지표의 유효성을 확인해야합니다.

최적화 방향

이 전략은 여러 가지 방법으로 개선될 수 있습니다.

  1. 가장 좋은 조합을 찾기 위해 지표 선택과 숫자를 최적화하십시오.

  2. 각 지표에 대한 매개 변수를 최적화합니다.

  3. 주요 지표를 강조하기 위해 지표 무게를 조정합니다.

  4. 가짜 파급을 피하기 위해 볼륨 스파이크 같은 필터를 추가합니다.

  5. 기계 학습 모델을 사용하여 자동으로 최적의 조합을 찾습니다.

결론

요약하자면,이 다중 지표 전략은 신호 신뢰성을 향상시키고 잘못된 신호를 줄이기 위해 다양한 지표의 강점을 결합합니다. 지표 선택, 매개 변수 및 무게를 세밀하게 조정하면 안정성을 더욱 향상시킬 수 있습니다. 안정적인 지표 신호가 필요한 거래자에게 적합합니다.


/*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) 


더 많은