Strategi Pullback Palang Emas EMA


Tarikh penciptaan: 2023-12-21 11:48:54 Akhirnya diubah suai: 2023-12-21 11:48:54
Salin: 2 Bilangan klik: 877
1
fokus pada
1623
Pengikut

Strategi Pullback Palang Emas EMA

Gambaran keseluruhan

EMA Gold Cross-Return Strategy adalah strategi perdagangan kuantitatif berdasarkan EMA Indicator. Strategi ini menggunakan tiga kurva EMA yang berbeza untuk membina isyarat perdagangan, dan menggabungkan mekanisme return harga untuk menetapkan stop loss stop loss, untuk melakukan perdagangan automatik.

Prinsip Strategi

Strategi ini menggunakan tiga kurva EMA, iaitu:

  • EMA1: digunakan untuk menentukan harga kembalikan sokongan / rintangan, kitaran yang lebih pendek, secara default 33 kitaran
  • EMA2: digunakan untuk menyaring sebahagian daripada isyarat pembalikan, dengan kitaran 5 kali EMA1, secara default 165 kitaran.
  • EMA3: digunakan untuk menentukan arah trend keseluruhan, dengan kitaran 11 kali EMA1, secara default 365 kitaran.

Penciptaan isyarat dagangan mengikut logik berikut:

isyarat berbilang: harga berlaku penyesuaian selepas memakai EMA1constitutes, di atas EMA1 membentuk titik rendah yang lebih tinggi, penyesuaian tidak menyentuh EMA2. Setelah memenuhi syarat, lakukan lebih banyak apabila memakai EMA1 sekali lagi.

Isyarat kosong: harga berlaku pemulihan selepas menembusi EMA1 ke bawah, membentuk titik tinggi yang lebih rendah di bawah EMA1 dan amplitudo pemulihan tidak menyentuh EMA2. Setelah memenuhi syarat, kosongkan ketika menembusi EMA1 lagi.

Stop loss adalah dengan menukar harga minimum/harga tertinggi. Stop loss ditetapkan 2 kali ganda daripada stop loss.

Kelebihan Strategik

Strategi ini mempunyai kelebihan berikut:

  1. Penggunaan indikator EMA untuk membina isyarat perdagangan, kebolehpercayaan yang lebih tinggi.
  2. Ia boleh digabungkan dengan mekanisme penyesuaian harga yang berkesan untuk mengelakkan penarikan.
  3. Stop loss set pada tahap rendah dan tinggi sebelum ini, untuk mengawal risiko.
  4. Tetapkan titik henti mengikut nisbah hentian hentian dan memenuhi keperluan nisbah keuntungan / kerugian.
  5. Parameter EMA boleh disesuaikan mengikut pasaran untuk menyesuaikan diri dengan kitaran yang berbeza.

Risiko Strategik

Strategi ini juga mempunyai risiko:

  1. Indeks EMA terlewat dan mungkin terlepas titik perubahan trend.
  2. Julat pengulangan yang terlalu besar melebihi EMA2 mungkin menghasilkan isyarat palsu.
  3. “Penghentian trend mungkin berlaku”.
  4. Tetapan parameter yang tidak betul boleh menyebabkan terlalu banyak perdagangan atau kehilangan peluang.

Parameter boleh dioptimumkan dengan cara seperti menyesuaikan kitaran EMA, memutar semula julat had. Ia juga boleh digabungkan dengan isyarat penapis indikator lain.

Arah pengoptimuman strategi

Strategi ini juga boleh dioptimumkan dalam beberapa aspek:

  1. Menambah penghakiman indikator trend, mengelakkan perdagangan berlawanan arah. Contohnya menyertai MACD.
  2. Tambah metrik jumlah urus niaga untuk mengelakkan penembusan palsu. Contohnya, menyertai OBV.
  3. Mengoptimumkan parameter kitaran EMA, atau menggunakan EMA yang menyesuaikan diri.
  4. Parameter pengoptimuman dinamik kaedah pembelajaran mesin seperti model beg kata.
  5. Tambah ramalan model, set stop-loss penyesuaian.

ringkaskan

EMA Gold Cross-Return Strategi EMA Gold Cross-Return Strategi EMA Gold Cross-Return Strategi EMA Gold Cross-Return Strategi EMA Gold Cross-Return Strategi EMA Gold Cross-Return Strategi EMA Gold Cross-Return Strategi EMA Gold Cross-Return Strategi EMA Gold Cross-Return Strategi EMA Gold Cross-Return Strategi EMA Gold Cross-Return Strategi EMA Gold Cross-Return Strategi EMA Gold Cross-Return Strategi EMA Gold Cross-Return Strategi EMA Gold Cross-Return Strategi EMA Gold Cross-Return Strategi EMA Gold Cross-Return Strategi EMA Gold Cross-Return Strategi EMA Gold Cross-Return Strategi EMA Gold Cross-Return Strategi EMA Gold Cross-Return Strategi EMA Gold Cross-Return Strategi EMA Gold Cross-Return Strategi EMA Gold-Return Strategi EMA Gold-Return Strategi EMA Gold-Return Strategi EMA Gold-Return Strategi EMA Gold-Return Strategi EMA Gold-Return Strategi

Kod 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)





//