여러 필터와 함께 슈퍼 트렌드 거래 전략

저자:차오장, 날짜: 2023-09-15 16:19:57
태그:

이 전략은 여러 필터와 함께 슈퍼 트렌드 거래 전략이라고 불립니다. 그것은 엄격하게 항목을 제어하기 위해 슈퍼 트렌드 위에 필터로 여러 지표를 추가합니다.

전략의 작동 방식:

  1. 구매 및 판매 신호를 생성하기 위해 슈퍼 트렌드 지표를 계산합니다.
  2. MACD 필터가 활성화되면 MACD가 신호선을 넘고 빠른 MA가 느린 MA를 넘을 때만 구매 신호가 생성됩니다. MACD가 신호선을 넘고 빠른 MA가 느린 MA를 넘을 때만 판매 신호가 생성됩니다.
  3. EMA 필터가 활성화되면, 가격이 200일 EMA를 넘을 때만 구매 신호가 생성됩니다. 가격이 200일 EMA를 넘을 때만 판매 신호가 생성됩니다.
  4. 스토카스틱 RSI 필터가 활성화되면 스토카스틱 RSI가 과소매에서 과소매로 넘어가면 구매 신호가 생성됩니다. 스토카스틱 RSI가 과소매에서 과소매로 넘어가면 판매 신호가 생성됩니다.
  5. MFI 필터가 활성화되면 MFI가 EMA를 넘을 때만 구매 신호가 생성됩니다. MFI가 EMA를 넘을 때만 판매 신호가 생성됩니다.
  6. CCI 필터가 활성화되면, 가격이 CCI 기준선을 넘을 때만 구매 신호가 생성됩니다. 가격이 CCI 기준선을 넘을 때만 판매 신호가 생성됩니다.
  7. ATR 또는 볼링거 밴드를 사용하여 스톱 로스를 계산하고 수익 수준을 취합니다.

이 전략의 장점:

  1. 여러 필터는 신호의 신뢰성을 높이고 잘못된 신호를 피합니다.
  2. 엄격한 스톱 로즈와 수익을 취하는 것은 위험을 통제하는 데 도움이 됩니다.
  3. 커스터마이징 가능한 매개 변수와 전환 스위치는 유연성을 제공합니다.

이 전략의 위험:

  1. 너무 많은 필터 조건은 거래 기회를 놓칠 수 있습니다.
  2. 부적절한 지표 매개 변수는 필터를 비효율화 할 수 있습니다.
  3. 잘못된 스톱 로즈와 취득은 손실을 증가시킬 수 있습니다.

요약하자면, 멀티 필터와 함께하는 슈퍼 트렌드 거래 전략은 트렌드 추적 및 지표 분석을 모두 고려하여 여러 가지 확인을 통해 신호 품질을 향상시킵니다. 합리적인 스톱 로스 및 영리 메커니즘은 거래 위험을 줄이는 열쇠입니다. 이 전략은 약간의 경험을 가진 거래자에게 적합합니다.


