
Il s’agit d’une stratégie de trading quantitative qui utilise les moyennes mobiles et l’indicateur MACD pour effectuer des opérations de rupture bidirectionnelles. Elle présente les caractéristiques d’une opération transversale, c’est-à-dire de juger de la direction de la tendance sur des périodes plus longues et d’avoir l’avantage de rechercher des opportunités d’entrée sur des périodes plus courtes.
La stratégie utilise trois moyennes SMMA de différentes longueurs et une moyenne EMA pour déterminer la direction de la tendance. En même temps, elle combine l’indicateur MACD pour déterminer la tendance à court terme et le moment d’entrée. Plus précisément, ses conditions d’achat sont: le prix traverse toutes les moyennes et la moyenne courte est déclenchée au-dessus de la moyenne longue; et les conditions de vente sont inversement, le prix traverse toutes les moyennes et la moyenne courte est déclenchée en dessous de la moyenne longue.
On peut voir que la stratégie utilise à la fois les moyennes mobiles pour déterminer la direction de la tendance à moyen et long terme et le MACD pour déterminer les inversions à court terme pour capturer les meilleurs moments d’entrée. Cette opération combinée sur plusieurs axes de temps est une caractéristique importante de la stratégie.
L’avantage de ce type d’opérations sur plusieurs axes de temps est de pouvoir choisir le bon point d’entrée pour un revirement de courte durée dans une direction de tendance à forte probabilité, ce qui permet d’obtenir un meilleur retour sur risque. Il y a trois avantages principaux:
3 lignes moyennes SMMA plus une EMA permettent de déterminer efficacement la direction de la tendance à moyen et long terme et d’éviter les opérations de revers.
L’indicateur MACD détermine le point de basculement à court terme et permet d’obtenir un prix d’entrée plus avantageux.
Les relations séquentielles strictes des moyennes mobiles servent de conditions de filtrage et réduisent la probabilité d’erreurs.
Les principaux risques de cette stratégie sont les suivants:
Les moyennes mobiles sont elles-mêmes fortement retardées et risquent de manquer une occasion de revenir sur la tendance à court terme.
Les indicateurs MACD sont sujets à de faux signaux et nécessitent un filtrage des prix.
Les jugements sur plusieurs axes de temps augmentent la complexité de la stratégie et la probabilité d’échec.
Pour le risque 1 et le risque 2, il est possible d’optimiser en raccourcissant de manière appropriée le cycle de la moyenne et le cycle du signal, afin de réagir rapidement à une inversion de tendance à court terme. Pour le risque 3, des tests d’optimisation sont nécessaires pour différentes variétés et périodes, afin que les paramètres de la stratégie soient strictement adaptés aux caractéristiques de la variété.
Cette stratégie peut être optimisée principalement dans les domaines suivants:
Optimiser les paramètres des moyennes mobiles et du MACD pour qu’ils correspondent au mieux aux différentes périodes et variétés. Par exemple, raccourcir la longueur moyenne, augmenter les paramètres de signal, etc.
Augmenter les stratégies de stop loss, en utilisant l’ATR ou d’autres indicateurs pour définir des stop loss mobiles raisonnables. Cela peut améliorer considérablement le contrôle des risques de la stratégie.
La recherche d’un meilleur indicateur ou d’une meilleure méthode de filtrage pour remplacer les signaux MACD. Par exemple, l’introduction d’un indicateur de taux d’oscillation, le filtrage des signaux, etc.
Tester différents rapports de stop loss et stop loss pour obtenir une combinaison de paramètres plus avantageuse que le risque et le rendement.
Dans l’ensemble, il s’agit d’un système révolutionnaire doté d’une logique unique et transversale. Il utilise à la fois les avantages des moyennes mobiles et du MACD pour mettre en œuvre une stratégie d’opération de jugement combiné sur plusieurs périodes. En ajustant les paramètres et les conditions de filtrage de manière optimisée, la stratégie peut devenir un programme de trading quantitatif très pratique.
/*backtest
start: 2023-10-22 00:00:00
end: 2023-11-21 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/
// © SoftKill21
//@version=4
strategy("Koala Script",initial_capital=1000,
commission_type=strategy.commission.cash_per_contract,
commission_value=0.000065,
slippage=3)
fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
fromYear = input(defval = 2000, title = "From Year", minval = 1970)
// To Date Inputs
toDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 8, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2031, title = "To Year", minval = 1970)
startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
len = input(3, minval=1, title="Length")
src = input(hl2, title="Source")
smma = 0.0
sma1 = sma(src, len)
smma := na(smma[1]) ? sma1 : (smma[1] * (len - 1) + src) / len
len2 = input(6, minval=1, title="Length")
src2 = input(hl2, title="Source")
smma2 = 0.0
sma2 = sma(src2, len2)
smma2 := na(smma2[1]) ? sma2 : (smma2[1] * (len2 - 1) + src2) / len2
len3 = input(9, minval=1, title="Length")
src3 = input(hl2, title="Source")
smma3 = 0.0
sma3 = sma(src3, len3)
smma3 := na(smma3[1]) ? sma3 : (smma3[1] * (len3 - 1) + src3) / len3
len4 = input(50, minval=1, title="Length")
src4 = input(close, title="Source")
smma4 = 0.0
sma4 = sma(src4, len4)
smma4 := na(smma4[1]) ? sma4 : (smma4[1] * (len4 - 1) + src4) / len4
len5 = input(200, minval=1, title="Length")
src5 = input(close, title="Source")
out5 = ema(src5, len5)
timeinrange(res, sess) => time(res, sess) != 0
london=timeinrange(timeframe.period, "0300-1045")
londonEntry=timeinrange(timeframe.period, "0300-0845")
time_cond = time >= startDate and time <= finishDate and londonEntry
fast_length = input(title="Fast Length", type=input.integer, defval=12)
slow_length = input(title="Slow Length", type=input.integer, defval=26)
srcc = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=false)
// Calculating
fast_ma = sma_source ? sma(srcc, fast_length) : ema(srcc, fast_length)
slow_ma = sma_source ? sma(srcc, slow_length) : ema(srcc, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal
longCond = close > out5 and close > smma4 and close > smma3 and close > smma2 and close > smma and londonEntry and smma > smma2 and smma2>smma3 and smma3>smma4 and smma4>out5
shortCond = close < out5 and close < smma4 and close < smma3 and close < smma2 and close < smma and londonEntry and smma < smma2 and smma2<smma3 and smma3<smma4 and smma4<out5
//longCond2 = crossover(close,out5) and crossover(close,smma4) and crossover(close,smma3) and crossover(close,smma2) and crossover(close,smma) and time_cond
//shortCond2 = crossunder(close,out5) and crossunder(close,smma4) and crossunder(close,smma3) and crossunder(close,smma2) and crossunder(close,smma) and time_cond
length=input(14, title="ATR Length")
mult=input(1.0, title="Percentage Multiplier (for ex., 0.7 = 70%)", step=0.1, minval=0.1, maxval=5.0)
oa=input(false, title="Show actual ATR")
ii=syminfo.pointvalue==0
s=ii?na:oa?atr(length):(syminfo.pointvalue * mult * atr(length))
tp=input(300,title="tp")
sl=input(300,title="sl")
//tp = s*10000
//sl= s*10000
//if(tp>300)
// tp:=300
//if(sl>300)
// sl:=300
//if(sl<150)
// sl:=150
//if(tp<150)
// tp:=150
strategy.initial_capital = 50000
//MONEY MANAGEMENT--------------------------------------------------------------''
balance = strategy.netprofit + strategy.initial_capital //current balance
floating = strategy.openprofit //floating profit/loss
risk = input(3,type=input.float,title="Risk %")/100 //risk % per trade
//Calculate the size of the next trade
temp01 = balance * risk //Risk in USD
temp02 = temp01/sl //Risk in lots
temp03 = temp02*100000 //Convert to contracts
size = temp03 - temp03%1000 //Normalize to 1000s (Trade size)
if(size < 10000)
size := 10000 //Set min. lot size
strategy.entry("long",1,when=longCond )
strategy.exit("closelong","long", profit=tp,loss=sl)
//strategy.close("long",when= crossunder(close[4],smma4) and close[4] > close[3] and close[3]>close[2] and close[2] > close[1] and close[1] > close)
strategy.entry("short",0,when=shortCond )
strategy.exit("closeshort","short", profit=tp,loss=sl)
//strategy.close("short",when= crossover(close[4],smma4) and close[4] < close[3] and close[3]< close[2] and close[2] < close[1] and close[1] < close)
strategy.close_all(when = not london)
maxEntry=input(2,title="max entries")
// strategy.risk.max_intraday_filled_orders(maxEntry)