다중 지표 지원 전략

저자:차오장, 날짜: 2023-09-24 13:17:50
태그:

전반적인 설명

이 전략은 EMA, RSI, MACD, PSAR, 볼링거 밴드 및 다른 기술적 지표를 결합하여 여러 각도에서 전반적인 트렌드 판단을 수행하여 최적의 진입 기회를 찾습니다. 조정 가능한 개인화 전략에 대한 여러 매개 변수 설정 옵션을 제공합니다.

전략 논리

  1. 3개의 EMA (5~9~21주기) 를 사용하여 가격 트렌드를 결정합니다. EMA 크로스오버는 트렌드 변화를 신호합니다.

  2. RSI는 과잉 구매/ 과잉 판매 수준을 판단합니다. RSI는 낮은 수준을 넘어 과잉 판매를 의미하며, 상위 수준을 넘어 과잉 구매를 의미합니다.

  3. MACD는 이동 평균 차이를 확인합니다. DIFF가 DEA를 넘으면 상승 신호이고 아래는 하락 신호입니다.

  4. PSAR는 추가 컨텍스트를 위해 현재 트렌드 방향을 나타냅니다.

  5. 볼링거 밴드는 지지/저항 수준을 나타냅니다. 가격 깨는 밴드는 트렌드 변화를 시사합니다.

  6. 지표가 사용자 선택에 따라 정렬 신호를 제공 할 때 긴 / 짧은 포지션을 취합니다.

장점

  1. 여러 가지 지표는 하나의 지표에서 오도하는 신호를 피합니다.

  2. 사용자 지정 가능한 매개 변수는 사용자가 최적의 조합을 선택할 수 있습니다.

  3. EMA, MACD 등에서 트렌드 변화의 정확한 탐지

  4. RSI는 과판/ 과입 기회를 효율적으로 식별합니다.

  5. SAR와 볼링거 밴드는 전환점을 보여줍니다.

위험성

  1. 멀티 인디케이터 신호 발생이 줄어들면 좋은 기회를 놓칠 수 있습니다.

  2. 단 하나의 표시기가 잘못된 신호를 표시할 때 필터링이 없습니다.

  3. 사용자들은 오버/저트레이딩으로 이어지는 열등한 매개 변수 세트를 선택할 수 있습니다.

  4. STOP LOSS처럼 위험 관리 제한이 없습니다.

  5. 전략의 검증을 위해 백테스트 데이터가 충분하지 않습니다.

가능한 해결책:

  1. 더 많은 신호를 제공하기 위해 지표 문턱을 넓혀라

  2. 거짓 신호를 필터링하기 위해 다른 표시기를 추가합니다.

  3. 사용자들이 조합을 테스트할 수 있는 더 많은 지표 옵션을 제공해야 합니다.

  4. 스톱 로스 및 다른 리스크 관리를 포함합니다.

  5. 매개 변수를 최적화하기 위해 더 많은 시장에서 백테스트.

최적화 방향

  1. 더 많은 지표 조합을 테스트해서 가장 잘 맞는 것을 찾으세요.

  2. 더 많은 데이터 기반 개선을 위해 기계 학습 모듈을 추가합니다.

  3. 트렌드 필터링을 포함해서 거래 방향을 결정합니다.

  4. 더 많은 시장 환경을 위해 자금 관리 최적화.

  5. 지능적인 향상을 위해 자동 매개 변수 최적화를 개발합니다.

요약

이 전략은 단일 지표에 지나치게 의존하는 것을 피하여 포괄적인 트렌드 분석을 위해 여러 가지 기술적 지표를 적용합니다. 패러미터 조정, 검증 모듈 추가, 인공지능 통합 등을 통해 더 많은 품질 신호를 제공하면서 안정성을 유지할 수 있습니다.


