Strategi perdagangan pembalikan berdasarkan sokongan/rintangan yang luas


Tarikh penciptaan: 2023-10-30 11:23:25 Akhirnya diubah suai: 2023-10-30 11:23:25
Salin: 1 Bilangan klik: 668
1
fokus pada
1617
Pengikut

Strategi perdagangan pembalikan berdasarkan sokongan/rintangan yang luas

Gambaran keseluruhan

Strategi ini menggunakan perdagangan berbalik berdasarkan faktor ketumpatan indikator, sambil menetapkan faedah keuntungan sasaran. Inti faktor ketumpatan adalah bentuk pengembangan berdasarkan jumlah dagangan yang digunakan untuk indeks dengan jumlah dagangan yang tinggi dan turun naik. Kelebihan strategi adalah dapat menangkap peluang pembalikan trend jangka pendek dan menengah yang lebih besar, dan dapat memperoleh keuntungan dengan cepat; tetapi terdapat juga risiko terikat.

Prinsip Strategi

  1. Pengesanan sokongan / rintangan berdasarkan jumlah dagangan

    • Menggunakan bentuk K-Line untuk mengenal pasti sokongan / rintangan klasik, menapis penembusan palsu dengan jumlah dagangan yang lebih besar

    • Support/Resistance yang lebih luas dan lebih inklusif daripada format klasik

    • Penembusan sokongan definisi luas sebagai isyarat pelbagai faktor, penembusan rintangan definisi luas sebagai isyarat faktor kosong

  2. Perdagangan berbalik

    • Selepas isyarat faktor dihantar, lakukan operasi terbalik

    • Jika anda telah memegang kedudukan, anda boleh melakukan penurunan kedudukan terbalik atau membuka kedudukan terbalik.

  3. Tetapkan matlamat keuntungan

    • Tetapan stop loss mengikut ATR

    • Menetapkan 1R / 2R / 3R dan pelbagai matlamat mendapat faedah

    • Pengurangan saham secara berturut-turut selepas mencapai sasaran keuntungan yang berbeza

Analisis kelebihan

  • Kemerosotan yang lebih ketara dalam jangka pendek

Penembusan rintangan sokongan mewakili isyarat pembalikan trend yang lebih kuat, mempunyai kebolehpercayaan tertentu, dan dapat menangkap pembalikan yang lebih besar dalam jangka pendek.

  • Pendapatan Cepat, Pengunduran Kecil

Dengan menetapkan sasaran stop loss dan keuntungan bergilir, keuntungan cepat dapat dicapai dan pengurangan pengeluaran saham.

  • Berlaku untuk indeks yang mempunyai banyak dana institusi dan turun naik yang besar

Strategi ini bergantung kepada jumlah transaksi, memerlukan aliran dana institusi yang mencukupi untuk menyokong trend; dan memerlukan ruang turun naik untuk menghasilkan keuntungan.

Analisis risiko

  • Risiko terjebak dalam peristiwa gegaran

Operasi berhenti, keluar, dan masuk terbalik boleh menyebabkan penutupan yang kerap apabila keadaan tidak stabil.

  • Risiko kegagalan sokongan rintangan

Rintangan sokongan yang luas tidak boleh dipercayai sepenuhnya, terdapat kebarangkalian untuk membalikkan ujian kegagalan.

  • Risiko memegang jawatan secara sepihak

Strategi ini adalah pembalikan semata-mata, dan tanpa trend-tracking, anda mungkin terlepas peluang yang lebih besar.

  • Pengendalian angin

    • Syarat-syarat faktor untuk perdagangan reverse boleh dikurangkan dengan sewajarnya, tanpa perlu untuk membalikkan setiap penembusan

    • boleh digabungkan dengan penapis lain, seperti ketidaksamaan harga

    • Strategi menghentikan kerugian yang boleh dioptimumkan untuk mengurangkan kemungkinan terjebak

Arah pengoptimuman

  • Optimumkan parameter kaliber

Mengoptimumkan parameter ketahanan sokongan umum untuk mengenal pasti faktor yang lebih dipercayai

  • Optimumkan strategi keuntungan

Anda boleh menambah sasaran keuntungan yang lebih bertingkat atau menggunakan sasaran keuntungan yang tidak tetap.

  • Optimumkan strategi henti kerugian

Menyesuaikan parameter ATR atau menggunakan stop loss statistik untuk mengurangkan kos transaksi yang disebabkan oleh stop loss yang tidak perlu

  • Gabungan trend dan faktor lain

