Strategi Perdagangan Pulangan Min EMA


Tarikh penciptaan: 2023-10-26 15:33:50 Akhirnya diubah suai: 2023-10-26 15:33:50
Salin: 2 Bilangan klik: 1006
1
fokus pada
1617
Pengikut

Strategi Perdagangan Pulangan Min EMA

Gambaran keseluruhan

EMA adalah strategi perdagangan yang menggunakan perbezaan peratusan jarak EMA dari harga semasa sebagai isyarat pembukaan kedudukan dan menggunakan tracking stop loss untuk menguruskan kedudukan.

Prinsip Strategi

Strategi ini menggunakan EMA sebagai penunjuk garis rata-rata dan mengira peratusan perbezaan harga semasa dari EMA. Apabila harga cukup jauh dari EMA (default 9%), ia akan membuka lebih banyak kedudukan; apabila harga cukup dekat dengan EMA (default 1%), ia akan menutup. Selepas membuka kedudukan, ia akan menggunakan stop loss operasi untuk mengunci keuntungan, dan menaikkan garis stop loss secara beransur-ansur apabila keuntungan meningkat.

Secara khusus, strategi ini merangkumi komponen-komponen berikut:

  1. Hitung garis rata-rata EMA. Periode boleh dikonfigurasi (default 200), sumber data (harga penutupan), cara pengiraan (EMA, SMA, RMA, WMA).

  2. Hitung peratusan perbezaan harga semasa dari EMA. Perhatikan pengendalian nilai positif negatif.

  3. Berdasarkan perkadaran jurang membuka kedudukan. Membuka lebih banyak kedudukan adalah 9% (boleh dikonfigurasi), membuka kosong kedudukan adalah 9% (boleh dikonfigurasi).

  4. Menyokong tangga terbuka. Anda boleh mengkonfigurasi bilangan tangga tangga dan setiap tahap tangga.

  5. Tracking stop loss selepas membuka kedudukan. Anda boleh mengkonfigurasi had untuk memulakan stop loss (default profit 1%) dan amplitudo tracking (default 1%)

  6. Berdasarkan perkadaran jurang kedudukan rata. Multiposisi kedudukan rata terhad adalah 1% (boleh dikonfigurasi), kedudukan kosong sama.

  7. Pembatalan pesanan yang belum selesai. Apabila harga kembali mendekati EMA, pesanan yang belum selesai akan dibatalkan.

  8. Peratusan Stop Loss yang boleh dikonfigurasi.

  9. Membantu pengesanan semula dan transaksi dalam masa nyata.

Analisis kelebihan

Strategi ini mempunyai kelebihan berikut:

  1. Menggunakan konsep pulangan garis rata-rata, membuka kedudukan apabila harga keluar dari garis rata-rata, meletakkan kedudukan kosong ketika kembali, sesuai dengan teori perdagangan trend.

  2. Parameter bukaan, hentian, dan penutupan boleh dikonfigurasi dengan teliti untuk menyesuaikan diri dengan keadaan pasaran yang berbeza.

  3. Teras boleh dibina secara berturut-turut, mengurangkan kos tunggal.

  4. Stop loss boleh mengunci keuntungan dan menguruskan risiko.

  5. Ruang pengoptimuman yang luas, anda boleh menyesuaikan parameter garis purata atau bukaan jarak kedudukan yang bersih untuk menyesuaikan diri dengan keadaan yang berbeza.

  6. Ia menyokong bahasa pengaturcaraan utama, Pine Script, yang boleh digunakan secara langsung di TradingView.

  7. Ia juga boleh digunakan untuk memaparkan grafik yang mudah untuk dilihat dan dianalisis.

Analisis risiko

Strategi ini juga mempunyai risiko:

  1. Risiko penyesuaian data tinjauan. Pengoptimuman parameter mungkin terlalu banyak penyesuaian data tinjauan, dan keberkesanan cakera hidup diragukan.

  2. Risiko kegagalan garis rata-rata. Harga mungkin jauh dari garis rata-rata untuk jangka masa yang lama dan tidak dapat kembali.

  3. Hentikan kerugian yang dikejar melalui risiko. Pergerakan yang teruk, titik hentikan kerugian mungkin akan ditembusi.

  4. Perdagangan yang kerap dan kos yang tinggi.

  5. Ia memerlukan kitaran pemerhatian yang lebih lama, dan kesan kejadian yang tidak dijangka adalah besar.

