Aliran 5 minit mengikut strategi berdasarkan silang EMA pantas dan perlahan


Tarikh penciptaan: 2023-11-16 15:36:36 Akhirnya diubah suai: 2023-11-16 15:36:36
Salin: 0 Bilangan klik: 828
1
fokus pada
1617
Pengikut

Aliran 5 minit mengikut strategi berdasarkan silang EMA pantas dan perlahan

Gambaran keseluruhan

Strategi ini adalah sistem persilangan EMA pantas berdasarkan rangka masa 5 minit, menggabungkan pesanan harga terhad dan trend tangkap automatik yang mengesan hentian kerugian. Strategi ini sesuai untuk perdagangan trend garis pendek tengah, dengan penapisan EMA untuk menentukan arah trend keseluruhan, dan kemudian menggabungkan persilangan EMA pantas untuk menentukan masa masuk tertentu. Kelebihannya adalah bahawa penilaian trend tepat, dapat mengesan trend dengan berkesan; Kelemahannya adalah bahawa terdapat beberapa pecah palsu, mudah dibungkus.

Prinsip Strategi

  1. Gunakan EMA pantas dan EMA perlahan, lakukan lebih banyak apabila memakai EMA perlahan di atas EMA pantas, kosongkan semasa memakai EMA pantas
  2. Menggunakan penapis makro EMA, hanya boleh melakukan lebih banyak apabila harga berada di atas EMA dan kosong di bawah EMA, untuk mengelakkan penembusan palsu
  3. Gunakan harga terhad untuk memastikan harga mencapai kedudukan yang diingini.
  4. Selepas masuk, gunakan tracker dinamik untuk menghentikan kerugian, mengunci keuntungan, menghentikan kerugian dan keluar

Secara khusus:

  1. EMA pantas dikira berdasarkan panjang EMA pantas dan EMA perlahan
  2. Sekiranya penapis EMA diaktifkan, anda hanya boleh melakukan lebih banyak apabila harga lebih tinggi daripada EMA dan kosong apabila harga lebih rendah daripada EMA
  3. Apabila EMA cepat di atas EMA perlahan, buat lebih banyak; apabila EMA cepat di bawah EMA perlahan, buat kosong
  4. Tambahan tiket masuk dengan had bawah, tiket masuk dengan had atas
  5. Mulakan Tracking Stop Loss selepas masuk, Lacak, Hentikan dan Hentikan Stop Loss mengikut harga tertinggi yang berjalan

Ini adalah logik dasar dalam strategi ini.

Kelebihan Strategik

  1. Menggunakan EMA untuk menentukan arah trend keseluruhan dan mengelakkan dagangan berlawanan arah
  2. EMA cepat dan cepat dengan harga terhad, boleh mencegah kenaikan dan penurunan
  3. Tracking Stop Loss Dinamika, boleh mengunci keuntungan dengan baik
  4. Risiko dikendalikan, setiap stop loss ditetapkan pada kira-kira 2%
  5. Penarikan diri yang lebih kecil, trend yang lebih baik
  6. Strategi yang mudah difahami dan dioptimumkan

Risiko Strategik

  1. Terdapat beberapa risiko trend palsu yang mungkin terjejas.
  2. EMA yang tidak betul boleh menyebabkan trend yang terlewat
  3. Stop loss set terlalu besar, mungkin di luar julat turun naik normal
  4. Penghentian Pengesanan Terlalu Radikal, Kemungkinan Keluar Awal
  5. Penetapan stop loss dan stop loss yang tidak munasabah, mungkin terlepas peluang yang lebih besar

Kaedah pencegahan:

  1. Optimumkan parameter EMA untuk mencari panjang kitaran yang optimum
  2. Melepaskan markah hentian yang sesuai untuk mengelakkan hentian yang terlalu kerap
  3. Tetapan awal dan kelajuan pengesanan yang berhati-hati
  4. Uji kelayakan stop-loss yang berbeza untuk mencari parameter yang optimum

