Stratégie de trading inversée basée sur des indicateurs stochastiques et MACD


Date de création: 2023-09-21 21:39:34 Dernière modification: 2023-09-21 21:39:34
Copier: 0 Nombre de clics: 728
1
Suivre
1617
Abonnés

Aperçu

Cette stratégie combine l’indicateur stochastique pour déterminer le point de revers de l’offre et l’indicateur MACD pour identifier le renversement de la tendance, pour réaliser une stratégie de trading inversée à bas prix et à bas prix. En même temps, le suivi des arrêts de perte pour verrouiller les bénéfices permet de contrôler efficacement les risques.

Principe de stratégie

  1. L’indicateur stochastique est utilisé pour juger de la situation de survente. La ligne du jour 9 est la zone de survente à 20 heures et la zone de survente à 80 heures, formant un signal de revers.

  2. La fourche de l’indicateur MACD est en hausse, la fourche de la fourche est en baisse. La ligne de signal de rupture de la ligne MACD annonce un renversement de la ligne moyenne, indiquant un renversement de tendance.

  3. Lorsque les signaux de retournement stochastique et les signaux de retournement MACD se produisent simultanément, effectuez plus de blanchiment.

  4. Le suivi des arrêts est configuré. Après avoir entré dans la tendance, le suivi des arrêts est lancé lorsque le prix atteint un certain pourcentage de gain; la ligne de stop-loss suit ensuite le canal de hausse des prix.

  5. Lorsque le signal de revers apparaît, la position initiale est fermée et la ligne de stop-loss est réinitialisée.

Avantages stratégiques

  • L’intégration de plusieurs indicateurs permet d’améliorer la précision du signal

  • L’indicateur stochastique est efficace pour identifier les zones de survente

  • Le MACD peut capturer un renversement de la ligne moyenne à l’avance et saisir le renversement de tendance

  • La mise en place d’un suivi des pertes est un bon moyen de protéger les bénéfices

  • Les données de détection sont abondantes et les signaux stratégiques sont clairs.

  • Les paramètres peuvent être optimisés et facilement ajustés

Risque stratégique

  • Plus de difficulté à optimiser un portefeuille multi-indicateurs

  • Les signaux de retournement peuvent être mal interprétés et nécessitent une vérification des indicateurs.

  • Plus de données pour optimiser les tests de suivi des pertes

  • Les stochastiques et le MACD sont en retard.

  • Les transactions fréquentes peuvent entraîner des coûts de transaction plus élevés

Orientation de l’optimisation de la stratégie

  • L’idée est d’essayer d’ajouter plus d’indicateurs et de créer un système de négociation plus solide.

  • Test des paramètres de différentes périodes pour trouver la meilleure combinaison de paramètres

  • Développer des paramètres adaptatifs et mettre à jour les paramètres optimaux en temps réel

  • Réglez le stop de retrait pour contrôler le retrait maximal

  • Ajout d’indicateurs de volume pour éviter les erreurs causées par des écarts de volume

  • Évaluer les effets sur les coûts de transaction et définir des limites minimales de volatilité

Résumer

Cette stratégie, qui combine les avantages des indicateurs stochastiques et des indicateurs MACD, possède une forte capacité d’identification du moment de la transaction inverse. Le mécanisme de suivi des pertes peut également être efficace pour verrouiller les bénéfices. Cependant, la transaction inverse elle-même présente un certain risque.

