Stratégie de croisement de lignes rapide et lente Double EMA


Date de création: 2024-02-22 16:18:39 Dernière modification: 2024-02-22 16:18:39
Copier: 0 Nombre de clics: 726
1
Suivre
1617
Abonnés

Stratégie de croisement de lignes rapide et lente Double EMA

Aperçu

La double EMA Crossover Strategy est une stratégie de trading quantitative basée sur deux périodes distinctes de trading EMA. La stratégie est simple, efficace et facile à comprendre. C’est une stratégie de trading quantitative courante.

Principe de stratégie

La stratégie utilise deux lignes EMA moyennes, une EMA de 25 cycles, comme ligne rapide, et une EMA de 50 cycles, comme ligne lente. Lorsque vous traversez la ligne lente sur la ligne rapide, faites plus; lorsque vous traversez la ligne lente sous la ligne rapide, faites moins.

Après avoir effectué un plus, définissez le stop comme étant 2% du prix d’entrée et le stop comme étant 2% du prix d’entrée. Lorsque le prix atteint le stop ou le stop, effacez la position.

Le cœur de cette stratégie est d’utiliser la croisée des lignes EMA pour juger de la tendance et de l’inversion du marché. Lorsque l’on est en hausse, on est en hausse et en hausse, et lorsque l’on est en baisse, on est en baisse et en baisse. Le paramètre de stop-loss est utilisé pour bloquer les bénéfices et contrôler les risques.

Analyse des avantages

Les avantages de la stratégie de croisement de lignes doubles EMA sont les suivants:

  1. La logique est claire, la logique est simple, la mise en œuvre est facile à comprendre.
  2. Les lignes rapides et les lignes lentes sont utilisées conjointement pour capturer les tendances des lignes courtes et moyennes.
  3. Il est possible de saisir les points de basculement du marché en temps opportun.
  4. Le risque est maîtrisé et les paramètres de stop-loss sont raisonnables.

Dans l’ensemble, la stratégie utilise une logique claire pour juger le marché, exploiter les avantages de l’EMA elle-même et obtenir de bons bénéfices à court et moyen terme, avec des risques maîtrisés.

Analyse des risques

La stratégie de double croisement des lignes de l’EMA présente aussi des risques:

  1. En cas de forte volatilité du marché, les signaux de croisement des lignes de l’EMA peuvent être inexacts et il y a une probabilité qu’ils soient mal interprétés.
  2. Si le point d’arrêt n’est pas raisonnablement défini, vous risquez de manquer une situation plus importante ou de subir des pertes plus importantes.
  3. L’impact des frais de transaction et des points de glissement ne peut être négligé.

Ces risques peuvent être résolus de manière optimale par:

  1. Il est important de combiner les indicateurs de l’EMA avec d’autres indicateurs pour éviter les signaux de mauvaise interprétation.
  2. Tester et optimiser les paramètres de stop loss pour trouver un équilibre entre les gains et les risques.
  3. Choisissez une plateforme de trading avec des frais de transaction peu élevés et augmentez le volume des transactions.

Direction d’optimisation

La stratégie a également les principaux axes d’optimisation suivants:

  1. Optimiser les paramètres périodiques de l’EMA pour trouver la meilleure combinaison de paramètres.
  2. L’ajout d’autres indicateurs de jugement, la formation d’un portefeuille de transactions et une plus grande précision.
  3. Modification dynamique du point d’arrêt des pertes. Le suivi du point d’arrêt est amplifié lorsque les pertes atteignent une certaine ampleur, le point d’arrêt se déplace lorsque les bénéfices atteignent une certaine ampleur, etc.
  4. Distinguer les marchés à capitaux multiples des marchés à capitaux vides et effectuer des transactions orientées.

Ces optimisations peuvent améliorer la rentabilité et le taux de réussite tout en maintenant la simplicité et la clarté de la stratégie.

Résumer

La stratégie de croisement de ligne rapide et lente de la double EMA est une stratégie de trading quantitative très pratique. Elle est facile à comprendre et à mettre en œuvre, et permet de saisir efficacement les tendances du marché.

Code source de la stratégie
/*backtest
start: 2024-01-22 00:00:00
end: 2024-02-21 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// SEMA-X(SEMA CROSS) [AB] : Simple EMA cross strategy Alert & Backtest
// 1. 2 EMA cross
// 2. Next candle entry
// 3. TP & SL

//@version=5
strategy("SEMA-X", "SEMA-X", overlay=false, margin_long=1,
 initial_capital=1000000, default_qty_type=strategy.percent_of_equity, default_qty_value=100,
 commission_type=strategy.commission.percent, commission_value=0.075, slippage=3)

//****************************************************************************//
// Input
//****************************************************************************//
// EMA length
emaLen25 = input.int(25, "Short", minval=1, confirm=true, group="[EMA]----------", inline="1")
emaLen50 = input.int(50, "Long",  minval=1, confirm=true, group="[EMA]----------", inline="1")

// TP & SL
isLong   = input.bool(true, "Long - ",    confirm=true, group="[TP & SL(%)]----------", inline="1")
tpLong   = input.float(2, "TP", minval=0, confirm=true, group="[TP & SL(%)]----------", inline="1")*0.01
slLong   = input.float(2, "SL", minval=0, confirm=true, group="[TP & SL(%)]----------", inline="1")*0.01
isShort  = input.bool(false, "Short - ",  confirm=true, group="[TP & SL(%)]----------", inline="2")
tpShort  = input.float(2, "TP", minval=0, confirm=true, group="[TP & SL(%)]----------", inline="2")*0.01
slShort  = input.float(2, "SL", minval=0, confirm=true, group="[TP & SL(%)]----------", inline="2")*0.01

