Stratégie de trading automatique avec un algorithme à deux voies

Auteur:ChaoZhang est là., Date: 2023-10-10 15h25 et 53 min
Les étiquettes:

Résumé

Cette stratégie utilise deux indicateurs, Supertrend et StochRSI, pour analyser les tendances des prix et les survendues sur différentes périodes de temps afin d'identifier les signaux d'achat et de vente potentiels.

Les principes stratégiques

La stratégie utilise les indicateurs Supertrend pour déterminer la direction de la tendance des prix sur deux cycles de 1 heure et 4 heures. On peut considérer qu'une tendance plus forte est apparue lorsque les deux Supertrends des cycles de temps se présentent dans la même direction.

En outre, la stratégie utilise l'indicateur StochRSI pour déterminer s'il y a une survente. StochRSI combine les avantages de l'indicateur RSI et de l'oscillateur stochastique.

En même temps que le double Supertrend confirme la direction de la tendance des prix, il est préférable d'acheter ou de vendre si le StochRSI affiche également une tendance d'achat ou de vente excessive. Pour confirmer davantage les signaux, la stratégie définit une période de rétroaction, après que le StochRSI affiche un signal d'achat ou de vente excessive, un certain nombre de lignes K doivent être retracées, ce qui déclenche un achat ou une vente si la tendance des prix confirme le signal du StochRSI au cours de cette période.

Dans l'ensemble, la stratégie utilise le Supertrend, un cadre à deux temps, pour déterminer les grandes tendances, et le StochRSI pour déterminer les ajustements locaux.

Les avantages stratégiques

  • Les jugements sont effectués à l'aide d'indicateurs à plusieurs cycles de temps, ce qui permet de filtrer efficacement les signaux erronés.
  • Les avantages de l'indicateur combiné Supertrend et StochRSI pour effectuer des jugements de tendance et des jugements d'achat et de vente
  • La vérification des signaux par période de rétroaction permet d'éviter les transactions inutiles
  • Les stratégies d'opération sur la ligne moyenne et longue permettent de réduire les pertes de point de glissement causées par des transactions trop fréquentes.
  • Combinaison facile à comprendre de deux indicateurs, réglage flexible des paramètres

Risque stratégique

  • Les tendances de la ligne moyenne et longue ne sont pas évidentes pendant les bouleversements boursiers, et de plus en plus de faux signaux peuvent apparaître.
  • Les périodes de rétroaction sont trop longues et peuvent manquer les meilleurs moments d'achat/vente
  • Les paramètres du StochRSI ne sont pas correctement réglés, ce qui peut entraîner des signaux d'achat ou de vente incorrects.
  • Les paramètres de Supertrend sont mal définis, ce qui peut décrire la mauvaise direction de la tendance
  • Il est facile d'ignorer les changements fondamentaux importants en suivant mécaniquement les signaux des indicateurs.

Comment optimiser:

  • Optimiser les combinaisons de paramètres du StochRSI et du Supertrend
  • Modifier la longueur du cycle de rétroaction dans différents environnements de disque
  • Vérification avec des indicateurs tels que le volume des transactions
  • Attention aux informations de base importantes et intervenez activement si nécessaire

Optimisation stratégique

  • Ajouter plus d'indicateurs de Supertrend à différents cycles de temps pour former un filtre à plusieurs niveaux
  • Remplacer l'indicateur StochRSI par d'autres indicateurs de type survente-achat, tels que KD, RSI, etc.
  • Augmenter les stratégies de stop-loss mobiles pour gagner plus en fonction des tendances
  • Les grandes tendances sont déterminées en combinant des indicateurs importants de la moyenne, tels que la moyenne de 30 cycles.
  • Développer des programmes d'optimisation automatique des paramètres pour rendre les stratégies plus robustes

Résumé

La stratégie de la cuisine à deux voies utilise pleinement la méthode de Supertrend pour déterminer les grandes tendances et les ajustements locaux du StochRSI pour réaliser une stratégie de suivi des tendances fiable. Cette stratégie, basée sur la manipulation d'une ligne moyenne longue, permet d'éviter efficacement les pertes de bénéfices causées par des transactions trop fréquentes. La stratégie permet d'obtenir des bénéfices positifs stables grâce à des moyens tels que l'optimisation des paramètres et la validation des indicateurs de la combinaison.


