이동 평균과 트레일링 스톱과 함께 채널 브레이크 전략에 따른 트렌드

저자:차오장, 날짜: 2024-01-15 12:25:26
태그:

img

전반적인 설명

이것은 가격 채널을 기반으로 한 브레이크 아웃 전략으로, 이동 평균 지표와 트레일링 스톱/트레이프 이윤을 결합하여 진입 및 출입을 위해 사용됩니다. 가격 채널을 구성하기 위해 높은 / 낮은 가격의 이동 평균을 사용하고, 가격이 채널을 벗어날 때 고정 스톱 손실 또는 트레일링 스톱을 사용하여 위험을 제어합니다.

전략 논리

이 전략은 가격 채널을 형성하기 위해 높은 / 낮은 가격의 이동 평균을 계산합니다. 구체적으로, 채널의 상부 및 하부 대역을 그리기 위해 높은 / 낮은 가격의 길이 10 SMA를 계산합니다. 가격이 하부 대역 위에 상부 대역으로 넘어가면, 그것은 길게 들어갑니다. 가격이 상부 대역에서 하부 대역으로 넘어가면, 그것은 짧게 들어갑니다.

엔트리 후, 전략은 고정 스톱 손실 또는 트레일링 스톱을 출구에 사용합니다. 트레일링 스톱은 두 가지 매개 변수로 구성됩니다: 고정 스톱 이익 수준 및 활성화 오프셋. 가격이 활성화 오프셋에 도달하면 스톱 이익 수준이 가격을 추적하기 시작합니다. 이것은 약간의 개방 공간을 유지하면서 이익을 잠금 할 수 있습니다.

이 전략은 또한 시간 범위 필터를 결합하여 특정 역사 시간 내에 백테스트를 실행하여 다른 시장 단계에서 성능을 테스트합니다.

이점 분석

이 전략은 가격 채널과 트레일링 스톱으로 트렌드를 이용하여 중장기 트렌드 방향을 파악할 수 있습니다. 간단한 이동 평균 전략과 비교하면 가격 변동으로 인해 비효율적인 거래를 피합니다. 트레일링 스톱으로 수익을 확보하기 위해 가격을 동적으로 추적 할 수 있습니다.

전체적으로 전략은 명확한 논리, 최소한의 지표와 매개 변수, 백테스트가 쉽고 중장기 트렌드 트레이딩에 적합하며 강력한 트렌드에서 이익을 얻을 수 있습니다.

위험 분석

이 전략은 변화하고 불안한 시장에서 손익을 유지할 수 없으므로 쉽게 중단되는 경향이 있습니다. 또한 극단적 인 움직임 중에도 가격이 공격적으로 큰 손실로 이어지는 스톱 손실을 깨뜨릴 수 있습니다.

매개 변수 조정은 상당히 주관적이며 다른 시장 단계에서 조정을 요구합니다. 고정 수익 및 활성화 오프셋은 변화하는 시장 변동에 적응하지 못합니다.

더 나은 기회

부피, 볼링거 밴드와 같은 다른 지표는 트랩을 피하는 엔트리 신호를 필터링하는 데 포함될 수 있습니다. 또는 ATR 또는 가격 변동성에 기반한 동적 스톱을 사용할 수 있습니다.

출구 규칙은 후속 정지 또는 캔들리어 출구로 업그레이드 될 수 있습니다. 가격이 채널에 다시 들어갈 때 부분 수익 목표를 고려 할 수 있습니다. 출입 필터와 출구 규칙을 최적화하면 전략의 안정성을 크게 향상시킬 수 있습니다.

결론

