
Chiến lược này là một chiến lược theo dõi xu hướng, sử dụng sự thay đổi tần số thấp để trích xuất các thành phần xu hướng tần số thấp trong chuỗi giá, kết hợp với ba đường trung bình di chuyển nhanh và chậm để nhận ra xu hướng và tạo tín hiệu giao dịch. Làm nhiều hơn khi MA nhanh vượt qua MA trung bình và giá cao hơn MA chậm, và làm trống khi MA nhanh vượt qua MA trung bình và giá thấp hơn MA chậm.
Các thành phần xu hướng tần số thấp của chuỗi giá được trích xuất bằng cách sử dụng chuyển đổi lá chuông tần số thấp. Chuyển đổi lá chuông tần số thấp có thể lọc hiệu quả tiếng ồn tần số cao, làm cho tín hiệu xu hướng được trích xuất trở nên trơn tru hơn.
3 đường trung bình di chuyển nhanh và chậm để đánh giá xu hướng. Trong đó, MA chậm là 200 chu kỳ, MA trung bình là 20 chu kỳ, MA nhanh là 5 chu kỳ. MA chậm lọc tiếng ồn, MA trung bình bắt được xu hướng biến đổi, MA nhanh phát ra tín hiệu giao dịch.
Khi MA nhanh vượt qua MA trung bình và giá cao hơn MA chậm, hãy đánh giá thị trường đi vào xu hướng tăng, làm nhiều; khi MA nhanh vượt qua MA trung bình và giá thấp hơn MA chậm, hãy đánh giá thị trường đi vào xu hướng giảm, làm trống.
Chiến lược này là một chiến lược theo dõi xu hướng, khi bạn nhận ra rằng bạn đang trong xu hướng, bạn sẽ giữ vị trí càng lâu càng tốt để kiếm lợi nhuận trong xu hướng.
Sử dụng biến tần số thấp để lọc hiệu quả tiếng ồn tần số cao, làm cho tín hiệu xu hướng được nhận biết đáng tin cậy hơn.
Sử dụng MA nhanh hoặc chậm để đánh giá hiệu quả sự thay đổi của xu hướng thị trường, tránh tín hiệu giả. Các tham số MA chậm được đặt lớn hơn, lọc tiếng ồn hiệu quả.
Chiến lược này theo dõi xu hướng đường dài trung bình có lợi thế rõ ràng. Khi đánh giá thị trường đi vào xu hướng, sẽ tiếp tục tăng cường theo dõi xu hướng, do đó thu được lợi nhuận vượt quá.
Các tham số của chiến lược được tối ưu hóa rộng rãi, người dùng có thể điều chỉnh tham số theo các giống và chu kỳ khác nhau, có khả năng thích ứng mạnh mẽ.
Là một chiến lược theo dõi xu hướng, chiến lược này không có khả năng đánh giá hiệu quả và phản ứng với sự đảo ngược xu hướng gây ra bởi sự kiện bất ngờ, có thể dẫn đến gia tăng tổn thất.
Trong các trường hợp xung đột, chiến lược này sẽ tạo ra nhiều giao dịch có lợi nhuận và giao dịch thua lỗ hơn. Tuy nhiên, cuối cùng vẫn có thể kiếm được lợi nhuận, cần có một số khả năng chịu đựng tinh thần.
Các chiến lược theo dõi xu hướng truyền thống dễ tạo ra các hợp chất chloride, và việc thoát khỏi xu hướng sớm là vấn đề cần giải quyết.
Có thể thiết lập dừng lỗ để kiểm soát tổn thất đơn lẻ. Ngoài ra, có thể thêm thử nghiệm sự kiện bất ngờ vào phản hồi để đánh giá khả năng chống rủi ro của chiến lược.
Thử các thuật toán trung bình di chuyển khác nhau để thích ứng với nhiều giống và chu kỳ hơn.
Chiến lược ngăn chặn tổn thất, kiểm soát rủi ro, như tăng mức dừng lỗ, thoát khỏi tổn thất liên tục.
Tăng chỉ số cường độ của xu hướng để tránh quá nhiều giao dịch trong thời gian dao động và xu hướng yếu.
Thêm mô hình học máy để đánh giá xu hướng đảo ngược, cho phép chiến lược có khả năng thích ứng với sự kiện bất ngờ.
Chiến lược theo dõi xu hướng chuyển đổi lá lách tần số thấp này theo dõi chiến lược trung bình di chuyển, có lợi thế trong việc lọc tiếng ồn, nhận ra xu hướng và theo dõi xu hướng, phù hợp với việc nắm giữ đường dài trung bình. Là chiến lược theo dõi xu hướng, nó chủ yếu đối mặt với rủi ro của sự đảo ngược xu hướng và biến động liên tục. Những rủi ro này đều có một số chiến lược đối phó. Nói chung, chiến lược này có nhiều tham số và tiềm năng tối ưu hóa cao, phù hợp với chứng thực thực tế của nhà đầu tư có khả năng phát triển chiến lược và kiểm soát rủi ro.
/*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)