이동 평균 지표 거래 전략


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

이동 평균 지표 거래 전략

전략 개요

이 전략은 여러 이동 평균 지표를 기반으로 거래 신호를 생성하는 전략이다. 전략은 동시에 단기, 중기 및 장기 이동 평균을 관찰하여 트렌드 방향을 판단하고 거래 신호를 생성합니다.

전략 이름

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

전략 원칙

이 전략은 7일선, 13일선, 21일선 등 3개의 다른 주기의 이동 평균을 동시에 사용한다. 거래 논리는 다음과 같은 점들에 기초한다:

  1. 단기 7 일선에서 중간 13 일선과 장기 21 일선에서 상승 추세에 있을 때, 다중 신호를 생성한다.
  2. 단기 7 일선 아래에서 중간 13 일선, 장기 21 일선 아래로 내려가는 경향에 있을 때, 코카이 신호가 발생한다.

다른 시기의 이동 평균을 결합하여 시장의 추세를 더 정확하게 판단하여 잘못된 거래를 피할 수 있습니다.

전략적 이점

  1. 다중 이동 평균을 사용하면 시장의 움직임을 더 정확하게 판단할 수 있으며, 시장의 가짜 돌파구 또는 단기 변동에 의해 오해받지 않습니다.
  2. 트렌드가 명확할 때만 신호를 생성하여 불필요한 거래 수를 줄이고 거래 비용을 줄일 수 있습니다.
  3. 변수 설정은 개인 취향에 따라 이동 평균의 주기를 조정할 수 있으며, 다양한 품종과 시장 환경에 적응할 수 있다.

전략적 위험

  1. 하지만, 이런 현상들은 종종 잘못된 신호로 이어질 수 있습니다.
  2. 이동 평균은 동향을 따르는 지표로 전환점을 정확하게 파악할 수 없습니다.
  3. 이동 평균의 크로스 트렌드를 인식하는 데 지연되어 수익의 일부를 놓칠 수 있습니다.
  4. 다른 기술 지표 검증 신호를 도입하여 이동 평균 변수를 최적화하여 위험을 줄일 수 있다.

전략 최적화 방향

  1. 변동성 지표를 도입하여 트렌드 강도를 판단하고, 불안정한 시장에서 거래하는 것을 피하십시오.
  2. 기계 학습과 같은 정량 기술을 사용하여 이동 평균 변수를 자동으로 최적화하십시오.
  3. 손실이 커질 때 적시에 손실을 막는 전략을 강화하십시오.
  4. 이동 평균을 교차할 때, 제한 가격 표를 사용하여 미끄러짐을 줄이는 것을 고려하십시오.

요약하다

이 전략은 짧은, 중장기 3개의 기간의 이동 평균을 결합하여, 그들의 교차 관계에 따라 시장의 추세를 판단하여, 비교적 안정적이고 효율적인 추세를 따라가는 전략이다. 지표 파라미터, 중지 손실 메커니즘 및 주문 방식에 대한 최적화를 통해 전략의 승률과 수익성을 더욱 높일 수 있다.

전략 소스 코드
/*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)