Tren Penembusan Tinggi Kemarin Mengikuti Strategi

Penulis:ChaoZhang, Tanggal: 2023-10-08 14:06:55
Tag:

Gambaran umum

Strategi ini beroperasi berdasarkan pada puncak hari perdagangan sebelumnya, bekerja dalam mode trend-mengikuti.

Logika Strategi

  1. Gunakan fungsi LucF untuk menghindari bias di backtesting.

  2. Mengidentifikasi apakah hari perdagangan baru dibuka. Catat hari tertinggi max_today dan rendah min_today.

  3. Bandingkan maksimum saat ini dengan max_today, update max_today jika melebihi.

  4. Bandingkan low saat ini dengan min_today, update min_today jika melanggar.

  5. Menggambar hari perdagangan sebelumnya tingkat tinggi dan rendah.

  6. Tetapkan titik masuk pada titik tinggi hari sebelumnya, GAP dapat ditambahkan untuk memajukan atau menunda masuk.

  7. Setel stop loss persentase sl dan mengambil keuntungan persentase tp.

  8. Pergi panjang ketika harga menembus hari perdagangan sebelumnya.

  9. Tetapkan harga stop loss dan ambil harga profit.

  10. Opsional mengaktifkan trailing stop loss, dengan tingkat aktivasi dan jarak offset.

  11. Opsional menutup perdagangan berdasarkan EMA crossover.

Analisis Keuntungan

Strategi yang sederhana ini memiliki keuntungan berikut:

  1. Generasi sinyal yang jelas dan mudah diterapkan.

  2. Penembusan dari hari sebelumnya memberikan konfirmasi tren, mengurangi whipsaws.

  3. Parameter GAP memungkinkan penyesuaian sensitivitas masuk.

  4. Risiko keseluruhan dikendalikan dengan stop loss yang jelas.

  5. Trailing stop bisa digunakan untuk mengunci lebih banyak keuntungan.

  6. EMA crossover menghindari terjebak dalam downtrends.

Analisis Risiko

Ada beberapa risiko yang perlu diperhatikan:

  1. Kegagalan melarikan diri dapat menyebabkan kerugian.

  2. Membutuhkan tren pasar, kemungkinan Whipsaws dalam kondisi yang berbeda.

  3. Penghentian yang tidak tepat dapat dihentikan lebih awal.

  4. Pilihan parameter EMA yang buruk dapat membuatnya terlalu sensitif atau tertinggal.

  5. Beberapa variabel perlu disesuaikan seperti GAP, stop loss, trailing stop dll.

Peluang Peningkatan

Beberapa cara untuk lebih mengoptimalkan strategi:

  1. Menggunakan stop loss dinamis berdasarkan ATR atau tren.

  2. Tambahkan filter untuk penyemburan yang valid menggunakan standar deviasi.

  3. Tambahkan kondisi volatilitas untuk menghindari kebocoran palsu di pasar bergolak.

  4. Optimalkan parameter EMA untuk sinyal yang lebih kuat.

  5. Perbaiki parameter trailing stop agar sesuai dengan volatilitas pasar.

  6. Uji ketahanan parameter pada instrumen yang berbeda.

  7. Tambahkan mekanisme ukuran posisi dinamis.

Kesimpulan

Strategi ini sederhana dan praktis sebagai sistem trend berikut yang khas berdasarkan breakout tinggi hari sebelumnya. Manajemen risiko tergantung pada stop loss terutama. Dengan penyesuaian parameter yang tepat, itu dapat berkinerja baik dalam kondisi tren. Tetapi stop loss dan filter yang tepat diperlukan untuk menghindari whipsaws. Kerangka kerja dapat ditingkatkan lebih lanjut sebagai dasar untuk strategi trend berikut.


