Эта стратегия - это стратегия, которая использует низкочастотную трансформацию Фурье для извлечения низкочастотных компонентов тренда из серии цен и сочетает три скользящих средних (быстрые, средние и медленные), чтобы определить тенденции и генерировать торговые сигналы. Она длинная, когда быстрый MA пересекает средний MA, а цена выше медленной MA, и короткая, когда быстрый MA пересекает средний MA, а цена ниже медленной MA. Эта стратегия подходит для отслеживания среднесрочных и долгосрочных тенденций.
Использование низкочастотного преобразования Фурье для извлечения низкочастотных компонентов тренда из серии цен.
Используйте три скользящих средних (быстрые, средние и медленные) для оценки тенденций. медленный MA имеет период 200 лет, средний MA имеет период 20 лет, а быстрый MA имеет период 5 лет. медленный MA фильтрует шум, средний MA фиксирует обратные тенденции, а быстрый MA генерирует торговые сигналы.
Когда быстрый MA пересекает средний MA, а цена превышает медленный MA, рынок считается входящим в восходящую тенденцию, идти длинным.
После того, как тренд будет идентифицирован, он попытается удержать позицию как можно дольше, чтобы извлечь выгоду из тренда.
Использование низкочастотного преобразования Фурье эффективно фильтрует высокочастотный шум, делая идентифицированные сигналы тренда более надежными и стабильными.
Принятие быстрых, средних и медленных МР эффективно оценивает изменение рыночных тенденций и избегает ложных сигналов.
Эта стратегия имеет значительные преимущества в отслеживании среднесрочных и долгосрочных тенденций.
Эта стратегия имеет большое пространство для оптимизации параметров. Пользователи могут регулировать параметры в соответствии с различными сортами и циклами для улучшения адаптивности.
В качестве стратегии, следующей за трендом, эта стратегия не может эффективно определять и реагировать на изменения тренда, вызванные внезапными событиями, которые могут привести к увеличению потерь.
На колеблющихся рынках эта стратегия будет приносить больше прибыли и убытков, но она все равно может быть прибыльной в конечном итоге, требуя некоторой психологической выносливости.
Традиционные стратегии, следующие за трендом, имеют тенденцию к
Стоп-лосс может быть установлен для контроля одиночных потерь.
Попробуйте разные алгоритмы скользящей средней, чтобы адаптировать больше разновидностей и циклов.
Добавьте стоп-лосс, последовательный выход с потерями и другие стратегии стоп-лосса для контроля рисков.
Добавить индикаторы силы тренда, чтобы избежать слишком большого количества сделок на колеблющихся и слабых рынках.
Добавьте модели машинного обучения, чтобы судить об обратных тенденциях, что делает стратегию несколько адаптивной к внезапным событиям.
Эта низкочастотная стратегия преобразования тренда Фурье имеет преимущества фильтрации шума, выявления тенденций и отслеживания тенденций. Она подходит для среднесрочного и долгосрочного хранения. Как стратегия, следующая за трендом, она в основном сталкивается с рисками отмены тренда и устойчивой колебания. Существуют стратегии преодоления этих рисков. В целом, эта стратегия имеет большое пространство параметров и высокий потенциал оптимизации. Она подходит для инвесторов с определенными возможностями разработки стратегии и контроля рисков для проверки в живой торговле.
/*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)