Strategi Pullback Golden Cross EMA


Tanggal Pembuatan: 2023-12-21 11:48:54 Akhirnya memodifikasi: 2023-12-21 11:48:54
menyalin: 2 Jumlah klik: 877
1
fokus pada
1623
Pengikut

Strategi Pullback Golden Cross EMA

Ringkasan

Strategi EMA Gold Crossover adalah strategi perdagangan kuantitatif yang didasarkan pada indikator EMA. Strategi ini menggunakan kurva EMA tiga periode yang berbeda untuk membangun sinyal perdagangan dan menggabungkan mekanisme harga yang berbalik untuk mengatur stop loss dan melakukan perdagangan otomatis.

Prinsip Strategi

Strategi ini menggunakan tiga kurva EMA, yaitu:

  • EMA1: digunakan untuk menentukan harga kembali support / resistance, siklus yang lebih pendek, default 33 siklus.
  • EMA2: digunakan untuk memfilter beberapa sinyal reversal, dengan periode 5 kali lebih lama dari EMA1, dengan default 165 siklus.
  • EMA3: digunakan untuk menentukan arah tren secara keseluruhan, dengan siklus 11 kali EMA1, dengan default 365 siklus.

Produksi sinyal perdagangan mengikuti logika berikut:

Sinyal multihead: harga naik setelah memakai EMA1constitutes, kemudian membentuk titik rendah yang lebih tinggi di atas EMA1, dan tidak menyentuh EMA2. Setelah memenuhi persyaratan, lakukan lebih banyak saat memakai EMA1 lagi.

Sinyal kosong: harga berbalik setelah melewati EMA1 ke bawah, membentuk titik tinggi yang lebih rendah di bawah EMA1 dan tidak menyentuh EMA2. Setelah memenuhi kondisi, kosongkan saat melewati EMA1 lagi.

Stop loss adalah harga minimum/maksimal. Stop loss adalah dua kali lipat dari stop loss yang ditetapkan.

Keunggulan Strategis

Strategi ini memiliki keuntungan sebagai berikut:

  1. Dengan menggunakan indikator EMA untuk membangun sinyal perdagangan, reliabilitas yang lebih tinggi.
  2. Dengan adanya mekanisme penyesuaian harga, penarikan harga dapat dihindari.
  3. Stop loss set pada level tinggi atau rendah sebelumnya untuk mengontrol risiko.
  4. Tetapkan stop loss sesuai dengan stop loss rasio, memenuhi persyaratan rasio untung rugi.
  5. Parameter EMA dapat disesuaikan dengan pasar untuk menyesuaikan dengan siklus yang berbeda.

Risiko Strategis

Strategi ini juga memiliki beberapa risiko:

  1. Indikator EMA terlambat, mungkin kehilangan titik balik tren.
  2. Rentang penyesuaian yang terlalu besar melebihi EMA2 may generate false signals。
  3. “Penghentian tren dan kerugian bisa saja terjadi.
  4. Pengaturan parameter yang tidak tepat dapat menyebabkan perdagangan yang terlalu sering atau kehilangan peluang.

Parameter dapat dioptimalkan dengan cara seperti menyesuaikan siklus EMA, memodifikasi batas rentang, dll. Parameter ini juga dapat digabungkan dengan sinyal filter indikator lainnya.

Arah optimasi strategi

Strategi ini juga dapat dioptimalkan dalam beberapa hal:

  1. Meningkatkan penilaian indikator tren, menghindari perdagangan berlawanan arah. Misalnya, bergabung dengan MACD.
  2. Menambahkan indikator volume transaksi untuk menghindari terobosan palsu. Misalnya, bergabung dengan OBV.
  3. Mengoptimalkan parameter siklus EMA, atau menggunakan EMA yang disesuaikan.
  4. Parameter optimasi dinamis dari metode pembelajaran mesin seperti model kantong kata.
  5. Bergabung dengan model prediksi, atur stop loss adaptif.

Meringkaskan

Strategi EMA Gold Cross-Retracing Strategi EMA Gold Cross-Retracing Strategi EMA Gold Cross-Retracing Strategi EMA Gold Cross-Retracing Strategi EMA Gold Cross-Retracing Strategi EMA Gold Cross-Retracing Strategi EMA Gold Cross-Retracing Strategi EMA Gold Cross-Retracing Strategi EMA Gold Cross-Retracing Strategi EMA Gold Cross-Retracing Strategi EMA Gold Cross-Retracing Strategi EMA Gold Cross-Retracing Strategi EMA Gold Cross-Retracing Strategi EMA Gold Cross-Retracing Strategi EMA Gold Cross-Retracing Strategi EMA Gold Cross-Retracing Strategi EMA Gold Cross-Retracing Strategi EMA Gold Strategi EMA Gold Cross-Retracing Strategi EMA Gold Cross-Retracing Strategi EMA Gold Cross-Retracing Strategi EMA Gold Strategi EMA Gold Strategi EMA Gold Cross-Retracing Strategi EMA Gold Strategi EMA Gold Strategi EMA Gold Strategi EMA Gold Strategi EMA Gold Strategi EMA Gold Strategi EMA Gold Strategi EMA Gold Strategi

Kode Sumber Strategi
/*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)





//