모멘텀 브레이크아웃 최적화 추세 추종 전략


생성 날짜: 2024-01-17 16:44:30 마지막으로 수정됨: 2024-01-17 16:44:30
복사: 0 클릭수: 622
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

모멘텀 브레이크아웃 최적화 추세 추종 전략

개요

동력 돌파 최적화 전략은 동력 지표에 기반하여 거래 신호 생성 및 스톱 스 설정을 구현하는 트렌드 추적 전략이다. 이 전략은 가격과 이동 평균선의 교차 상황을 계산하여 시장의 트렌드 방향을 판단하고, ATR 및 LinReg 채널과 결합하여 동력 스톱 스 메커니즘을 구축한다. 동시에, 전략은 CMO 지표를 사용하여 과매 과매 상황을 식별하여 더 나은 입장을 실현한다.

전략 원칙

  • 1. 가격의 ZLEMA 이동 평균을 추세 방향을 판단하는 기술 지표로 계산합니다.
  • 2. ATR에 의해 계산된 긴 위치의 중지 가격과 짧은 위치의 중지 가격
  • 3. 이동 평균과 결합하여 CMO 지표의 오버 바이 오버 셀 범위를 계산하여 입력 신호를 제공합니다.
  • 4. ATR 및 이동 평균의 돌파구에 따라 세 가지 거래 신호를 구성합니다.
    • 이동 평균선과 스톱 가격의 교차 신호
    • 가격과 스톱 가격의 교차 신호
    • 가격과 이동 평균의 교차 신호
  • 5. 매개 변수 설정을 통해 다양한 유형의 신호의 활성화 제어
  • 6. 리스크 관리를 위해 리스크 계수 및 포지션 컨트롤을 설정합니다.

전체 전략은 다양한 지표의 조합을 통해 안정적인 트렌드 추적과 자동 중지 손실을 구현하여 충분한 거래 기회를 보장하고 거래 위험을 통제합니다.

우위 분석

여러 지표 조합 사용

이 전략은 이동 평균, ATR, CMO와 같은 여러 지표의 조합을 사용하여 지표들 사이에 효과적인 상호보조를 형성할 수 있으며, 트렌드 방향을 식별하고 오버 바이 오버 셀 영역을 판단하는 것이 더 정확하고 신뢰할 수 있습니다.

동적 트레일링 스톱

ATR 기반의 동적 중지 메커니즘은 시장의 변동성에 따라 중지 위치를 유연하게 조정하여 단독 손실을 효과적으로 제어 할 수 있습니다.

좋은 위험 관리

전략은 포지션 제어와 위험 계수 설정을 제공하여 최대 손실 자본 비율을 미리 정의하여 자금이 크게 변동하지 않도록합니다.

풍부한 거래 신호

전략은 총 3개의 거래 신호를 제공하며, 다양한 유형의 신호 조합을 선택하여 더 나은 피드백 결과를 얻을 수 있습니다.

위험 분석

거래 빈도가 너무 높습니다.

모든 신호 포트폴리지를 활성화하면 거래 빈도가 너무 높을 수 있습니다. 일부 신호 포트폴리지를 사용하도록 선택하여 피할 수 있습니다.

지표 변수 민감

여러 지표 조합을 사용하면 파라미터 선택이 더 복잡하고, 파라미터 설정에 더 민감하게, 신중하게 테스트해야 하는 파라미터의 최적의 조합이 필요합니다.

파격 신호 회수율이 높다

오직 가격과 중지 가격의 교차에 기초한 거래 신호는, 그것의 중지 범위가 더 커서, 더 큰 단독 손실과 회수로 이어질 수 있다. 이동 중계선 신호와 그것의 조합을 선택할 수 있다.

최적화 방향

다양한 변수 조합을 테스트합니다.

이동 평균 유형, 길이를 최적화; ATR 주기 변수를 최적화; CMO 변수를 최적화. 최적의 매칭을 찾는다.

최적화 신호 사용 전략

테스트는 이동 평균 신호, 스톱 가격 신호 및 조합 신호만을 사용하여 최적의 사용 전략을 분석합니다.

