Stratégie de croisement à double EMA

Auteur:ChaoZhang est là., Date: 2024-02-22 16:18:39 Je vous en prie.
Les étiquettes:

img

Résumé

La stratégie de croisement double EMA est une stratégie de négociation quantitative qui ouvre et ferme des positions basées sur le croisement de deux lignes EMA avec des périodes différentes.

La logique de la stratégie

La stratégie utilise deux lignes EMA, l'une est une ligne EMA de 25 périodes comme la ligne rapide, et l'autre est une ligne EMA de 50 périodes comme la ligne lente.

Une fois que vous avez passé long, réglez le profit à 2% du prix d'entrée et le stop-loss à 2% du prix d'entrée.

Le noyau de cette stratégie est d'utiliser le croisement des lignes rapides et lentes de l'EMA pour juger des tendances et des renversements du marché. Lorsque la ligne rapide traverse au-dessus, elle est jugée comme un marché haussier et va long. Lorsque la ligne rapide traverse en dessous, elle est jugée comme un marché baissier et va court.

Analyse des avantages

La double stratégie de croisement des EMA présente les avantages suivants:

  1. L'idée est claire et la logique est simple, facile à comprendre et à mettre en œuvre.
  2. Les lignes rapides et lentes fonctionnent ensemble pour capturer les tendances à moyen et à court terme.
  3. Elle peut suivre la tendance en temps opportun et saisir les points tournants du marché.
  4. Le contrôle des risques est mis en place avec des paramètres raisonnables de prise de bénéfices et de stop loss.

En général, cette stratégie juge clairement le marché, utilise les avantages de l'EMA elle-même et obtient de bons rendements à moyen et à court terme tout en contrôlant les risques.

Analyse des risques

La double stratégie de croisement EMA comporte également certains risques:

  1. En cas de fortes fluctuations du marché, les signaux croisés de l'EMA peuvent être inexacts, avec une probabilité d'erreur de jugement.
  2. Les points de prise de profit et d'arrêt de perte déraisonnables peuvent manquer des mouvements plus importants ou prendre des pertes plus importantes.
  3. L'impact des frais de négociation et du glissement ne peut pas non plus être ignoré.

Ces risques peuvent être optimisés et résolus de la manière suivante:

  1. Combiner d'autres indicateurs pour juger du marché et éviter de juger à tort les signaux croisés de l'EMA.
  2. Testez et optimisez les points de prise de profit et d'arrêt de perte pour trouver un équilibre entre les rendements et les risques.
  3. Choisissez des plateformes de négociation avec de faibles frais et augmentez les positions de manière appropriée.

Directions d'optimisation

Les principales orientations d'optimisation de cette stratégie sont les suivantes:

  1. Optimiser les paramètres de la période EMA pour trouver la meilleure combinaison de paramètres.
  2. Augmenter les autres indicateurs de jugement pour former une combinaison de négociation et améliorer la précision.
  3. Ajustez dynamiquement les points de prise de profit et de stop-loss. Par exemple, lorsque la perte atteint un certain niveau, élargissez le point de stop-loss, et lorsque le profit atteint un certain niveau, déplacez le point de prise de profit.
  4. Distinguer les marchés haussiers et baissiers pour le trading directionnel.

Ces optimisations peuvent améliorer les taux de rendement et de gain tout en maintenant la stratégie simple et claire.

Résumé

En résumé, la stratégie de double EMA est une stratégie de trading quantitative très pratique. Elle est facile à comprendre et à mettre en œuvre, et capture efficacement les tendances du marché. En même temps, elle a une marge d'optimisation. Des améliorations supplémentaires des taux de rendement peuvent être obtenues grâce à l'ajustement et aux combinaisons de paramètres.


/*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")

Plus de