Stratégie hybride de croisement de moyennes mobiles et de plage réelle moyenne


Date de création: 2023-09-26 17:22:21 Dernière modification: 2023-09-26 17:22:21
Copier: 9 Nombre de clics: 1076
1
Suivre
1702
Abonnés

Aperçu

Cette stratégie utilise les indicateurs techniques de l’intersection moyenne et de l’amplitude réelle moyenne pour identifier les signaux d’intersection moyenne dans la tendance et obtenir un taux de victoire plus élevé.

Le principe

  • L’indicateur ATR est utilisé pour évaluer la volatilité des prix à grande échelle et confirme une tendance à la hausse.
  • Calculer les moyennes rapides et les moyennes lentes sur une période plus courte, en ajoutant une valeur plus élevée pour les moyennes rapides et plus faible pour les moyennes lentes.
  • L’indicateur ATR calcule l’amplitude moyenne réelle des grandes périodes pour déterminer la tendance générale; le croisement de la moyenne pour déterminer le point d’entrée spécifique dans les petites périodes
  • L’indicateur ATR est calculé à partir d’une moyenne mobile lisse RMA, dont la longueur et la lisse sont réglables
  • Le croisement de moyenne ligne est constitué de deux SMA mesurées en moyenne ligne et de longueur réglable.

Les avantages

  • L’indicateur ATR permet de filtrer efficacement les tendances à la baisse et d’éviter les transactions inutiles
  • Le croisement de la moyenne permet de déterminer avec précision les tendances des petites périodes.
  • RMA calcule l’ATR pour réduire la courbure et déterminer plus précisément le mouvement du grand cycle
  • La combinaison de ces deux éléments permet d’éviter les bouleversements et de saisir les opportunités concrètes.
  • Les paramètres sont réglables et optimisés pour différentes variétés et périodes
  • Dans l’ensemble, la stratégie a un taux de réussite élevé et des gains stables.

Les risques

  • L’indicateur ATR détermine que la tendance principale est en retard et pourrait manquer le début de la tendance
  • La probabilité d’ajustements multiples de la ligne moyenne de croisement est plus élevée.
  • Le paramètre de réglage est essentiel, et un mauvais réglage peut entraîner des transactions trop fréquentes ou conservatrices.
  • Analyser les données historiques pour chaque variété afin de trouver la meilleure combinaison de paramètres
  • Il est recommandé d’ouvrir les positions progressivement, en veillant à ce qu’elles soient suffisamment capitalisées et en contrôlant les pertes individuelles.

Direction d’optimisation

  • Essayez de compléter ou de remplacer l’ATR par d’autres indicateurs, tels que les bandes de Brin pour déterminer la force de la tendance
  • Les types de croisement linéaire sont extensibles à d’autres combinaisons, telles que les EMA, les indicateurs de dynamique, etc.
  • Le système d’authentification de fausse fuite peut être ajouté
  • Séquence de réglage des paramètres d’optimisation: ATR longueur et lissure > Longueur moyenne de la ligne > Réglage du stop-loss
  • Considérer des stratégies de gestion de fonds combinées, telles que des parts fixes, des positions dynamiques, etc.
  • La rétrospective du disque dur pour évaluer la stabilité de la stratégie et le retrait maximal

Résumer

Cette stratégie exploite pleinement les avantages respectifs de l’ATR et du croisement de la ligne moyenne pour déterminer ensemble la direction de la tendance et le moment d’entrée spécifique. Elle peut être adaptée à différents environnements de marché grâce à des paramètres d’ajustement.

