Strategi Mengikuti Tren Rata-rata Pergerakan Transformasi Fourier Frekuensi Rendah


Tanggal Pembuatan: 2023-12-05 14:56:06 Akhirnya memodifikasi: 2023-12-05 14:56:06
menyalin: 0 Jumlah klik: 807
1
fokus pada
1619
Pengikut

Strategi Mengikuti Tren Rata-rata Pergerakan Transformasi Fourier Frekuensi Rendah

Ringkasan

Strategi ini adalah strategi pelacakan tren yang menggunakan perubahan leaflet frekuensi rendah untuk mengekstrak komponen tren frekuensi rendah dalam urutan harga, yang digabungkan dengan tiga rata-rata bergerak cepat dan lambat untuk memungkinkan identifikasi tren dan pembuatan sinyal perdagangan. Lakukan lebih banyak ketika MA cepat melintasi MA menengah dan harga lebih tinggi dari MA lambat, dan kosongkan ketika MA cepat melintasi MA menengah dan harga lebih rendah dari MA lambat.

Prinsip Strategi

  1. Komponen tren frekuensi rendah dari sekuensi harga yang diekstrak menggunakan transformasi lempengan lempengan frekuensi rendah. Transformasi lempengan lempengan frekuensi rendah dapat secara efektif menyaring kebisingan frekuensi tinggi, sehingga sinyal tren yang diekstrak lebih halus.

  2. Tiga rata-rata bergerak cepat dan lambat untuk menilai tren. Di antaranya, MA lambat adalah 200 siklus, MA menengah adalah 20 siklus, dan MA cepat adalah 5 siklus. MA lambat memfilter kebisingan, MA menengah menangkap perubahan tren, dan MA cepat mengirimkan sinyal perdagangan.

  3. Ketika MA cepat melewati MA sedang dan harga lebih tinggi dari MA lambat, menilai bahwa pasar masuk ke tren naik, lakukan lebih banyak; ketika MA cepat melewati MA sedang dan harga lebih rendah dari MA lambat, menilai bahwa pasar masuk ke tren menurun, lakukan lebih banyak.

  4. Strategi ini adalah strategi trend tracking, yang mana ketika masuk ke dalam tren, akan memegang posisi selama mungkin untuk mendapatkan keuntungan dari tren tersebut.

Analisis Keunggulan

  1. Penggunaan low-frequency tray conversion secara efektif menyaring kebisingan frekuensi tinggi, membuat sinyal tren yang diidentifikasi lebih stabil dan lebih dapat diandalkan.

  2. MA cepat dan lambat digunakan untuk menilai perubahan tren pasar, menghindari sinyal palsu. Pengaturan parameter MA lambat lebih besar, memfilter kebisingan secara efektif.

  3. Strategi ini memiliki keuntungan yang jelas untuk melacak tren garis tengah dan panjang. Setelah menilai bahwa pasar masuk ke tren, akan terus menaikkan posisi untuk mengikuti tren, sehingga mendapatkan keuntungan tambahan.

  4. Strategi ini memiliki banyak ruang untuk mengoptimalkan parameter, pengguna dapat menyesuaikan parameter sesuai dengan varietas dan siklus yang berbeda, dan sangat mudah beradaptasi.

Analisis risiko

  1. Sebagai strategi pelacakan tren, strategi ini tidak dapat secara efektif menilai dan menanggapi pembalikan tren yang dipicu oleh peristiwa yang tidak terduga, yang dapat menyebabkan peningkatan kerugian.

  2. Strategi ini menghasilkan lebih banyak perdagangan yang menguntungkan dan perdagangan yang merugikan dalam situasi yang bergolak. Namun, pada akhirnya masih mungkin untuk mendapatkan keuntungan, membutuhkan beberapa ketahanan psikologis.

  3. Strategi trend-following tradisional mudah terbentuk dari halusinasi, dan keluar dari tren lebih awal adalah masalah yang harus diselesaikan.

  4. Anda dapat mengatur stop loss untuk mengendalikan kerugian tunggal. Anda juga dapat menambahkan tes kejadian yang tidak terduga dalam pengukuran ulang untuk menilai ketahanan strategi terhadap risiko.