Code source de la stratégie
/*backtest
start: 2022-09-14 00:00:00
end: 2023-06-24 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
////////////////////////////////////////////////////////////
// @CoinDigger
//
// Credits for the base strategy go to HPotter
//
// I've just added a trail stop, basic leverage simulation and stop loss
//
////////////////////////////////////////////////////////////
//  Copyright by HPotter v1.0 28/01/2021
// This is combo strategies for get a cumulative signal. 
//
// First strategy
// This System was created from the Book "How I Tripled My Money In The 
// Futures Market" by Ulf Jensen, Page 183. This is reverse type of strategies.
// The strategy buys at market, if close price is higher than the previous close 
// during 2 days and the meaning of 9-days Stochastic Slow Oscillator is lower than 50. 
// The strategy sells at market, if close price is lower than the previous close price 
// during 2 days and the meaning of 9-days Stochastic Fast Oscillator is higher than 50.
//
// Second strategy
// MACD – Moving Average Convergence Divergence. The MACD is calculated 
// by subtracting a 26-day moving average of a security's price from a 
// 12-day moving average of its price. The result is an indicator that 
// oscillates above and below zero. When the MACD is above zero, it means 
// the 12-day moving average is higher than the 26-day moving average. 
// This is bullish as it shows that current expectations (i.e., the 12-day 
// moving average) are more bullish than previous expectations (i.e., the 
// 26-day average). This implies a bullish, or upward, shift in the supply/demand 
// lines. When the MACD falls below zero, it means that the 12-day moving average 
// is less than the 26-day moving average, implying a bearish shift in the 
// supply/demand lines.
// A 9-day moving average of the MACD (not of the security's price) is usually 
// plotted on top of the MACD indicator. This line is referred to as the "signal" 
// line. The signal line anticipates the convergence of the two moving averages 
// (i.e., the movement of the MACD toward the zero line).
// Let's consider the rational behind this technique. The MACD is the difference 
// between two moving averages of price. When the shorter-term moving average rises 
// above the longer-term moving average (i.e., the MACD rises above zero), it means 
// that investor expectations are becoming more bullish (i.e., there has been an 
// upward shift in the supply/demand lines). By plotting a 9-day moving average of 
// the MACD, we can see the changing of expectations (i.e., the shifting of the 
// supply/demand lines) as they occur.
//
// WARNING:
// - For purpose educate only
// - This script to change bars colors.
////////////////////////////////////////////////////////////
Reversal123(Length, KSmoothing, DLength, Level) =>
    vFast = sma(stoch(close, high, low, Length), KSmoothing) 
    vSlow = sma(vFast, DLength)
    pos = 0.0
    pos := iff(close[2] < close[1] and close > close[1] and vFast < vSlow and vFast > Level, 1,
	         iff(close[2] > close[1] and close < close[1] and vFast > vSlow and vFast < Level, -1, nz(pos[1], 0))) 
	pos

MACD(fastLength,slowLength,signalLength) =>
    pos = 0.0
    fastMA = ema(close, fastLength)
    slowMA = ema(close, slowLength)
    macd = fastMA - slowMA
    signal = sma(macd, signalLength)
    pos:= iff(signal < macd , 1,
	       iff(signal > macd, -1, nz(pos[1], 0))) 
    pos
strategy(title="Combo Backtest 123 Reversal & MACD Crossover with Trail and Stop", shorttitle="ComboReversal123MACDWithStop", overlay = false, precision=8,default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=100, currency="USD", commission_type=strategy.commission.percent, commission_value=0.075)

leverage=input(2,"leverage",step=1)
percentOfEquity=input(100,"percentOfEquity",step=1)

sl_trigger = input(10, title='Stop Trail Trigger %', type=input.float)/100
sl_trail = input(5, title='Stop Trail %', type=input.float)/100
sl_inp = input(10, title='Stop Loss %', type=input.float)/100

Length = input(100, minval=1)
KSmoothing = input(1, minval=1)
DLength = input(2, minval=1)
Level = input(1, minval=1)
//-------------------------
fastLength = input(10, minval=1)
slowLength = input(19,minval=1)
signalLength=input(24,minval=1)
xSeria = input(title="Source", type=input.source, defval=close)
reverse = input(false, title="Trade reverse")


////////////////////////////////////////////////////////////////////////////////
// BACKTESTING RANGE
 
// From Date Inputs
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 = 2015, title = "From Year", minval = 1970)
 
// To Date Inputs
toDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2999, title = "To Year", minval = 1970)
 
// Calculate start/end date and time condition
startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = time >= startDate and time <= finishDate
 
////////////////////////////////////////////////////////////////////////////////



////////////////////// STOP LOSS CALCULATIONS //////////////////////////////
///////////////////////////////////////////////////


cond() => barssince(strategy.position_size[1] == 0 and (strategy.position_size > 0 or strategy.position_size < 0)) > 0

lastStopLong = 0.0
lastStopLong := lastStopLong[1] != strategy.position_avg_price - (strategy.position_avg_price * (sl_inp)) and lastStopLong[1]  != 0.0 ? lastStopLong[1]  : strategy.position_size > 0 ? (cond() and close > strategy.position_avg_price + (strategy.position_avg_price * (sl_trigger)) ? strategy.position_avg_price + (strategy.position_avg_price * (sl_trail)) : strategy.position_avg_price - (strategy.position_avg_price * (sl_inp))) : 0
lastStopShort = 0.0
lastStopShort := lastStopShort[1] != strategy.position_avg_price + (strategy.position_avg_price * (sl_inp)) and lastStopShort[1]  != 9999999999.0 ? lastStopShort[1]  : strategy.position_size < 0 ? (cond() and close < strategy.position_avg_price - (strategy.position_avg_price * (sl_trigger)) ? strategy.position_avg_price - (strategy.position_avg_price * (sl_trail)) : strategy.position_avg_price + (strategy.position_avg_price * (sl_inp))) : 9999999999.0

longStopPrice = 0.0
longStopPrice2 = 0.0
longStopPrice3 = 0.0
shortStopPrice = 0.0
longStopPrice := if strategy.position_size > 0
    originalStop = strategy.position_avg_price - (strategy.position_avg_price * (sl_inp))
    trigger = strategy.position_avg_price + (strategy.position_avg_price * (sl_trigger))
    trail = strategy.position_avg_price + (strategy.position_avg_price * (sl_trail))
    stopValue = high > trigger ? trail : 0
    max(stopValue, originalStop, longStopPrice[1])
else
    0

longStopPrice2 := if strategy.position_size > 0
    originalStop = strategy.position_avg_price - (strategy.position_avg_price * (sl_inp))
    trigger = strategy.position_avg_price + (strategy.position_avg_price * (sl_trigger*2))
    trail = strategy.position_avg_price + (strategy.position_avg_price * (sl_trail*2))
    stopValue = high > trigger ? trail : 0
    max(stopValue, originalStop, longStopPrice2[1])
else
    0


longStopPrice3 := if strategy.position_size > 0
    originalStop = strategy.position_avg_price - (strategy.position_avg_price * (sl_inp))
    trigger = strategy.position_avg_price + (strategy.position_avg_price * (sl_trigger*4))
    trail = strategy.position_avg_price + (strategy.position_avg_price * (sl_trail*3))
    stopValue = high > trigger ? trail : 0
    max(stopValue, originalStop, longStopPrice3[1])
else
    0
    
shortStopPrice := if strategy.position_size < 0
    originalStop = strategy.position_avg_price + (strategy.position_avg_price * (sl_inp))
    trigger = strategy.position_avg_price - (strategy.position_avg_price * (sl_trigger))
    trail = strategy.position_avg_price - (strategy.position_avg_price * (sl_trail))
    stopValue = low < trigger ? trail : 999999
    min(stopValue, originalStop, shortStopPrice[1])
else
    999999
    
///////////////////////////////////////////////////
///////////////////////////////////////////////////


posReversal123 = Reversal123(Length, KSmoothing, DLength, Level)
posMACD = MACD(fastLength,slowLength, signalLength)
pos = iff(posReversal123 == 1 and posMACD == 1 , 1,
	   iff(posReversal123 == -1 and posMACD == -1, -1, 0)) 
	   
possig = pos

quantity = max(0.000001,min(((strategy.equity*(percentOfEquity/100))*leverage/open),100000000))

if (possig == 1 and time_cond)
    strategy.entry("Long", strategy.long, qty=quantity)
if (possig == -1 and time_cond)
    strategy.entry("Short", strategy.short, qty=quantity) 
if (strategy.position_size > 0 and possig == -1 and time_cond)   
    strategy.close_all()
if (strategy.position_size < 0 and possig == 1 and time_cond)   
    strategy.close_all()
if ((strategy.position_size < 0 or strategy.position_size > 0) and possig == 0)   
    strategy.close_all()

//EXIT TRADE @ TSL
if strategy.position_size > 0
    strategy.exit(id="Long", stop=longStopPrice)
if strategy.position_size < 0
    strategy.exit(id="Short", stop=shortStopPrice)