Stratégie de négociation algorithmique de la rupture et de l' engorgement de l' élan

Auteur:ChaoZhang est là., Date: 2024-01-30 17:20:59 Les résultats sont disponibles au moment où vous les souhaitez.
Les étiquettes:

img

Résumé

Cet article présente une stratégie de trading algorithmique qui identifie les opportunités rentables grâce à des modèles d'engorgement et utilise le croisement des prix avec la moyenne mobile comme signaux d'entrée.

Principaux

La logique de base de cette stratégie repose sur la convergence de deux indicateurs indépendants:

  1. Modèle d'engloutissement: Un modèle d'inversion de deux chandeliers dans lequel le corps de la deuxième bougie engloutit complètement le corps de la première, utilisé pour identifier les opportunités d'inversion.

  2. Crossover de prix avec moyenne mobile: Un signal d'achat est généré lorsque le prix traverse au-dessus de la ligne moyenne mobile depuis le bas; Un signal de vente est lorsque le prix traverse en dessous de la ligne moyenne mobile depuis le haut.

En évaluant le moment de l'inversion potentielle du marché avec des tendances d'engloutissement et en utilisant le croisement des prix avec la moyenne mobile comme signaux de confirmation, la probabilité d'obtenir des bénéfices peut être améliorée.

Plus précisément, cette stratégie suit trois types de schémas d'engloutissement - haussier, baissier et sans engloutissement d'ombre pour déterminer les éventuelles consolidations et inversions.

Les avantages

Le plus grand avantage de cette stratégie est l'utilisation de la convergence d'indicateurs non liés pour améliorer l'efficacité de la décision. Les modèles d'engorgement jugent du moment et de la probabilité d'un renversement du marché; tandis que le croisement des prix avec la moyenne mobile vérifie la direction et l'élan de l'inversion. Les deux se valident mutuellement et peuvent réduire efficacement les pertes commerciales causées par de faux signaux.

Un autre avantage est la flexibilité des paramètres. Les utilisateurs peuvent définir des paramètres tels que la période moyenne mobile et la plage de stop loss pour optimiser la stratégie eux-mêmes.

Les risques

Bien que l'utilisation de plusieurs indicateurs améliore le jugement, il existe encore des risques de faux signaux dans cette stratégie. Les modèles d'engorgement ne sont pas des signaux d'inversion fiables à 100%, et des scénarios d'échec existent également dans le croisement des prix avec la moyenne mobile.

De plus, comme la plupart des stratégies d'analyse technique, il se débrouille également mal sur des marchés en tendance conflictuelle comme la fourchette et la consolidation.

Pour contrôler les risques, des paramètres tels que la période moyenne mobile et la plage de stop loss peuvent être ajustés en conséquence.

Directions d'optimisation

Les domaines suivants peuvent être optimisés pour cette stratégie:

  1. Testez plus de types de moyennes mobiles pour trouver des ensembles de paramètres optimaux, tels que la moyenne mobile pondérée, la moyenne mobile doublement lissée, etc.

  2. Ajouter des indicateurs de jugement de tendance pour éviter d'ouvrir des positions sur les marchés latéraux.

  3. Optimiser les méthodes d'arrêt de perte pour améliorer l'efficacité.

  4. Améliorer les méthodes d'apprentissage automatique pour juger des modèles de chandeliers et améliorer la précision de la reconnaissance des engloutissements.

  5. Ajouter des fonctions d'optimisation des paramètres pour un réglage adaptatif.

Conclusion

Cette stratégie identifie le moment de l'inversion avec des modèles d'engorgement et vérifie la direction en utilisant le croisement des prix avec la moyenne mobile. En améliorant l'efficacité de la décision grâce à la convergence des indicateurs, il s'agit d'une approche d'analyse technique. Les avantages incluent des indicateurs complémentaires et des paramètres flexibles. Les inconvénients sont les risques de faux signaux et de faiblesse sur les marchés latéraux.


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