/*backtest
start: 2023-09-09 00:00:00
end: 2023-10-09 00:00:00
period: 4h
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/
// © Baby_whale_to_moon

//@version=5
strategy('Kitchen [ilovealgotrading]', overlay=true, format=format.price, initial_capital = 1000)

// BACKTEST DATE
Start_Time = input(defval=timestamp('01 January 2017 13:30 +0000'), title='Start_Time', group = " ################# BACKTEST DATE ################ " )
End_Time = input(defval=timestamp('30 April 2024 19:30 +0000'), title='End_Time', group = " ################# BACKTEST DATE ################ " )

// supertrend 
atrPeriod = input(10, 'ATR Length', group = " #################  Supertrend  ################ ")
factor = input(3, 'Factor', group = " #################  Supertrend  ################ ")

time1 = input.string(title='Short Time Period', defval='07 1h', options=['01 1m','02 3m','03 5m',  '04 15m', '05 30m', '06 45m', '07 1h', '08 2h', '09 3h', '10 4h', '11 1D', '12 1W' ], group = " #################  Supertrend  ################ ",tooltip = "this timeframe is the value of our short-time supertrend indicator")
time2 = input.string(title='Long Time Period', defval='10 4h', options=[ '01 1m','02 3m','03 5m', '04 15m', '05 30m', '06 45m', '07 1h', '08 2h', '09 3h', '10 4h', '11 1D', '12 1W' ], group = " #################  Supertrend  ################ ",tooltip = "this timeframe is the value of our long-time supertrend indicator")


res(Resolution) =>
    if Resolution == '00 Current'
        timeframe.period
    else
        if Resolution == '01 1m'
            '1'
        else
            if Resolution == '02 3m'
                '3'
            else
                if Resolution == '03 5m'
                    '5'
                else
                    if Resolution == '04 15m'
                        '15'
                    else
                        if Resolution == '05 30m'
                            '30'
                        else
                            if Resolution == '06 45m'
                                '45'
                            else
                                if Resolution == '07 1h'
                                    '60'
                                else
                                    if Resolution == '08 2h'
                                        '120'
                                    else
                                        if Resolution == '09 3h'
                                            '180'
                                        else
                                            if Resolution == '10 4h'
                                                '240'
                                            else
                                                if Resolution == '11 1D'
                                                    '1D'
                                                else
                                                    if Resolution == '12 1W'
                                                        '1W'
                                                    else
                                                        if Resolution == '13 1M'
                                                            '1M'


// supertrend Long time period 
[supertrend2, direction2] = request.security(syminfo.tickerid, res(time2), ta.supertrend(factor, atrPeriod))
bodyMiddle4 = plot((open + close) / 2, display=display.none)
upTrend2 = plot(direction2 < 0 ? supertrend2 : na, 'Up Trend', color=color.new(color.green, 0), style=plot.style_linebr, linewidth=2)
downTrend2 = plot(direction2 < 0 ? na : supertrend2, 'Down Trend', color=color.new(color.red, 0), style=plot.style_linebr, linewidth=2)

// supertrend short time period 
[supertrend1, direction1] = request.security(syminfo.tickerid, res(time1), ta.supertrend(factor, atrPeriod))
bodyMiddle = plot((open + close) / 2, display=display.none)
upTrend = plot(direction1 < 0 ? supertrend1 : na, 'Up Trend', color=color.new(color.yellow, 0), style=plot.style_linebr)
downTrend = plot(direction1 < 0 ? na : supertrend1, 'Down Trend', color=color.new(color.orange, 0), style=plot.style_linebr)


// Stochastic RSI
low_limit_stoch_rsi = input.float(title = 'Stoch Rsi Low Limit', step=0.5, defval=15, group = " #################  Stoch RSI   ################ ", tooltip = "when Stock rsi value crossover Low Limit value we get Long")
up_limit_stoch_rsi = input.float(title = 'Stoch Rsi Up Limit', step=0.5, defval=85, group = " #################  Stoch RSI   ################ ", tooltip = "when Stock rsi value crossunder Up Limit value we get Short")
stocrsi_back_length = input.int(20, 'Stoch Rsi retroactive length', minval=1, group = " #################  Stoch RSI   ################ ", tooltip = "How many candles are left behind, even if there is a buy or sell signal, it will be valid now")
smoothK = input.int(3, 'Stochastic RSI K', minval=1, group = " #################  Stoch RSI   ################ ")
lengthRSI = input.int(14, 'RSI Length', minval=1, group = " #################  Stoch RSI   ################ ")
lengthStoch = input.int(14, 'Stochastic Length', minval=1, group = " #################  Stoch RSI   ################ ")
src_rsi = input(close, title='RSI Source', group = " #################  Stoch RSI   ################ ")
rsi1 = request.security(syminfo.tickerid, '240', ta.rsi(src_rsi, lengthRSI))
k = request.security(syminfo.tickerid, '240', ta.sma(ta.stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK))

// Strategy settings 
dollar = input.float(title='Dollar Cost Per Position ', defval=20000, group = " #################  Strategy Settings  ################ ")
trade_direction = input.string(title='Trade_direction', group = " #################  Strategy Settings  ################ ", options=['LONG', 'SHORT', 'BOTH'], defval='BOTH')
Long_message_open = input('Long Open', title = "Long Open Message", group = " #################  Strategy Settings  ################ ", tooltip = "if you write your alert window this code {{strategy.order.alert_message}} .When trigger Long signal you will get dynamically what you pasted here for Long Open Message ")
Short_message_open = input('Short Open', title = "Short Open Message", group = " #################  Strategy Settings  ################ ", tooltip = "if you write your alert window this code {{strategy.order.alert_message}} .When trigger Long signal you will get dynamically what you pasted here for Short Open Message ")
Long_message_close = input('Long Close', title = "Long Close Message", group = " #################  Strategy Settings  ################ ", tooltip = "if you write your alert window this code {{strategy.order.alert_message}} .When trigger Long signal you will get dynamically what you pasted here for Long Close Message ")
Short_message_close = input('Short Close', title = "Short Close Message", group = " #################  Strategy Settings  ################ ", tooltip = "if you write your alert window this code {{strategy.order.alert_message}} .When trigger Long signal you will get dynamically what you pasted here for Short Close Message ")

Time_interval = true
bgcolor(Time_interval ? color.rgb(255, 235, 59, 95) : na)

back_long = 0
back_short = 0

for i = 1 to stocrsi_back_length by 1
    if ta.crossover(k, low_limit_stoch_rsi)[i] == true 
        back_long += i
        back_long
    if ta.crossunder(k, up_limit_stoch_rsi)[i] == true 
        back_short += i
        back_short

// bgcolor(back_long>0?color.rgb(153, 246, 164, 54):na)
// bgcolor(back_short>0?color.rgb(246, 153, 153, 54):na)

buy_signal = false
sell_signal = false

if direction2 < 0 and direction1 < 0 and back_long > 0
    buy_signal := true
    buy_signal

if direction2 > 0 and direction1 > 0 and back_short > 0
    sell_signal := true
    sell_signal


//bgcolor(buy_signal  ? color.new(color.lime,90) : na ,title="BUY bgcolor")
plotshape( buy_signal[1] == false and  strategy.opentrades == 0 and Time_interval and buy_signal  ? supertrend2 : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white)

//bgcolor(sell_signal  ? color.new(color.red,90) : na ,title="SELL bgcolor")
plotshape(sell_signal[1] == false and strategy.opentrades == 0 and Time_interval and sell_signal  ? supertrend2 : na , title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white)


// Strategy entries 
if strategy.opentrades == 0 and Time_interval and buy_signal and ( trade_direction == 'LONG' or trade_direction == 'BOTH')
    strategy.entry('Long_Open', strategy.long, qty=dollar / close, alert_message=Long_message_open)

if strategy.opentrades == 0 and Time_interval and sell_signal and ( trade_direction == 'SHORT' or trade_direction == 'BOTH')
    strategy.entry('Short_Open', strategy.short, qty=dollar / close, alert_message=Short_message_open)


// Strategy Close
if close < supertrend1 and strategy.position_size > 0 
    strategy.exit('Long_Close',from_entry = "Long_Open", stop=close, qty_percent=100, alert_message=Long_message_close)

if close > supertrend1 and strategy.position_size < 0 
    strategy.exit('Short_Close',from_entry = "Short_Open", stop=close, qty_percent=100, alert_message=Short_message_close)



En savoir plus