
La stratégie utilise deux types de paramètres différents de la configuration des moyennes mobiles pour effectuer des opérations de croisement, d’ouverture et de clôture en fonction de la direction de la tendance des signaux de croisement. La stratégie permet de choisir 9 types de moyennes mobiles différents, y compris les moyennes mobiles simples (SMA), les moyennes mobiles indicielles (EMA), les moyennes mobiles pondérées (WMA), les moyennes mobiles Almo (ALMA), les moyennes mobiles à valeur quantitative (VWMA), etc. La stratégie définit simultanément les points d’arrêt et de perte.
La logique centrale de cette stratégie est de comparer les valeurs de deux moyennes mobiles et de déterminer la direction de la tendance du marché en fonction de l’intersection des deux moyennes mobiles. Plus précisément, nous avons mis en place deux moyennes mobiles, une rapide et une lente.
Une fois entré dans la position, si le prix touche la ligne de stop-loss, il perd; si le prix touche la ligne de stop-loss, il gagne. Cela permet de bloquer les bénéfices et d’empêcher l’expansion des pertes.
D’un point de vue logique du code, la stratégie est principalement composée de quatre parties:
Calculer les moyennes mobiles. Calculer les moyennes mobiles des lignes rapides et des lignes lentes en fonction du type de moyenne mobile choisi par l’utilisateur.
Génération de signaux de transaction. Selon le croisement des lignes rapides et lentes, génération de signaux de plus et de moins.
Définition de l’arrêt-perte. Le prix de la ligne d’arrêt et de la ligne d’arrêt est calculé en temps réel en fonction du prix d’entrée et du pourcentage de l’arrêt-perte.
Entrée et sortie: selon le signal d’arrêt-destruction et d’arrêt-perte.
Le plus grand avantage de cette stratégie réside dans la possibilité de choisir librement entre plusieurs types de moyennes mobiles. Différents types de moyennes mobiles ont une sensibilité différente au prix, et l’utilisateur peut choisir la moyenne mobile appropriée en fonction de ses propres besoins. De plus, la durée de la moyenne mobile peut être personnalisée, ce qui permet d’optimiser la dimension temporelle.
Un autre avantage est la mise en place d’un mécanisme de stop-loss. Cela empêche efficacement l’expansion des pertes tout en bloquant les bénéfices.
Le principal risque de cette stratégie est que les moyennes mobiles soient retardées. Lorsque les prix sont soudainement fortement fluctuants, les moyennes mobiles ne peuvent pas répondre à temps, ce qui peut entraîner la perte du meilleur moment d’entrée ou de sortie. Cela entraîne de plus grandes pertes.
Un autre risque est le paramétrage de la position de stop loss. Si le paramètre est trop petit, il est susceptible d’être arbitragé; s’il est trop grand, il peut entraîner un verrouillage des bénéfices insuffisamment rapide.
De manière générale, la stratégie repose principalement sur les moyennes mobiles pour déterminer la direction de la tendance, de sorte que l’effet est réduit lorsque des événements soudains entraînent de fortes fluctuations des prix. En outre, la configuration des paramètres a également une grande influence sur les gains de la stratégie.
Cette stratégie peut être optimisée dans les domaines suivants:
Optimiser les types de moyennes mobiles. Choisir les moyennes mobiles les plus appropriées en fonction des différentes conditions du marché et des variétés de transactions.
Paramètres d’optimisation des moyennes mobiles. Adaptation de la durée des moyennes mobiles pour les rendre plus adaptées aux caractéristiques du marché.
Ajouter des filtres d’autres indicateurs. Vous pouvez ajouter d’autres indicateurs tels que le MACD, le RSI, etc. pour éviter de négocier fréquemment dans un marché sans tendance.
Optimiser le ratio de stop-loss. Calculer le paramètre de stop-loss optimal en fonction des données historiques.
Ajout de modèles d’apprentissage automatique. Utilisation d’algorithmes tels que LSTM et Random Forest pour prédire les mouvements de prix et aider à générer des signaux de transaction.
L’utilisation d’algorithmes de suivi des arrêts. Les lignes de stop-loss peuvent se déplacer progressivement avec le mouvement des prix, réduisant la probabilité que les arrêts soient déclenchés.
Cette stratégie est généralement simple et directe, elle suit la tendance par des jugements croisés. Elle est une stratégie typique de suivi de la tendance. Ses avantages sont la simplicité, la facilité d’utilisation, la flexibilité et la possibilité de choisir son propre type de moyenne mobile et ses paramètres.
/*backtest
start: 2022-12-26 00:00:00
end: 2024-01-01 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
strategy("Kozlod - Yet Another Moving Average Cross Strategy", shorttitle="kozlod_yamacs", overlay = true)
//
// author: Kozlod
// date: 2018-03-06
//
////////////
// INPUTS //
////////////
ma_type = input(title = "MA Type", defval = "SMA", options = ['SMA', 'EMA', 'WMA', 'ALMA', 'VWMA', 'HMA', 'LSMA', 'SMMA', 'DEMA'])
short_ma_len = input(title = "Short MA Length", defval = 5, minval = 1)
short_ma_src = input(title = "Short MA Source", defval = close)
long_ma_len = input(title = "Long MA Length", defval = 15, minval = 2)
long_ma_src = input(title = "Long MA Source", defval = close)
alma_offset = input(title = "ALMA Offset", type = float, defval = 0.85, step = 0.01, minval = 0, maxval = 1)
alma_sigma = input(title = "ALMA Sigma", type = float, defval = 6, step = 0.01)
lsma_offset = input(title = "LSMA Offset", defval = 0, step = 1)
sl_lev_perc = input(title = "SL Level % (0 - Off)", type = float, defval = 0, minval = 0, step = 0.01)
pt_lev_perc = input(title = "PT Level % (0 - Off)", type = float, defval = 0, minval = 0, step = 0.01)
// Set initial values to 0
short_ma = 0.0
long_ma = 0.0
// Simple Moving Average (SMA)
if ma_type == 'SMA'
short_ma := sma(short_ma_src, short_ma_len)
long_ma := sma(long_ma_src, long_ma_len)
// Exponential Moving Average (EMA)
if ma_type == 'EMA'
short_ma := ema(short_ma_src, short_ma_len)
long_ma := ema(long_ma_src, long_ma_len)
// Weighted Moving Average (WMA)
if ma_type == 'WMA'
short_ma := wma(short_ma_src, short_ma_len)
long_ma := wma(long_ma_src, long_ma_len)
// Arnaud Legoux Moving Average (ALMA)
if ma_type == 'ALMA'
short_ma := alma(short_ma_src, short_ma_len, alma_offset, alma_sigma)
long_ma := alma(long_ma_src, long_ma_len, alma_offset, alma_sigma)
// Hull Moving Average (HMA)
if ma_type == 'HMA'
short_ma := wma(2*wma(short_ma_src, short_ma_len/2)-wma(short_ma_src, short_ma_len), round(sqrt(short_ma_len)))
long_ma := wma(2*wma(long_ma_src, long_ma_len /2)-wma(long_ma_src, long_ma_len), round(sqrt(long_ma_len)))
// Volume-weighted Moving Average (VWMA)
if ma_type == 'VWMA'
short_ma := vwma(short_ma_src, short_ma_len)
long_ma := vwma(long_ma_src, long_ma_len)
// Least Square Moving Average (LSMA)
if ma_type == 'LSMA'
short_ma := linreg(short_ma_src, short_ma_len, lsma_offset)
long_ma := linreg(long_ma_src, long_ma_len, lsma_offset)
// Smoothed Moving Average (SMMA)
if ma_type == 'SMMA'
short_ma := na(short_ma[1]) ? sma(short_ma_src, short_ma_len) : (short_ma[1] * (short_ma_len - 1) + short_ma_src) / short_ma_len
long_ma := na(long_ma[1]) ? sma(long_ma_src, long_ma_len) : (long_ma[1] * (long_ma_len - 1) + long_ma_src) / long_ma_len
// Double Exponential Moving Average (DEMA)
if ma_type == 'DEMA'
e1_short = ema(short_ma_src, short_ma_len)
e1_long = ema(long_ma_src, long_ma_len)
short_ma := 2 * e1_short - ema(e1_short, short_ma_len)
long_ma := 2 * e1_long - ema(e1_long, long_ma_len)
/////////////
// SIGNALS //
/////////////
long_signal = crossover( short_ma, long_ma)
short_signal = crossunder(short_ma, long_ma)
// Calculate PT/SL levels
// Initial values
last_signal = 0
prev_tr_price = 0.0
pt_level = 0.0
sl_level = 0.0
// Calculate previous trade price
prev_tr_price := long_signal[1] or short_signal[1] ? open : nz(last_signal[1]) != 0 ? prev_tr_price[1] : na
// Calculate SL/PT levels
pt_level := nz(last_signal[1]) == 1 ? prev_tr_price * (1 + pt_lev_perc / 100) : nz(last_signal[1]) == -1 ? prev_tr_price * (1 - pt_lev_perc / 100) : na
sl_level := nz(last_signal[1]) == 1 ? prev_tr_price * (1 - sl_lev_perc / 100) : nz(last_signal[1]) == -1 ? prev_tr_price * (1 + sl_lev_perc / 100) : na
// Calculate if price hit sl/pt
long_hit_pt = pt_lev_perc > 0 and nz(last_signal[1]) == 1 and close >= pt_level
long_hit_sl = sl_lev_perc > 0 and nz(last_signal[1]) == 1 and close <= sl_level
short_hit_pt = pt_lev_perc > 0 and nz(last_signal[1]) == -1 and close <= pt_level
short_hit_sl = sl_lev_perc > 0 and nz(last_signal[1]) == -1 and close >= sl_level
// What is last active trade?
last_signal := long_signal ? 1 : short_signal ? -1 : long_hit_pt or long_hit_sl or short_hit_pt or short_hit_sl ? 0 : nz(last_signal[1])
//////////////
// PLOTTING //
//////////////
// Plot MAs
plot(short_ma, color = red, linewidth = 2)
plot(long_ma, color = green, linewidth = 2)
// Plot Levels
plotshape(prev_tr_price, style = shape.cross, color = gray, location = location.absolute, size = size.small)
plotshape(sl_lev_perc > 0 ? sl_level : na, style = shape.cross, color = red, location = location.absolute, size = size.small)
plotshape(pt_lev_perc > 0 ? pt_level : na, style = shape.cross, color = green, location = location.absolute, size = size.small)
//////////////
// STRATEGY //
//////////////
strategy.entry("long", true, when = long_signal)
strategy.entry("short", false, when = short_signal)
strategy.close("long", when = long_hit_pt or long_hit_sl)
strategy.close("short", when = short_hit_pt or short_hit_sl)