다양한 종의 성능을 테스트하는 방법

주식 지수, 외환, 상품 품종에 대한 재검토를 실시하고, 시장 유형에 대한 전략의 적합성을 분석한다.

요약하다

이 전략은 종합적으로 여러 가지 지표를 사용하여 트렌드 방향을 식별하고, 손실을 막는 장치를 구축하고, 과매매 기회를 발견합니다. 파라미터 최적화, 신호 조합 선택 등의 방법을 통해 조정하면 더 나은 회수 지표를 얻을 수 있습니다. 전체적으로, 이 전략 시스템은 완전하고 신뢰성이 높으며, 실제에서 추가 테스트 최적화를 할 가치가 있습니다.

전략 소스 코드
/*backtest
start: 2024-01-09 00:00:00
end: 2024-01-16 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © KivancOzbilgic
//developer: @KivancOzbilgic
//author: @KivancOzbilgic

strategy(title="Profit Maximizer PMax", overlay=true,
     pyramiding=0, initial_capital=1000,
     commission_type=strategy.commission.cash_per_order,
     commission_value=0.025, slippage=2)


src = input(hl2, title="Source")
Periods = input(title="ATR Length", type=input.integer, defval=10)
Multiplier = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
mav = input(title="Moving Average Type", defval="ZLEMA", options=["SMA", "EMA", "WMA", "TMA", "VAR", "WWMA", "ZLEMA", "TSF"])
length =input(10, "Moving Average Length", minval=1)
changeATR= input(title="Change ATR Calculation Method ?", type=input.bool, defval=true)
showsupport = input(title="Show Moving Average?", type=input.bool, defval=true)
showsignalsk = input(title="Show Crossing Signals?", type=input.bool, defval=true)
showsignalsc = input(title="Show Price/Pmax Crossing Signals?", type=input.bool, defval=false)
highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true)

usePosSize = input(title="Use Position Sizing?", type=input.bool, defval=true)
riskPerc   = input(title="Risk %", type=input.float, defval=0.5, step=0.25)

// Make input options that configure backtest date range
startDate = input(title="Start Date", type=input.integer,
     defval=1, minval=1, maxval=31)
startMonth = input(title="Start Month", type=input.integer,
     defval=1, minval=1, maxval=12)
startYear = input(title="Start Year", type=input.integer,
     defval=2019, minval=1800, maxval=2100)

endDate = input(title="End Date", type=input.integer,
     defval=1, minval=1, maxval=31)
endMonth = input(title="End Month", type=input.integer,
     defval=12, minval=1, maxval=12)
endYear = input(title="End Year", type=input.integer,
     defval=2021, minval=1800, maxval=2100)
     
// Look if the close time of the current bar
// falls inside the date range
inDateRange = true

atr2 = sma(tr, Periods)
atr= changeATR ? atr(Periods) : atr2
valpha=2/(length+1)
vud1=src>src[1] ? src-src[1] : 0
vdd1=src<src[1] ? src[1]-src : 0
vUD=sum(vud1,9)
vDD=sum(vdd1,9)
vCMO=nz((vUD-vDD)/(vUD+vDD))
VAR=0.0
VAR:=nz(valpha*abs(vCMO)*src)+(1-valpha*abs(vCMO))*nz(VAR[1])
wwalpha = 1/ length
WWMA = 0.0
WWMA := wwalpha*src + (1-wwalpha)*nz(WWMA[1])
zxLag = length/2==round(length/2) ? length/2 : (length - 1) / 2
zxEMAData = (src + (src - src[zxLag]))
ZLEMA = ema(zxEMAData, length)
lrc = linreg(src, length, 0)
lrc1 = linreg(src,length,1)
lrs = (lrc-lrc1)
TSF = linreg(src, length, 0)+lrs
getMA(src, length) =>
    ma = 0.0
    if mav == "SMA"
        ma := sma(src, length)
        ma

    if mav == "EMA"
        ma := ema(src, length)
        ma

    if mav == "WMA"
        ma := wma(src, length)
        ma

    if mav == "TMA"
        ma := sma(sma(src, ceil(length / 2)), floor(length / 2) + 1)
        ma

    if mav == "VAR"
        ma := VAR
        ma

    if mav == "WWMA"
        ma := WWMA
        ma

    if mav == "ZLEMA"
        ma := ZLEMA
        ma

    if mav == "TSF"
        ma := TSF
        ma
    ma
    
MAvg=getMA(src, length)
longStop = MAvg - Multiplier*atr
longStopPrev = nz(longStop[1], longStop)
longStop := MAvg > longStopPrev ? max(longStop, longStopPrev) : longStop
shortStop = MAvg + Multiplier*atr
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := MAvg < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop
dir = 1
dir := nz(dir[1], dir)
dir := dir == -1 and MAvg > shortStopPrev ? 1 : dir == 1 and MAvg < longStopPrev ? -1 : dir
PMax = dir==1 ? longStop: shortStop
plot(showsupport ? MAvg : na, color=#0585E1, linewidth=2, title="Moving Avg Line")
pALL=plot(PMax, color=color.red, linewidth=2, title="PMax", transp=0)

alertcondition(cross(MAvg, PMax), title="Cross Alert", message="PMax - Moving Avg Crossing!")
alertcondition(crossover(MAvg, PMax), title="Crossover Alarm", message="Moving Avg BUY SIGNAL!")
alertcondition(crossunder(MAvg, PMax), title="Crossunder Alarm", message="Moving Avg SELL SIGNAL!")
alertcondition(cross(src, PMax), title="Price Cross Alert", message="PMax - Price Crossing!")
alertcondition(crossover(src, PMax), title="Price Crossover Alarm", message="PRICE OVER PMax - BUY SIGNAL!")
alertcondition(crossunder(src, PMax), title="Price Crossunder Alarm", message="PRICE UNDER PMax - SELL SIGNAL!")


// Calculate position size
riskEquity  = (riskPerc / 100) * strategy.equity
atrCurrency = (atr(20) * syminfo.pointvalue)
posSize     = usePosSize ? floor(riskEquity / atrCurrency) : 1

//Long
buySignalk = crossover(MAvg, PMax)
plotshape(buySignalk and showsignalsk ? PMax*0.995 : na, title="Buy", text="BuyL", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=0)


if(buySignalk and showsignalsk and inDateRange)
    strategy.entry(id="buySignalk", long=true, qty=posSize)
    
sellSignallk = crossunder(MAvg, PMax)
plotshape(sellSignallk and showsignalsk ? PMax*1.005 : na, title="Sell", text="SellL", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white, transp=0)

if(sellSignallk and showsignalsk and inDateRange)
    strategy.order(id="sellSignallk", long=false, qty=strategy.position_size)
    
//Short
buySignalc = crossover(src, PMax)
plotshape(buySignalc and showsignalsc ? PMax*0.995 : na, title="Buy", text="BuyS", location=location.absolute, style=shape.labelup, size=size.tiny, color=#0F18BF, textcolor=color.white, transp=0)

if(buySignalc and showsignalsc and inDateRange)
    strategy.entry(id="BuyS", long=false, qty=posSize)

sellSignallc = crossunder(src, PMax)
plotshape(sellSignallc and showsignalsc ? PMax*1.005 : na, title="Sell", text="SellS", location=location.absolute, style=shape.labeldown, size=size.tiny, color=#0F18BF, textcolor=color.white, transp=0)

if(sellSignallc and showsignalsc and inDateRange)
    strategy.order(id="SellS", long=true, qty=abs(strategy.position_size))

mPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0,display=display.none)

longFillColor = highlighting ? (MAvg>PMax ? color.green : na) : na
shortFillColor = highlighting ? (MAvg<PMax ? color.red : na) : na

fill(mPlot, pALL, title="UpTrend Highligter", color=longFillColor)
fill(mPlot, pALL, title="DownTrend Highligter", color=shortFillColor)

// Exit open market position when date range ends
if (not inDateRange)
    strategy.close_all()