더블 이동 평균 골든 크로스와 데드 크로스 양적 전략


생성 날짜: 2023-12-05 10:24:34 마지막으로 수정됨: 2023-12-05 10:24:34
복사: 0 클릭수: 704
avatar of ChaoZhang ChaoZhang
1
집중하다
1619
수행원

더블 이동 평균 골든 크로스와 데드 크로스 양적 전략

개요

이 전략은 쌍 ALMA 이동 평균의 황금 포크 시드포크 신호를 기반으로 MACD 지표의 다공개 신호와 결합하여 자동으로 다공개하는 것을 구현합니다. 전략은 4시간 이상 시간 주기에서 적용되며, 테스트 데이터는 BNB/USDT이며, 시간대는 2017년 현재로, 수료는 0.03%로 설정됩니다.

전략 원칙

전략은 ALMA 빠른 선과 느린 선을 사용하여 이중 이동 평균을 구축한다. 빠른 선의 길이는 20이고 느린 선의 길이는 40이며, 각각 0.9의 오차를 취하고, 표준 차이는 5이다. 빠른 선에서 느린 선을 통과할 때 다중 신호가 생성되며, 빠른 선에서 느린 선을 통과할 때 공백 신호가 생성된다.

한편, 전략이 MACD 지표의 직각 도표 신호를 결합한다. MACD 직각 도표가 긍정 (((상승) 이면만, 다중 신호가 유효하다. MACD 직각 도표가 부정 (((하락) 이면만, 공백 신호가 유효하다.

이 전략은 동시에 스톱스트로프 조건을 설정한다. 더 많은 스톱스트로프는 2배, 스톱스트로프는 0.2배; 더 많은 스톱스트로프는 0.05배, 스톱스트로프는 1배이다.

우위 분석

이 전략은 이중 이동 평균의 트렌드 판단과 MACD 지표의 에너지 판단을 결합하여 가짜 신호를 효과적으로 필터링하여 입장의 정확성을 향상시킬 수 있습니다. 정지 손실 설정은 합리적이며, 수익을 최대화하여 큰 손실을 피합니다.

회귀 데이터는 2017년 이후 수차례의 황금과 곰의 전환을 포함하고 있으며, 전략은 상반기 조건에서 여전히 좋은 성과를 내고 있다. 이것은 전략이 시장의 선형적 및 비선형적 특성에 적응한다는 것을 증명한다.

위험 분석

이 전략은 다음과 같은 위험성을 가지고 있습니다.

  1. 이중 이동 평균 자체는 지연되어 있고, 단선 기회를 놓칠 수 있습니다.
  2. MACD 직사각형이 0일 때, 전략은 신호를 생성하지 않습니다.
  3. 스톱톱 손실 비율은 미리 설정되어 있으며 실제 상황과는 차이가 있을 수 있습니다.

해결책:

  1. 이동 평균 주기를 적절히 단축하고 짧은 선에 대한 민감성을 높여라
  2. MACD 변수를 최적화하여 직각 도표의 변동이 더 자주 발생합니다.
  3. 동적으로 정지 손해를 조정

최적화 방향

이 전략은 다음과 같은 부분에서 최적화될 수 있습니다.

  1. 다른 종류의 이동 평균을 시도하여 더 나은 평준화를 찾으십시오.
  2. 이동 평균과 MACD의 변수를 최적화하여 다양한 품종과 주기에 적합합니다.
  3. 거래량 변화와 같은 추가 조건을 추가하여 신호를 필터링합니다.
  4. 전략의 적응성을 높이기 위해 실시간으로 스톱 로즈 비율을 조정합니다.

요약하다

이 전략은 이동 평균의 추세 판단과 MACD의 보조 판단을 성공적으로 결합하여 합리적인 스톱 스톱을 설정하여 여러 가지 상황 하에서 안정적인 수익을 얻을 수 있습니다. 지속적인 최적화 파라미터 설정을 통해 추가 필터 조건이 추가되는 수단으로 전략의 안정성과 수익성이 더욱 향상 될 수 있습니다.

전략 소스 코드
/*backtest
start: 2023-11-04 00:00:00
end: 2023-12-04 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/
// © exlux99

//@version=4
strategy(title = "Full Crypto Swing Strategy ALMA Cross", overlay = true,  pyramiding=1,initial_capital = 1, default_qty_type= strategy.percent_of_equity, default_qty_value = 100, calc_on_order_fills=false, slippage=0,commission_type=strategy.commission.percent,commission_value=0.03)

//time condition
fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
fromYear = input(defval = 2010, title = "From Year", minval = 1970)
 //monday and session 
// To Date Inputs
toDay = input(defval = 31, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 12, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2031, title = "To Year", minval = 1970)

startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = time >= startDate and time <= finishDate

UseHAcandles    = input(false, title="Use Heikin Ashi Candles in Algo Calculations")

haClose = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, close) : close
haOpen  = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, open) : open
haHigh  = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, high) : high
haLow   = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, low) : low

//alma fast and slow
src = haClose
windowsize = input(title="Length Size Fast", type=input.integer, defval=20)
windowsize2 = input(title="Length Size Slow", type=input.integer, defval=40)
offset = input(title="Offset", type=input.float, defval=0.9, step=0.05)
sigma = input(title="Sigma", type=input.float, defval=5)
outfast=alma(src, windowsize, offset, sigma)
outslow=alma(src, windowsize2, offset, sigma)

//macd
fast_length = input(title="Fast Length", type=input.integer, defval=6)
slow_length = input(title="Slow Length", type=input.integer, defval=25)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)

// Calculating
fast_ma = ema(src, fast_length)
slow_ma =  ema(src, slow_length)
macd = fast_ma - slow_ma
signal = ema(macd, signal_length)
hist = macd - signal

long=crossover(outfast,outslow) and hist > hist[1] and time_cond
short=crossunder(outfast,outslow) and hist < hist[1] and time_cond

takeProfit_long=input(2.0, step=0.005)
stopLoss_long=input(0.2, step=0.005)
takeProfit_short=input(0.05, step=0.005)
stopLoss_short=input(1.0, step=0.005)

strategy.entry("long",1,when=long)
strategy.entry("short",0,when=short)

strategy.exit("short_tp/sl", "long", profit=close * takeProfit_long / syminfo.mintick, loss=close * stopLoss_long / syminfo.mintick, comment='LONG EXIT',  alert_message = 'closeshort')
strategy.exit("short_tp/sl", "short", profit=close * takeProfit_short / syminfo.mintick, loss=close * stopLoss_short / syminfo.mintick, comment='SHORT EXIT',  alert_message = 'closeshort')