Tendance à la suite d'une stratégie de moyenne mobile adaptative

Auteur:ChaoZhang est là., Date: le 10 octobre 2023 à 15h21h45
Les étiquettes:

Résumé

Cette stratégie génère des signaux de trading basés sur le croisement entre les moyennes mobiles rapides et lentes, appartenant aux stratégies de suivi de tendance.

La logique de la stratégie

  1. Calculez les moyennes mobiles rapides et lentes. La longueur par défaut de MA rapide est de 21 et la longueur par défaut de MA lente est de 34.

  2. Lorsque le MA rapide traverse le MA lent, il indique une tendance haussière et génère un signal d'achat.

  3. Lorsque le MA rapide passe sous le MA lent, il indique une tendance à la baisse et génère un signal de vente.

  4. En ajustant automatiquement la longueur des moyennes mobiles, la stratégie s'adapte dynamiquement à la tendance du marché pour suivre les bénéfices.

Analyse des avantages

  1. La stratégie est simple et claire, facile à comprendre et à mettre en œuvre.

  2. Il peut suivre efficacement les tendances du marché avec un grand potentiel de profit.

  3. L'ajustement dynamique des paramètres s'adapte aux changements des conditions du marché.

  4. Les algorithmes MA personnalisables augmentent la flexibilité de la stratégie.

  5. Configuration logique d'achat et de vente flexible.

Analyse des risques

  1. Les échanges fréquents entraînent des coûts de transaction plus élevés.

  2. Les écarts de MA peuvent manquer les meilleurs points d'entrée et de sortie pendant les marchés volatils.

  3. Un paramètre MA inapproprié et une optimisation de la fréquence d'ajustement entraînent une défaillance de la stratégie.

  4. L'exposition au risque est calculée sur la base de l'exposition au risque.

  5. L'inversion de tendance peut entraîner d'énormes pertes flottantes.

Directions d'optimisation

  1. Optimiser les paramètres MA pour une meilleure détection des changements de tendance.

  2. Ajoutez une logique de stop loss pour contrôler les pertes d'une seule transaction.

  3. Ajouter des indicateurs de jugement de tendance pour éviter les pertes liées à l'inversion de tendance.

  4. Améliorer la stratégie d'ajustement de l'AM afin d'être plus intelligente et automatisée.

  5. Ajouter le module d'optimisation des paramètres en utilisant l'apprentissage automatique.

Résumé

La logique de la stratégie est simple et claire, générant des trades basés sur un croisement rapide et lent des MAs. Elle capture efficacement les tendances mais comporte des risques. Une optimisation continue des paramètres, une logique de stop loss est requise pour rendre la stratégie plus robuste. Dans l'ensemble, la stratégie a un grand potentiel d'amélioration et mérite d'être étudiée et appliquée.


/*backtest
start: 2022-10-03 00:00:00
end: 2023-10-09 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//
// @version=4
// © Ehsan Haghpanah, (ehsanha)
// Algorithmic Trading Research
//
// eha Moving Averages Strategy, 
// A simple strategy based on crossing Moving Averages of 
// different lengths (a fast moving average and slow one)
//

strategy(title = "eha Moving Averages Strategy", shorttitle = "eha MA Strategy", overlay = true)

// 
// -- strategy parameter(s)
// moving averages parameter(s)
var _fastMA_len  = input(title = "Fast MA Length",  defval = 21,    type = input.integer, minval = 1, step = 1)
var _slowMA_len  = input(title = "Slow MA Length",  defval = 34,    type = input.integer, minval = 1, step = 1)
var _ma_algo_id  = input(title = "MA Algorithm",    defval = "SMA", options = ["SMA", "EMA", "WMA"])
// backtesting date and time range parameter(s)
var _startYear   = input(defval = 2020, title = "Start Year",  type = input.integer, minval = 1976)
var _startMonth  = input(defval = 1,    title = "Start Month", type = input.integer, minval = 1, maxval = 12)
var _startDay    = input(defval = 1,    title = "Start Day",   type = input.integer, minval = 1, maxval = 31)
var _closeYear   = input(defval = 2020, title = "Close Year",  type = input.integer, minval = 1984)
var _closeMonth  = input(defval = 9,    title = "Close Month", type = input.integer, minval = 1, maxval = 12)
var _closeDay    = input(defval = 1,    title = "Close Day",   type = input.integer, minval = 1, maxval = 31)

//
// -- function(s) and calculation(s)
// checks whether current time is in backtesting time range
start_t = timestamp(_startYear, _startMonth, _startDay, 00, 00)     // backtesting range start time, (00, 00); (hour, minute)
close_t = timestamp(_closeYear, _closeMonth, _closeDay, 23, 59)     // backtesting range close time, (23, 59); (hour, minute)
isInRange() => true
//
// calculates moving average based on provided algorithm, source and length
// alg : moving average algorithm
// len : length
// ser : series
calcMA(alg, len, ser) =>
    (len == 0) ? ser : ((alg == "SMA") ? sma(ser, len) : ((alg == "EMA") ? ema(ser, len) : (alg == "WMA" ? wma(ser, len) : na)))

//
// -- strategy logic and calculation(s)
ma_fast  = calcMA(_ma_algo_id, _fastMA_len, close)
ma_slow  = calcMA(_ma_algo_id, _slowMA_len, close)
cross_ov = crossover (ma_fast, ma_slow) // returns true if fastMA crosses over slowMA
cross_un = crossunder(ma_fast, ma_slow) // returns true if slowMA crosses over fastMA

//
// -- strategy execution logic
// opens a long position whenever the time is in range and crosses over
strategy.entry("ID", comment = "-", long = strategy.long, when = isInRange() and cross_ov)
// closes the position whenever the time is in range and crosses under
strategy.close("ID", comment = "-", when = isInRange() and cross_un)

//
// -- drawing and visualization
co_fast = color.new(color.gray, 25)
co_slow = color.new(color.gray, 75)
// drawing moving average(s)
plot(ma_fast, color = co_fast, linewidth = 2, style = plot.style_line)
plot(ma_slow, color = co_slow, linewidth = 3, style = plot.style_line)

Plus de