Arah pengoptimuman strategi

  1. Mengoptimumkan parameter kitaran EMA untuk mencari kombinasi parameter terbaik
  2. Cuba jenis EMA yang berbeza, seperti purata bergerak bertimbangan
  3. Uji MACD dan lain-lain untuk melihat apakah ia boleh meningkatkan keberkesanan
  4. Cuba saringan EMA pada jangka masa yang lebih tinggi
  5. Mengoptimumkan Julat Had Had Had
  6. Mengoptimumkan titik dan nisbah penghentian kerosakan
  7. Cubalah dengan cara yang lebih kompleks untuk mengesan dan menghentikan kerosakan.
  8. Menambah Indeks Trend untuk Menentukan Trend Kuat
  9. Pertimbangan untuk menambah lebih banyak penapis untuk mengelakkan penembusan palsu

ringkaskan

Strategi ini secara keseluruhannya adalah strategi yang sangat sesuai untuk perdagangan trend garis pendek, masa masuk EMA yang cepat dan perlahan, harga terhad untuk mengelakkan mengejar kenaikan dan penurunan, proses mengesan stop loss untuk mengunci keuntungan secara dinamik sangat jelas, logik, dan mudah dikendalikan. Dengan mengoptimumkan parameter tertentu, anda dapat meningkatkan lagi kemenangan dan keuntungan strategi. Sudah tentu, anda juga perlu berhati-hati untuk mencegah risiko seperti kitaran EMA yang tidak wajar, kehilangan terlalu kerap.

