Stratégie de filtrage de la double moyenne mobile de la percée des tendances


Date de création: 2023-11-27 17:03:08 Dernière modification: 2023-11-27 17:03:08
Copier: 0 Nombre de clics: 689
1
Suivre
1617
Abonnés

Stratégie de filtrage de la double moyenne mobile de la percée des tendances

Aperçu

Il s’agit d’une stratégie qui utilise la ligne d’équilibre et le canal de Brin pour juger de la tendance et combiner le filtrage et le principe de stop-loss. Il peut capturer le signal en temps opportun lorsque la tendance change, réduire les signaux erronés par un double filtrage de la ligne d’équilibre et régler les stop-loss pour contrôler le risque.

Principe de stratégie

La stratégie est principalement composée des éléments suivants:

  1. Détermination de la tendance: utilisez le MACD pour déterminer la tendance des prix, en distinguant les tendances à plusieurs têtes et les tendances à vide.

  2. Filtrage de la fourchette: utilise le canal de Brin pour déterminer la fourchette de fluctuation des prix et filtrer les signaux qui ne franchissent pas la fourchette.

  3. Confirmation de la double ligne de parité: une double ligne de parité composée d’une EMA rapide et d’une EMA lente, utilisée pour confirmer un signal de tendance. Un signal d’achat n’est généré que lorsque l’EMA rapide > l’EMA lente.

  4. Le stop loss est un mécanisme qui consiste à définir un point de stop loss et à arrêter le placement si le prix dépasse le point de stop loss.

La logique de jugement de l’entrée de signaux est la suivante:

  1. Le MACD est en hausse
  2. Les prix ont dépassé le passage de Brin
  3. L’EMA rapide est supérieure à l’EMA lente

Un signal d’achat est généré lorsque les trois conditions ci-dessus sont réunies.

La logique de plafonnement est divisée en deux types, le plafonnement d’arrêt et le plafonnement d’arrêt. Le point d’arrêt est le prix d’entrée multiplié par un certain pourcentage, le point d’arrêt est le prix d’entrée multiplié par un certain pourcentage.

Analyse des avantages

Cette stratégie présente les avantages suivants:

  1. Le blogueur a également ajouté qu’il est possible de capturer les changements de tendance en temps opportun, avec moins de traceback.
  2. Amélioration de la qualité du signal par filtrage des signaux erronés en double homogénéité
  3. Les mécanismes de prévention des pertes sont efficaces pour contrôler les pertes individuelles.
  4. Les paramètres ont beaucoup d’espace d’optimisation et peuvent être ajustés à l’état optimal.

Analyse des risques

Cette stratégie comporte aussi des risques:

  1. Les signaux erronés produits lors d’une secousse peuvent causer des dommages.
  2. Une mauvaise configuration du point d’arrêt peut entraîner des pertes inutiles.
  3. Les paramètres incorrects peuvent entraîner une mauvaise stratégie.

Ces risques peuvent être optimisés et améliorés par des paramètres d’optimisation, l’ajustement de la position d’arrêt, etc.

Direction d’optimisation

Cette stratégie peut être optimisée dans les directions suivantes:

  1. Ajustez la longueur de la ligne de symétrie pour trouver la meilleure combinaison de paramètres.
  2. Tester différentes méthodes d’arrêt des pertes, telles que l’arrêt de la traçabilité, l’arrêt de la vibration, etc.
  3. Test des paramètres MACD pour trouver le paramètre optimal
  4. L’optimisation automatique des paramètres est effectuée à l’aide de l’apprentissage machine.
  5. Ajout de signaux de filtrage conditionnels supplémentaires.

Le meilleur état de la stratégie peut être trouvé en testant différents paramètres, en évaluant le rendement et le Sharpe ratio.

Résumer

Il s’agit d’une stratégie quantitative qui utilise le jugement de tendance, le filtrage de la portée, la confirmation de la double ligne de parité et l’idée de stop-loss. Elle permet de juger efficacement la direction de la tendance et de trouver un équilibre entre la maximisation des bénéfices et la gestion des risques.