//@version=4
//@author=Daveatt

StrategyName = "BEST Engulfing + MA"
ShortStrategyName = "BEST Engulfing + MA"

strategy(title=StrategyName, shorttitle=ShortStrategyName, overlay=true)

includeEngulfing = true

includeMA = true
source_ma = input(title="Source Price vs MA", type=input.source, defval=close)
typeofMA = input(title="Type of MA", defval="SMA", options=["RMA", "SMA", "EMA", "WMA", "VWMA", "SMMA", "KMA", "TMA", "HullMA", "DEMA", "TEMA"])
length_ma = input(32, title = "MA Length", type=input.integer)

// ---------- Candle components and states
GreenCandle = close > open
RedCandle = close < open
NoBody = close==open
Body = abs(close-open)


// bullish conditions
isBullishEngulfing1 = max(close[1],open[1]) < max(close,open) and min(close[1],open[1]) > min(close,open) and Body > Body[1] and GreenCandle and RedCandle[1]
isBullishEngulfing2 = max(close[1],open[1]) < max(close,open) and min(close[1],open[1]) <= min(close,open) and Body > Body[1] and GreenCandle and RedCandle[1]

// bearish conditions
isBearishEngulfing1 = max(close[1],open[1]) < max(close,open) and min(close[1],open[1]) > min(close,open) and Body > Body[1] and RedCandle and GreenCandle[1]
isBearishEngulfing2 = max(close[1],open[1]) >= max(close,open) and min(close[1],open[1]) > min(close,open) and Body > Body[1] and RedCandle and GreenCandle[1]

// consolidation of conditions
isBullishEngulfing = isBullishEngulfing1 or isBullishEngulfing2
isBearishEngulfing = isBearishEngulfing1 or isBearishEngulfing2

//isBullishEngulfing = max(close[1],open[1]) < max(close,open) and min(close[1],open[1]) > min(close,open) and Body > Body[1] and GreenCandle and RedCandle[1]
//isBearishEngulfing = max(close[1],open[1]) < max(close,open) and min(close[1],open[1]) > min(close,open) and Body > Body[1] and RedCandle and GreenCandle[1]

Engulf_curr = 0 - barssince(isBearishEngulfing) + barssince(isBullishEngulfing)
Engulf_Buy = Engulf_curr < 0 ? 1 : 0
Engulf_Sell = Engulf_curr > 0 ? 1 : 0


// Price vs MM


smma(src, len) =>
    smma = 0.0
    smma := na(smma[1]) ? sma(src, len) : (smma[1] * (len - 1) + src) / len
    smma

ma(smoothing, src, length) => 
    if smoothing == "RMA"
        rma(src, length)
    else
        if smoothing == "SMA"
            sma(src, length)
        else 
            if smoothing == "EMA"
                ema(src, length)
            else 
                if smoothing == "WMA"
                    wma(src, length)
				else
					if smoothing == "VWMA"
						vwma(src, length)
					else
						if smoothing == "SMMA"
						    smma(src, length)
						else
							if smoothing == "HullMA"
								wma(2 * wma(src, length / 2) - wma(src, length), round(sqrt(length)))
							else
								if smoothing == "LSMA"
									src
								else
								    if smoothing == "KMA"
								        xPrice = src
                                        xvnoise = abs(xPrice - xPrice[1])
                                        nfastend = 0.666
                                        nslowend = 0.0645
                                        nsignal = abs(xPrice - xPrice[length])
                                        nnoise = sum(xvnoise, length)
                                        nefratio = iff(nnoise != 0, nsignal / nnoise, 0)
                                        nsmooth = pow(nefratio * (nfastend - nslowend) + nslowend, 2) 
                                        nAMA = 0.0
                                        nAMA := nz(nAMA[1]) + nsmooth * (xPrice - nz(nAMA[1]))
                                        nAMA
								    else
								        if smoothing == "TMA"
									        sma(sma(close, length), length)
						                else
							                if smoothing == "DEMA"
							                    2 * src - ema(src, length)
							                else
							                    if smoothing == "TEMA"
							                        3 * (src - ema(src, length)) + ema(ema(src, length), length) 
							                    else
		    							            src
		    							                

