다중 이동 평균 크로스오버 거래 전략

저자:차오장, 날짜: 2023-12-06 17:10:00
태그:

img

전략 개요

이 전략은 여러 이동 평균 지표에 기초하여 거래 신호를 생성합니다. 단기, 중기 및 장기 이동 평균을 동시에 모니터링하고 트렌드 방향을 결정하기 위해 교차 상황에 따라 거래 신호를 생성합니다.

전략 이름

다중 이동 평균 크로스오버 전략

전략 논리

이 전략은 7 일, 13 일 및 21 일 라인을 포함한 다른 기간과 함께 3 개의 이동 평균을 사용합니다. 거래 논리는 다음과 같은 점을 기반으로합니다.

  1. 단기 7일 MA가 중기 13일 MA를 넘어 올라가면, 장기 21일 MA가 상승 추세를 보이는 경우 긴 신호가 생성됩니다.
  2. 단기 7일 MA가 중기 13일 MA보다 낮아지고, 장기 21일 MA가 하향 추세를 보이는 경우 단기 신호가 생성됩니다.

서로 다른 시간 프레임에서 이동 평균을 결합함으로써 전략은 시장 트렌드를 더 정확하게 판단하고 잘못된 거래를 피할 수 있습니다.

장점

  1. 여러 MA 라인을 사용하면 시장 움직임을 더 잘 파악할 수 있고 잘못된 브레이크오웃이나 시장의 단기 변동에 의해 오도되는 것을 피할 수 있습니다.
  2. 트렌드가 명확할 때만 신호가 생성되므로 불필요한 거래를 줄이고 거래 비용을 줄입니다.
  3. 유연한 매개 변수 설정 - 각기 다른 제품과 시장 환경에 맞게 개인 취향에 따라 MA 기간을 조정할 수 있습니다.

위험성

  1. 시장의 변화와 불안정성에서 잘못된 신호가 자주 나타날 수 있습니다.
  2. 트렌드를 따르는 지표로서 MA는 전환점을 정확하게 찾을 수 없습니다.
  3. MA 크로스오버로 신호가 늦어지면 수익의 일부가 사라질 수 있습니다.
  4. 신호 검증을 위한 다른 기술적 지표들을 도입하고 MA 매개 변수를 최적화함으로써 위험을 줄일 수 있습니다.

최적화 방향

  1. 트렌드 강도를 측정하고 불안정한 시장에서 거래를 피하기 위해 변동성 지표를 통합하는 것을 고려하십시오.
  2. 기계 학습 모델을 적용해서 MA 매개 변수를 자동으로 최적화해보세요.
  3. 스톱 로스 전략을 추가해 드라우다운이 늘어나면 적시에 손실을 줄일 수 있습니다.
  4. MA 교차가 발생하면 미끄러짐을 줄이기 위해 제한 명령을 사용하십시오.

결론

이 전략은 단기, 중기 및 장기 MAs를 결합하여 교차 관계를 기반으로 시장 추세를 결정하여 비교적 안정적이고 효율적인 추세 추후 전략으로 만듭니다. 지표 매개 변수, 스톱 로스 메커니즘 및 주문 배치의 추가 개선은 승률과 수익성을 높이는 데 도움이 될 수 있습니다.