Arah optimasi

  1. Cobalah berbagai algoritma moving average untuk lebih banyak varietas dan periode.

  2. Strategi penghentian kerugian, seperti meningkatkan stop loss, dan keluar dari kerugian beruntun, untuk mengendalikan risiko.

  3. Meningkatkan indikator intensitas tren untuk menghindari terlalu banyak perdagangan di tengah-tengah pergerakan dan tren lemah.

  4. Menambahkan model pembelajaran mesin untuk menilai pergeseran tren, sehingga strategi memiliki kemampuan adaptasi terhadap kejadian yang tidak terduga.

Meringkaskan

Strategi ini memiliki keuntungan untuk memfilter kebisingan, mengidentifikasi tren, dan melacak tren. Sebagai strategi pelacakan tren, ini terutama menghadapi risiko pembalikan tren dan getaran yang berkelanjutan. Risiko ini memiliki strategi untuk menanggapi. Secara keseluruhan, strategi ini memiliki parameter yang luas dan berpotensi untuk dioptimalkan.

Kode Sumber Strategi
/*backtest
start: 2023-11-27 00:00:00
end: 2023-11-29 02:00:00
period: 1m
basePeriod: 1m
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/
// © 03.freeman

//@version=4
strategy("FTSMA", overlay=true )
src=input(close,"Source")
slowMA=input(200,"Slow MA period")
mediumMA=input(20,"Mid MA period")
fastMA=input(5,"Fast MA period")
plotSMA=input(true,"Use MA")
sin1=input(1,"First sinusoid",minval=1)
sin2=input(2,"Second sinusoid",minval=1)
sin3=input(3,"Third sinusoid",minval=1)
smoothinput = input('EMA', title = "MA Type", options =['EMA', 'SMA', 'ALMA','FRAMA','RMA', 'SWMA', 'VWMA','WMA','LinearRegression'])
linearReg=input(false, "Use linear regression?")
linregLenght=input(13, "Linear regression lenght")
linregOffset=input(0, "Linear regression offset")

//------FRAMA ma---------
ma(src, len) =>
    float result = 0
    int len1 = len/2
    frama_SC=200
    frama_FC=1
    e = 2.7182818284590452353602874713527
    w = log(2/(frama_SC+1)) / log(e) // Natural logarithm (ln(2/(SC+1))) workaround
    H1 = highest(high,len1)
    L1 = lowest(low,len1)
    N1 = (H1-L1)/len1
    H2_ = highest(high,len1)
    H2 = H2_[len1]
    L2_ = lowest(low,len1)
    L2 = L2_[len1]
    N2 = (H2-L2)/len1
    H3 = highest(high,len)
    L3 = lowest(low,len)
    N3 = (H3-L3)/len
    dimen1 = (log(N1+N2)-log(N3))/log(2)
    dimen = iff(N1>0 and N2>0 and N3>0,dimen1,nz(dimen1[1]))
    alpha1 = exp(w*(dimen-1))
    oldalpha = alpha1>1?1:(alpha1<0.01?0.01:alpha1)
    oldN = (2-oldalpha)/oldalpha
    N = (((frama_SC-frama_FC)*(oldN-1))/(frama_SC-1))+frama_FC
    alpha_ = 2/(N+1)
    alpha = alpha_<2/(frama_SC+1)?2/(frama_SC+1):(alpha_>1?1:alpha_)
    frama = 0.0
    frama :=(1-alpha)*nz(frama[1]) + alpha*src
    result := frama
    result

// ----------MA calculation - ChartArt and modified by 03.freeman-------------
calc_ma(src,l) => 
    _ma = smoothinput=='SMA'?sma(src, l):smoothinput=='EMA'?ema(src, l):smoothinput=='WMA'?wma(src, l):smoothinput=='LinearRegression'?linreg(src, l,0):smoothinput=='VWMA'?vwma(src,l):smoothinput=='RMA'?rma(src, l):smoothinput=='ALMA'?alma(src,l,0.85,6):smoothinput=='SWMA'?swma(src):smoothinput=='FRAMA'?ma(sma(src,1),l):na
    
//----------------------------------------------


//pi = acos(-1)
// Approximation of Pi in _n terms --- thanks to e2e4mfck
f_pi(_n) =>
    _a = 1. / (4. * _n + 2)
    _b = 1. / (6. * _n + 3)
    _pi = 0.
    for _i = _n - 1 to 0
        _a := 1 / (4. * _i + 2) - _a / 4.
        _b := 1 / (6. * _i + 3) - _b / 9.
    _pi := (4. * _a) + (4. * _b) - _pi
pi=f_pi(20)

//---Thanks to xyse----https://www.tradingview.com/script/UTPOoabQ-Low-Frequency-Fourier-Transform/
//Declaration of user-defined variables
N = input(defval=64, title="Lookback Period", type=input.integer, minval=2, maxval=600, confirm=false, step=1, options=[2,4,8,16,32,64,128,256,512,1024,2048,4096])

//Real part of the Frequency Domain Representation
ReX(k) =>
    sum = 0.0
    for i=0 to N-1
        sum := sum + src[i]*cos(2*pi*k*i/N)
    return = sum
    
//Imaginary part of the Frequency Domain Representation
ImX(k) =>
    sum = 0.0
    for i=0 to N-1
        sum := sum + src[i]*sin(2*pi*k*i/N)
    return = -sum

//Get sinusoidal amplitude from frequency domain  
ReX_(k) =>
    case = 0.0
    if(k!=0 and k!=N/2)
        case := 2*ReX(k)/N
    if(k==0)
        case := ReX(k)/N
    if(k==N/2)
        case := ReX(k)/N
    return = case
    
 //Get sinusoidal amplitude from frequency domain  
ImX_(k) =>
    return = -2*ImX(k)/N
    
//Get full Fourier Transform
x(i, N) =>
    sum1 = 0.0
    sum2 = 0.0
    for k=0 to N/2
        sum1 := sum1 + ReX_(k)*cos(2*pi*k*i/N)
    for k=0 to N/2
        sum2 := sum2 + ImX_(k)*sin(2*pi*k*i/N)
    return = sum1+sum2
    
//Get single constituent sinusoid
sx(i, k) =>
    sum1 = ReX_(k)*cos(2*pi*k*i/N)
    sum2 = ImX_(k)*sin(2*pi*k*i/N)
    return = sum1+sum2
//Calculations for strategy
SLOWMA = plotSMA?calc_ma(close+sx(0,sin1),slowMA):close+sx(0,sin1)
MEDMA = plotSMA?calc_ma(close+sx(0,sin2),mediumMA):close+sx(0,sin2)
FASTMA = plotSMA?calc_ma(close+sx(0,sin3),fastMA):close+sx(0,sin3)

SLOWMA := linearReg?linreg(SLOWMA,linregLenght,linregOffset):SLOWMA
MEDMA := linearReg?linreg(MEDMA,linregLenght,linregOffset):MEDMA
FASTMA := linearReg?linreg(FASTMA,linregLenght,linregOffset):FASTMA

//Plot 3 Low-Freq Sinusoids
plot(SLOWMA, color=color.green)
plot(MEDMA, color=color.red)
plot(FASTMA, color=color.blue)

//  Strategy: (Thanks to JayRogers)
// === STRATEGY RELATED INPUTS ===
// the risk management inputs
inpTakeProfit   = input(defval = 0, title = "Take Profit Points", minval = 0)
inpStopLoss     = input(defval = 0, title = "Stop Loss Points", minval = 0)
inpTrailStop    = input(defval = 0, title = "Trailing Stop Loss Points", minval = 0)
inpTrailOffset  = input(defval = 0, title = "Trailing Stop Loss Offset Points", minval = 0)

// === RISK MANAGEMENT VALUE PREP ===
// if an input is less than 1, assuming not wanted so we assign 'na' value to disable it.
useTakeProfit   = inpTakeProfit  >= 1 ? inpTakeProfit  : na
useStopLoss     = inpStopLoss    >= 1 ? inpStopLoss    : na
useTrailStop    = inpTrailStop   >= 1 ? inpTrailStop   : na
useTrailOffset  = inpTrailOffset >= 1 ? inpTrailOffset : na

longCondition = FASTMA>MEDMA and close > SLOWMA             //crossover(FASTMA, MEDMA) and close > SLOWMA
if (longCondition)
    strategy.entry("Long Entry", strategy.long)

shortCondition = FASTMA<MEDMA and close < SLOWMA            //crossunder(FASTMA, MEDMA) and close < SLOWMA
if (shortCondition)
    strategy.entry("Short Entry", strategy.short)

// === STRATEGY RISK MANAGEMENT EXECUTION ===
// finally, make use of all the earlier values we got prepped
strategy.exit("Exit Buy", from_entry = "Long Entry", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)
strategy.exit("Exit Sell", from_entry = "Short Entry", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)