이 전략은 여러 이동 평균 지표에 기초하여 거래 신호를 생성합니다. 단기, 중기 및 장기 이동 평균을 동시에 모니터링하고 트렌드 방향을 결정하기 위해 교차 상황에 따라 거래 신호를 생성합니다.
다중 이동 평균 크로스오버 전략
이 전략은 7 일, 13 일 및 21 일 라인을 포함한 다른 기간과 함께 3 개의 이동 평균을 사용합니다. 거래 논리는 다음과 같은 점을 기반으로합니다.
서로 다른 시간 프레임에서 이동 평균을 결합함으로써 전략은 시장 트렌드를 더 정확하게 판단하고 잘못된 거래를 피할 수 있습니다.
이 전략은 단기, 중기 및 장기 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)