Chiến lược theo xu hướng dựa trên MOST và KAMA


Ngày tạo: 2024-02-29 11:04:38 sửa đổi lần cuối: 2024-02-29 11:04:38
sao chép: 3 Số nhấp chuột: 697
1
tập trung vào
1617
Người theo dõi

Chiến lược theo xu hướng dựa trên MOST và KAMA

Tổng quan

Chiến lược này sử dụng nhiều đường trung bình di chuyển như SMA, EMA, KAMA để xác định xu hướng của xu hướng giá và thiết kế một chiến lược để theo dõi xu hướng dựa trên đường dừng của giá. Khi giá tăng, trails the upper band làm dừng; khi giá giảm, trails the lower limit làm dừng.

Nguyên tắc chiến lược

Chiến lược này sử dụng KAMA làm chỉ số cơ bản để xác định hướng xu hướng, vì KAMA đáp ứng với sự thay đổi của giá và có thể nhận diện chuyển hướng sớm hơn. Ngoài ra, chiến lược bao gồm nhiều loại moving average khác như SMA, EMA và các loại khác để lọc giá và nhận diện hướng xu hướng chính.

Lệnh dừng của chiến lược được thiết lập dựa trên chính giá cả và đường trung bình di chuyển. Cụ thể, đường dừng theo dõi lên sẽ được chồng lên một tỷ lệ cho đường trung bình di chuyển như một bảo đảm; đường dừng theo dõi xuống sẽ được trừ đi một tỷ lệ cho đường trung bình di chuyển như một bảo đảm.

Điều kiện để tham gia là, khi giá từ dưới lên phá vỡ đường dừng lên trên; khi giá từ trên xuống phá vỡ đường dừng xuống dưới.

Phân tích lợi thế

Ưu điểm lớn nhất của chiến lược này là thông qua sự kết hợp của nhiều đường trung bình di chuyển, có thể cải thiện độ chính xác của phán đoán xu hướng và giảm tín hiệu giả. Đồng thời, đường dừng của chiến lược dựa trên sự thay đổi động của đường trung bình di chuyển, có thể điều chỉnh theo giá trong thời gian thực và đáp ứng các sự kiện bất ngờ.

Ngoài ra, so với chiến lược chỉ số đơn, chiến lược này kết hợp các ưu điểm của chiến lược theo dõi xu hướng và phá vỡ. Trong tình huống xu hướng, lợi nhuận có thể được tối đa hóa; trong tình huống chấn động, có thể giảm thiệt hại bằng cách thiết lập dừng lỗ.

Phân tích rủi ro

Rủi ro chính của chiến lược này là thiết lập đường dừng có thể quá lỏng lẻo và không thể dừng lại kịp thời. Điều này là do tỷ lệ rút lại của đường dừng là thiết lập cố định và có thể dẫn đến tổn thất lớn hơn nếu tình hình thay đổi mạnh và không thể cập nhật đường dừng lại kịp thời.

Ngoài ra, Moving Average tự nó có tính chậm trễ và không thể phản ứng ngay lập tức với sự thay đổi giá. Điều này cũng có thể dẫn đến việc không thể dừng lại kịp thời khi thị trường thay đổi nhanh chóng.

Hướng tối ưu hóa

Chiến lược này có thể được tối ưu hóa theo các khía cạnh sau:

  1. Kiểm tra tỷ lệ đường dừng dưới các thiết lập tham số khác nhau để tìm ra sự kết hợp tham số tốt hơn;

  2. Cố gắng thiết lập đường dừng lỗ theo biến động, điều chỉnh theo mức độ biến động của thị trường;

  3. Thêm các chỉ số đánh giá khác, giới thiệu nhiều biến hơn trên cơ sở dừng lỗ, nâng cao khả năng thích ứng của chiến lược;

  4. Tối ưu hóa các tham số chu kỳ của đường trung bình di chuyển để tìm các thiết lập chu kỳ giá trơn nhất.

Tóm tắt

Chiến lược này là khá mạnh mẽ, đánh giá xu hướng xu hướng thông qua nhiều kết hợp moving average và thiết kế cơ chế theo dõi động để theo dõi xu hướng. Ưu điểm là có thể giảm tín hiệu giả, bằng cách kiểm soát rủi ro bằng cách dừng lỗ; Nhược điểm là đường dừng có thể được thiết lập quá rộng, không thể dừng lỗ nhanh chóng.

Mã nguồn chiến lược
/*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))