/*backtest
start: 2023-09-07 00:00:00
end: 2023-09-14 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © mathlabel

//@version=5
strategy("My strategy", overlay=true, margin_long=100, margin_short=100)



atrPeriod = input(10, "ATR Length")
factor = input.float(3.0, "Factor", step = 0.01)
stopLossFactor = input(2.0, "Stop Loss Factor")
takeProfitFactor = input(1.5, "Take Profit Factor")
stochlenght= input(14,'stochlenght')
oversold_level = input(title = 'Oversold', defval = 20)
overbought_level = input(title = 'Overbought', defval = 80)
use_atr_exits=input.bool(false)
use_bollinger_exits=input.bool(false)
use_cci_filter=input.bool(false)


longLossPerc = input.float(title='Long Stop Loss (%)', minval=0.0, step=0.1, defval=1) * 0.01

shortLossPerc = input.float(title='Short Stop Loss (%)', minval=0.0, step=0.1, defval=1) * 0.01

longprofitPerc = input.float(title='Long profit (%)', minval=0.0, step=0.1, defval=1) * 0.01

shortprofitPerc = input.float(title='Short profit (%)', minval=0.0, step=0.1, defval=1) * 0.01



// Calculate ATR
atr = ta.atr(atrPeriod)
plotsuper=input.bool(false)
[supertrend, direction] = ta.supertrend(factor, atrPeriod)


upTrend = plot(plotsuper? (direction < 0 ? supertrend : na) : na, "Up Trend", color = color.green, style=plot.style_linebr)
downTrend = plot(plotsuper ? (direction < 0? na : supertrend):na, "Down Trend", color = color.red, style=plot.style_linebr)



long_supertrend_filter= (direction < 0 ? supertrend : na)
short_supertrend_filter= (direction < 0? na : supertrend)



//--trama--
lengths = input(99,title='Trama lenght')
src =(close)

ama = 0.
hh = math.max(math.sign(ta.change(ta.highest(lengths))), 0)
ll = math.max(math.sign(ta.change(ta.lowest(lengths)) * -1), 0)
tc = math.pow(ta.sma(hh or ll ? 1 : 0, lengths), 2)
ama := nz(ama[1] + tc * (src - ama[1]), src)

plottrama=input.bool(false, title="Show Lux TRAMA")
plot(plottrama?ama : na, 'Plot', color.new(#ff1100, 0), 2)

use_LUX_trama_filter=input.bool(false)
long_LUX_trama_filter= (close > ama)
short_LUX_trama_filter= (close < ama)

// highest high
highest = ta.highest(high, stochlenght)
// lowest low
lowest = ta.lowest(low, stochlenght)

// stochastic oscillator
stochastic_K = ((close - lowest) / (highest - lowest)) * 100
stochastic_D = ta.sma(stochastic_K, 3)

use_stochastic_filter = input.bool(false)
long_stoch_filter = stochastic_K > oversold_level and stochastic_K[1] < oversold_level
short_stoch_filter = stochastic_K < overbought_level and stochastic_K[1] > overbought_level

//Define a ATR band upline and bottome line.

upline = open + (atr* takeProfitFactor)
bottomline = open -(atr*stopLossFactor)

plot(use_atr_exits ? upline : na, color=color.white)
plot(use_atr_exits ? bottomline:na, color=color.white)

// Calculate stop loss and take profit levels
stopLoss = stopLossFactor * atr
takeProfit = takeProfitFactor * atr

//input macd
ma_fast=ta.sma(close,input(14,title='ma fast for macd filter'))
ma_slow=ta.sma(close,input(28, title='ma slowfor macd filter'))
use_macd_filter=input.bool(false)

[macdLine, signalLine, histLine]= ta.macd(close,12,26,9)
long_macd_filter= (macdLine > signalLine) and ta.crossover(ma_fast,ma_slow)
short_macd_filter= (macdLine < signalLine) and ta.crossunder(ma_fast,ma_slow)
// ema 200
ema1= ta.ema(close,1)
ema2= ta.ema(close,200)
use_ema200_filter= input.bool(false)
long_ema_filter = (close > ema2)
short_ema_filter= (close < ema2)
plotAverage = input.bool(true, title="Plot EMA200")
plot(plotAverage ? ta.ema(close, 200) : na, title="Exponential Average")
// mfi
signalLength = input(title="mfi Signal Length", defval=9)
length1 = input(title="mfi Length", defval=14)
src1 = hlc3
mf = ta.mfi(src1, length1)
signal = ta.ema(mf, signalLength)



use_mfi_filter=input.bool(false)
long_mfi_filter= ta.crossover(mf,signal) ?mf:na 
short_mfi_filter= ta.crossunder(mf,signal)? mf : na

//cci
cci_l = input(50, title='CCI Period Length')
atr_l = input(5, title=' CCI ATR Length')
level = 0
sd_length = 20



cci = ta.cci(src, cci_l)
atr2 = ta.atr(atr_l)

var st = 0.

if cci >= level
    st := low - atr
    st

if cci <= level
    st := high + atr
    st


var tu = 0.
var td = 0.
var optimal_line = 0.

if cci >= level and cci[1] < level
    tu := td[1]
    tu

if cci <= level and cci[1] > level
    td := tu[1]
    td

if cci > level
    tu := low - atr2
    if tu < tu[1] and cci[1] >= level
        tu := tu[1]
        tu

if cci < level
    td := high + atr2
    if td > td[1] and cci[1] <= level
        td := td[1]
        td

optimal_line := math.max(tu, td)

// Creating a Price Channel, 

avg_st8 = ta.ema(st, 8)
avg_st13 = ta.ema(st, 13)
avg_st21 = ta.ema(st, 21)
avg_st34 = ta.ema(st, 21)
avg_st55 = ta.ema(st, 55)
avg_st89 = ta.ema(st, 89)
avg_st144 = ta.ema(st, 144)
avg_st233 = ta.ema(st, 233)

average_weighting = (optimal_line + avg_st8 + avg_st13 + avg_st21 + avg_st34 + avg_st55 + avg_st89 + avg_st144 + avg_st233) / 9

basis = ta.sma(average_weighting, sd_length)
devs = ta.stdev(average_weighting, sd_length)
upperS = basis + devs
lowerS = basis - devs
plot(use_cci_filter ? basis: na, 'Basis', color=color.new(#872323, 0))
p3 = plot(use_cci_filter ? upperS : na, 'UpperS', color=color.new(color.teal, 0))
p4 = plot(use_cci_filter ? lowerS: na ,'LowerS', color=color.new(color.teal, 0))

long_cci_filter= ta.crossover(close,upperS) 
short_cci_filter= ta.crossunder(close,lowerS) 



var isLong = false
var isShort = false
long = (not use_LUX_trama_filter or long_LUX_trama_filter) and ( long_supertrend_filter) and (not use_ema200_filter or long_ema_filter) and (not isLong) and  (not use_stochastic_filter or long_stoch_filter) and (not use_macd_filter or long_macd_filter) and (not use_mfi_filter or long_mfi_filter) and (not use_cci_filter or long_cci_filter)
short= (not use_LUX_trama_filter or short_LUX_trama_filter) and ( short_supertrend_filter) and (not use_ema200_filter or short_ema_filter) and (not isShort)  and ( not use_stochastic_filter or short_stoch_filter) and (not use_macd_filter or long_macd_filter) and (not use_mfi_filter or short_mfi_filter) and (not use_cci_filter or short_cci_filter)


if long
    isLong := true
    isShort := false

if short
    isLong := false
    isShort := true

plotshape(long, title='Buy', text='Buy', style=shape.labelup, location=location.belowbar, color=color.new(color.green, 0), textcolor=color.new(color.white, 0), size=size.tiny)
plotshape(short, title='Sell', text='Sell', style=shape.labeldown, location=location.abovebar, color=color.new(color.red, 0), textcolor=color.new(color.white, 0), size=size.tiny)


//bollinger
lengthss = input(20, title='bollinger lenght')

mult = input.float(2.0, minval=0.001, maxval=50, title="bollinger StdDev")
basiss = ta.sma(src, lengthss)
dev = mult * ta.stdev(src, lengthss)
upper = basiss + dev
lower = basiss - dev
offset = input.int(0, "bollinger Offset", minval = -500, maxval = 500)
plot(use_bollinger_exits ? basiss : na, "Basis", color=#FF6D00, offset = offset)
p1 = plot(use_bollinger_exits ? upper : na, "Upper", color=#2962FF, offset = offset)
p2 = plot(use_bollinger_exits ? lower: na, "Lower", color=#2962FF, offset = offset)

long_bollinger_exits= close > upper
short_bollinger_exits=close < lower
long_atr_exits = close > upline 
short_atr_exits = close < bottomline
takelong = (not use_atr_exits or long_atr_exits) and (not use_bollinger_exits or long_bollinger_exits)
takeshort = (not use_atr_exits or short_atr_exits) and (not use_bollinger_exits or short_bollinger_exits)

plotshape(use_atr_exits? takelong : na,title = 'take profit',text='high SL/TP',style=shape.cross,location = location.abovebar, color=color.new(color.green,0) , size=size.tiny)
plotshape(use_atr_exits ? takeshort : na,title = 'take profit',text='low SL/TP',style=shape.cross,location = location.belowbar, color=color.new(color.green,0), size=size.tiny)
plotshape(use_bollinger_exits ? takelong: na,title = 'take profit',text='high SL/TP',style=shape.cross,location = location.abovebar, color=color.new(color.green,0) , size=size.tiny)
plotshape(use_bollinger_exits ? takeshort: na,title = 'take profit',text='low SL/TP',style=shape.cross,location = location.belowbar, color=color.new(color.green,0), size=size.tiny)




alertcondition(long,'long','buy')
alertcondition(short,'short','short')
alertcondition(takeshort,'trail short close','short trailing take profit')
alertcondition(takelong ,'trail long close','long trailing take profit')


use_trailing_stop_loss=input.bool(title = 'use trailing stop loss (atr or bollinger)?', defval = true)

// Determine stop loss price
longStopPrice = strategy.position_avg_price * (1 - longLossPerc)
shortStopPrice = strategy.position_avg_price * (1 + shortLossPerc)
// Determine take profit price
longprofitPrice = strategy.position_avg_price * (1 + longprofitPerc)
shortprofitPrice = strategy.position_avg_price * (1 - shortprofitPerc)

// Plot stop loss values for confirmation
plot(series=strategy.position_size > 0 ? longStopPrice : na, color=color.new(color.red, 0), style=plot.style_cross, linewidth=1, title='Long Stop Loss')
plot(series=strategy.position_size < 0 ? shortStopPrice : na, color=color.new(color.red, 0), style=plot.style_cross, linewidth=1, title='Short Stop Loss')
plot(series=strategy.position_size > 0 ? longprofitPrice : na, color=color.new(color.green, 0), style=plot.style_cross, linewidth=1, title='Long profit')
plot(series=strategy.position_size < 0 ? shortprofitPrice : na, color=color.new(color.green, 0), style=plot.style_cross, linewidth=1, title='Short profit')




longCondition = long
if (longCondition)
    strategy.entry("Long Entry", strategy.long)

shortCondition = short
if (shortCondition)
    strategy.entry("Short Entry", strategy.short,stop = shortStopPrice)
if use_trailing_stop_loss
    if takelong or close < longStopPrice
        strategy.close("Long Entry")
    if takeshort or close > shortStopPrice
        strategy.close("Short Entry")
else
    if close < longStopPrice or close > longprofitPrice
        strategy.close("Long Entry")
    if close < shortprofitPrice or close > shortStopPrice
        strategy.close("Short Entry")

더 많은