Trend Transformasi Fourier Frekuensi Rendah Mengikuti Strategi Purata Pergerakan


Tarikh penciptaan: 2023-12-05 14:56:06 Akhirnya diubah suai: 2023-12-05 14:56:06
Salin: 0 Bilangan klik: 807
1
fokus pada
1619
Pengikut

Trend Transformasi Fourier Frekuensi Rendah Mengikuti Strategi Purata Pergerakan

Gambaran keseluruhan

Strategi ini adalah strategi pengesanan trend yang menggunakan perubahan lipatan frekuensi rendah untuk mengekstrak komponen trend frekuensi rendah dalam urutan harga, digabungkan dengan tiga purata bergerak yang pantas dan lambat untuk mengenal pasti trend dan menghasilkan isyarat perdagangan. Lakukan lebih banyak apabila MA pantas melintasi MA sederhana dan harga lebih tinggi daripada MA perlahan, dan kosong apabila MA pantas melintasi MA sederhana dan harga lebih rendah daripada MA perlahan.

Prinsip Strategi

  1. Menggunakan perubahan frekuensi rendah untuk mengekstrak komponen trend frekuensi rendah dari urutan harga. Perubahan frekuensi rendah untuk mengekstrak frekuensi rendah dapat menyaring bunyi frekuensi tinggi dengan berkesan, menjadikan isyarat trend yang diekstrak lebih lancar.

  2. Tiga purata bergerak pantas dan perlahan untuk menilai trend. Di antaranya, MA perlahan adalah 200 kitaran, MA sederhana adalah 20 kitaran, dan MA pantas adalah 5 kitaran. MA perlahan menyaring kebisingan, MA sederhana menangkap perubahan trend, dan MA pantas mengeluarkan isyarat perdagangan.

  3. Apabila MA pantas menembusi MA sederhana dan harga lebih tinggi daripada MA perlahan, menilai pasaran memasuki trend naik, lakukan lebih banyak; apabila MA pantas menembusi MA sederhana dan harga lebih rendah daripada MA perlahan, menilai pasaran memasuki trend menurun, lakukan kosong.

  4. Strategi ini adalah strategi trend-following, di mana seseorang akan memegang kedudukan selama mungkin untuk mendapatkan keuntungan dari trend apabila ia masuk ke dalam trend.

Analisis kelebihan

  1. Penggunaan transformasi daun sirip frekuensi rendah menapis bunyi frekuensi tinggi dengan berkesan, menjadikan isyarat trend yang dikenal pasti lebih stabil dan dipercayai.

  2. MA pantas dan lambat digunakan untuk menilai perubahan trend pasaran, mengelakkan isyarat palsu. Pengaturan parameter MA perlahan lebih besar, menapis kebisingan dengan berkesan.

  3. Strategi ini menjejaki trend garis tengah dan panjang dengan kelebihan yang jelas. Apabila menilai pasaran memasuki trend, ia akan terus menaikkan saham untuk menjejaki trend, sehingga mendapat keuntungan tambahan.

  4. Strategi ini mempunyai banyak ruang untuk mengoptimumkan parameter, pengguna boleh menyesuaikan parameter mengikut varieti dan kitaran yang berbeza, dan sangat fleksibel.

Analisis risiko

  1. Sebagai strategi trend-following, strategi ini tidak dapat menilai dan bertindak balas dengan berkesan terhadap perubahan trend yang dicetuskan oleh peristiwa yang tidak dijangka, yang boleh menyebabkan peningkatan kerugian.

  2. Dalam keadaan yang tidak menentu, strategi ini akan menghasilkan lebih banyak perdagangan yang menguntungkan dan perdagangan yang rugi. Tetapi akhirnya masih mungkin untuk mendapat keuntungan dan memerlukan ketahanan mental tertentu.

  3. Strategi trend-following tradisional mudah terbentuk dalam bentuk hidrogen klorida, dan keluar awal dari trend adalah masalah yang perlu diselesaikan dalam strategi tersebut.

  4. Anda boleh menetapkan stop loss untuk mengawal kerugian tunggal. Anda juga boleh memasukkan ujian kejadian yang tidak dijangka dalam pengukuran semula, untuk menilai ketahanan strategi terhadap risiko.

Arah pengoptimuman

  1. Cuba algoritma purata bergerak yang berbeza untuk lebih banyak jenis dan tempoh.

  2. Meningkatkan strategi henti kerugian, seperti berhenti kerugian, keluar dari kerugian berturut-turut, dan mengawal risiko.

  3. Meningkatkan penunjuk kekuatan trend untuk mengelakkan terlalu banyak dagangan semasa kejatuhan dan trend lemah.

  4. Menambah model pembelajaran mesin untuk menilai perubahan trend, memberikan strategi kebolehan beradaptasi terhadap kejadian yang tidak dijangka.

ringkaskan

Strategi ini mempunyai kelebihan untuk menyaring kebisingan, mengiktiraf trend, dan mengikuti trend. Sebagai strategi trend, ia kebanyakannya menghadapi risiko pembalikan trend dan gegaran yang berterusan. Semua risiko ini mempunyai strategi untuk menanggapi.

Kod 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)