boleh memperkenalkan penilaian trend seperti garis rata-rata, untuk mengelakkan pertentangan serius dengan trend; juga boleh memperkenalkan faktor pembantu lain

ringkaskan

Inti strategi ini adalah untuk menggunakan perdagangan berbalik untuk menangkap turun naik yang lebih besar dalam jangka pendek. Strategi ini mudah dan mudah, dengan penyesuaian parameter, anda boleh mendapatkan kesan yang baik di papan. Tetapi strategi berbalik lebih radikal, terdapat risiko penarikan balik dan penyetempatan, anda perlu mengoptimumkan lagi strategi stop loss dan keuntungan, dan menggabungkan penilaian tren dengan betul untuk mengurangkan kerugian yang tidak perlu.

Kod sumber strategi
/*backtest
start: 2023-09-29 00:00:00
end: 2023-10-29 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/
// © DojiEmoji

//@version=5
strategy("Fractal Strat [KL] ", overlay=true, pyramiding=1, initial_capital=1000000000)
var string ENUM_LONG = "Long"
var string GROUP_ENTRY = "Entry"
var string GROUP_TSL = "Stop loss"
var string GROUP_TREND = "Trend prediction"
var string GROUP_ORDER = "Order size and Profit taking"

// backtest_timeframe_start = input.time(defval=timestamp("01 Apr 2000 13:30 +0000"), title="Backtest Start Time")
within_timeframe = true

// TSL: calculate the stop loss price. {
_multiple       = input(2.0, title="ATR Multiplier for trailing stop loss", group=GROUP_TSL)
ATR_TSL         = ta.atr(input(14, title="Length of ATR for trailing stop loss", group=GROUP_TSL, tooltip="Initial risk amount = atr(this length) x multiplier")) * _multiple
TSL_source      = low
TSL_line_color  = color.green
TSL_transp      = 100
var stop_loss_price = float(0)

var float initial_entry_p    = float(0)
var float risk_amt           = float(0)
var float initial_order_size = float(0)

if strategy.position_size == 0 or not within_timeframe
    TSL_line_color := color.black
    stop_loss_price := TSL_source - ATR_TSL
else if strategy.position_size > 0
    stop_loss_price := math.max(stop_loss_price, TSL_source - ATR_TSL)
    TSL_transp := 0

plot(stop_loss_price, color=color.new(TSL_line_color, TSL_transp))
// } end of "TSL" block


// Order size and profit taking {
pcnt_alloc = input.int(5, title="Allocation (%) of portfolio into this security", tooltip="Size of positions is based on this % of undrawn capital. This is fixed throughout the backtest period.", minval=0, maxval=100, group=GROUP_ORDER) / 100

// Taking profits at user defined target levels relative to risked amount (i.e 1R, 2R, 3R)
var bool  tp_mode = input(true, title="Take profit and different levels", group=GROUP_ORDER)
var float FIRST_LVL_PROFIT = input.float(1, title="First level profit", tooltip="Relative to risk. Example: entry at $10 and inital stop loss at $9. Taking first level profit at 1R means taking profits at $11", group=GROUP_ORDER)
var float SECOND_LVL_PROFIT = input.float(2, title="Second level profit", tooltip="Relative to risk. Example: entry at $10 and inital stop loss at $9. Taking second level profit at 2R means taking profits at $12", group=GROUP_ORDER)
var float THIRD_LVL_PROFIT = input.float(3, title="Third level profit", tooltip="Relative to risk. Example: entry at $10 and inital stop loss at $9. Taking third level profit at 3R means taking profits at $13", group=GROUP_ORDER)

// }

// Fractals {
// Modified from synapticEx's implementation: https://www.tradingview.com/script/cDCNneRP-Fractal-Support-Resistance-Fixed-Volume-2/

rel_vol_len = 6 // Relative volume is used; the middle candle has to have volume above the average (say sma over prior 6 bars)
rel_vol = ta.sma(volume, rel_vol_len)
_up = high[3]>high[4] and high[4]>high[5] and high[2]<high[3] and high[1]<high[2] and volume[3]>rel_vol[3]
_down = low[3]<low[4] and low[4]<low[5] and low[2]>low[3] and low[1]>low[2] and volume[3]>rel_vol[3]

fractal_resistance = high[3], fractal_support = low[3]   // initialize

fractal_resistance :=  _up ? high[3] : fractal_resistance[1]
fractal_support := _down ? low[3] : fractal_support[1]

plot(fractal_resistance, "fractal_resistance", color=color.new(color.red,50), linewidth=2, style=plot.style_cross, offset =-3, join=false)
plot(fractal_support, "fractal_support", color=color.new(color.lime,50), linewidth=2, style=plot.style_cross, offset=-3, join=false)
// }

// ATR diversion test {
// Hypothesis testing (2-tailed):
//
// Null hypothesis (H0) and Alternative hypothesis (Ha):
//     H0 : atr_fast equals atr_slow
//     Ha : atr_fast not equals to atr_slow; implies atr_fast is either too low or too high
len_fast    = input(5,title="Length of ATR (fast) for diversion test", group=GROUP_ENTRY)
atr_fast    = ta.atr(len_fast)
atr_slow    = ta.atr(input(50,title="Length of ATR (slow) for diversion test", group=GROUP_ENTRY, tooltip="This needs to be larger than Fast"))

// Calculate test statistic (test_stat)
std_error   = ta.stdev(ta.tr, len_fast) / math.pow(len_fast, 0.5)
test_stat = (atr_fast - atr_slow) / std_error

// Compare test_stat against critical value defined by user in settings
//critical_value = input.float(1.645,title="Critical value", tooltip="Strategy uses 2-tailed test to compare atr_fast vs atr_slow. Null hypothesis (H0) is that both should equal. Based on the computed test statistic value, if absolute value of it is +/- this critical value, then H0 will be rejected.", group=GROUP_ENTRY)
conf_interval = input.string(title="Confidence Interval", defval="95%", options=["90%","95%","99%"], tooltip="Critical values of 1.645, 1.96, 2.58, for CI=90%/95%/99%, respectively; Under 2-tailed test to compare atr_fast vs atr_slow. Null hypothesis (H0) is that both should equal. Based on the computed test statistic value, if absolute value of it is +/- critical value, then H0 will be rejected.")
critical_value = conf_interval == "90%" ? 1.645 : conf_interval == "95%" ? 1.96 : 2.58
reject_H0_lefttail = test_stat < -critical_value
reject_H0_righttail = test_stat > critical_value

// } end of "ATR diversion test" block

// Entry Signals
entry_signal_long = close >= fractal_support and reject_H0_lefttail

// MAIN {
// Update the stop limit if strategy holds a position.
if strategy.position_size > 0
    strategy.exit(ENUM_LONG, comment="SL", stop=stop_loss_price)

// Entry
if within_timeframe and entry_signal_long and strategy.position_size == 0
    initial_entry_p := close
    risk_amt := ATR_TSL
    initial_order_size := math.floor(pcnt_alloc * strategy.equity / close)
    strategy.entry(ENUM_LONG, strategy.long, qty=initial_order_size)

var int TP_taken_count = 0
if tp_mode and close > strategy.position_avg_price
    if close >= initial_entry_p + THIRD_LVL_PROFIT * risk_amt and TP_taken_count == 2
        strategy.close(ENUM_LONG, comment="TP Lvl3", qty=math.floor(initial_order_size / 3))
        TP_taken_count := TP_taken_count + 1
    else if close >= initial_entry_p + SECOND_LVL_PROFIT * risk_amt and TP_taken_count == 1
        strategy.close(ENUM_LONG, comment="TP Lvl2", qty=math.floor(initial_order_size / 3))
        TP_taken_count := TP_taken_count + 1
    else if close >= initial_entry_p + FIRST_LVL_PROFIT * risk_amt and TP_taken_count == 0
        strategy.close(ENUM_LONG, comment="TP Lvl1", qty=math.floor(initial_order_size / 3))
        TP_taken_count := TP_taken_count + 1
    
// Alerts
_atr = ta.atr(14)
alert_helper(msg) =>
    prefix = "[" + syminfo.root + "] "
    suffix = "(P=" + str.tostring(close, "#.##") + "; atr=" + str.tostring(_atr, "#.##") + ")"
    alert(str.tostring(prefix) + str.tostring(msg) + str.tostring(suffix), alert.freq_once_per_bar)

if strategy.position_size > 0 and ta.change(strategy.position_size)
    if strategy.position_size > strategy.position_size[1]
        alert_helper("BUY")
    else if strategy.position_size < strategy.position_size[1]
        alert_helper("SELL")

// Clean up - set the variables back to default values once no longer in use
if ta.change(strategy.position_size) and strategy.position_size == 0
    TP_taken_count := 0
    initial_entry_p := float(0)
    risk_amt := float(0)
    initial_order_size := float(0)
    stop_loss_price := float(0)
// } end of MAIN block