Chiến lược này kết hợp nhiều đường trung bình động như SMA và EMA để xác định hướng xu hướng giá, và thiết lập các đường dừng lỗ dựa trên sự đột phá giá để thiết kế một chiến lược theo xu hướng. Khi giá tăng, nó đi theo dải trên như một mức dừng lỗ; khi giá giảm, nó đi theo giới hạn dưới như một mức dừng lỗ. Lợi thế của chiến lược là sự kết hợp của nhiều đường trung bình động có thể làm mịn dữ liệu giá và xác định xu hướng; Thiết kế dừng lỗ năng động tránh dừng quá nhạy cảm. Nguy cơ của chiến lược là việc thiết lập đường dừng lỗ có thể quá lỏng để dừng lỗ trong thời gian.
Chiến lược này sử dụng KAMA làm cơ sở để đánh giá hướng xu hướng, bởi vì KAMA phản ứng với sự thay đổi giá một cách nhạy cảm hơn và có thể xác định chuyển đổi trước.
Định hướng đường dừng lỗ của chiến lược dựa trên chính giá cả và đường trung bình động. Cụ thể, đường dừng lỗ đi lên là đường trung bình di chuyển cộng với tỷ lệ như một đệm; Đường dừng lỗ đi xuống là đường trung bình di chuyển trừ tỷ lệ như một đệm. Điều này cho phép dừng lỗ ngay lập tức khi giá đảo ngược.
Các điều kiện nhập là dài khi giá vượt qua đường dừng lỗ tăng từ dưới lên; ngắn khi giá vượt qua đường dừng lỗ giảm từ trên xuống.
Lợi thế lớn nhất của chiến lược này là bằng cách kết hợp nhiều đường trung bình động, độ chính xác của phán đoán xu hướng có thể được cải thiện và các tín hiệu sai có thể được giảm.
Ngoài ra, so với các chiến lược chỉ số duy nhất, chiến lược này kết hợp các lợi thế của theo dõi xu hướng và các chiến lược đột phá. Trong một thị trường xu hướng, nó có thể tối đa hóa lợi nhuận; trong khi trên thị trường whipsaw, nó có thể giảm lỗ thông qua cài đặt dừng lỗ.
Rủi ro chính của chiến lược này là thiết lập đường dừng lỗ có thể quá lỏng lẻo để dừng lỗ kịp thời. Điều này là do tỷ lệ khôi phục của đường dừng lỗ được cố định, nếu có một sự thay đổi mạnh mẽ trên thị trường, đường dừng lỗ không thể được cập nhật kịp thời, có thể dẫn đến tổn thất lớn hơn.
Ngoài ra, Moving Average tự nó có sự loạn cảm cao và không thể phản ứng ngay lập tức với sự thay đổi giá cả. Điều này cũng có thể dẫn đến việc không thể ngăn chặn lỗ kịp thời khi thị trường đảo ngược nhanh chóng.
Chiến lược có thể được tối ưu hóa trong các khía cạnh sau:
Kiểm tra các thiết lập tham số khác nhau cho tỷ lệ đường stop loss để tìm kết hợp tham số tốt hơn;
Cố gắng làm cho đường dừng lỗ thay đổi năng động theo mức độ biến động của thị trường;
Tăng các chỉ số khác để đánh giá, giới thiệu nhiều biến số hơn trong cơ sở dừng lỗ để cải thiện khả năng thích nghi của chiến lược;
Tối ưu hóa các tham số chu kỳ của đường trung bình động để tìm ra cài đặt chu kỳ tốt nhất để làm mượt giá.
Nhìn chung, chiến lược này khá mạnh mẽ, kết hợp nhiều đường trung bình động để xác định hướng xu hướng và thiết kế một cơ chế dừng lỗ theo sau động nhằm theo dõi xu hướng. Ưu điểm là nó có thể giảm tín hiệu sai, kiểm soát rủi ro thông qua dừng lỗ; Nhược điểm là đường dừng lỗ có thể được đặt quá rộng để dừng lỗ nhanh chóng. Bước tiếp theo để tối ưu hóa chiến lược nên tập trung vào thiết kế đường dừng lỗ để làm cho nó điều chỉnh năng động theo những thay đổi của thị trường.
/*backtest start: 2023-02-22 00:00:00 end: 2024-02-28 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy('Atlantean Trend Signal BUY SELL Strategy', overlay=true) ma_length = input.int(title='Moving Average Length', minval=1, defval=3) percent = input.float(3.3, 'STOP LOSS Percent', step=0.1, minval=0) src = input(title='Source', defval=close) mav = input.string(title="Moving Average Type", defval="KAMA", options=["SMA", "EMA", "WMA", "DEMA", "TMA", "VAR", "WWMA", "ZLEMA", "TSF", "HULL", "TILL", "KAMA"]) T3a1 = 0.7 _type = false //input(false, title='Activate Moving Average Screening Mode') _type1 = false //input(false, title='Activate Moving Average Color Change Screening Mode') activateScreener = input.bool(false, title="Activate Screener?") showsignallabels = input(title='Show Signal Labels?', defval=true) Var_Func(src, ma_length) => valpha = 2 / (ma_length + 1) vud1 = src > src[1] ? src - src[1] : 0 vdd1 = src < src[1] ? src[1] - src : 0 vUD = math.sum(vud1, 9) vDD = math.sum(vdd1, 9) vCMO = nz((vUD - vDD) / (vUD + vDD)) VAR = 0.0 VAR := nz(valpha * math.abs(vCMO) * src) + (1 - valpha * math.abs(vCMO)) * nz(VAR[1]) VAR VAR = Var_Func(src, ma_length) DEMA = 2 * ta.ema(src, ma_length) - ta.ema(ta.ema(src, ma_length), ma_length) Wwma_Func(src, ma_length) => wwalpha = 1 / ma_length WWMA = 0.0 WWMA := wwalpha * src + (1 - wwalpha) * nz(WWMA[1]) WWMA WWMA = Wwma_Func(src, ma_length) // KAMA Calculation Kama_Func(src, ma_length) => xvnoise = math.abs(src - src[1]) nfastend = 0.666 nslowend = 0.0645 nsignal = math.abs(src - src[ma_length]) nnoise = math.sum(xvnoise, ma_length) nefratio = nnoise != 0 ? nsignal / nnoise : 0 nsmooth = math.pow(nefratio * (nfastend - nslowend) + nslowend, 2) nAMA = 0.0 nAMA := nz(nAMA[1]) + nsmooth * (src - nz(nAMA[1])) nAMA Zlema_Func(src, ma_length) => zxLag = ma_length / 2 == math.round(ma_length / 2) ? ma_length / 2 : (ma_length - 1) / 2 zxEMAData = src + src - src[zxLag] ZLEMA = ta.ema(zxEMAData, ma_length) ZLEMA ZLEMA = Zlema_Func(src, ma_length) Tsf_Func(src, ma_length) => lrc = ta.linreg(src, ma_length, 0) lrc1 = ta.linreg(src, ma_length, 1) lrs = lrc - lrc1 TSF = ta.linreg(src, ma_length, 0) + lrs TSF TSF = Tsf_Func(src, ma_length) HMA = ta.wma(2 * ta.wma(src, ma_length / 2) - ta.wma(src, ma_length), math.round(math.sqrt(ma_length))) T3e1 = ta.ema(src, ma_length) T3e2 = ta.ema(T3e1, ma_length) T3e3 = ta.ema(T3e2, ma_length) T3e4 = ta.ema(T3e3, ma_length) T3e5 = ta.ema(T3e4, ma_length) T3e6 = ta.ema(T3e5, ma_length) T3c1 = -T3a1 * T3a1 * T3a1 T3c2 = 3 * T3a1 * T3a1 + 3 * T3a1 * T3a1 * T3a1 T3c3 = -6 * T3a1 * T3a1 - 3 * T3a1 - 3 * T3a1 * T3a1 * T3a1 T3c4 = 1 + 3 * T3a1 + T3a1 * T3a1 * T3a1 + 3 * T3a1 * T3a1 T3 = T3c1 * T3e6 + T3c2 * T3e5 + T3c3 * T3e4 + T3c4 * T3e3 getMA(src, ma_length) => ma = 0.0 ma := switch mav 'SMA' => ta.sma(src, ma_length) 'EMA' => ta.ema(src, ma_length) 'WMA' => ta.wma(src, ma_length) 'DEMA' => DEMA 'TMA' => ta.sma(ta.sma(src, math.ceil(ma_length / 2)), math.floor(ma_length / 2) + 1) 'VAR' => VAR 'WWMA' => WWMA 'ZLEMA' => ZLEMA 'TSF' => TSF 'HULL' => HMA 'TILL' => T3 'KAMA' => Kama_Func(src, ma_length) ma ALL = getMA(src, ma_length) exMov = ALL fark = exMov * percent * 0.01 longStop = exMov - fark longStopPrev = nz(longStop[1], longStop) longStop := exMov > longStopPrev ? math.max(longStop, longStopPrev) : longStop shortStop = exMov + fark shortStopPrev = nz(shortStop[1], shortStop) shortStop := exMov < shortStopPrev ? math.min(shortStop, shortStopPrev) : shortStop dir = 1 dir := nz(dir[1], dir) dir := dir == -1 and exMov > shortStopPrev ? 1 : dir == 1 and exMov < longStopPrev ? -1 : dir MOST = dir == 1 ? longStop : shortStop cro = _type and _type1 ? ta.crossover(exMov, exMov[1]) : _type ? ta.crossover(close, exMov) : ta.crossover(exMov, MOST) cru = _type and _type1 ? ta.crossunder(exMov, exMov[1]) : _type ? ta.crossunder(close, exMov) : ta.crossunder(exMov, MOST) direction = 0 direction := cro ? 1 : cru ? -1 : direction[1] col1 = exMov > exMov[1] col3 = exMov < exMov[1] colorM = col1 and _type and _type1 ? color.rgb(14, 241, 52) : col3 and _type and _type1 ? color.red : color.new(#00bcd4, 0) if (cro) strategy.entry('LONG', strategy.long) if (cru) strategy.close('LONG') plot(_type ? na : MOST, color=color.new(color.maroon, 0), linewidth=3, title='MOST') plot(exMov, color=colorM, linewidth=2, title='exMov') plotshape(cro and showsignallabels, title='BUY', text='BUY', location=location.belowbar, style=shape.labelup, size=size.tiny, color=color.new(#00bcd4, 0), textcolor=color.new(color.white, 0)) plotshape(cru and showsignallabels, title='SELL', text='SELL', location=location.abovebar, style=shape.labeldown, size=size.tiny, color=color.new(#e91e63, 0), textcolor=color.new(color.white, 0))