Strategi Pullback EMA

Penulis:ChaoZhang, Tarikh: 2023-12-21 11:48:54
Tag:

img

Ringkasan

Strategi pulback EMA adalah strategi perdagangan kuantitatif berdasarkan penunjuk EMA. Ia membina isyarat perdagangan menggunakan tiga kurva EMA dengan tempoh yang berbeza dan menetapkan stop loss dan mengambil keuntungan berdasarkan pulback harga untuk mengotomatiskan perdagangan.

Prinsip Strategi

Strategi ini menggunakan tiga lengkung EMA:

  • EMA1: untuk menilai tahap sokongan / rintangan harga, dengan tempoh yang agak pendek, lalai kepada 33 tempoh.
  • EMA2: untuk menapis beberapa isyarat pembalikan, dengan tempoh 5 kali EMA1, lalai kepada 165 tempoh.
  • EMA3: untuk menentukan arah trend keseluruhan, dengan tempoh 11 kali EMA1, lalai kepada 365 tempoh.

Isyarat perdagangan dihasilkan mengikut logik berikut:

Isyarat panjang: Harga melintasi di atas EMA1, menarik balik di bawah EMA1 membentuk tahap terendah yang lebih tinggi, dengan pullback tidak mencapai EMA2. Masuk panjang apabila harga melintasi kembali di atas EMA1.

Isyarat pendek: Harga melintasi di bawah EMA1, menarik balik di atas EMA1 membentuk paras tertinggi yang lebih rendah, dengan pullback tidak mencapai EMA2. Masuk pendek apabila harga melintasi kembali di bawah EMA1.

Stop loss ditetapkan pada harga tarik balik terendah / tertinggi untuk panjang / pendek. mengambil keuntungan ditetapkan pada 2 kali stop loss.

Kelebihan Strategi

Strategi ini mempunyai kelebihan berikut:

  1. Isyarat perdagangan yang dibina menggunakan penunjuk EMA yang boleh dipercayai.
  2. Penarikan harga mengelakkan terperangkap dengan berkesan.
  3. Hentikan kerugian yang ditetapkan pada kawalan tinggi / rendah sebelum ini risiko dengan berkesan.
  4. Ambil keuntungan yang memuaskan nisbah risiko-balasan.
  5. Parameter EMA boleh diselaraskan untuk kitaran yang berbeza.

Risiko Strategi

Strategi ini juga mempunyai beberapa risiko:

  1. EMA mempunyai kesan kelewatan, mungkin terlepas titik pembalikan trend.
  2. Julat pulback yang terlalu besar melebihi EMA2 boleh menghasilkan isyarat palsu.
  3. Stop loss boleh dilanggar di pasaran trend.
  4. Tetapan parameter yang tidak betul membawa kepada perdagangan berlebihan atau peluang yang hilang.

Risiko boleh dikurangkan dengan menyesuaikan tempoh EMA, had pulback dan lain-lain. Penunjuk lain juga boleh ditambah kepada isyarat penapis.

Arahan pengoptimuman

Strategi ini juga boleh dioptimumkan dalam aspek berikut:

  1. Tambah penunjuk trend untuk mengelakkan perdagangan yang bertentangan dengan trend, contohnya MACD.
  2. Tambah penunjuk jumlah dagangan untuk mengelakkan pecah palsu, contohnya OBV.
  3. Mengoptimumkan tempoh EMA atau menggunakan EMA adaptif.
  4. Mengoptimumkan parameter secara dinamik menggunakan model pembelajaran mesin seperti beg-of-word.
  5. Tambah ramalan model untuk stop loss adaptif dan mengambil keuntungan.

Kesimpulan

Strategi EMA pullback membina sistem perdagangan menggunakan tiga EMA dan menetapkan stop loss dan mengambil keuntungan berdasarkan penarikan harga untuk mengotomatiskan perdagangan. Ia berkesan mengawal risiko perdagangan dan boleh dioptimumkan dengan menyesuaikan parameter berdasarkan keadaan pasaran. Secara keseluruhan strategi ini mempunyai logika yang baik dan boleh digunakan dalam perdagangan sebenar. Penambahbaikan masa depan boleh dibuat dalam aspek seperti penentuan trend, pengoptimuman parameter dan kawalan risiko.


