
Cette stratégie est une stratégie de suivi de tendance qui utilise une variation de couche de basse fréquence pour extraire la composante de tendance basse fréquence d’une séquence de prix, combinée à trois moyennes mobiles rapides et lentes pour permettre la reconnaissance de la tendance et la génération de signaux de négociation. Faites plus lorsque la MA rapide traverse la MA moyenne et le prix est supérieur à la MA lente, et faites moins lorsque la MA rapide traverse la MA moyenne et le prix est inférieur à la MA lente.
Les composants de tendance basse fréquence de la séquence de prix sont extraits à l’aide d’une transformation de feuille de couverture basse fréquence. La transformation de feuille de couverture basse fréquence permet de filtrer efficacement le bruit de haute fréquence, rendant le signal de tendance extrait plus stable.
Les trois moyennes mobiles rapides et lentes permettent de juger de la tendance. La moyenne lente est de 200 cycles, la moyenne lente est de 20 cycles et la moyenne rapide est de 5 cycles. La moyenne lente filtre le bruit, la moyenne lente capte le retournement de tendance et la moyenne rapide émet un signal de transaction.
Lorsque le MA rapide traverse le MA moyen et que le prix est supérieur au MA lent, jugez que le marché est entré dans une tendance à la hausse, faites plus; lorsque le MA rapide traverse le MA moyen et que le prix est inférieur au MA lent, jugez que le marché est entré dans une tendance à la baisse, faites vide.
Cette stratégie est une stratégie de suivi de tendance, qui consiste à maintenir une position pendant le plus longtemps possible après l’entrée dans la tendance, afin de tirer profit de la tendance.
La transformation de la lame de coude à basse fréquence permet de filtrer efficacement le bruit à haute fréquence, ce qui rend le signal de tendance identifié plus fiable et plus stable.
L’utilisation d’une MA rapide ou lente permet de juger efficacement le tournant de la tendance du marché et d’éviter les faux signaux. Le paramètre de la MA lente est plus grand et filtre efficacement le bruit.
Cette stratégie a un avantage évident de suivre la tendance de la ligne médiane et longue. Après avoir jugé que le marché était entré dans la tendance, il continue à accroître ses positions pour suivre la tendance, ce qui lui permet de réaliser des gains supplémentaires.
La stratégie offre un large espace d’optimisation des paramètres, permettant aux utilisateurs d’ajuster les paramètres en fonction des variétés et des cycles, et est très adaptable.
En tant que stratégie de suivi des tendances, la stratégie ne peut pas évaluer efficacement et réagir à un renversement de tendance déclenché par un événement soudain, ce qui peut entraîner une augmentation des pertes.
Dans une situation de choc, cette stratégie peut entraîner plus de transactions à gain et à perte. Cependant, il est toujours possible de gagner de l’argent et cela nécessite une certaine tolérance psychologique.
Les stratégies traditionnelles de suivi des tendances sont sujettes à la formation de chlorure de potassium, et l’abandon prématuré de la tendance est un problème que la stratégie doit résoudre.
Il est possible de définir des arrêts de perte pour contrôler les pertes individuelles. Il est également possible d’inclure des tests de survenance dans la rétro-évaluation pour évaluer la résistance au risque de la stratégie.
Essayez différents algorithmes de moyenne mobile pour plus de variétés et de périodes.
Augmentation des stratégies d’arrêt des pertes, telles que l’arrêt des pertes consécutives et l’expiration des pertes consécutives, et contrôle des risques.
Augmenter les indicateurs de force de tendance pour éviter les surtensions et les faiblesses de tendance.
L’ajout d’un modèle d’apprentissage automatique pour juger des retournements de tendance permet à la stratégie d’avoir une certaine capacité d’adaptation aux événements inattendus.
Cette stratégie de suivi de la tendance à basse fréquence suit les moyennes mobiles, a l’avantage de filtrer le bruit, d’identifier les tendances et de suivre les tendances, et convient aux longues lignes moyennes. En tant que stratégie de suivi de la tendance, elle est principalement exposée au risque de renversement de tendance et de perturbations persistantes.
/*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)