/*backtest
start: 2023-09-30 00:00:00
end: 2023-10-07 00:00:00
period: 15m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
// © TheSocialCryptoClub

//@version=5

strategy("Yesterday's High", overlay=true, pyramiding = 1,
         initial_capital=10000, 
         default_qty_type=strategy.percent_of_equity, default_qty_value=10,
         slippage=1, backtest_fill_limits_assumption=1, use_bar_magnifier=true,
         commission_type=strategy.commission.percent, commission_value=0.075
         )

// -----------------------------------------------------------------------------
// ROC Filter
// -----------------------------------------------------------------------------

// f_security function by LucF for PineCoders available here: https://www.tradingview.com/script/cyPWY96u-How-to-avoid-repainting-when-using-security-PineCoders-FAQ/
f_security(_sym, _res, _src, _rep) => request.security(_sym, _res, _src[not _rep and barstate.isrealtime ? 1 : 0])[_rep or barstate.isrealtime ? 0 : 1]
high_daily = f_security(syminfo.tickerid, "D", high, false)

roc_enable = input.bool(false, "", group="ROC Filter from CloseD", inline="roc")
roc_threshold = input.float(1, "Treshold", step=0.5, group="ROC Filter from CloseD", inline="roc")

closed = f_security(syminfo.tickerid,"1D",close, false)
roc_filter= roc_enable ? (close-closed)/closed*100  > roc_threshold  : true


// -----------------------------------------------------------------------------
// Trigger Point 
// -----------------------------------------------------------------------------

open_session = ta.change(time('D'))
price_session = ta.valuewhen(open_session, open, 0)
tf_session = timeframe.multiplier <= 60

bgcolor(open_session and tf_session ?color.new(color.blue,80):na, title = "Session")

first_bar = 0
if open_session
    first_bar := bar_index

var max_today = 0.0
var min_today = 0.0
var high_daily1 = 0.0
var low_daily1 = 0.0
var today_open = 0.0

if first_bar
    high_daily1 := max_today
    low_daily1 := min_today
    today_open := open
    max_today := high
    min_today := low


if high >= max_today
    max_today := high

if low < min_today
    min_today := low


same_day  = today_open == today_open[1]

plot( timeframe.multiplier <= 240 and same_day ? high_daily1 : na, color= color.yellow , style=plot.style_linebr, linewidth=1, title='High line')
plot( timeframe.multiplier <= 240 and same_day ? low_daily1 : na, color= #E8000D , style=plot.style_linebr, linewidth=1, title='Low line')

// -----------------------------------------------------------------------------
// Strategy settings 
// -----------------------------------------------------------------------------

Gap = input.float(1,"Gap%", step=0.5, tooltip="Gap di entrata su entry_price -n anticipa entrata, con +n posticipa entrata", group = "Entry")
Gap2 = (high_daily1 * Gap)/100

sl  = input.float(3, "Stop-loss", step= 0.5,  group = "Entry")
tp  = input.float(9, "Take-profit", step= 0.5, group = "Entry")
stop_loss_price = strategy.position_avg_price * (1-sl/100)
take_price = strategy.position_avg_price * (1+tp/100)

sl_trl = input.float(2, "Trailing-stop", step = 0.5, tooltip = "Attiva trailing stop dopo che ha raggiunto...",group = "Trailing Stop Settings")//group = "Trailing Stop Settings")
Atrl= input.float(1, "Offset Trailing", step=0.5,tooltip = "Distanza dal prezzo", group = "Trailing Stop Settings")
stop_trl_price_cond = sl_trl * high/syminfo.mintick/100
stop_trl_price_offset_cond = Atrl * high/syminfo.mintick/100

stop_tick = sl * high/syminfo.mintick/100
profit_tick = tp * high/syminfo.mintick/100

mess_buy = "buy"
mess_sell = "sell"

// -----------------------------------------------------------------------------
// Entry - Exit - Close
// -----------------------------------------------------------------------------

if close < high_daily1 and roc_filter
    strategy.entry("Entry", strategy.long, stop = high_daily1 + (Gap2), alert_message = mess_buy)

ts_n  = input.bool(true, "Trailing-stop", tooltip = "Attiva o disattiva trailing-stop", group = "Trailing Stop Settings")
close_ema = input.bool(false, "Close EMA", tooltip = "Attiva o disattiva chiusura su EMA", group = "Trailing Stop Settings")
len1 = input.int(10, "EMA length", step=1, group = "Trailing Stop Settings")
ma1 = ta.ema(close, len1)

plot(ma1, title='EMA', color=color.new(color.yellow, 0))

if ts_n == true
    strategy.exit("Trailing-Stop","Entry",loss= stop_tick, stop= stop_loss_price, limit= take_price, trail_points = stop_trl_price_cond, trail_offset = stop_trl_price_offset_cond, comment_loss="Stop-Loss!!",comment_profit ="CASH!!", comment_trailing = "TRL-Stop!!", alert_message = mess_sell)
else
    strategy.exit("TP-SL", "Entry",loss= stop_tick, stop=stop_loss_price, limit= take_price, comment_loss= "Stop-loss!!!", comment_profit = "CASH!!", alert_message = mess_sell)

if close_ema == true and ta.crossunder(close,ma1)
    strategy.close("Entry",comment = "Close" , alert_message = mess_sell)



Lebih banyak