Pengurusan risiko:

  1. Lebih banyak penyesuaian parameter untuk memastikan parameter yang stabil.

  2. Tempoh linear yang munasabah, tidak boleh terlalu pendek atau terlalu panjang.

  3. Melepaskan Stop Loss yang sesuai untuk mengelakkan penangkapan.

  4. Mempermudahkan syarat untuk membuka kedudukan dan mengurangkan kekerapan dagangan.

  5. Ia juga akan membantu meningkatkan keupayaan untuk beradaptasi dengan keadaan kecemasan.

Arah pengoptimuman

Strategi ini boleh dioptimumkan dengan:

  1. Menambah syarat penapisan seperti jumlah dagangan, Brinks, RSI dan lain-lain untuk mengurangkan isyarat palsu.

  2. Menambah garis purata komposit, seperti sistem EMA berganda, meningkatkan kebarangkalian perdagangan berlawanan arah.

  3. Mengoptimumkan strategi henti kerugian, seperti hentian beradaptasi, Keluar Chandelier, dan sebagainya, untuk mengehadkan risiko.

  4. Tambah fungsi pengoptimuman parameter automatik untuk mencari kombinasi parameter yang lebih baik secara automatik.

  5. Menambah ramalan pembelajaran mesin untuk membantu menentukan kebarangkalian harga keluar dari garis purata.

  6. Pertimbangkan untuk berdagang di seluruh tempoh masa, menggunakan maklumat malam atau pra-set.

  7. Integrasi kolam saham, pilihan dan perdagangan automatik, dan peningkatan kapasiti strategi.

ringkaskan

Strategi EMA adalah strategi pengesanan trend berdasarkan ciri-ciri pengesanan garis rata harga. Ia menggunakan ciri-ciri statistik garis rata untuk menilai pembalikan trend dan mengawal risiko dengan menghentikan kerugian. Berbanding dengan strategi perdagangan garis rata tradisional, ia lebih memberi tumpuan kepada pengesanan berhenti yang dinamik, dan bukan kedudukan kosong yang terbuka. Strategi ini dapat memperkaya portofolio strategi pengesanan trend, tetapi perlu memperhatikan masalah pengoptimuman dan mengawal frekuensi perdagangan.