/*backtest
start: 2022-09-17 00:00:00
end: 2023-09-23 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("f.society", title="f.society", overlay=true)
//@Author: rick#1414
// -----------------------------------------------------
// f.society : Pone 3EMA: 5, 9, 21, 50, 100, 200, SAR, 
// velas azules en sobreventa y velas moradas sobre compra 
// SAR 0.02, 0.02, 0.2 , Bandas de Bollinger
// estrategia de compra y venta con rsi, macd o psr
// color de fondo: ema, rsi (color azul sobreventa 35, 25 (mas intenso))
// -----------------------------------------------------
// Como agregar a Trading view:
// 1 Cerrar todos los otros indicadores antes de añadirlo
// 2. Ir a la página de inicio TradingView.com
// 3. En la parte inferior, haga clic en Editor Pine // ver imagen: // https://cdn.discordapp.com/attachments/407267549047422976/407393815112974336/unknown.png
// 4. borrar todo el texo y reemplazar con todo el contenido de este archivo
// 5. Pulse el botón "Añadir a trazar" (Add to graph)
// -----------------------------------------------------
// revisar opciones de on y off segun indicadores deseados
// https://cdn.discordapp.com/attachments/405885820114042883/412115277883506700/unknown.png
// se puede cambiar la estrategia desde este menu desplegable para señales buy/sell

// Options
estrategia = input(defval="rsi", title = "Strategy", options=["ema","rsi","macd","psr","off","BB","ema5"])
in_bkcolor = input(defval="rsi", title = "background color", options=["ema","rsi","macd","psr","off","exchange","BB","ema5"])
e5 = input(title="Show ema5?", type=bool, defval=false)
e9 = input(title="Show ema9?", type=bool, defval=true)
e21 = input(title="Show ema21?", type=bool, defval=true)
e50 = input(title="Show ema50?", type=bool, defval=false)
e100 = input(title="Show ema100?", type=bool, defval=false)
e200 = input(title="Show ema200", type=bool, defval=true)
in_rsi = input(title="Color oversold and overbought bars?", type=bool, defval=true)
in_sar = input(title="Show Parabolic Sar", type=bool, defval=true)
in_bb = input(title="Show Bollinger Bands?", type=bool, defval=true)
sd = input(false, title="Show Daily Pivots?")
linew = input(1, title="linewidth", minval=0)
sarw = input(1, title="sar points width", minval=0)
ovs = input(40, title="oversold rsi", minval=0)
ovb = input(65, title="overbought rsi", minval=0)



//pf = input(false,title="Show Filtered Pivots")
pf=false

// 3 ema
src = close // input(close, title="Source")
//len9 = input(9, minval=1, title="ema9 Length")
//len21 = input(21, minval=1, title="ema21 Length")
//len200 = input(200, minval=1, title="ema200 Length")
len5=5
len9=9
len21=21
len50=50
len100=100
len200=200
ema5 = ema(src, len5)
ema9 = ema(src, len9)
ema21 = ema(src, len21)
ema50= ema(src, len50)
ema100 = ema(src, len100)
ema200 = ema(src, len200)
plot(e5? ema5 : na, title="EMA5", linewidth=linew, color=purple)
plot(e9? ema9 : na, title="EMA9", linewidth=linew, color=blue)
plot(e21? ema21 : na, title="EMA21", linewidth=linew, color=red)
plot(e50? ema50 : na, title="EMA50", linewidth=linew, color=green)
plot(e100? ema100 : na, title="EMA100", linewidth=linew, color=lime)
plot(e200? ema200 : na, title="EMA200", linewidth=linew, color=yellow)

// RSI Color
//lenR = input(14, minval=1, title="RSI Length")
lenR=14
//up = rma(max(change(src), 0), lenR)
//down = rma(-min(change(src), 0), lenR)
//vrsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
vrsi=rsi(close,lenR)
//plot(vrsi,title="vrsi")
oversold = vrsi < ovs
overbought = vrsi > ovb
barcolor(in_rsi? oversold? #0000FF : overbought? #ff00ff:na : na)

// SAR
plot(in_sar? sar(0.02, 0.02, 0.2): na, style=cross, linewidth=sarw, color=blue, title="sar")

// BB
//length = input(20, title="Bollinger length", minval=1)
length=20
//mult = input(2.0, title="Bollinger stdDev", minval=0.001, maxval=50)
mult=2.0
basis = sma(src, length)
dev = mult * stdev(src, length)
upper = basis + dev
lower = basis - dev
plot(in_bb? basis :na, color=red, linewidth=linew, title="BB basis")
p1 = plot(in_bb? upper :na, color=blue, linewidth=linew, title="BB upper")
p2 = plot(in_bb? lower :na, color=blue, linewidth=linew, title="BB lower")
fill(p1, p2)

//background
bgcolor(in_bkcolor=="exchange"? #0000FF40 : in_bkcolor=="rsi"? vrsi < (ovs-15) ? #0000FF50  : vrsi < ovs ? #0000FF30 :( vrsi < ovb ? #ff00ff10 : #ff00ff20): in_bkcolor=="ema"?(ema9>ema21?#ff00ff10  : #0000FF20):in_bkcolor=="BB"?(lower>close?#ff00ff10 : close>upper?#0000FF20:#ff00ff10): in_bkcolor=="ema5"?(ema5>ema21?#ff00ff10  : #0000FF20):na)


// Strategy
if estrategia == "ema"
    strategy.entry("buy", true, 1, when= crossover(ema9,ema21) ),
    strategy.entry("sell", false, 1, when = crossover(ema21,ema9)) 
else
    if estrategia =="rsi"
        strategy.entry("buy", true, 1, when= vrsi <ovs),
        strategy.entry("sell", false, 1, when = vrsi > ovb or crossover(close,upper)) 
    else 
        if estrategia =="macd"    
            [macdLine, signalLine, histLine] = macd(close, 12, 26, 9),
            //bgcolor(macdLine > signalLine ? #98c8ff : #ff8b94),
            strategy.entry("buy", true, 1, when= macdLine>=signalLine ),
            strategy.entry("sell", false, 1, when = macdLine<signalLine) 
        else 
            if estrategia=="psr"
                leftBars = 4 //input(4)
                rightBars = 2 //input(2)
                swh = pivothigh(leftBars, rightBars)
                swl = pivotlow(leftBars, rightBars)
                swh_cond = not na(swh)
                hprice = 0.0
                hprice := swh_cond ? swh : hprice[1]
                le = false
                le := swh_cond ? true : (le[1] and high > hprice ? false : le[1])
                if (le)
                    strategy.entry("buy", strategy.long, comment="buy", stop=hprice + syminfo.mintick)
                swl_cond = not na(swl)
                lprice = 0.0
                lprice := swl_cond ? swl : lprice[1]
                se = false
                se := swl_cond ? true : (se[1] and low < lprice ? false : se[1])
                if (se)
                    strategy.entry("sell", strategy.short, comment="sell", stop=lprice - syminfo.mintick)
            else
                if estrategia=="BB"
                    strategy.entry("buy", true, 1, when= crossover(lower,close) ),
                    strategy.entry("sell", false, 1, when = crossover(close,upper)) 
                else
                    if estrategia=="ema5"
                        strategy.entry("buy", true, 1, when= crossover(ema5,ema21) ),
                        strategy.entry("sell", false, 1, when = crossover(ema21,ema5)) 



// pivots

// Classic Pivot
pivot = (high + low + close ) / 3.0
// Filter Cr
bull= pivot > (pivot + pivot[1]) / 2 + .0025
bear= pivot < (pivot + pivot[1]) / 2 - .0025
// Classic Pivots
r1 = pf and bear ? pivot + (pivot - low) : pf and bull ? pivot + (high - low) : pivot + (pivot - low)
s1 = pf and bull ? pivot - (high - pivot) : pf and bear ? pivot - (high - low) : pivot - (high - pivot)
r2 = pf ? na : pivot + (high - low)
s2 = pf ? na : pivot - (high - low)
//Pivot Average Calculation
smaP = sma(pivot, 3)
//Daily Pivots 
dtime_pivot = security(syminfo.tickerid, 'D', pivot[1])
dtime_pivotAvg = security(syminfo.tickerid, 'D', smaP[1])
dtime_r1 = security(syminfo.tickerid, 'D', r1[1]) 
dtime_s1 = security(syminfo.tickerid, 'D', s1[1]) 
dtime_r2 = security(syminfo.tickerid, 'D', r2[1]) 
dtime_s2 = security(syminfo.tickerid, 'D', s2[1])
offs_daily = 0
plot(sd and dtime_pivot ? dtime_pivot : na, title="Daily Pivot",style=line, color=fuchsia,linewidth=linew) 
plot(sd and dtime_r1 ? dtime_r1 : na, title="Daily R1",style=line, color=#DC143C,linewidth=linew) 
plot(sd and dtime_s1 ? dtime_s1 : na, title="Daily S1",style=line, color=lime,linewidth=linew) 
plot(sd and dtime_r2 ? dtime_r2 : na, title="Daily R2",style=line, color=maroon,linewidth=linew) 
plot(sd and dtime_s2 ? dtime_s2 : na, title="Daily S2",style=line, color=#228B22,linewidth=linew) 


// References:
// get number of bars since last green bar
//plot(barssince(close >= open), linewidth=3, color=blue)
//bgcolor(close < open ? #ff8b94   : #98c8ff , transp=10)
//http://www.color-hex.com/
//   #98c8ff    light blue
//    #ff8b94   red   #b21c0e
//       #7d1d90    purple
//    #0029ff blue
//    #fffa86   yellow

더 많은