Strategi Bounce Purata Bergerak Eksponensial

Penulis:ChaoZhang, Tarikh: 2023-12-08 16:47:39
Tag:

img

Ringkasan Strategi

Strategi pantulan purata bergerak eksponensial (EMA) adalah strategi yang mengesan terobosan harga garis purata bergerak. Ia memeriksa sama ada lilin pantulan kembali dari bawah garis purata bergerak. Jika ya, ia adalah isyarat kenaikan; jika lilin pantulan ke bawah dari atas garis purata bergerak, ia adalah isyarat penurunan.

Nama Strategi

Strategi Bounce Purata Bergerak Eksponensial

Logika Strategi

Strategi ini adalah berdasarkan pada garis purata bergerak eksponensial (EMA). Ia mengira garis EMA dalam masa nyata. Kemudian ia memeriksa sama ada harga memantul kembali dari garis EMA:

  • Jika harga pertama memecahkan garis EMA dan kemudian rebound kembali di atas garis EMA, ia adalah isyarat bullish
  • Jika harga pertama memecahkan garis EMA dan kemudian jatuh semula di bawah garis EMA, ia adalah isyarat penurunan

Kemunculan semula seperti itu adalah isyarat masuk untuk strategi.

Analisis Kelebihan

Perdagangan dengan trend, mengelakkan terperangkap

EMA strategi lompatan hanya memasuki selepas mengesahkan pembalikan harga, yang mengelakkan perdagangan terhadap trend dan terperangkap.

Pengeluaran kecil, pulangan sejarah yang baik

Dengan menggunakan purata bergerak eksponensial, strategi ini dapat secara berkesan meratakan data harga dan menapis bunyi bising pasaran, yang mengakibatkan penarikan kecil dan pulangan sejarah yang baik.

Mudah difahami, penyesuaian parameter yang fleksibel

Strategi bounce EMA hanya bergantung kepada purata bergerak, yang mudah difahami oleh pemula. Sementara itu, tempoh EMA boleh disesuaikan dengan fleksibel untuk menyesuaikan diri dengan produk yang berbeza.

Analisis Risiko

Rendah kepada isyarat palsu

Selalunya terdapat pecah palsu padat di sekitar garis EMA, yang boleh menyebabkan isyarat yang salah. Parameter EMA perlu diselaraskan untuk menapis bunyi bising.

Berdagang dengan trend, tidak dapat meramalkan titik perubahan

Strategi ini pada dasarnya berdagang bersama-sama dengan trend. Ia tidak dapat meramalkan titik perubahan harga dan hanya boleh mengikuti trend. Ini mungkin kehilangan peluang masuk terbaik semasa penyesuaian kitaran.

Stop loss cenderung untuk diambil keluar

Stop loss berhampiran garis purata bergerak kadang-kadang dipukul, yang membawa kepada kerugian yang diperbesar.

Pengoptimuman

Masukkan penunjuk lain untuk penapisan isyarat

Penunjuk seperti RSI dan MACD boleh ditambah untuk mengesahkan pembalikan harga dan menapis isyarat palsu.

Mengoptimumkan kaedah stop loss

Kaedah stop loss yang lebih fleksibel seperti berhenti masa dan berhenti turun naik boleh digunakan untuk mengurangkan risiko dikeluarkan.

Pengoptimuman Parameter

Mengoptimumkan parameter tempoh EMA untuk mencari kombinasi parameter terbaik. Parameter EMA juga boleh dibuat dinamik untuk mengesan kitaran pasaran.

Kesimpulan

EMA adalah strategi yang mudah dan praktikal. Ia mempunyai penurunan yang kecil dan mudah difahami. Pada masa yang sama, ia juga mempunyai beberapa risiko isyarat palsu dan dihentikan. Kita boleh mengoptimumkan strategi dengan menggunakan kombinasi penunjuk yang lebih baik, kaedah stop loss dan pemilihan parameter untuk menjadikannya strategi kuantitatif yang stabil dan boleh dipercayai.