Code source de la stratégie
/*backtest
start: 2023-08-26 00:00:00
end: 2023-09-25 00:00:00
period: 1h
basePeriod: 15m
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/
// © Phoenix085

//@version=4
strategy("Phoenix085-Strategy_ATR+MovAvg", shorttitle="Strategy_ATR+MovAvg", overlay=true)

// // ######################>>>>>>>>>>>>Inputs<<<<<<<<<<<#########################
// // ######################>>>>>>>>>>>>Strategy Inputs<<<<<<<<<<<#########################

TakeProfitPercent = input(50, title="Take Profit %", type=input.float, step=.25)
StopLossPercent = input(5, title="Stop Loss %", type=input.float, step=.25)

ProfitTarget = (close * (TakeProfitPercent / 100)) / syminfo.mintick
LossTarget = (close * (StopLossPercent / 100)) / syminfo.mintick

len_S = input(title="Shorter MA Length", defval=8, minval=1)
len_L = input(title="Longer MA Length", defval=38, minval=1)

TF = input(defval="", title="Session TF for calc only", type=input.session,options=[""])
TF_ = "1"

if TF == "3"
    TF_ == "1"
else 
    if TF == "5" 
        TF_ == "3"
    else 
        if TF == "15"
            TF_ == "5"
        else 
            if TF == "30"
                TF_ == "15"
            else 
                if TF == "1H"
                    TF_ == "30"
                else 
                    if TF == "2H"
                        TF_ == "1H"
                    else 
                        if TF == "4H"
                            TF_ == "3H"
                        else 
                            if TF == "1D"
                                TF_ == "4H"
                            else
                                if TF == "1W"
                                    TF_ == "1H"
                                else 
                                    if TF == "1M"
                                        TF_ == "1W"
                                    else
                                        if TF =="3H"
                                            TF_ == "2H"

Src = security(syminfo.tickerid, TF, close[1], barmerge.lookahead_on)

Src_ = security(syminfo.tickerid, TF_, close, barmerge.lookahead_off)

// ######################>>>>>>>>>>>>ATR Inputs<<<<<<<<<<<#########################
length = input(title="ATR Length", defval=4, minval=1)
smoothing = input(title="ATR Smoothing", defval="RMA", options=["RMA", "SMA", "EMA", "WMA"])


// //######################>>>>>>>>>>>>Custom Functions Declarations<<<<<<<<<<<#########################



// ######################>>>>>>>>>>>>ATR<<<<<<<<<<<#########################

ma_function(source, length) =>
	if smoothing == "RMA"
		rma(Src, length)
	else
		if smoothing == "SMA"
			sma(Src, length)
		else
			if smoothing == "EMA"
				ema(Src, length)
			else
				wma(Src, length)

ATR=ma_function(tr(true), length)


// //######################>>>>>>>>>>>>Conditions<<<<<<<<<<<#########################
ATR_Rise = ATR>ATR[1] and ATR[1]<ATR[2] and ATR[2]<ATR[3]

longCondition = crossover(sma(Src_, len_S), sma(Src_, len_L)) and sma(Src_, len_L) < sma(Src_, len_S) and (sma(Src_, len_S) < Src_[1])
shortCondition = crossunder(sma(Src_, len_S), sma(Src_, len_L)) and sma(Src_, len_L) > sma(Src_, len_S) 

plot(sma(Src_, len_S), color=color.lime, transp=90)
col = longCondition ? color.lime : shortCondition ? color.red : color.gray
plot(sma(Src_, len_L),color=col,linewidth=2)


bool IsABuy = longCondition 
bool IsASell = shortCondition

// // ######################>>>>>>>>>>>>Strategy<<<<<<<<<<<#########################

testStartYear = input(2015, "Backtest Start Year", minval=1980)
testStartMonth = input(1, "Backtest Start Month", minval=1, maxval=12)
testStartDay = input(1, "Backtest Start Day", minval=1, maxval=31)
testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, 0, 0)

testStopYear = input(9999, "Backtest Stop Year", minval=1980)
testStopMonth = input(12, "Backtest Stop Month", minval=1, maxval=12)
testStopDay = input(31, "Backtest Stop Day", minval=1, maxval=31)
testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0)

testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
inDateRange = true

bgcolor(inDateRange ? color.green : na, 90)
// //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<//

// // ######################>>>>>>LongEntries<<<<<<<#########################
if inDateRange and ATR_Rise and IsABuy 
    strategy.entry("longCondition",true,when = longCondition)
    strategy.close("shortCondition")
    strategy.exit("Take Profit or Stop Loss", "longCondition",trail_points = close * 0.05 / syminfo.mintick ,trail_offset = close * 0.05 / syminfo.mintick, loss = LossTarget)
// strategy.risk.max_drawdown(10, strategy.percent_of_equity)
    
// // ######################>>>>>>ShortEntries<<<<<<<#########################
if inDateRange and ATR_Rise and IsASell  
    strategy.entry("shortCondition",false,when = shortCondition)
    strategy.exit("Take Profit or Stop Loss", "shortCondition",trail_points = close * 0.05 / syminfo.mintick ,trail_offset = close * 0.05 / syminfo.mintick, loss = LossTarget)
    strategy.close("longCondition")