Stratégie de swing trading basée sur la double moyenne mobile


Date de création: 2024-01-08 16:29:21 Dernière modification: 2024-01-08 16:29:21
Copier: 0 Nombre de clics: 716
1
Suivre
1617
Abonnés

Stratégie de swing trading basée sur la double moyenne mobile

Aperçu

Cette stratégie est une stratégie de trading basée sur les oscillations bi-équivalentes. Elle utilise le croisement des moyennes mobiles rapides et des moyennes mobiles lentes comme signal d’achat et de vente. Elle génère un signal d’achat lorsque la moyenne mobile rapide traverse la moyenne mobile lente en bas et un signal de vente lorsque la moyenne mobile rapide traverse la moyenne mobile lente en haut.

Principe de stratégie

La stratégie utilise une RMA de longueur de 6 comme moyenne mobile rapide et une HMA de longueur de 4 comme moyenne mobile lente. La stratégie détermine la tendance des prix et génère un signal de transaction à travers la croix des lignes rapides et lentes.

Lorsque la ligne rapide traverse la ligne lente par le bas, cela indique que le prix a été inversé à la baisse à court terme et appartient au moment de la conversion de la puce, donc la stratégie génère un signal d’achat à ce moment-là; lorsque la ligne rapide traverse la ligne lente par le haut, cela indique que le prix a été inversé à la baisse à court terme et appartient au moment de la conversion de la puce, donc la stratégie génère un signal de vente à ce moment-là.

En outre, la stratégie détecte les jugements de tendance à long terme pour éviter les transactions à contre-courant. Les signaux d’achat et de vente réels ne sont générés que lorsque les jugements de tendance à long terme sont également favorables au signal.

Avantages stratégiques

Cette stratégie présente les avantages suivants:

  1. L’utilisation d’un jugement bi-homogène de croix permet d’identifier efficacement les points de retournement de prix à court terme.
  2. Les lignes rapides et les lignes lentes sont conçues de manière à produire des signaux de trading plus précis.
  3. Le système de filtrage de la plupart des signaux de trading bruyants est basé sur des estimations de tendances à court et à long terme.
  4. La logique Stop Loss permet d’éviter activement les risques.
  5. Il est facile à comprendre et à mettre en œuvre pour les débutants en trading quantitatif.

Les risques et les solutions

Cette stratégie comporte aussi des risques:

  1. La stratégie de double équilibre est susceptible de générer de petits gains à plusieurs reprises mais de grandes pertes à la fois. La solution consiste à ajuster le niveau de stop loss de manière appropriée.

  2. Les signaux de transaction sont fréquents dans les situations de choc, ce qui peut entraîner une sur-transaction. La solution est d’assouplir les conditions de transaction et de réduire les transactions.

  3. Les paramètres de la stratégie sont faciles à sur-optimiser et peuvent être moins efficaces sur disque. La solution est le test de stabilité des paramètres.

  4. Les stratégies ne fonctionnent pas bien dans une situation de tendance. La solution consiste à ajouter un module de jugement de tendance ou à l’utiliser en combinaison avec une stratégie de tendance.

Direction d’optimisation

La stratégie peut être optimisée dans les domaines suivants:

  1. Mise à jour de l’indicateur de moyenne, utilisation de filtres adaptatifs tels que Kalman.

  2. L’ajout d’un module d’apprentissage automatique permettant à l’IA de déterminer les points de vente.

  3. L’ajout d’un module de gestion des fonds pour automatiser le contrôle des risques.

  4. Les signaux d’échange plus puissants ont été trouvés en combinaison avec des facteurs de haute fréquence.

  5. La variété est arbitrage entre les marchés.

Résumer

La stratégie d’oscillation bi-linéaire est une stratégie de trading quantitative typique et pratique dans son ensemble. Elle est très adaptable et permet aux débutants d’apprendre beaucoup de choses sur le développement de la stratégie.