Kod sumber strategi
/*backtest
start: 2022-11-09 00:00:00
end: 2023-11-15 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="5 Minute EMA Strategy", overlay=true, max_bars_back=500, 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 = "    "

// Group Titles
group_one_title = "EMA Settings"
group_two_title = "Entry Settings"
group_three_title = "Trade Filters"

// Input Tips

ocean_blue = color.new(#0C6090,0)
sky_blue = color.new(#00A5FF,0)
green = color.new(#2DBD85,0)
red = color.new(#E02A4A,0)
light_blue = color.new(#00A5FF,85)
light_green = color.new(#2DBD85,85)
light_red = color.new(#E02A4A,85)
light_yellow = color.new(#FFF900,85)
white = color.new(#ffffff,0)
light_gray = color.new(#000000,70)
transparent = color.new(#000000,100)

// Strategy Settings - EMA
fast_EMA_length = input.int(defval=20, minval=1, title="Fast Length", group=group_one_title)
fast_EMA_type = input.string(defval="EMA", options = ["EMA", "SMA", "RMA", "WMA"], title=indent_4+"Type", group=group_one_title)
fast_EMA_source = input.source(defval=close, title=indent_4+"Source", group=group_one_title)
fast_EMA = switch fast_EMA_type
    "EMA" => ta.ema(fast_EMA_source, fast_EMA_length)
    "SMA" => ta.sma(fast_EMA_source, fast_EMA_length)
    "RMA" => ta.rma(fast_EMA_source, fast_EMA_length)
    "WMA" => ta.wma(fast_EMA_source, fast_EMA_length)
    => na
plot(fast_EMA, title="Fast EMA", linewidth=1, color=green, editable=true)

slow_EMA_length = input.int(defval=100, minval=1, title="Slow Length", group=group_one_title)
slow_EMA_type = input.string(defval="EMA", options = ["EMA", "SMA", "RMA", "WMA"], title=indent_4+"Type", group=group_one_title)
slow_EMA_source = input.source(defval=close, title=indent_4+"Source", group=group_one_title)
slow_EMA = switch slow_EMA_type
    "EMA" => ta.ema(slow_EMA_source, slow_EMA_length)
    "SMA" => ta.sma(slow_EMA_source, slow_EMA_length)
    "RMA" => ta.rma(slow_EMA_source, slow_EMA_length)
    "WMA" => ta.wma(slow_EMA_source, slow_EMA_length)
    => na
plot(slow_EMA, title="Slow EMA", linewidth=1, color=sky_blue, editable=true)


// EMA Macro Filter
enable_EMA_filter = input.bool(defval=false, title="Use EMA Filter", group=group_three_title)
EMA_filter_timeframe = input.timeframe(defval="", title=indent_4+"Timeframe", group=group_three_title)
EMA_filter_length = input.int(defval=300, minval=1, step=10, title=indent_4+"Length", group=group_three_title)
EMA_filter_source = input.source(defval=hl2, title=indent_4+"Source", group=group_three_title)
ema_filter = ta.ema(EMA_filter_source, EMA_filter_length)
ema_filter_smoothed = request.security(syminfo.tickerid, EMA_filter_timeframe, ema_filter[barstate.isrealtime ? 1 : 0], gaps=barmerge.gaps_on)
plot(enable_EMA_filter ? ema_filter_smoothed: na, title="EMA Macro Filter", linewidth=2, color=white, editable=true)


// Entry Settings
stop_loss_val = input.float(defval=2.0, title="Stop Loss (%)", step=0.1, group=group_two_title)/100
take_profit_val = input.float(defval=2.0, title="Take Profit (%)", step=0.1, group=group_two_title)/100
long_entry_limit_lookback = input.int(defval=3, title="Long Entry Limit Lookback", minval=1, step=1, group=group_two_title)
short_entry_limit_lookback = input.int(defval=3, title="Short Entry Limit Lookback", minval=1, step=1, group=group_two_title)
limit_order_long_price = ta.lowest(low, long_entry_limit_lookback)
limit_order_short_price = ta.highest(high, short_entry_limit_lookback)
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
long_start_trailing_val = strategy.position_avg_price + (strategy.position_avg_price * start_trailing_after)
short_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/100))
short_trail_behind_val = close + (strategy.position_avg_price * (trail_behind/100))
currently_in_a_long_postion = strategy.position_size > 0
currently_in_a_short_postion = strategy.position_size < 0
long_profit_target = strategy.position_avg_price * (1 + take_profit_val)
long_stop_loss = strategy.position_avg_price * (1.0 - stop_loss_val)
short_profit_target = strategy.position_avg_price * (1 - take_profit_val)
short_stop_loss = strategy.position_avg_price * (1 + stop_loss_val)

bars_since_entry = bar_index - strategy.opentrades.entry_bar_index(strategy.opentrades - 1)
plot(bars_since_entry, editable=false, title="Bars Since Entry", color=green)

long_run_up = currently_in_a_long_postion and bars_since_entry > 0 ? ta.highest(high, bars_since_entry) : high
long_trailing_stop = currently_in_a_long_postion and bars_since_entry > 0 and long_run_up > long_start_trailing_val ? long_run_up - (long_run_up * trail_behind) : long_stop_loss
long_run_up_line = plot(long_run_up, style=plot.style_stepline, editable=false, color=currently_in_a_long_postion ? green : transparent)
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 = currently_in_a_short_postion and bars_since_entry > 0 ? ta.lowest(low, bars_since_entry) : low
short_trailing_stop = currently_in_a_short_postion and bars_since_entry > 0 and short_run_up < short_start_trailing_val ? short_run_up + (short_run_up * trail_behind) : short_stop_loss
// short_run_up_line = plot(short_run_up, style=plot.style_stepline, editable=false, color=currently_in_a_short_postion ? green : transparent)
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)


// Trade Conditions
fast_EMA_cross_down_slow_EMA = ta.crossunder(fast_EMA,slow_EMA)
fast_EMA_cross_up_slow_EMA = ta.crossover(fast_EMA,slow_EMA)
plotshape(fast_EMA_cross_down_slow_EMA ? close : na, title="Short Entry Symbol", color=red, style=shape.triangledown, location=location.belowbar)
plotshape(fast_EMA_cross_up_slow_EMA ? close : na, title="Long Entry Symbol", color=green, style=shape.triangleup, location=location.abovebar)
fast_EMA_is_above_slow_EMA = fast_EMA > slow_EMA
fast_EMA_is_below_slow_EMA = fast_EMA < slow_EMA
ema_macro_filter_longs_only = fast_EMA > ema_filter_smoothed and slow_EMA > ema_filter_smoothed
ema_macro_filter_shorts_only = fast_EMA < ema_filter_smoothed and slow_EMA < ema_filter_smoothed

long_position_take_profit = ta.cross(close, long_trailing_stop) or close > long_profit_target
short_position_take_profit = ta.cross(close, short_trailing_stop) or close > short_profit_target

long_conditions_met = enable_EMA_filter ? ema_macro_filter_longs_only and fast_EMA_cross_up_slow_EMA and fast_EMA_is_above_slow_EMA and not currently_in_a_short_postion : fast_EMA_cross_up_slow_EMA and not currently_in_a_short_postion
short_conditions_met = enable_EMA_filter ? ema_macro_filter_shorts_only and fast_EMA_cross_down_slow_EMA and fast_EMA_is_below_slow_EMA and not currently_in_a_long_postion : fast_EMA_cross_down_slow_EMA and fast_EMA_is_below_slow_EMA and not currently_in_a_long_postion

// Long Entry
strategy.entry(id="Long", direction=strategy.long, limit=limit_order_long_price, when=long_conditions_met)
strategy.cancel(id="Cancel Long", when=ta.crossover(fast_EMA,slow_EMA))
strategy.exit(id="Close Long", from_entry="Long", stop=long_trailing_stop, limit=long_profit_target, when=long_position_take_profit)

// Short Entry 
strategy.entry(id="Short", direction=strategy.short, limit=limit_order_short_price, when=short_conditions_met)
strategy.cancel(id="Cancel Short", when=ta.crossunder(fast_EMA,slow_EMA))
strategy.exit(id="Close Short", from_entry="Short", stop=short_trailing_stop, limit=short_profit_target, when=short_position_take_profit)

entry = plot(strategy.position_avg_price, editable=false, title="Entry", style=plot.style_stepline, color=currently_in_a_long_postion or currently_in_a_short_postion ? color.blue : transparent, linewidth=1)
fill(entry,long_trailing_stop_line, editable=false, color=currently_in_a_long_postion ? long_trailing_stop > strategy.position_avg_price ? light_green : light_red : transparent)
fill(entry,short_trailing_stop_line, editable=false, color=currently_in_a_short_postion ? short_trailing_stop < strategy.position_avg_price ? light_green : light_red : transparent)
//ltp = plot(currently_in_a_long_postion ? long_profit_target : na, style=plot.style_stepline, title="Take Profit", color=currently_in_a_long_postion ? green : transparent, linewidth=1)
//lsl = plot(currently_in_a_long_postion ? long_stop_loss : na, style=plot.style_stepline, title="Take Profit", color=currently_in_a_long_postion ? red : transparent, linewidth=1)
//fill(entry,ltp, color= currently_in_a_long_postion ? light_green : light_red)
//fill(entry,lsl, color= currently_in_a_long_postion ? light_red : light_green)

//stp = plot(currently_in_a_short_postion ? short_profit_target : na, style=plot.style_stepline, title="Take Profit", color=currently_in_a_short_postion ? green : transparent, linewidth=1)
//ssl = plot(currently_in_a_short_postion ? short_stop_loss : na, style=plot.style_stepline, title="Take Profit", color=currently_in_a_short_postion ? red : transparent, linewidth=1)
//fill(entry,stp, color= currently_in_a_short_postion ? light_green : light_red)
//fill(entry,ssl, color= currently_in_a_short_postion ? light_red : light_green)