Chiến lược này là một chiến lược theo xu hướng sử dụng biến đổi Fourier tần số thấp để chiết xuất các thành phần xu hướng tần số thấp từ chuỗi giá và kết hợp ba đường trung bình động (nhanh, trung bình và chậm) để xác định xu hướng và tạo ra tín hiệu giao dịch.
Sử dụng biến đổi Fourier tần số thấp để chiết xuất các thành phần xu hướng tần số thấp từ chuỗi giá.
Sử dụng ba đường trung bình động (nhanh, trung bình và chậm) để đánh giá xu hướng. MA chậm có khoảng thời gian 200, MA trung bình có khoảng thời gian 20, và MA nhanh có khoảng thời gian 5.
Khi MA nhanh vượt qua trên MA trung bình và giá vượt qua MA chậm, thị trường được đánh giá là đang bước vào xu hướng tăng, đi dài. Khi MA nhanh vượt qua dưới MA trung bình và giá dưới MA chậm, thị trường được đánh giá là bước vào xu hướng giảm, đi ngắn.
Đây là một chiến lược theo xu hướng. Một khi một xu hướng được xác định, nó sẽ cố gắng giữ vị trí càng lâu càng tốt để lợi nhuận từ xu hướng.
Việc sử dụng biến đổi Fourier tần số thấp lọc hiệu quả tiếng ồn tần số cao, làm cho các tín hiệu xu hướng được xác định đáng tin cậy và ổn định hơn.
Việc áp dụng các MA nhanh, trung bình và chậm có hiệu quả đánh giá sự đảo ngược xu hướng thị trường và tránh các tín hiệu sai.
Chiến lược này có những lợi thế đáng kể trong việc theo dõi xu hướng trung và dài hạn. Một khi một xu hướng được xác định, nó sẽ tiếp tục thêm các vị trí để theo dõi xu hướng, do đó thu được lợi nhuận vượt quá.
Chiến lược này có không gian tối ưu hóa tham số lớn. Người dùng có thể điều chỉnh các tham số theo các giống và chu kỳ khác nhau để cải thiện khả năng thích nghi.
Là một chiến lược theo xu hướng, chiến lược này không thể xác định và phản ứng hiệu quả với sự đảo ngược xu hướng do các sự kiện đột ngột, có thể dẫn đến tổn thất tăng lên.
Trong thị trường dao động, chiến lược này sẽ tạo ra nhiều giao dịch có lợi và thua lỗ hơn.
Các chiến lược theo xu hướng truyền thống có xu hướng
Stop loss có thể được thiết lập để kiểm soát lỗ đơn. Các thử nghiệm sự kiện đột ngột cũng có thể được bao gồm trong backtesting để đánh giá khả năng chống rủi ro của chiến lược.
Hãy thử các thuật toán trung bình động khác nhau để điều chỉnh nhiều loại và chu kỳ hơn.
Thêm stop loss, exit loss liên tiếp và các chiến lược stop loss khác để kiểm soát rủi ro.
Thêm các chỉ số sức mạnh xu hướng để tránh quá nhiều giao dịch trong thị trường xu hướng dao động và yếu.
Thêm các mô hình học máy để đánh giá sự đảo ngược xu hướng, làm cho chiến lược có thể thích nghi với các sự kiện đột ngột.
Chiến lược biến đổi xu hướng Fourier tần số thấp này theo chiến lược trung bình động có những lợi thế của việc lọc tiếng ồn, xác định xu hướng và theo dõi xu hướng. Nó phù hợp với việc nắm giữ trung và dài hạn. Là một chiến lược theo xu hướng, nó chủ yếu đối mặt với rủi ro đảo ngược xu hướng và dao động bền vững. Có các chiến lược đối phó với những rủi ro này. Nói chung, chiến lược này có không gian tham số lớn và tiềm năng tối ưu hóa cao. Nó phù hợp với các nhà đầu tư có khả năng phát triển chiến lược và kiểm soát rủi ro nhất định để xác minh trong giao dịch trực tiếp.
/*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)