// Backtest period
sTime = input(timestamp("0001-01-01"), "Start", group="[Backtest]----------")
eTime = input(timestamp("9999-01-01"), "End",   group="[Backtest]----------")
inDateRange   = true
periodBg      = input.bool(false, "Backtest BGcolor", confirm=true, group="[Backtest]----------", inline="1")
bgLong        = input.bool(false, "Position BGcolor", confirm=true, group="[Backtest]----------", inline="1")
periodBgColor = periodBg and inDateRange ? color.new(color.green, 95) : na
bgcolor(periodBgColor, title="Backtest BGcolor")
bgColorLong   = bgLong and strategy.position_size>0 ? color.new(color.green, 95) : na
bgcolor(bgColorLong, title="Position BGcolor")

// IRISBOT
exchange = input.string("binance",  "Exchange", confirm=true, group="[IRISBOT]----------", inline="2", options=["binance", "bybit", "upbit"])
account  = input.string("account1", "Account",  confirm=true, group="[IRISBOT]----------", inline="2")
symbol   = input.string("BTC/USDT", "Symbol",   confirm=true, group="[IRISBOT]----------", inline="3")
strategy = input.string("sema-x",   "Strategy", confirm=true, group="[IRISBOT]----------", inline="3")
token    = input.string("token",    "Token",    confirm=true, group="[IRISBOT]----------", inline="4")
stRatio  = input.float(100.0,       "Ratio(%)", confirm=true, group="[IRISBOT]----------", inline="5", tooltip="하나의 거래소에서 이 전략을 몇 % 비중으로 투자할 것인가?") * 0.01
leverage = input.float(1,           "Leverage", confirm=true, group="[IRISBOT]----------", inline="5")
isPlotMsg = input.bool(false, "View alert msg", confirm=true, group="[IRISBOT]----------", inline="6")

//****************************************************************************//
// Process
//****************************************************************************//
ema25=ta.ema(close, emaLen25)
ema50=ta.ema(close, emaLen50)

// Entry condition
longCondition  = isLong and ta.crossover(ema25, ema50)
shortCondition = isShort and ta.crossunder(ema25, ema50)

// Entry price
var price=0.0
var pricePlot=0.0
if (longCondition or shortCondition) and strategy.position_size == 0
    price:=close
pricePlot:=price
if (strategy.position_size==0)
    pricePlot:=na

// Amount
amount = str.tostring(stRatio*100)

// IRISBOT alert msg (for auto trading, you can change this for autoview, tvextbot, thanksbot, etc webhookbot)
msgLong  = '{"exchange":"'+exchange+'","account":"'+account+'","strategy":"'+strategy+'","symbol":"'+symbol+'","type":"market","side":"buy","amount":"'+amount+'%","leverage":"'+str.tostring(leverage)+'","token":"'+token+'"}'
msgShort = '{"exchange":"'+exchange+'","account":"'+account+'","strategy":"'+strategy+'","symbol":"'+symbol+'","type":"market","side":"sell","amount":"'+amount+'%","leverage":"'+str.tostring(leverage)+'","token":"'+token+'"}'
msgExit  = '{"exchange":"'+exchange+'","account":"'+account+'","strategy":"'+strategy+'","symbol":"'+symbol+'","type":"market","side":"close","token":"'+token+'"}'

// Entry signal
if inDateRange
    strategy.entry("L", strategy.long,  when=longCondition,  comment="L", alert_message=msgLong)
    strategy.entry("S", strategy.short, when=shortCondition, comment="S", alert_message=msgShort)
    strategy.exit("XL", "L", profit=price*tpLong/syminfo.mintick,  loss=price*slLong/syminfo.mintick,  comment="X", alert_message=msgExit)
    strategy.exit("XS", "S", profit=price*tpShort/syminfo.mintick, loss=price*slShort/syminfo.mintick, comment="X", alert_message=msgExit)

//****************************************************************************//
// Plot
//****************************************************************************//
// Alert msg plot
var msgTable = table.new(position = position.bottom_right, columns = 2, rows = 3, bgcolor = color.new(color.blue, 80), border_width = 1)
if isPlotMsg
    if isLong
        table.cell(msgTable, 0, 0, "Long",  text_halign = text.align_left)
        table.cell(msgTable, 1, 0, msgLong,  text_halign = text.align_left)
    
    if isShort
        table.cell(msgTable, 0, 1, "Short", text_halign = text.align_left, bgcolor=color.new(color.red, 80))
        table.cell(msgTable, 1, 1, msgShort, text_halign = text.align_left, bgcolor=color.new(color.red, 80))
    
    if isLong or isShort
        table.cell(msgTable, 0, 2, "Exit",  text_halign = text.align_left, bgcolor=color.new(color.purple, 80))
        table.cell(msgTable, 1, 2, msgExit,  text_halign = text.align_left, bgcolor=color.new(color.purple, 80))

// EMA
e0=plot(ema25, "Short", color.green)
e1=plot(ema50, "Long", color.red)
fill(e0, e1, ema25>ema50 ? color.new(color.green, 50) : color.new(color.red, 50), "EMA BG")

// TP & SL
p0=plot(pricePlot, "Entry", color.black, style=plot.style_linebr)
p1=plot(pricePlot*(strategy.position_size>0 ? 1+tpLong : 1-tpShort), "TP", color.new(color.green, 50), style=plot.style_linebr)
p2=plot(pricePlot*(strategy.position_size>0 ? 1-slLong : 1+slShort), "SL", color.new(color.red, 50), style=plot.style_linebr)
fill(p0, p1, color.new(color.green, 80), "TP BG")
fill(p0, p2, color.new(color.red, 80), "SL BG")