요약하자면, 이것은 가격 채널, 트렌드 추적, 스톱 로스/프로프트 테이크 관리에 기반한 양적 전략이다. 명확한 논리 흐름, 간단한 매개 변수 구조, 이해하기 쉽고 백테스트가 있습니다. 알고리즘 거래 개념을 배우기에 적합합니다. 전략은 안정성과 수익성을 향상시키기 위해 다양한 측면에서 향상 될 수 있습니다. 핵심 아이디어는 트렌드 방향을 파악하고 스톱 로스 및 리프트를 통해 위험을 관리하는 것입니다. 다양한 기간에 걸쳐 다양한 제품에 적용 될 수 있습니다.


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-21 23:59:59
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("Generalized SSL Backtest w/ TSSL", shorttitle="GSSL Backtest", overlay=true )
// Generalized SSL:
//  This is the very first time the SSL indicator, whose acronym I ignore, is on Tradingview. 
//  It is based on moving averages of the highs and lows. 
//  Similar channel indicators can be found, whereas 
//  this one implements the persistency inside the channel, which is rather tricky.
//  The green line is the base line which decides entries and exits, possibly with trailing stops.
//  With respect to the original version, here one can play with different moving averages.
//  The default settings are (10,SMA)
//
// Vitelot/Yanez/Vts March 2019

lb = input(10, title="Lb", minval=1)
maType = input( defval="SMA", title="MA Type", options=["SMA","EMA","HMA","McG","WMA","Tenkan"])

fixedSL = input(title="SL Activation", defval=300)
trailSL = input(title="SL Trigger", defval=1)
fixedTP = input(title="TP Activation", defval=150)
trailTP = input(title="TP Trigger", defval=1)

FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2019, title = "From Year", minval = 2017)
ToMonth   = input(defval = 6, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 19, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 2020, title = "To Year", minval = 2017)
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
startTimeOk()  => true // create function "within window of time" if statement true
// QUANDL:BCHAIN/ETRVU is USD-denominated daily transaction value on BTC blockchain
// QUANDL:BCHAIN/MKTCP is USD-denominated Bitcoin marketcap

hma(sig, n) => // Hull moving average definition
    wma( 2*wma(sig,round(n/2))-wma(sig,n), round(sqrt(n)))

mcg(sig,length) => // Mc Ginley MA definition
    mg = 0.0
    mg := na(mg[1]) ? ema(sig, length) : mg[1] + (sig - mg[1]) / (length * pow(sig/mg[1], 4))

tenkan(sig,len) =>
    0.5*(highest(sig,len)+lowest(sig,len))

ma(t,sig,len) =>
    sss=na
    if t =="SMA"
        sss := sma(sig,len)
    if t == "EMA"
        sss := ema(sig,len)
    if t == "HMA"
        sss := hma(sig,len)
    if t == "McG" // Mc Ginley
        sss := mcg(sig,len)
    if t == "Tenkan"
        sss := tenkan(sig,len)
    if t == "WMA"
        sss := wma(sig,len)
    sss

base(mah, mal) =>
    bbb = na
    inChannel = close<mah and close>mal
    belowChannel = close<mah and close<mal
    bbb := inChannel? bbb[1]: belowChannel? -1: 1
    uuu = bbb==1? mal: mah
    ddd = bbb==1? mah: mal
    [uuu, ddd]

maH = ma(maType, high, lb)
maL = ma(maType, low, lb)

[up, dn] = base(maH,maL)

plot(up, title="High MA", color=lime, linewidth=3)
plot(dn, title="Low MA", color=orange, linewidth=3)

long = crossover(dn,up)
short = crossover(up,dn)

// === STRATEGY - LONG POSITION EXECUTION ===
strategy.entry("Long", strategy.long, when= long and startTimeOk())
strategy.exit("Exit", qty_percent = 100, loss=fixedSL, trail_offset=trailTP, trail_points=fixedTP) 
strategy.exit("Exit", when= short)
// === STRATEGY - SHORT POSITION EXECUTION ===
strategy.entry("Short", strategy.short, when= short and startTimeOk())
strategy.exit("Exit", qty_percent = 100, loss=fixedSL, trail_offset=trailTP, trail_points=fixedTP)
strategy.exit("Exit", when= long)

더 많은