Strategi perdagangan pembalikan berdasarkan dukungan/perlawanan yang luas


Tanggal Pembuatan: 2023-10-30 11:23:25 Akhirnya memodifikasi: 2023-10-30 11:23:25
menyalin: 1 Jumlah klik: 668
1
fokus pada
1617
Pengikut

Strategi perdagangan pembalikan berdasarkan dukungan/perlawanan yang luas

Ringkasan

Strategi ini menggunakan perdagangan berbalik berdasarkan indikator faktor overhead, dan menetapkan keuntungan target. Inti faktor overhead adalah bentuk ekspansinya yang didasarkan pada volume perdagangan yang digunakan untuk indikator dengan volume perdagangan dan volatilitas yang tinggi. Keuntungan dari strategi ini adalah bahwa peluang untuk membalikkan tren jangka pendek dan menengah yang lebih besar dapat ditangkap dan menghasilkan keuntungan dengan cepat.

Prinsip Strategi

  1. Identifikasi faktor polusi berdasarkan support/resistance yang luas berdasarkan volume transaksi

    • Menggunakan bentuk K-line untuk mengidentifikasi support/resistance klasik dan memfilter false breakout untuk volume transaksi yang lebih besar

    • Support/Resistance yang lebih luas memiliki inklusi yang lebih baik daripada bentuk klasik

    • Penembusan dukungan dalam arti luas untuk sinyal multi-faktor, penembusan resistensi dalam arti luas untuk sinyal nol-faktor

  2. Perdagangan berbalik

    • Setelah sinyal faktor keluar, lakukan operasi mundur

    • Jika sudah memegang posisi, lakukan penurunan posisi terbalik atau buka posisi terbalik

  3. Menetapkan target keuntungan

    • Stop loss berdasarkan ATR

    • Mengatur 1R / 2R / 3R dan manfaat beberapa tujuan

    • Pengurangan saham secara bertahap setelah mencapai target laba yang berbeda

Analisis Keunggulan

  • Dapat menangkap pergeseran yang lebih besar dalam jangka pendek

Penembusan resistensi dukungan mewakili sinyal pembalikan tren yang lebih kuat, memiliki keandalan tertentu, dan dapat menangkap pembalikan yang lebih besar dalam jangka pendek.

  • Mendapatkan keuntungan cepat, menarik sedikit.

Dengan menetapkan stop loss dan target keuntungan bertingkat, keuntungan cepat dapat dicapai dan penarikan kembali saham dapat dibatasi.

  • Berlaku untuk indeks yang memiliki banyak dana institusional dan volatilitas tinggi

Strategi ini bergantung pada volume transaksi, yang membutuhkan aliran dana institusional yang memadai untuk mendukung tren; dan ruang fluktuasi tertentu untuk menghasilkan keuntungan.

Analisis risiko

  • Bahaya Terjebak Dalam Guncangan

Operasi Stop Loss Exit dan Reverse Entry dapat menyebabkan seringnya penutupan.

  • Resistensi Dukungan Berisiko Gagal

Resistansi dukungan yang luas tidak sepenuhnya dapat diandalkan, dan ada probabilitas kegagalan tes untuk membalikkannya.

  • Risiko memegang posisi sepihak

Strategi ini adalah pembalikan murni, dan tanpa mempertimbangkan trend tracking, kemungkinan besar akan kehilangan peluang yang lebih besar.

  • Pengendalian angin

    • Kondisi-kondisi faktor untuk reversal trading yang dapat dilepaskan secara tepat, tanpa harus reversal setiap kali ada penembusan

    • Dapat digabungkan dengan filter indikator lain, seperti deviasi harga

    • Strategi Stop Loss yang dapat dioptimalkan untuk mengurangi kemungkinan terjerat

Arah optimasi

  • Optimalkan parameter kaliber

Optimalkan parameter resistansi penyangga yang lebih luas untuk mengidentifikasi faktor yang lebih andal

  • Optimalkan strategi untuk mendapatkan keuntungan

Anda dapat menambahkan target laba dengan tingkat yang lebih tinggi, atau Anda dapat menggunakan target laba yang tidak tetap.

  • Optimalkan strategi stop loss

Menyesuaikan parameter ATR atau menggunakan stop loss statistik untuk mengurangi biaya transaksi yang disebabkan oleh stop loss yang tidak perlu

  • Kombinasi Tren dan Faktor-Faktor Lain

Pengertian tren seperti garis rata-rata dapat diperkenalkan, untuk menghindari konfrontasi serius dengan tren; juga dapat diperkenalkan faktor tambahan lainnya

Meringkaskan

Inti dari strategi ini adalah memanfaatkan perdagangan reversal untuk menangkap volatilitas yang lebih besar dalam jangka pendek. Strategi ini sederhana dan langsung, dengan penyesuaian parameter dapat memperoleh efek disk yang baik. Namun, strategi reversal lebih radikal, ada beberapa risiko penarikan dan penarikan, perlu lebih mengoptimalkan strategi stop loss dan profit, dan menggabungkan penilaian tren dengan tepat untuk mengurangi kerugian yang tidak perlu.

Kode 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