/*backtest
start: 2022-12-01 00:00:00
end: 2023-12-07 00:00:00
period: 1d
basePeriod: 1h
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/
// © tweakerID

// Simple strategy that checks for price bounces over an Exponential Moving Average. If the CLOSE of the candle bounces
// back from having it's LOW below the EMA, then it's a Bull Bounce. If the CLOSE of the candle bounces down from having it's
// high above the EMA, then it's a Bear Bounce. This logic can be reverted.

//@version=4
strategy("EMA Bounce", overlay=true, 
     default_qty_type=strategy.percent_of_equity, 
     default_qty_value=100, 
     initial_capital=10000, 
     commission_value=0.04, 
     calc_on_every_tick=false, 
     slippage=0)

direction = input(0, title = "Strategy Direction", type=input.integer, minval=-1, maxval=1)
strategy.risk.allow_entry_in(direction == 0 ? strategy.direction.all : (direction < 0 ? strategy.direction.short : strategy.direction.long))

/////////////////////// STRATEGY INPUTS ////////////////////////////////////////
title1=input(true, "-----------------Strategy Inputs-------------------")  

i_EMA=input(20, title="EMA Length")

/////////////////////// BACKTESTER /////////////////////////////////////////////
title2=input(true, "-----------------General Inputs-------------------")  

// Backtester General Inputs
i_SL=input(true, title="Use Swing Stop Loss and Take Profit")
i_SPL=input(defval=10, title="Swing Point Loopback")
i_PercIncrement=input(defval=.2, step=.1, title="Swing Point SL Perc Increment")*0.01
i_TPRRR = input(1.2, step=.1, title="Take Profit Risk Reward Ratio")

// Bought and Sold Boolean Signal
bought = strategy.position_size > strategy.position_size[1] 
 or strategy.position_size < strategy.position_size[1]

// Price Action Stop and Take Profit
LL=(lowest(i_SPL))*(1-i_PercIncrement)
HH=(highest(i_SPL))*(1+i_PercIncrement)
LL_price = valuewhen(bought, LL, 0)
HH_price = valuewhen(bought, HH, 0)
entry_LL_price = strategy.position_size > 0 ? LL_price : na 
entry_HH_price = strategy.position_size < 0 ? HH_price : na 
tp=strategy.position_avg_price + (strategy.position_avg_price - entry_LL_price)*i_TPRRR
stp=strategy.position_avg_price - (entry_HH_price - strategy.position_avg_price)*i_TPRRR


/////////////////////// STRATEGY LOGIC /////////////////////////////////////////

EMA=ema(close, i_EMA)
LowAboveEMA=low > EMA
LowBelowEMA=low < EMA
HighAboveEMA=high > EMA
HighBelowEMA=high < EMA
BullBounce=LowAboveEMA[1] and LowBelowEMA and close > EMA //and close > open
BearBounce=HighBelowEMA[1] and HighAboveEMA and close < EMA //and close < open
plot(EMA)

BUY=BullBounce
SELL=BearBounce

//Inputs
DPR=input(false, "Allow Direct Position Reverse")
reverse=input(false, "Reverse Trades")

// Entries
if reverse
    if not DPR
        strategy.entry("long", strategy.long, when=SELL and strategy.position_size == 0)
        strategy.entry("short", strategy.short, when=BUY and strategy.position_size == 0)
    else     
        strategy.entry("long", strategy.long, when=SELL)
        strategy.entry("short", strategy.short, when=BUY)
else
    if not DPR 
        strategy.entry("long", strategy.long, when=BUY and strategy.position_size == 0)
        strategy.entry("short", strategy.short, when=SELL and strategy.position_size == 0)
    else
        strategy.entry("long", strategy.long, when=BUY)
        strategy.entry("short", strategy.short, when=SELL)


SL=entry_LL_price
SSL=entry_HH_price
TP=tp
STP=stp

strategy.exit("TP & SL", "long", limit=TP, stop=SL, when=i_SL)
strategy.exit("TP & SL", "short", limit=STP, stop=SSL, when=i_SL)

/////////////////////// PLOTS //////////////////////////////////////////////////

plot(strategy.position_size > 0 ? SL : na , title='SL', style=plot.style_cross, color=color.red)
plot(strategy.position_size < 0 ? SSL : na , title='SSL', style=plot.style_cross, color=color.red)
plot(strategy.position_size > 0 ? TP : na, title='TP', style=plot.style_cross, color=color.green)
plot(strategy.position_size < 0 ? STP : na, title='STP', style=plot.style_cross, color=color.green)
// Draw price action setup arrows
plotshape(BUY ? 1 : na, style=shape.triangleup, location=location.belowbar, 
 color=color.green, title="Bullish Setup", transp=80, size=size.auto)
plotshape(SELL ? 1 : na, style=shape.triangledown, location=location.abovebar, 
 color=color.red, title="Bearish Setup", transp=80, size=size.auto)


Lebih lanjut