Code source de la stratégie
/*backtest
start: 2023-12-31 00:00:00
end: 2024-01-07 00:00:00
period: 3m
basePeriod: 1m
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/
// © dc_analytics
// https://datacryptoanalytics.com/


//@version=5
strategy("Scalping Trading", overlay=true)

//  INPUTS  //
bar_color       = input(true, title='Bar Color', group='⚙ Settings',tooltip='Color chart bars.', inline = "1")
mostrar         = input(true, 'Show Alerts', group='⚙ Settings', inline = "1")
tempo           = input.timeframe('60', group='⚙ Settings', title='🕗 Timeframe', options=['1', '5', '15', '30', '60', '120', '240', '360', '720', 'D', 'W'])

i_position      = input.string("Bottom Center", title = "⚙ D-Panel Location", 
 options = ["Top Right", "Bottom Center", "Bottom Right"], group='⚙ D-Panel Settings️',
 tooltip='Choose the location of the information table on the chart.(D-Panel) ')

position        = i_position == "Top Right" ? position.top_right : i_position == "Bottom Center" ? position.bottom_center : position.bottom_right

i_tam           = input.string('Big', title = '⚙ D-Painel Size', 
 options = ["Tiny", "Small", "Big"], group='⚙ D-Panel Settings️',tooltip='Choose the size of the information panel (D-Panel).')

tamanho         = i_tam == "Tiny" ? size.tiny : i_tam == "Small" ? size.small : size.normal

show_tp_sl      = input(true, title='Show Take Profit/Stop Loss', group='⚙ Settings',tooltip='Show Take Profit/Stop Loss.')
TP              = input.float(defval=4500, title='Take Profit:',group='⚙ Risk Management',tooltip='Choose amount of profit')
SL              = input.float(defval=2500, title='Stop Loss:', group='⚙ Risk Management',tooltip='Choose amount of loss') 
//  END INPUTS  //


//  DECLARATIONS  //
t_up    = '📈'
t_down  = '📉'

c_buy   = 'Long ⇡'
c_sell  = 'Short ⇣'

// _DECLARATION TREND
t_sma       = ta.hma(close, 200)
tend_sma    = ta.sma(close, 12)

tendencia   = request.security(syminfo.tickerid, timeframe.period, t_sma, barmerge.gaps_off, barmerge.lookahead_off)
tend_tabela = request.security(syminfo.tickerid, timeframe.period, tend_sma, barmerge.gaps_off, barmerge.lookahead_off)
// _END DECLARATION TREND

circle = plot.style_circles
//  END DECLARATIONS  //


//  COLORS  //
color gray   = color.gray
color red    = color.new(#ff8c05, 0)
color orange = color.new(#ff8c05, 0)
color silver = color.silver
color up_vol = color.new(color.green, 0)
color dn_vol = color.new(color.purple, 0)

color orange_tranp  = color.new(#ff8c05, 95)
// END COLORS //

//  SCANNER MARKET MAKERS  //
periodo  = input.int(20, 'Period Volume', group='⚙️ Scanner Market Makers Settings')
fator    = input.float(1.85, 'Proportion to the mean: (1.25 = 125% of the mean)', minval=0, group='⚙️ Scanner Market Makers Settings')
vol_up   = close > open
vol_down = open > close
vol      = volume
pesado   = volume > ta.ema(volume, periodo) * fator

palette  = pesado and vol_up ? gray : pesado and vol_down ? orange : vol_up ? silver : gray
//  END SCANNER MARKET MAKERS  //


//  LOGIC ONE  //
s = ta.rma(close, 6)
v = ta.hma(close, 4)

//  TREND  
t_baixa     = tendencia > tendencia[1]
t_alta      = tendencia < tendencia[1]

te_d        = tend_tabela > tend_tabela[1]
trend       = te_d ? t_up : t_down
//  END TREND  

a = request.security(syminfo.tickerid, tempo, s)
b = request.security(syminfo.tickerid, tempo, ohlc4)

c_dn   = a > b and a[1] < b[1]
c_up   = b > a and b[1] < a[1]

compra = mostrar and c_up ? a : na
venda  = mostrar and c_dn ? a : na

s_sell = venda and t_alta
s_buy  = compra and t_baixa
c_vela = b > a and te_d ? gray : orange

s_up = false
s_dw = false

b_sinal = not s_up and s_buy
s_sinal = not s_dw and s_sell

if b_sinal
    s_dw := false
    s_up := true
    s_up

if s_sinal
    s_dw := true
    s_up := false
    s_up

// END LOGIC ONE //


//  DATA TABLE  //
c = b > a ? orange : gray 
c_sinal = b > a ? c_buy : c_sell
//  END DATA TABLE  //


//  PLOT/BARCOLOR  //
c_barcolor = pesado and vol_up ? up_vol : pesado and vol_down ? dn_vol : vol_up ? c : c

barcolor(bar_color ? c_barcolor : na)
plot(a, color=orange_tranp, style=circle)
//  END PLOT/BARCOLOR  //


//  TABLE  //
var dash = table.new(position=position, columns=2, rows=3, border_width=1)
if barstate.islast
    table.cell(table_id=dash, column=1, row=2, text='Scalping DCA', bgcolor=orange)
    table.cell(table_id=dash, column=1, row=0, text='Trade: ' + c_sinal)
    table.cell(table_id=dash, column=1, row=1, text='Trend: ' + trend)
//  END TABLE  //


//  SETTINGS STRATEGY  //
exitPrice = strategy.closedtrades.exit_price(strategy.closedtrades - 1)

// OPEN ORDER
if (b_sinal)
    strategy.order("Long", strategy.long , comment = "Entry: " + str.tostring(close, "#.####"))
//    strategy.exit("EXIT", trail_points = 1000, trail_offset = 0, comment_trailing = "Close with Profit: " + str.tostring(close, "#.####"))
//    strategy.entry("long", strategy.long)

if (s_sinal)
    strategy.order("Short", strategy.short , comment = "Entry: " + str.tostring(close, "#.####"))
//    strategy.exit("EXIT", trail_points = 1000, trail_offset = 0, comment_trailing = "Close with Profit: " + str.tostring(close, "#.####"))
//    strategy.entry("short", strategy.short)

//  TP/SL ORDERS
if strategy.position_size > 0
    strategy.exit('Long_Close', 'Long',profit = TP , loss=SL, qty_percent=100, comment_profit = "Profit Long: " + str.tostring(exitPrice, "#.####"), comment_loss = "Stop Long: " + str.tostring(exitPrice, "#.####"))
//if  strategy.position_size > 0
//    strategy.exit("Long", "Long", stop = longSL, limit = longTP, comment_profit = "Profit Long: " + str.tostring(exitPrice, "#.####"), comment_loss = "Stop Long: " + str.tostring(exitPrice, "#.####"))
    
if strategy.position_size < 0
    strategy.exit('Short_Close', 'Short',profit = TP, loss=SL, qty_percent=100, comment_profit = "Profit Short: " + str.tostring(exitPrice, "#.####"), comment_loss = "Stop Short: " + str.tostring(exitPrice, "#.####"))
//if strategy.position_size < 0
//    strategy.exit("Short", "Short", stop = shortSL, limit = shortTP, comment_profit = "Profit Short: "+ str.tostring(exitPrice, "#.####"), comment_loss = "Stop Short: " + str.tostring(exitPrice, "#.####")) 

//  END SETTINGS STRATEGY  //

// LOGS 
// if strategy.opentrades > 10
//     log.warning("{0} positions opened in the same direction in a row. Try adjusting `bracketTickSizeInput`", strategy.opentrades)

// last10Perc = strategy.initial_capital / 10 > strategy.equity
// if (last10Perc and not last10Perc[1])
//     log.error("The strategy has lost 90% of the initial capital!")