MA = ma(typeofMA, source_ma, length_ma)

plot(MA, color=#006400FF, title="MA breakout", linewidth=3)

macrossover  = crossover (source_ma, MA)
macrossunder = crossunder(source_ma, MA)

since_ma_buy = barssince(macrossover)
since_ma_sell = barssince(macrossunder)
macross_curr = 0 - since_ma_sell + since_ma_buy
bullish_MA_cond = macross_curr < 0 ?  1 : 0
bearish_MA_cond = macross_curr > 0 ? 1  : 0

posUp = (Engulf_Buy ? 1 : 0) + (bullish_MA_cond ? 1 : 0) 
posDn = (Engulf_Sell ? 1 : 0) + (bearish_MA_cond ? 1 : 0) 

conditionUP = posUp == 2 and posUp[1] < 2
conditionDN = posDn == 2 and posDn[1] < 2


sinceUP = barssince(conditionUP)
sinceDN = barssince(conditionDN)

// primary-first signal of the trend
nUP = crossunder(sinceUP,sinceDN)
nDN = crossover(sinceUP,sinceDN)


// and the following secondary signals

// save of the primary signal
sinceNUP = barssince(nUP)
sinceNDN = barssince(nDN)

buy_trend   = sinceNDN > sinceNUP
sell_trend  = sinceNDN < sinceNUP

// engulfing by
barcolor(nUP ? color.orange : na, title="Bullish condition")
barcolor(nDN ? color.yellow : na, title="Bearish condition")

isLong  = nUP
isShort = nDN

long_entry_price    = valuewhen(nUP, close, 0)
short_entry_price   = valuewhen(nDN, close, 0)

longClose   = close[1] < MA
shortClose  = close[1] > MA

///////////////////////////////////////////////
//* Backtesting Period Selector | Component *//
///////////////////////////////////////////////


StartYear = input(2017, "Backtest Start Year",minval=1980)
StartMonth = input(1, "Backtest Start Month",minval=1,maxval=12)
StartDay = input(1, "Backtest Start Day",minval=1,maxval=31)
testPeriodStart = timestamp(StartYear,StartMonth,StartDay,0,0)

StopYear = input(2020, "Backtest Stop Year",minval=1980)
StopMonth = input(12, "Backtest Stop Month",minval=1,maxval=12)
StopDay = input(31, "Backtest Stop Day",minval=1,maxval=31)
testPeriodStop = timestamp(StopYear,StopMonth,StopDay,0,0)

testPeriod() => true


//////////////////////////
//* Profit Component *//
//////////////////////////

input_tp_pips = input(600, "Backtest Profit Goal (in USD)",minval=0)
input_sl_pips = input(300, "Backtest STOP Goal (in USD)",minval=0)


tp = buy_trend? long_entry_price + input_tp_pips : short_entry_price - input_tp_pips
sl = buy_trend? long_entry_price - input_sl_pips : short_entry_price + input_sl_pips


long_TP_exit  = buy_trend and high >= tp
short_TP_exit = sell_trend and low <= tp

plot(tp, title="TP", style=plot.style_circles, linewidth=3, color=color.blue)
plot(sl, title="SL", style=plot.style_circles, linewidth=3, color=color.red)

if testPeriod()
    strategy.entry("Long", 1, when=isLong)
    strategy.close("Long", when=longClose )
    strategy.exit("XL","Long", limit=tp,  when=buy_trend, stop=sl)


if testPeriod()
    strategy.entry("Short", 0,  when=isShort)
    strategy.close("Short", when=shortClose )
    strategy.exit("XS","Short", when=sell_trend, limit=tp, stop=sl)


Plus de