Kod sumber strategi
/*backtest
start: 2022-10-19 00:00:00
end: 2023-10-25 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/
// © jordanfray

//@version=5
strategy(title="EMA Mean Reversion Strategy", overlay=true, max_bars_back=5000, default_qty_type=strategy.percent_of_equity, default_qty_value=100,initial_capital=100000, commission_type=strategy.commission.percent, commission_value=0.05, backtest_fill_limits_assumption=2)


// Indenting Classs
indent_1 = " "
indent_2 = "  "
indent_3 = "   "
indent_4 = "    "


// Tooltips
longEntryToolTip = "When the percentage that the price is away from the selected EMA reaches this point, a long postion will open."
shortEntryToolTip = "When the percentage that the price is away from the selected EMA reaches this point, a short postion will open."
closeEntryToolTip = "When the percentage that the price is away from the selected EMA reaches this point, open postion will close."
ladderInToolTip = "Enable this to use the laddering settings below."
cancelEntryToolTip = "When the percentage that the price is away from the selected EMA reaches this point, any unfilled entries will be canceled."

// Group Titles
group_one_title = "EMA Settings"
group_two_title = "Entry Settings"


// Colors
blue = color.new(#00A5FF,0)
lightBlue = color.new(#00A5FF,90)
green = color.new(#2DBD85,0)
gray_80 =  color.new(#7F7F7F,80)
gray_60 =  color.new(#7F7F7F,60)
gray_40 =  color.new(#7F7F7F,40)
white = color.new(#ffffff,0)
red = color.new(#E02A4A,0)
transparent = color.new(#000000,100)


// Strategy Settings
EMAtimeframe = input.timeframe(defval="", title="Timeframe", group=group_one_title)
EMAlength = input.int(defval=200, minval=1, title="Length", group=group_one_title)
EMAtype = input.string(defval="EMA", options = ["EMA", "SMA", "RMA", "WMA"], title="Type", group=group_one_title)
EMAsource = input.source(defval=close, title="Source", group=group_one_title)

openLongEntryAbove = input.float(defval=9, title="Long Position Entry Trigger", tooltip=longEntryToolTip, group=group_two_title)
openEntryEntryAbove = input.float(defval=9, title="Short Position Entry Trigger", tooltip=shortEntryToolTip, group=group_two_title)
closeEntryBelow = input.float(defval=1.0, title="Close Position Trigger", tooltip=closeEntryToolTip, group=group_two_title)
cancelEntryBelow = input.float(defval=4, title="Cancel Unfilled Entries Trigger", tooltip=cancelEntryToolTip, group=group_two_title)

enableLaddering = input.bool(defval=true, title="Ladder Into Positions", tooltip=ladderInToolTip, group=group_two_title)
ladderRungs = input.int(defval=4, minval=2, maxval=4, step=1, title=indent_4+"Ladder Rungs", group=group_two_title)
ladderStep = input.float(defval=.5, title=indent_4+"Ladder Step (%)", step=.1, group=group_two_title)/100
stop_loss_val = input.float(defval=4.0, title="Stop Loss (%)", step=0.1, group=group_two_title)/100
start_trailing_after = input.float(defval=1, title="Start Trailing After (%)", step=0.1, group=group_two_title)/100
trail_behind = input.float(defval=1, title="Trail Behind (%)", step=0.1, group=group_two_title)/100

// Calculate trailing stop values
long_start_trailing_val = strategy.position_avg_price + (strategy.position_avg_price * start_trailing_after)
long_trail_behind_val = close - (strategy.position_avg_price * trail_behind)
long_stop_loss = strategy.position_avg_price * (1.0 - stop_loss_val)
short_start_trailing_val = strategy.position_avg_price - (strategy.position_avg_price * start_trailing_after)
short_trail_behind_val = close + (strategy.position_avg_price * trail_behind)
short_stop_loss = strategy.position_avg_price * (1 + stop_loss_val)


// Calulate EMA
EMA = switch EMAtype
    "EMA" => ta.ema(EMAsource, EMAlength)
    "SMA" => ta.sma(EMAsource, EMAlength)
    "RMA" => ta.rma(EMAsource, EMAlength)
    "WMA" => ta.wma(EMAsource, EMAlength)
    => na
EMA_ = EMAtimeframe == timeframe.period ? EMA : request.security(syminfo.ticker, EMAtimeframe, EMA[1], lookahead = barmerge.lookahead_on)
plot(EMA_, title="EMA", linewidth=2, color=blue, editable=true)

EMA_cloud_upper_band_val = EMA_ + (EMA_ * openLongEntryAbove/100)
EMA_cloud_lower_band_val = EMA_ - (EMA_ * openLongEntryAbove/100)
EMA_cloud_upper_band = plot(EMA_cloud_upper_band_val, title="EMA Cloud Upper Band", color=blue)
EMA_cloud_lower_band = plot(EMA_cloud_lower_band_val, title="EMA Cloud Upper Band", color=blue)
fill(EMA_cloud_upper_band, EMA_cloud_lower_band, editable=false, color=lightBlue)

distance_from_EMA = ((close - EMA_)/close)*100
if distance_from_EMA < 0
    distance_from_EMA := distance_from_EMA * -1

// Calulate Ladder Entries
long_ladder_1_limit_price = close - (close * 1 * ladderStep)
long_ladder_2_limit_price = close - (close * 2 * ladderStep)
long_ladder_3_limit_price = close - (close * 3 * ladderStep)
long_ladder_4_limit_price = close - (close * 4 * ladderStep)

short_ladder_1_limit_price = close + (close * 1 * ladderStep)
short_ladder_2_limit_price = close + (close * 2 * ladderStep)
short_ladder_3_limit_price = close + (close * 3 * ladderStep)
short_ladder_4_limit_price = close + (close * 4 * ladderStep)

var position_qty = strategy.equity/close
if enableLaddering
    position_qty := (strategy.equity/close) / ladderRungs
else
    position_qty := strategy.equity/close
    
plot(position_qty, color=white)
//plot(strategy.equity, color=green)

// Entry Conditions
currently_in_a_postion = strategy.position_size != 0
currently_in_a_long_postion = strategy.position_size > 0
currently_in_a_short_postion = strategy.position_size < 0
average_price = strategy.position_avg_price

bars_since_entry = currently_in_a_postion ? bar_index - strategy.opentrades.entry_bar_index(strategy.opentrades - 1) + 1 : 5
long_run_up = ta.highest(high, bar_index == 0 ? 5000: bars_since_entry)
long_run_up_line = plot(long_run_up, style=plot.style_stepline, editable=false, color=currently_in_a_long_postion ? green : transparent)
start_trailing_long_entry = currently_in_a_long_postion and long_run_up > long_start_trailing_val
long_trailing_stop = start_trailing_long_entry ? long_run_up - (long_run_up * trail_behind) : long_stop_loss
long_trailing_stop_line = plot(long_trailing_stop, style=plot.style_stepline, editable=false, color=currently_in_a_long_postion ? long_trailing_stop > strategy.position_avg_price ? green : red : transparent)

short_run_up = ta.lowest(low, bar_index == 0 ? 5000: bars_since_entry)
short_run_up_line = plot(short_run_up, style=plot.style_stepline, editable=false, color=currently_in_a_short_postion ? green : transparent)
start_trailing_short_entry = currently_in_a_short_postion and short_run_up < short_start_trailing_val
short_trailing_stop = start_trailing_short_entry ? short_run_up + (short_run_up * trail_behind) : short_stop_loss
short_trailing_stop_line = plot(short_trailing_stop, style=plot.style_stepline, editable=false, color=currently_in_a_short_postion ? short_trailing_stop < strategy.position_avg_price ? green : red : transparent)

long_conditions_met = distance_from_EMA > openLongEntryAbove and close < EMA_ and not currently_in_a_postion
short_conditions_met = distance_from_EMA > openEntryEntryAbove and close > EMA_ and not currently_in_a_postion
close_long_entries = distance_from_EMA <= closeEntryBelow or close <= long_trailing_stop
close_short_entries = distance_from_EMA <= closeEntryBelow or close >= short_trailing_stop
cancel_entries = distance_from_EMA <= cancelEntryBelow

plotshape(long_conditions_met ? close : na, style=shape.diamond, title="Long Conditions Met" )
plotshape(short_conditions_met ? close : na, style=shape.diamond, title="Short Conditions Met" )
plot(average_price,style=plot.style_stepline, editable=false, color=currently_in_a_postion ? blue : transparent)

// Long Entry
if enableLaddering
    if ladderRungs == 2
        strategy.entry(id="Long Ladder 1", direction=strategy.long, qty=position_qty, limit=long_ladder_1_limit_price, when=long_conditions_met)
        strategy.entry(id="Long Ladder 2", direction=strategy.long, qty=position_qty, limit=long_ladder_2_limit_price, when=long_conditions_met)
    else if ladderRungs == 3
        strategy.entry(id="Long Ladder 1", direction=strategy.long, qty=position_qty, limit=long_ladder_1_limit_price, when=long_conditions_met)
        strategy.entry(id="Long Ladder 2", direction=strategy.long, qty=position_qty, limit=long_ladder_2_limit_price, when=long_conditions_met)
        strategy.entry(id="Long Ladder 3", direction=strategy.long, qty=position_qty, limit=long_ladder_3_limit_price, when=long_conditions_met)
    else if ladderRungs == 4
        strategy.entry(id="Long Ladder 1", direction=strategy.long, qty=position_qty, limit=long_ladder_1_limit_price, when=long_conditions_met)
        strategy.entry(id="Long Ladder 2", direction=strategy.long, qty=position_qty, limit=long_ladder_2_limit_price, when=long_conditions_met)
        strategy.entry(id="Long Ladder 3", direction=strategy.long, qty=position_qty, limit=long_ladder_3_limit_price, when=long_conditions_met)
        strategy.entry(id="Long Ladder 4", direction=strategy.long, qty=position_qty, limit=long_ladder_4_limit_price, when=long_conditions_met)
    
    strategy.exit(id="Close Long Ladder 1", from_entry="Long Ladder 1", stop=long_trailing_stop, limit=long_trailing_stop, when=close_long_entries)
    strategy.exit(id="Close Long Ladder 2", from_entry="Long Ladder 2", stop=long_trailing_stop, limit=long_trailing_stop, when=close_long_entries)
    strategy.exit(id="Close Long Ladder 3", from_entry="Long Ladder 3", stop=long_trailing_stop, limit=long_trailing_stop, when=close_long_entries)
    strategy.exit(id="Close Long Ladder 4", from_entry="Long Ladder 4", stop=long_trailing_stop, limit=long_trailing_stop, when=close_long_entries)
    
    strategy.cancel(id="Long Ladder 1", when=cancel_entries)
    strategy.cancel(id="Long Ladder 2", when=cancel_entries)
    strategy.cancel(id="Long Ladder 3", when=cancel_entries)
    strategy.cancel(id="Long Ladder 4", when=cancel_entries)
else
    strategy.entry(id="Long", direction=strategy.long, qty=100, when=long_conditions_met)
    strategy.exit(id="Close Long", from_entry="Long", stop=long_stop_loss, limit=EMA_, when=close_long_entries)
    strategy.cancel(id="Long", when=cancel_entries)

// Short Entry
if enableLaddering
    if ladderRungs == 2
        strategy.entry(id="Short Ladder 1", direction=strategy.short, qty=position_qty, limit=short_ladder_1_limit_price, when=short_conditions_met)
        strategy.entry(id="Short Ladder 2", direction=strategy.short, qty=position_qty, limit=short_ladder_2_limit_price, when=short_conditions_met)
    else if ladderRungs == 3
        strategy.entry(id="Short Ladder 1", direction=strategy.short, qty=position_qty, limit=short_ladder_1_limit_price, when=short_conditions_met)
        strategy.entry(id="Short Ladder 2", direction=strategy.short, qty=position_qty, limit=short_ladder_2_limit_price, when=short_conditions_met)
        strategy.entry(id="Short Ladder 3", direction=strategy.short, qty=position_qty, limit=short_ladder_3_limit_price, when=short_conditions_met)
    else if ladderRungs == 4
        strategy.entry(id="Short Ladder 1", direction=strategy.short, qty=position_qty, limit=short_ladder_1_limit_price, when=short_conditions_met)
        strategy.entry(id="Short Ladder 2", direction=strategy.short, qty=position_qty, limit=short_ladder_2_limit_price, when=short_conditions_met)
        strategy.entry(id="Short Ladder 3", direction=strategy.short, qty=position_qty, limit=short_ladder_3_limit_price, when=short_conditions_met)
        strategy.entry(id="Short Ladder 4", direction=strategy.short, qty=position_qty, limit=short_ladder_4_limit_price, when=short_conditions_met)
    
    strategy.exit(id="Close Short Ladder 1", from_entry="Short Ladder 1", stop=short_trailing_stop, limit=EMA_, when=close_short_entries)
    strategy.exit(id="Close Short Ladder 2", from_entry="Short Ladder 2", stop=short_trailing_stop, limit=EMA_, when=close_short_entries)
    strategy.exit(id="Close Short Ladder 3", from_entry="Short Ladder 3", stop=short_trailing_stop, limit=EMA_, when=close_short_entries)
    strategy.exit(id="Close Short Ladder 4", from_entry="Short Ladder 4", stop=short_trailing_stop, limit=EMA_, when=close_short_entries)
    
    strategy.cancel(id="Short Ladder 1", when=cancel_entries)
    strategy.cancel(id="Short Ladder 2", when=cancel_entries)
    strategy.cancel(id="Short Ladder 3", when=cancel_entries)
    strategy.cancel(id="Short Ladder 4", when=cancel_entries)
else
    strategy.entry(id="Short", direction=strategy.short, when=short_conditions_met)
    strategy.exit(id="Close Short", from_entry="Short", limit=EMA_, when=close_short_entries)
    strategy.cancel(id="Short", when=cancel_entries)