/*backtest
start: 2022-11-29 00:00:00
end: 2023-12-05 00:00:00
period: 1d
basePeriod: 1h
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/
// © Crypto-Oli

//@version=4
strategy("CryptOli 3 MAs long/short Backtest", initial_capital=5000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, overlay=true)

// this is an educational Script - basicly its very simple - you can see how minimal changes impact results, thats why i posted it
// Credits to Quantnomad to publish tons of free educational script
// this Script is based on https://www.tradingview.com/script/0NgUadGr-Ultimate-MA-Cross-Indicator/ Quantnomads Ultimate MA Indicator 
// HA - Option for calcucaltion based on HA-Candles (very famous recently)
// Source Input - Option (Candletype for calculation, close, ohlc4 ect.) --- there are huge differences --- try it by your own

////////////////////////////////////////////////////////////////////////////////
// BACKTESTING RANGE

// From Date Inputs
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=2015, title="From Year", minval=1970)

// To Date Inputs
toDay = input(defval=1, title="To Day", minval=1, maxval=31)
toMonth = input(defval=1, title="To Month", minval=1, maxval=12)
toYear = input(defval=2030, title="To Year", minval=1970)

// Calculate start/end date and time condition
startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = time >= startDate and time <= finishDate

////////////////////////////////////////////////////////////////////////////////

h = input(false, title = "Signals from Heikin Ashi Candles")

ma_type      = input(title = "MA Type",         type = input.string,  defval = "SMMA", options = ['SMA', 'EMA', 'WMA', 'VWMA', 'HMA', 'SMMA', 'DEMA'])
src = input(ohlc4)

short_ma_len = input(title = "Short MA Length", type = input.integer, defval = 7,     minval = 1)
short_ma_src = h ? security(heikinashi(syminfo.tickerid), timeframe.period, src, lookahead = false) : close
middle_ma_len  = input(title = "Middle MA Length",  type = input.integer, defval = 13,    minval = 2)
middle_ma_src = h ? security(heikinashi(syminfo.tickerid), timeframe.period, src, lookahead = false) : close
long_ma_len  = input(title = "Long MA Length",  type = input.integer, defval = 21,    minval = 2)
long_ma_src = h ? security(heikinashi(syminfo.tickerid), timeframe.period, src, lookahead = false) : close


tick_round(x) => 
    round(x / syminfo.mintick) * syminfo.mintick

// Set initial values to 0
short_ma = 0.0
middle_ma = 0.0
long_ma  = 0.0

// Simple Moving Average (SMA)
if ma_type == 'SMA' 
    short_ma := sma(short_ma_src, short_ma_len)
    middle_ma := sma(middle_ma_src, middle_ma_len)
    long_ma  := sma(long_ma_src,  long_ma_len)

// Exponential Moving Average (EMA)
if ma_type == 'EMA'
    short_ma := ema(short_ma_src, short_ma_len)
    middle_ma := ema(middle_ma_src, middle_ma_len)
    long_ma  := ema(long_ma_src,  long_ma_len)

// Weighted Moving Average (WMA)
if ma_type == 'WMA'
    short_ma := wma(short_ma_src, short_ma_len)
    middle_ma := wma(middle_ma_src, middle_ma_len)
    long_ma  := wma(long_ma_src,  long_ma_len)

// Hull Moving Average (HMA)
if ma_type == 'HMA'
    short_ma := wma(2*wma(short_ma_src, short_ma_len/2)-wma(short_ma_src, short_ma_len), round(sqrt(short_ma_len)))
    middle_ma := wma(2*wma(middle_ma_src, middle_ma_len/2)-wma(middle_ma_src, middle_ma_len), round(sqrt(middle_ma_len)))
    long_ma  := wma(2*wma(long_ma_src,  long_ma_len /2)-wma(long_ma_src,  long_ma_len),  round(sqrt(long_ma_len)))

// Volume-weighted Moving Average (VWMA)
if ma_type == 'VWMA'
    short_ma := vwma(short_ma_src, short_ma_len)
    middle_ma := vwma(middle_ma_src, middle_ma_len)
    long_ma  := vwma(long_ma_src,  long_ma_len)


// Smoothed Moving Average (SMMA)    
if ma_type == 'SMMA'
    short_ma := na(short_ma[1]) ? sma(short_ma_src, short_ma_len) : (short_ma[1] * (short_ma_len - 1) + short_ma_src) / short_ma_len
    middle_ma := na(middle_ma[1]) ? sma(middle_ma_src, middle_ma_len) : (middle_ma[1] * (middle_ma_len - 1) + middle_ma_src) / middle_ma_len
    long_ma  := na(long_ma[1])  ? sma(long_ma_src,  long_ma_len)  : (long_ma[1]  * (long_ma_len  - 1) + long_ma_src)  / long_ma_len

// Double Exponential Moving Average (DEMA)
if ma_type == 'DEMA'
    e1_short = ema(short_ma_src, short_ma_len)
    e1_middle = ema(middle_ma_src, middle_ma_len)
    e1_long  = ema(long_ma_src,  long_ma_len)
    
    short_ma := 2 * e1_short - ema(e1_short, short_ma_len)
    middle_ma := 2 * e1_middle - ema(e1_middle, middle_ma_len)
    long_ma  := 2 * e1_long  - ema(e1_long,  long_ma_len)

// Plot MAs
plot(short_ma, color = color.green,   linewidth = 1)
plot(middle_ma, color = color.yellow,   linewidth = 1)
plot(long_ma,  color = color.red, linewidth = 1)

if close>long_ma and short_ma>middle_ma and time_cond
    strategy.entry("Long", strategy.long)


if close<long_ma and short_ma<middle_ma and time_cond
    strategy.entry("Short", strategy.short)


더 많은