
Les stratégies multi-facteurs combinent trois types de stratégies différentes: les stratégies de choc, les stratégies de suivi de tendance et les stratégies de rupture. Les meilleures stratégies sont obtenues en les utilisant en combinaison.
Les stratégies multifactorielles sont modélisées en fonction des facteurs suivants:
Une partie de la stratégie de choc utilise des indicateurs aléatoires pour déterminer le moment d’achat et de vente. Plus précisément, un signal d’achat est généré lorsque l’indicateur aléatoire% K traverse la ligne% D de la zone de survente; un signal de vente est généré lorsque la ligne% K traverse la ligne% D de la zone de survente.
Une partie de la stratégie de tendance utilise la croix d’or de la moyenne SMA pour déterminer la direction de la tendance. Un signal d’achat est généré lorsque la ligne rapide traverse la ligne lente en bas et un signal de vente lorsque la ligne rapide traverse la ligne lente en haut.
La partie de la stratégie de rupture surveille si le prix a franchi le prix le plus élevé ou le prix le plus bas d’une période donnée. Acheter lorsque le prix est supérieur au prix le plus élevé; vendre lorsque le prix est inférieur au prix le plus bas.
Le trading de tendance ne s’effectue que lorsque la tendance est suffisamment forte, combinée à l’indicateur ADX.
Établissez une ligne de stop-loss et une ligne de stop-stop, en définissant un ratio de stop-loss raisonnable.
En résumé, la stratégie multifactorielle suit essentiellement la logique suivante:
Lorsque l’ADX est supérieur au seuil fixé, la tendance est considérée comme suffisamment forte pour commencer à exécuter la stratégie de tendance; lorsque l’ADX est inférieur au seuil fixé, il est considéré comme en liquidation, et ne peut exécuter que la stratégie de choc.
Dans une tendance, on achète une position d’ouverture lorsque la courbe SMA croise l’or et une position de clôture lorsque la fourche meurt.
En cas de choc, exécutez un signal de transaction avec un indicateur aléatoire.
Les stratégies de rupture sont utilisées dans les deux environnements de marché pour suivre les canaux.
La mise en place d’une ligne de freinage stop-loss pour optimiser les gains.
Le plus grand avantage des stratégies multifactorielles réside dans la combinaison de différents types de stratégies, permettant d’obtenir de meilleurs résultats stratégiques dans les deux environnements de marché. Plus précisément, elles présentent principalement les avantages suivants:
Il est possible de suivre la tendance et d’obtenir un taux de victoire plus élevé dans des conditions de tendance.
Il est possible de tirer profit de la conjoncture et de ne pas être pris au piège de la position.
Le paramètre Stop Loss est raisonnable avec un facteur de gain élevé.
Le gouvernement a décidé de réduire les pertes en tenant compte de l’intensité de la tendance.
La combinaison de plusieurs indicateurs peut créer un signal de trading plus fort.
On obtient une meilleure combinaison de paramètres grâce à l’optimisation des paramètres.
Les stratégies multifactorielles présentent également des risques, notamment:
Une combinaison de facteurs inappropriée peut entraîner une confusion des signaux de transaction et nécessite des tests répétés pour trouver la combinaison optimale.
Il est difficile d’optimiser plusieurs paramètres et nécessite un support historique suffisant.
Si la tendance est inversée, il est possible de perdre beaucoup d’argent en n’ayant pas la possibilité d’arrêter la position à temps.
L’indicateur ADX est à la traîne et risque de manquer le point de basculement.
Les transactions de rupture sont faciles à piéger et nécessitent une stratégie de stop-loss raisonnable.
Pour les risques mentionnés ci-dessus, il est possible d’optimiser à partir des points suivants:
Tester la stabilité des différents facteurs dans les données historiques et sélectionner le facteur de stabilité.
L’utilisation d’algorithmes d’optimisation intelligents tels que les algorithmes génétiques pour trouver les paramètres optimaux.
Il est recommandé de mettre en place des limites raisonnables de stop-loss pour contrôler le retrait maximal.
Les indicateurs additionnels ont été utilisés pour juger de l’inversion de la tendance.
Optimiser les stratégies de stop loss pour les transactions de rupture afin d’éviter les pertes excessives.
Les stratégies multifactorielles offrent également la possibilité d’optimiser davantage:
Tester plus de types de facteurs pour trouver la meilleure combinaison. D’autres facteurs peuvent être pris en compte, tels que la volatilité, le volume des transactions.
Trouver le poids stratégique optimal en utilisant une méthode d’apprentissage automatique.
L’optimisation des paramètres peut être réalisée par des algorithmes intelligents qui permettent une recherche rapide de l’optimisation.
On peut tester le rendement de différentes périodes de détention.
Vous pouvez envisager d’ajuster dynamiquement votre ligne de stop-loss.
Il est possible d’introduire plus de conditions de filtrage, comme une augmentation du trafic, pour améliorer la qualité du signal.
L’indicateur ADX peut être considéré comme un paramètre d’optimisation ou remplacé par un indicateur de jugement de tendance plus avancé.
La stratégie multifacteur prend en compte plusieurs logiques de négociation, telles que les tendances, les chocs et les ruptures, et peut obtenir d’excellents résultats dans les deux environnements de marché. Par rapport à la stratégie unique, la stratégie multifacteur peut obtenir des rendements plus stables et une bonne marge d’extension.
/*backtest
start: 2023-09-30 00:00:00
end: 2023-10-30 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
// strategy("Strategy_1", shorttitle="Strategy1",overlay=true ,pyramiding = 12, initial_capital=25000, currency='EUR', commission_type = strategy.commission.cash_per_order, commission_value = 3, default_qty_type = strategy.percent_of_equity, default_qty_value = 20)
// Revision: 1
// Author: Jonas
// === INPUT ===
// > BACKTEST RANGE <
FromMonth = input(defval=1, title="From Month", minval=1, maxval=12)
FromDay = input(defval=1, title="From Day", minval=1, maxval=31)
FromYear = input(defval=2017, title="From Year", minval=2010)
ToMonth = input(defval=1, title="To Month", minval=1, maxval=12)
ToDay = input(defval=1, title="To Day", minval=1, maxval=31)
ToYear = input(defval=9999, title="To Year", minval=2010)
// > STRATEGY SETTINGS <
bolOS = input(defval = false, type=input.bool, title="Oscillating Strategy")
bolTS = input(defval = true, type=input.bool, title="Trend Strategy")
bolBO = input(defval = false, type=input.bool, title="Breakout Strategy")
strStrategy = input(defval = "Long", type=input.string, title="Trade Strategy",options = ["Long", "Short","Long & Short"])
flStopLoss = input(defval = 2.0, title="Stop Loss %", type=input.float)/100
flTakeProfit = input(defval = 4.0, title="Take Profit %", type=input.float)/100
// > SMA <
fastMA = input(defval=8, type=input.integer, title="FastMA length", minval=1, step=1)
slowMA = input(defval=21, type=input.integer, title="SlowMA length", minval=1, step=1)
// > ADX <
adx_len = input(defval=10, type=input.integer, title="ADX length", minval=1, step=1)
adx_trend = input(defval=30, type=input.integer, title="ADX Tr", minval=1, step=1)
adx_choppy = adx_trend
adx_limit = adx_trend
// > TRENDSCORE <
ts_fromIndex = input(title="From", type=input.integer, minval=1, defval=10)
ts_toIndex = input(title="To", type=input.integer, minval=1, defval=14)
ts_src = input(title="Source", type=input.source, defval=close)
// > Oscillator <
stoch_length = 14
stoch_OverBought = 75
stoch_OverSold = 25
stoch_smoothK = 3
stoch_smoothD = 3
// === BACK TEST RANGE FUNCTION ===
window_start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window
window_finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) // backtest finish window
window() => // create function "within window of time"
time >= window_start and time <= window_finish ? true : false
//plot(stop_level_Long, title="TEST",color=color.red, style=plot.style_linebr, linewidth=2)
//plot(take_level_Long, color=color.green, style=plot.style_linebr, linewidth=2)
// === ADX ===
adx_up = change(high)
adx_down = -change(low)
adx_trur = rma(tr, adx_len)
adx_plus = fixnan(100 * rma(adx_up > adx_down and adx_up > 0 ? adx_up : 0, adx_len) / adx_trur)
adx_minus = fixnan(100 * rma(adx_down > adx_up and adx_down > 0 ? adx_down : 0, adx_len) / adx_trur)
adx_sum = adx_plus + adx_minus
ADX = 100 * rma(abs(adx_plus - adx_minus) / (adx_sum == 0 ? 1 : adx_sum), adx_len)
//=== TRENDSCORE ===
trendscore(ts_src, ts_fromIndex, ts_toIndex) =>
ts_sum = 0.0
for i = ts_fromIndex to ts_toIndex
ts_sum := ts_sum + (ts_src >= nz(ts_src[i]) ? 1 : -1)
ts_sum
intTS = trendscore(ts_src, ts_fromIndex, ts_toIndex)
// Long if TrendDirection = 1, Short if TrendDirection = -1; Indifferent if TrendDirection = 0
intTrendDirection = (intTS > (ts_toIndex-ts_fromIndex)) ? 1 : (intTS < (ts_fromIndex-ts_toIndex)) ? -1 : 0
// > TREND CONDITION <
adx_growing = ADX > highest(ADX[1],3)
intTrend = ((ADX >= adx_limit) and (ADX[1] >= adx_limit) and adx_growing) ? intTrendDirection : 0
// === ATR ===
ATR = sma(tr,10)
ATR_100 = ATR /abs(high - low)
// === STOCHASTICS ===
stoch_k = sma(stoch(close, high, low, stoch_length), stoch_smoothK)
stoch_d = sma(stoch_k, stoch_smoothD)
// === FILTER & CONDITIONS ===
// > STOCHASTICS <
bolFilter_OS1 = close[1] > hl2[1]
bolSigOsc_long_1 = (na(stoch_k) or na(stoch_d)) ? false : (crossover(stoch_d,stoch_OverSold) and stoch_k > stoch_d) ? true:false
bolSigOsc_short_1 = (na(stoch_k) or na(stoch_d)) ? false : (crossunder(stoch_d,stoch_OverBought) and stoch_k < stoch_d) ? true:false
bolLongOpenOS = bolSigOsc_long_1 and bolFilter_OS1
bolLongCloseOS = bolSigOsc_short_1
bolShortOpenOS = bolSigOsc_short_1 and bolFilter_OS1
bolShortCloseOS = bolSigOsc_long_1
// > TREND <
bolFilter_TS1 = close[1] > hl2[1] and open[1] < hl2[1]
bolFilter_TS2 = sma(close,50)>sma(close,50)[10]
bolFilter_TS3 = close[1] < hl2[1] and open[1] > hl2[1]
bolSigTrendLO1 = sma(close, fastMA) > sma(close, slowMA)
bolSigTrendLO2 = close > sma(close,fastMA)
bolSigTrendLO3 = bolSigTrendLO1 and bolSigTrendLO2
bolSigTrendLC1 = sma(close, fastMA) < sma(close, slowMA)
bolSigTrendLC2 = close < sma(close, fastMA)
bolSigTrendLC3 = bolSigTrendLC1 and bolSigTrendLC2
bolSigTrendSO1 = bolSigTrendLC3
bolSigTrendSC1 = bolSigTrendLO1
bolLongOpenTS = bolSigTrendLO3 and bolFilter_TS1
bolLongCloseTS = bolSigTrendLC3 and bolFilter_TS3
bolShortOpenTS = bolSigTrendSO1 and bolFilter_TS3
bolShortCloseTS = bolLongOpenTS and bolFilter_TS1
plot(sma(close, fastMA), title='FastMA', color=color.green, linewidth=2, style=plot.style_line) // plot FastMA
plot(sma(close, slowMA), title='SlowMA', color=color.red, linewidth=2, style=plot.style_line) // plot SlowMA
// > BREAKOUT <
flFilter_BS1 = 0.5 * stdev(close,slowMA)[1]
bolFilter_BS2 = volume > sma(volume,slowMA)*1.25
bolSigBreakoutLO1 = close > (highestbars(high,slowMA)[1] + flFilter_BS1)
bolSigBreakoutLC1 = barssince(bolSigBreakoutLO1)==5
bolSigBreakoutSO1 = close < lowestbars(low,slowMA)[1] - flFilter_BS1
bolSigBreakoutSC1 = barssince(bolSigBreakoutSO1)==5
bolLongOpenBO = bolSigBreakoutLO1 and bolFilter_BS2
bolLongCloseBO = bolSigBreakoutLC1
bolShortOpenBO = bolSigBreakoutSO1 and bolFilter_BS2
bolShortCloseBO = bolSigBreakoutSC1
//=== STRATEGIES ENTRIES & EXITS ===
// > STOPS & LIMITS <
stop_level_Long = strategy.position_avg_price * (1 - flStopLoss)
take_level_Long = strategy.position_avg_price * (1 + flTakeProfit)
stop_level_Short = strategy.position_avg_price * (1 + flStopLoss)
take_level_Short = strategy.position_avg_price * (1 - flTakeProfit)
// > ENTRIES / CLOSES / EXITS <
if window() //only in backtest-window
if (bolOS == true)
if (intTrend == 0)
if(strStrategy == "Long" or strStrategy == "Long & Short")
strategy.entry("Lng Osc", strategy.long, when=bolLongOpenOS) // buy long when "within window of time" AND crossover
if(strStrategy == "Short" or strStrategy == "Long & Short")
strategy.entry("Short Osc", strategy.short, when=bolShortOpenOS)
strategy.close("Lng Osc", when=(bolLongCloseOS))
//strategy.exit("Exit L OS/STD", "Lng Osc", stop = strategy.position_avg_price - 2*stdev(close,10))
strategy.exit("Exit L OS/%", "Lng Osc", stop=stop_level_Long)
strategy.close("Short Osc", when=(bolShortCloseOS))
//strategy.exit("Exit S OS/STD", "Short Osc", stop = strategy.position_avg_price + 2*stdev(strategy.position_avg_price,10))
strategy.exit("Exit S OS/%", "Short Osc", stop=stop_level_Short)
if (bolTS == true)
if (not(intTrend == 0))
if((strStrategy == "Long") or (strStrategy == "Long & Short"))
strategy.entry("Lng TD", strategy.long, when=bolLongOpenTS) // buy long when "within window of time" AND crossover
if((strStrategy == "Short") or (strStrategy == "Long & Short"))
strategy.entry("Short TD", strategy.short, when=(bolShortOpenTS and bolTS)) // buy long when "within window of time" AND crossover
strategy.exit("Exit L TD", "Lng TD", stop=stop_level_Long)
strategy.close("Lng TD", when=bolLongCloseTS)
strategy.exit("Exit S TD", "Short TD", stop=stop_level_Short)
strategy.close("Short TD", when=bolShortCloseTS)
if (bolBO == true)
if((strStrategy == "Long") or (strStrategy == "Long & Short"))
strategy.entry("Lng BO", strategy.long, when=bolLongOpenBO) // buy long when "within window of time" AND crossover
strategy.close("Lng BO", when=bolLongCloseBO)
//strategy.exit("Exit L BO/STD", "Lng BO", stop = strategy.position_avg_price - 2*stdev(strategy.position_avg_price,10))
strategy.exit("Exit L BO/2.5%", "Lng BO", stop=stop_level_Long)
if((strStrategy == "Short") or (strStrategy == "Long & Short"))
strategy.entry("Short BO", strategy.short, when=bolShortOpenBO) // buy long when "within window of time" AND crossover
strategy.close("Short BO", when=bolShortCloseBO)
//strategy.exit("Exit S BO/STD", "Short BO", stop = strategy.position_avg_price - 2*stdev(strategy.position_avg_price,10))
strategy.exit("Exit S BO/%", "Short BO", stop=stop_level_Short)