Stratégie moyenne mobile du filtre de coque

Auteur:ChaoZhang est là., Date: 2024-01-04 15:16:34 Je suis désolé
Les étiquettes:

img

Résumé

Cette stratégie utilise des moyennes mobiles Hull à court et à long terme pour générer et filtrer les signaux de négociation. La moyenne mobile Hull à court terme est utilisée pour générer des signaux, tandis que la moyenne mobile Hull à long terme est utilisée pour filtrer les signaux. Les transactions ne sont effectuées que lorsque la moyenne mobile Hull à court terme change de direction et que la moyenne mobile Hull à long terme se déplace dans la même direction globale.

La stratégie utilise également l'indicateur ATR pour définir dynamiquement les niveaux de stop loss et de profit lors de l'entrée dans les transactions.

La logique de la stratégie

La moyenne mobile à court terme de Hull capture les tendances et les points tournants des prix à court terme.

La moyenne mobile à long terme de Hull détermine l'évolution globale des prix.

Les transactions ne sont effectuées que lorsque la moyenne mobile à court terme de Hull tourne de direction et que sa nouvelle direction s'aligne sur la direction de la moyenne mobile à long terme de Hull. Cela filtre les signaux qui vont à l'encontre de la tendance globale et peuvent simplement être du bruit de marché à court terme.

Après l'entrée de positions, les niveaux de stop loss et de take profit sont définis en fonction de la valeur de l'indicateur ATR. L'ATR reflète la volatilité du marché et les niveaux de risque. Le stop loss est placé en dessous des bas de prix tandis que les objectifs de profit sont placés en dessous des hauts de prix, avec des plages liées à la lecture actuelle de l'ATR.

Analyse des avantages

La combinaison de signaux à court terme et de filtres à long terme permet d'identifier efficacement les tendances à moyen terme et les points tournants, en évitant les faux signaux du bruit du marché.

Les taux de stop loss et de profit-take dynamiques basés sur l'ATR fixent des fourchettes raisonnables en fonction de la volatilité actuelle, de l'équilibrage de la prise de profit et de la prévention des pertes.

La moyenne mobile de Hull présente des avantages de flexibilité et de précision par rapport aux moyennes mobiles standard, avec un meilleur suivi de la tendance.

Analyse des risques

La stratégie repose sur des croisements entre les moyennes mobiles de Hull pour générer des signaux.

Dans la fourchette, des marchés agités avec des prix oscillant dans une fourchette de négociation, des erreurs de signal et des transactions inutiles peuvent s'accumuler.

La dépendance au stop loss et au take profit sur l'ATR signifie que des lectures de volatilité inexactes entraîneront un mauvais placement.

Optimisation

D'autres indicateurs à court terme comme le RSI peuvent améliorer la précision du signal grâce à la convergence.

La logique de filtrage entre les moyennes mobiles Hull peut être améliorée pour avoir des exigences d'entrée plus strictes, évitant de faux signaux.

La recherche sur le réglage des paramètres peut permettre de déceler des améliorations de stabilité et de rentabilité résultant de modifications des longueurs moyennes mobiles, des périodes ATR, etc.

Résumé

Cette stratégie combine la génération de signaux à court terme, le filtrage de signaux à long terme et le stop loss/take profit basé sur ATR dans un cadre de suivi de tendance à moyen terme robuste.


/*backtest
start: 2023-12-04 00:00:00
end: 2024-01-03 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Hull Filtered Strategy", overlay=true, pyramiding=0, default_qty_type= strategy.percent_of_equity, default_qty_value = 10, calc_on_order_fills=false, slippage=0,commission_type=strategy.commission.percent,commission_value=0)

// Parameters for Hull Moving Averages
src = input(close, title="Source")
signal_period = input(50, title="Period of signal HMA")
filter_period = input(200, title="Period of filter HMA")

strat_dir_input = input(title="Strategy Direction", defval="all", options=["long", "short", "all"])

// Set allowed trading directions
strat_dir_value = strat_dir_input == "long" ? strategy.direction.long : strat_dir_input == "short" ? strategy.direction.short : strategy.direction.all
strategy.risk.allow_entry_in(strat_dir_value)

// stop loss and take profit
sl_factor = input(2,title="Stop Loss Factor")
tp_factor = input(3,title="Take Profit Factor")
atr_period = input(14, title="ATR Period (SL/TP)")

// Testing Start dates
testStartYear = input(2010, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

//Stop date if you want to use a specific range of dates
testStopYear = input(2030, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)


// -----------------------------------------------------------------------------
// Global variables
// -----------------------------------------------------------------------------
var float tp = na
var float sl = na
var float position = na


// -----------------------------------------------------------------------------
// Functions
// -----------------------------------------------------------------------------
testWindow() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false


// -----------------------------------------------------------------------------
// The engine
// -----------------------------------------------------------------------------
hma_signal = hma(src, signal_period)
hma_filter = hma(src, filter_period)

// Used to determine exits and stop losses
atr_e = atr(atr_period)

// if hma_filter increases hma_trend is set to 1, if it decreases hma_trend is set to -1. If no trend is available, hma_trend is set to ß0
trend = hma_filter > hma_filter[1]  ?  1 : hma_filter < hma_filter[1] ? -1 : 0
signal = hma_signal > hma_signal[1] ? 1 : hma_signal  < hma_signal[1] ? -1 : 0


// -----------------------------------------------------------------------------
// signals
// -----------------------------------------------------------------------------
if signal[0] == 1 and signal[1] != 1 and trend == 1 and testWindow()
    sl := close - sl_factor*atr_e
    tp := close + tp_factor*atr_e
    strategy.entry("HMA_LNG", strategy.long)
    strategy.exit("LE", "HMA_LNG", profit=100*tp_factor*atr_e, loss=100*sl_factor*atr_e)
    
if signal[0] == -1 and signal[1] != -1 and trend == -1 and testWindow()
    sl := close + sl_factor*atr_e
    tp := close - tp_factor*atr_e
    strategy.entry("HMA_SHRT", strategy.short)
    strategy.exit("SE", "HMA_SHRT", profit=100*tp_factor*atr_e, loss=100*sl_factor*atr_e)


if strategy.position_size != 0
    sl := sl[1]
    tp := tp[1]

// -----------------------------------------------------------------------------
// PLOT
// -----------------------------------------------------------------------------
hma_s = plot(hma_signal, title="SIGNAL", color = signal == 1 ? color.green : color.red)
hma_l = plot(hma_filter, title="TREND", color = trend == 1 ? color.green : color.red)

plot(tp, title="TAKE PROFIT", color= strategy.position_size != 0 ? color.blue: na, linewidth=1)  
plot(sl, title="STOP LOSS", color= strategy.position_size != 0 ? color.red: na, linewidth = 1)


Plus de