/*backtest
start: 2023-11-20 00:00:00
end: 2023-12-20 00:00:00
period: 1h
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/
// created by Space Jellyfish
//@version=4

strategy("EMA pullback strategy", overlay = true, initial_capital=10000, commission_value = 0.075)

target_stop_ratio = input(title="Take Profit Stop Loss ratio", type=input.float, defval=2.06, minval=0.5, maxval=100)
riskLimit_low =  input(title="lowest risk per trade", type=input.float, defval=0.008, minval=0, maxval=100)
riskLimit_high =  input(title="highest risk per trade", type=input.float, defval=0.02, minval=0, maxval=100)
//give up the trade, if the risk is smaller than limit, adjust position size if risk is bigger than limit

ema_pullbackLevel_period = input(title="EMA1 for pullback level Period", type=input.integer, defval=33, minval=1, maxval=10000)
ema_pullbackLimiit_period = input(title="EMA2 for pullback limit Period", type=input.integer, defval=165, minval=1, maxval=10000)
ema_trend_period = input(title="EMA3 for trend Period", type=input.integer, defval=365, minval=1, maxval=10000)

startDate = input(title="Start Date", type=input.integer, defval=1, minval=1, maxval=31)
startMonth = input(title="Start Month", type=input.integer, defval=1, minval=1, maxval=12)
startYear = input(title="Start Year", type=input.integer, defval=2018, minval=2008, maxval=2200)

inDateRange = (time >= timestamp(syminfo.timezone, startYear, startMonth, startDate, 0, 0))

ema_pullbackLevel = ema(close, ema_pullbackLevel_period)
ema_pullbackLimit = ema(close, ema_pullbackLimiit_period)
ema_trendDirection = ema(close, ema_trend_period)

//ema pullback 
float pricePullAboveEMA_maxClose = na
float pricePullAboveEMA_maxHigh = na

float pricePullBelowEMA_minClose = na
float pricePullBelowMA_minLow = na

if(crossover(close, ema_pullbackLevel))
    pricePullAboveEMA_maxClose := close
    pricePullAboveEMA_maxHigh := high
else
    pricePullAboveEMA_maxClose := pricePullAboveEMA_maxClose[1]
    pricePullAboveEMA_maxHigh := pricePullAboveEMA_maxHigh[1]

if(close > pricePullAboveEMA_maxClose)
    pricePullAboveEMA_maxClose := close
if(high > pricePullAboveEMA_maxHigh)
    pricePullAboveEMA_maxHigh := high

if(crossunder(close, ema_pullbackLevel))
    pricePullBelowEMA_minClose := close
    pricePullBelowMA_minLow := low
else
    pricePullBelowEMA_minClose :=pricePullBelowEMA_minClose[1]
    pricePullBelowMA_minLow:=pricePullBelowMA_minLow[1]
    
if(close < pricePullBelowEMA_minClose)
    pricePullBelowEMA_minClose := close
if(low < pricePullBelowMA_minLow)
    pricePullBelowMA_minLow := low


long_strategy = crossover(close, ema_pullbackLevel) and pricePullBelowEMA_minClose < ema_pullbackLimit and ema_pullbackLevel>ema_trendDirection 
short_strategy = crossunder(close, ema_pullbackLevel) and pricePullAboveEMA_maxClose > ema_pullbackLimit and ema_pullbackLevel<ema_trendDirection


var open_long_or_short = 0// long = 10000, short = -10000, no open = 0

//check if position is closed
if(strategy.position_size == 0)
    open_long_or_short := 0
else
    open_long_or_short := open_long_or_short[1]

float risk_long = na
float risk_short = na
float stopLoss = na
float takeProfit = na
float entry_price = na

float entryContracts = 0



risk_long := risk_long[1]
risk_short := risk_short[1]
    
//open a position determine the position size
if (strategy.position_size == 0 and long_strategy and inDateRange)
    risk_long := (close - pricePullBelowMA_minLow) / close

    if(risk_long < riskLimit_high)
        entryContracts := strategy.equity / close
    else
        entryContracts := (strategy.equity * riskLimit_high / risk_long)/close
    
    if(risk_long > riskLimit_low)
        strategy.entry("long", strategy.long, qty = entryContracts, when = long_strategy)


    open_long_or_short := 10000
    
if (strategy.position_size == 0 and short_strategy and inDateRange)
    risk_short := (pricePullAboveEMA_maxHigh - close) / close
    if(risk_short < riskLimit_high)
        entryContracts := strategy.equity / close
    else
        entryContracts := (strategy.equity * riskLimit_high / risk_short)/close

    if(risk_short > riskLimit_low)
        strategy.entry("short", strategy.short, qty = entryContracts, when = short_strategy)

    
    open_long_or_short := -10000

//take profit / stop loss
if(open_long_or_short == 10000)

    stopLoss :=   strategy.position_avg_price*(1 - risk_long)
    takeProfit :=  strategy.position_avg_price*(1 + target_stop_ratio * risk_long)
    entry_price := strategy.position_avg_price
    strategy.exit("Long exit","long", limit = takeProfit , stop = stopLoss)
    
if(open_long_or_short == -10000)
    stopLoss :=  strategy.position_avg_price*(1 + risk_short)
    takeProfit :=  strategy.position_avg_price*(1 - target_stop_ratio * risk_short)
    entry_price := strategy.position_avg_price
    strategy.exit("Short exit","short", limit = takeProfit, stop = stopLoss)



plot(ema_pullbackLevel, color=color.aqua,  title="ema pullback level")
plot(ema_pullbackLimit, color=color.purple,  title="ema pullback limit")
plot(ema_trendDirection, color=color.white,  title="ema trend")

plot(entry_price, color = color.yellow, linewidth = 1, style = plot.style_linebr)
plot(stopLoss, color = color.red, linewidth = 1, style = plot.style_linebr)
plot(takeProfit, color = color.green, linewidth = 1, style = plot.style_linebr)





//

Lebih lanjut