Code source de la stratégie
/*backtest
start: 2022-11-20 00:00:00
end: 2023-11-26 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title="Range Filter Buy and Sell Strategies", shorttitle="Range Filter Strategies", overlay=true,pyramiding = 5)

// Original Script > @DonovanWall
// Adapted Version > @guikroth
// 
// Updated PineScript to version 5
// Republished by > @tvenn
// Strategizing by > @RonLeigh
//////////////////////////////////////////////////////////////////////////
// Settings for 5min chart, BTCUSDC. For Other coin, change the parameters
//////////////////////////////////////////////////////////////////////////



SS = input.bool(false,"Percentage Take Profit Stop Loss")


longProfitPerc = input.float(title='LongProfit(%)', minval=0.0, step=0.1, defval=1.5) * 0.01

shortProfitPerc = input.float(title='ShortProfit(%)', minval=0.0, step=0.1, defval=1.5) * 0.01


longLossPerc = input.float(title='LongStop(%)', minval=0.0, step=0.1, defval=1.5) * 0.01

shortLossPerc = input.float(title='ShortStop(%)', minval=0.0, step=0.1, defval=1.5) * 0.01


// Color variables
upColor   = color.white
midColor  = #90bff9
downColor = color.blue

// Source
src = input(defval=close, title="Source")

// Sampling Period
// Settings for 5min chart, BTCUSDC. For Other coin, change the paremeters
per = input.int(defval=100, minval=1, title="Sampling Period")

// Range Multiplier
mult = input.float(defval=3.0, minval=0.1, title="Range Multiplier")

// Smooth Average Range
smoothrng(x, t, m) =>
    wper = t * 2 - 1
    avrng = ta.ema(math.abs(x - x[1]), t)
    smoothrng = ta.ema(avrng, wper) * m
    smoothrng
smrng = smoothrng(src, per, mult)

// Range Filter
rngfilt(x, r) =>
    rngfilt = x
    rngfilt := x > nz(rngfilt[1]) ? x - r < nz(rngfilt[1]) ? nz(rngfilt[1]) : x - r : 
       x + r > nz(rngfilt[1]) ? nz(rngfilt[1]) : x + r
    rngfilt
filt = rngfilt(src, smrng)

// Filter Direction
upward = 0.0
upward := filt > filt[1] ? nz(upward[1]) + 1 : filt < filt[1] ? 0 : nz(upward[1])
downward = 0.0
downward := filt < filt[1] ? nz(downward[1]) + 1 : filt > filt[1] ? 0 : nz(downward[1])

// Target Bands
hband = filt + smrng
lband = filt - smrng

// Colors
filtcolor = upward > 0 ? upColor : downward > 0 ? downColor : midColor
barcolor = src > filt and src > src[1] and upward > 0 ? upColor :
   src > filt and src < src[1] and upward > 0 ? upColor : 
   src < filt and src < src[1] and downward > 0 ? downColor : 
   src < filt and src > src[1] and downward > 0 ? downColor : midColor

filtplot = plot(filt, color=filtcolor, linewidth=2, title="Range Filter")

// Target
hbandplot = plot(hband, color=color.new(upColor, 70), title="High Target")
lbandplot = plot(lband, color=color.new(downColor, 70), title="Low Target")

// Fills
fill(hbandplot, filtplot, color=color.new(upColor, 90), title="High Target Range")
fill(lbandplot, filtplot, color=color.new(downColor, 90), title="Low Target Range")

// Bar Color
barcolor(barcolor)

// Break Outs
longCond = bool(na)
shortCond = bool(na)
longCond := src > filt and src > src[1] and upward > 0 or 
   src > filt and src < src[1] and upward > 0
shortCond := src < filt and src < src[1] and downward > 0 or 
   src < filt and src > src[1] and downward > 0

CondIni = 0
CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1]
longCondition = longCond and CondIni[1] == -1
shortCondition = shortCond and CondIni[1] == 1



// alertcondition(longCondition, title="Buy alert on Range Filter", message="Buy alert on Range Filter")
// alertcondition(shortCondition, title="Sell alert on Range Filter", message="Sell alert on Range Filter")
// alertcondition(longCondition or shortCondition, title="Buy and Sell alert on Range Filter", message="Buy and Sell alert on Range Filter")


////////////// 副

sensitivity = input(150, title='Sensitivity')
fastLength = input(20, title='FastEMA Length')
slowLength = input(40, title='SlowEMA Length')
channelLength = input(20, title='BB Channel Length')
multt = input(2.0, title='BB Stdev Multiplier')

DEAD_ZONE = nz(ta.rma(ta.tr(true), 100)) * 3.7

calc_macd(source, fastLength, slowLength) =>
    fastMA = ta.ema(source, fastLength)
    slowMA = ta.ema(source, slowLength)
    fastMA - slowMA

calc_BBUpper(source, length, multt) =>
    basis = ta.sma(source, length)
    dev = multt * ta.stdev(source, length)
    basis + dev

calc_BBLower(source, length, multt) =>
    basis = ta.sma(source, length)
    dev = multt * ta.stdev(source, length)
    basis - dev

t1 = (calc_macd(close, fastLength, slowLength) - calc_macd(close[1], fastLength, slowLength)) * sensitivity

e1 = calc_BBUpper(close, channelLength, multt) - calc_BBLower(close, channelLength, multt)

trendUp = t1 >= 0 ? t1 : 0
trendDown = t1 < 0 ? -1 * t1 : 0

duoad = trendUp > 0 and trendUp > e1

kongad = trendDown > 0 and trendDown > e1



duo =  longCondition and duoad

kong = shortCondition and kongad


//Alerts
plotshape(longCondition  and trendUp > e1 and  trendUp > 0 , title="Buy Signal", text="Buy", textcolor=color.white, style=shape.labelup, size=size.small, location=location.belowbar, color=color.new(#aaaaaa, 20))
plotshape(shortCondition  and trendDown > e1 and  trendDown > 0 , title="Sell Signal", text="Sell", textcolor=color.white, style=shape.labeldown, size=size.small, location=location.abovebar, color=color.new(downColor, 20))




if  longCondition and trendUp > e1 and  trendUp > 0 
    strategy.entry('Long',strategy.long, comment = "buy" )

if  shortCondition and trendDown > e1 and  trendDown > 0 
    strategy.entry('Short',strategy.short, comment = "sell" )




longlimtPrice  = strategy.position_avg_price * (1 + longProfitPerc)
shortlimtPrice = strategy.position_avg_price * (1 - shortProfitPerc)
   
longStopPrice  = strategy.position_avg_price * (1 - longLossPerc)
shortStopPrice = strategy.position_avg_price * (1 + shortLossPerc)



if (strategy.position_size > 0)  and SS == true
    
    strategy.exit(id="Long",comment_profit = "Profit",comment_loss = "StopLoss", stop=longStopPrice,limit = longlimtPrice)
    

if (strategy.position_size < 0)  and SS == true
    
    strategy.exit(id="Short",comment_profit = "Profit",comment_loss = "StopLoss", stop=shortStopPrice,limit = shortlimtPrice)