모멘텀 터틀 트렌드 팔로잉 전략


생성 날짜: 2023-11-23 11:53:27 마지막으로 수정됨: 2023-11-23 11:53:27
복사: 0 클릭수: 382
1
집중하다
1214
수행원

모멘텀 터틀 트렌드 팔로잉 전략

개요

동력 해파리 트렌드 추적 전략은 해파리 거래 법칙에 기반한 트렌드 추적 전략이다. 그것은 해파리 지표를 사용하여 트렌드를 식별하고 동력 지표와 결합하여 일부 노이즈 거래를 필터링한다. 이 전략의 주요 장점은 강력한 가격 트렌드를 포착하여 초과 수익을 창출할 수 있다는 것이다.

전략 원칙

이 전략은 태극기 지표의 기본 돌파구 시스템을 사용하여 트렌드 방향을 판단한다. 구체적으로, 종결 가격이 지난 20일 최고 가격보다 높을 때 낙점 신호로, 이 때 더 많이 한다. 종결 가격이 지난 20일 최저 가격보다 낮을 때 낙점 신호로, 전략은 공허하다.

일부 노이즈 거래를 필터링하기 위해 이 전략은 동력 인자를 추가한다. 가격 변동이 5 ATR 미만이라면 전략은 거래에 들어가지 않는다. 이것은 공백이 너무 많기 때문에 소규모 거래의 손실을 피할 수 있다.

포지션 개시 후, 전략은 해파리 원칙의 N값을 뚫고 exit를 사용하여 손해를 막는다. 이 시스템은 최근 20일간의 최고 가격과 최저 가격에 기초하여 손해를 막는 지점을 설정한다. 예를 들어, 다단계한 손해가 지난 20일간의 최저 가격 아래 2N의 ATR이다. 전략의 중지 방법은 비교적 간단하며, 계좌의 총 자산의 10%로 설정한다.

우위 분석

이 전략의 가장 큰 장점은 트렌드 추적과 동력 관리를 동시에 결합한다는 것입니다. 해파리 거래 시스템은 가격의 중기 경향을 정확하게 파악하여 시장의 잡음으로 방해받지 않습니다. ATR 동력 필터를 추가하면 불필요한 거래 수를 더욱 줄일 수 있습니다.

특히, 이 전략은 다음과 같은 장점을 가지고 있습니다.

  1. 바닷가 지표는 트렌드를 정확하게 판단하고 중기 트렌드를 효과적으로 추적할 수 있습니다.
  2. 동력 필터 메커니즘은 불필요한 거래를 줄이고 거래 횟수에 손실을 방지합니다.
  3. 리스크 관리가 가능하여 트렌드 전환 시 적당히 손실을 막을 수 있습니다.
  4. 전체적으로, 전략적 매개 변수는 충분히 최적화되어 있으며, 해안가 원칙에 부합합니다.

위험 분석

이 전략의 최적화 가능성은 크지만, 몇 가지 잠재적인 위험도 있습니다.

  1. 장기간 지분을 보유하는 과도한 변동성의 문제를 해결할 수 없습니다. 해양 시스템의 위치 사이징은 변동률 요소를 고려하지 않고, 단일 손실이 너무 커질 수 있습니다.
  2. 시장이 급격하게 변할 때, 정지 가격은 돌파될 수 있으며, 예상보다 더 큰 손실을 초래할 수 있다.
  3. 이 시스템은 수익 목표가 설정되지 않았기 때문에 과도한 포지션이 발생할 수 있습니다. 이것은 단독으로 위험을 초래할 수 있습니다.

최적화 방향

위와 같은 위험 분석을 바탕으로, 이 전략에는 다음과 같은 주요 최적화 방향이 있습니다.

  1. 유동적인 포지션 알고리즘에 변동률 조정도 포함할 수 있습니다. 포지션 손실이 일정 정도에 도달하면 적극적으로 포지션을 줄일 수 있습니다.
  2. 반전 메커니즘을 추가하고, 머리, 어깨, 두 개의 꼭대기와 같은 형태를 형성할 때 포지션을 줄이거나 역으로 공백을 고려한다.
  3. 이윤 목표 설정을 늘리십시오. 누적 이윤이 계좌 총 자산의 일정한 비율을 달성하면 부분적으로 지분 환급을 줄일 수 있습니다.

요약하다

동력 해파리 트렌드 추적 전략은 전반적으로 매우 실용적인 중장선 트렌드 추적 프로그램이다. 그것은 동시에 해파리 지표 판단 트렌드 및 ATR 지표의 충격 필터를 결합하여 강력한 가격 트렌드를 효과적으로 잠금 할 수 있다. 또한, 전략의 위험 제어 및 변수 최적화도 매우 잘 조정되어 회수율을 줄일 수 있다. 동적 포지션 관리, 반전 메커니즘 및 수익 목표와 같은 모듈을 추가하면 이 전략의 효과는 더욱 향상 될 수 있다.

전략 소스 코드
/*backtest
start: 2023-10-23 00:00:00
end: 2023-11-22 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Heiken Ashi BF 🚀", overlay=false, 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 ///////////////
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(2029, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)

testPeriod() => true

///////////// HA /////////////
haTicker = heikinashi(syminfo.tickerid)
haOpen = security(haTicker, "D", open)
haHigh = security(haTicker, "D", high)
haLow = security(haTicker, "D", low)
haClose = security(haTicker, "D", close)

///////////// Rate Of Change ///////////// 
source = close
roclength = input(30, minval=1)
pcntChange = input(7.0, minval=1)
roc = 100 * (source - source[roclength]) / source[roclength]
emaroc = ema(roc, roclength / 2)
isMoving() => emaroc > (pcntChange / 2) or emaroc < (0 - (pcntChange / 2))

/////////////// Strategy ///////////////
long = haOpen < haClose and isMoving()
short = haOpen > haClose and isMoving()

last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

sl_inp = input(2.0, title='Stop Loss %') / 100
tp_inp = input(5000.0, title='Take Profit %') / 100
 
take_level_l = strategy.position_avg_price * (1 + tp_inp)
take_level_s = strategy.position_avg_price * (1 - tp_inp)

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1])
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) 

slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na

/////////////// Execution ///////////////
if testPeriod()
    strategy.entry("L",  strategy.long, when=long)
    strategy.entry("S", strategy.short, when=short)
    strategy.exit("L SL", "L", stop=long_sl, limit=take_level_l, when=since_longEntry > 0)
    strategy.exit("S SL", "S", stop=short_sl, limit=take_level_s, when=since_shortEntry > 0)

/////////////// Plotting ///////////////
plotcandle(haOpen, haHigh, haLow, haClose, title='HA Candles', color = haOpen < haClose ? color.lime : color.red)
bgcolor(isMoving() ? long ? color.lime : short ? color.red : na : color.white, transp=70)
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=50)