Chiến lược Stochastic Dual Moving Average cố gắng xác định các cơ hội giao dịch bằng cách sử dụng sự kết hợp của các chỉ số trung bình động và dao động stochastic. Nó tạo ra các tín hiệu giao dịch khi EMA nhanh vượt qua trên hoặc dưới SMA chậm, đồng thời sử dụng giá trị stochastic %K để lọc ra các tín hiệu khi thị trường quá căng.
Chiến lược chủ yếu dựa trên hai chỉ số kỹ thuật:
Moving Averages: Nó tính toán EMA nhanh, SMA chậm và VWMA chậm bằng cách sử dụng các thông số khác nhau và tạo ra tín hiệu giao dịch khi EMA nhanh vượt qua SMA chậm.
Stochastic Oscillator: Nó tính toán giá trị %K và coi thị trường đã mua quá mức hoặc đã bán quá mức khi %K vượt qua các ngưỡng trên hoặc dưới được đặt trước, sử dụng điều này để lọc một số tín hiệu trung bình động.
Cụ thể, logic để tạo tín hiệu là:
Khi EMA nhanh vượt qua trên SMA chậm, và %K nằm dưới mức bán quá mức, mua dài. Khi EMA nhanh vượt qua dưới SMA chậm, và %K nằm trên mức mua quá mức, mua ngắn.
Đối với các vị trí dài hiện có, đóng khi %K quay trở lại khu vực mua quá mức hoặc giá vi phạm mức dừng lỗ. Đối với các vị trí ngắn, đóng khi %K quay trở lại khu vực bán quá mức hoặc giá vi phạm mức dừng lỗ.
Bằng cách kết hợp các đường trung bình động và dao động stochastic, chiến lược cố gắng xác định các điểm tín hiệu trung bình động có khả năng cao để tham gia giao dịch, trong khi sử dụng stochastic để lọc một số tín hiệu sai.
Những lợi thế chính của chiến lược này là:
Ngoài ra còn có một số rủi ro:
Hạn chế:
Các cơ hội tối ưu hóa chính là:
Chiến lược Stochastic Trung bình Di chuyển kép sử dụng sự pha trộn của các đường trung bình di chuyển và dao động stochastic để thiết kế một hệ thống theo xu hướng mạnh mẽ, nhưng có một số cơ hội cải tiến xung quanh các thông số, dừng vv.
/*backtest start: 2023-01-22 00:00:00 end: 2024-01-28 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("TVIX MEAN REV V2 TREND", overlay=true) length = input(16, minval=1) OverBought = input(80) OverSold = input(20) TradeLong = input (true) TradeShort = input (true) OverBoughtClose = input(80) OverSoldClose = input(20) smoothK = 3 smoothD = 3 trail_points = input(50) k = sma(stoch(close, high, low, length), smoothK) d = sma(k, smoothD) k2 = sma(stoch(close, high, low, length), smoothK) d2 = sma(k, smoothD) // === GENERAL INPUTS === // short Ema maFastSource = input(defval=close, title="Fast EMA Source") maFastLength = input(defval=1, title="Fast EMA Period", minval=1) // long Sma maSlowSource = input(defval=close, title="Slow SMA Source") maSlowLength = input(defval=100, title="Slow SMA Period", minval=1) // longer Sma maSlowerSource = input(defval=close, title="Slower SMA Source") maSlowerLength = input(defval=30, title="Slower SMA Period", minval=1) //ATR Stop Loss Indicator by Keith Larson atrDays = input(7, "ATR Days Lookback") theAtr = atr(atrDays) atrModifier = input(5.0, "ATR Modifier") //plot(atr * atrModifier, title="ATR") LstopLoss = close - (theAtr * atrModifier) SstopLoss = close + (theAtr * atrModifier) // === SERIES SETUP === /// a couple of ma's.. maFast = ema(maFastSource, maFastLength) maSlow = sma(maSlowSource, maSlowLength) maSlower = vwma(maSlowerSource, maSlowerLength) rsi = rsi(maSlowerSource, maSlowerLength) // === PLOTTING === fast = plot(maFast, title="Fast MA", color=color.red, linewidth=2, style=plot.style_line, transp=30) slow = plot(maSlow, title="Slow MA", color=color.green, linewidth=2, style=plot.style_line, transp=30) slower = plot(maSlower, title="Slower MA", color=color.teal, linewidth=2, style=plot.style_line, transp=30) // === LOGIC === Basic - simply switches from long to short and vice-versa with each fast-slow MA cross LongFilter = maFast > maSlow ShortFilter = maSlow > maFast BUY=crossover(k, d) and k < OverSold SELL=crossunder(k, d) and k > OverBought SELLCLOSE=crossover(k, d) and k < OverSoldClose BUYCLOSE=crossunder(k, d) and k > OverBoughtClose Open = open if not na(k) and not na(d) if crossover(k, d) and k < OverSold and LongFilter and TradeLong strategy.entry("$", strategy.long, limit = Open, comment="Long") strategy.close("$",when = crossunder(k, d) and k > OverBoughtClose or open < LstopLoss ) ///strategy.close("$",when = open < LstopLoss ) if not na(k) and not na(d) if crossunder(k, d) and k > OverBought and ShortFilter and TradeShort strategy.entry("$1", strategy.short, limit = Open, comment="S") strategy.close ("$1", when = crossover(k, d) and k < OverSoldClose or open > SstopLoss ) ///strategy.close ("$1", when = open < SstopLoss)