Strategi Pullback EMA

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

img

Gambaran umum

Strategi EMA pullback adalah strategi perdagangan kuantitatif yang didasarkan pada indikator EMA. Strategi ini membangun sinyal perdagangan menggunakan tiga kurva EMA dengan periode yang berbeda dan menetapkan stop loss dan take profit berdasarkan pullback harga untuk mengotomatisasi perdagangan.

Prinsip Strategi

Strategi ini menggunakan tiga kurva EMA:

  • EMA1: untuk menilai tingkat dukungan/resistensi harga, dengan periode yang relatif singkat, default hingga 33 periode.
  • EMA2: untuk menyaring beberapa sinyal pembalikan, dengan periode 5 kali EMA1, default hingga 165 periode.
  • EMA3: untuk menentukan arah tren keseluruhan, dengan periode 11 kali EMA1, default hingga 365 periode.

Sinyal perdagangan dihasilkan sesuai dengan logika berikut:

Sinyal panjang: Harga melintasi di atas EMA1, menarik kembali di bawah EMA1 membentuk posisi terendah yang lebih tinggi, dengan pullback tidak mencapai EMA2. Masukkan panjang ketika harga melintasi kembali di atas EMA1.

Sinyal pendek: Harga melintasi di bawah EMA1, menarik kembali di atas EMA1 membentuk tinggi yang lebih rendah, dengan pullback tidak mencapai EMA2. Masuk pendek ketika harga melintasi kembali di bawah EMA1.

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

Keuntungan Strategi

Strategi ini memiliki keuntungan berikut:

  1. Sinyal perdagangan yang dibangun menggunakan indikator EMA yang dapat diandalkan.
  2. Penarikan harga menghindari terperangkap secara efektif.
  3. Stop loss diatur pada kontrol tinggi / rendah sebelumnya risiko secara efektif.
  4. Ambil keuntungan yang memuaskan rasio risiko-balasan.
  5. Parameter EMA diatur untuk siklus yang berbeda.

Risiko Strategi

Strategi ini juga memiliki beberapa risiko:

  1. EMA memiliki efek keterlambatan, mungkin melewatkan titik pembalikan tren.
  2. Jangkauan pullback yang terlalu besar melebihi EMA2 dapat menghasilkan sinyal palsu.
  3. Stop loss dapat dipecahkan di pasar tren.
  4. Pengaturan parameter yang tidak benar menyebabkan perdagangan berlebihan atau kehilangan peluang.

Risiko dapat dikurangi dengan menyesuaikan periode EMA, batas pullback dll. Indikator lain juga dapat ditambahkan ke sinyal filter.

Arahan Optimasi

Strategi ini juga dapat dioptimalkan dalam aspek berikut:

  1. Tambahkan indikator tren untuk menghindari perdagangan yang bertentangan dengan tren, misalnya MACD.
  2. Tambahkan indikator volume perdagangan untuk menghindari kegagalan palsu, misalnya OBV.
  3. Optimalkan periode EMA atau gunakan EMA adaptif.
  4. Optimalkan parameter secara dinamis menggunakan model pembelajaran mesin seperti tas kata.
  5. Tambahkan prediksi model untuk stop loss adaptif dan ambil keuntungan.

Kesimpulan

Strategi EMA pullback membangun sistem perdagangan menggunakan tiga EMA dan menetapkan stop loss dan take profit berdasarkan pullback harga untuk mengotomatiskan perdagangan. Ini secara efektif mengontrol risiko perdagangan dan dapat dioptimalkan dengan menyesuaikan parameter berdasarkan kondisi pasar. Secara keseluruhan strategi ini memiliki logika yang baik dan dapat diterapkan dalam perdagangan aktual.


/*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 banyak