Sumber dimuat naik... memuat...

Multi-Indicator Optimized KDJ Trend Crossover Strategy Berdasarkan Sistem Dagangan Pola Stochastic Dinamis

Penulis:ChaoZhang, Tarikh: 2025-01-06 16:23:38
Tag:KDJRSVSLTPATR

img

Ringkasan

Strategi ini adalah sistem dagangan canggih berdasarkan penunjuk KDJ, yang menangkap trend pasaran melalui analisis mendalam corak persilangan K-line, D-line, dan J-line. Strategi ini mengintegrasikan algoritma pelunturan BCWSMA tersuai, meningkatkan kebolehpercayaan isyarat melalui pengiraan penunjuk stokastik yang dioptimumkan. Sistem ini menggunakan mekanisme kawalan risiko yang ketat, termasuk ciri stop-loss dan trailing stop, untuk mencapai pengurusan wang yang kukuh.

Prinsip Strategi

Logik teras strategi ini berdasarkan beberapa elemen utama:

  1. Menggunakan algoritma BCWSMA (Rata Pergerakan Bertimbang) tersuai untuk mengira penunjuk KDJ, meningkatkan kelancaran dan kestabilan penunjuk
  2. Mengubah harga kepada julat 0-100 melalui pengiraan RSV (Raw Stochastic Value), yang lebih mencerminkan kedudukan harga antara paras tertinggi dan terendah
  3. Merancang mekanisme pengesahan silang J-line dan J5-line (penunjuk turunan) yang unik, meningkatkan ketepatan isyarat perdagangan melalui pengesahan berbilang
  4. Menetapkan mekanisme pengesahan trend berdasarkan kesinambungan, yang memerlukan garis J untuk kekal di atas garis D selama 3 hari berturut-turut untuk mengesahkan kesahihan trend
  5. Mengintegrasikan sistem kawalan risiko komposit dengan peratusan stop-loss dan trailing stop-loss

Kelebihan Strategi

  1. Generasi Isyarat Lanjutan: Mengurangkan isyarat palsu dengan ketara melalui pengesahan silang pelbagai penunjuk teknikal
  2. Kawalan Risiko Komprehensif: Menggunakan mekanisme kawalan risiko pelbagai peringkat, termasuk berhenti tetap dan trailing, mengawal risiko penurunan dengan berkesan
  3. Kebolehsesuaian Parameter yang Kuat: Parameter utama seperti tempoh KDJ dan pekali pelunturan isyarat boleh diselaraskan secara fleksibel berdasarkan keadaan pasaran
  4. Kecekapan Pengiraan Tinggi: Menggunakan algoritma BCWSMA yang dioptimumkan, mengurangkan kerumitan pengiraan dan meningkatkan kecekapan pelaksanaan strategi
  5. Kebolehsesuaian yang baik: Boleh menyesuaikan diri dengan persekitaran pasaran yang berbeza melalui pengoptimuman pelarasan parameter

Risiko Strategi

  1. Risiko pasaran goyangan: Boleh menghasilkan isyarat pecah palsu yang kerap di pasaran sampingan, meningkatkan kos dagangan
  2. Risiko Lag: Isyarat mungkin mengalami beberapa kelewatan kerana rata-rata bergerak.
  3. Sensitiviti Parameter: Keberkesanan strategi sensitif kepada tetapan parameter, tetapan yang tidak betul boleh mengurangkan prestasi strategi dengan ketara
  4. Kebergantungan persekitaran pasaran: Prestasi strategi mungkin tidak ideal dalam persekitaran pasaran tertentu

Arahan Pengoptimuman Strategi

  1. Pengoptimuman mekanisme penapis isyarat: Boleh memperkenalkan penunjuk tambahan seperti jumlah dan turun naik untuk meningkatkan kebolehpercayaan isyarat
  2. Penyesuaian Parameter Dinamik: Penyesuaian dinamik parameter KDJ dan parameter stop-loss berdasarkan turun naik pasaran
  3. Pengiktirafan persekitaran pasaran: Tambah modul penilaian persekitaran pasaran untuk mengamalkan strategi perdagangan yang berbeza dalam persekitaran pasaran yang berbeza
  4. Peningkatan Kawalan Risiko: Boleh menambah langkah kawalan risiko tambahan seperti kawalan pengeluaran maksimum dan had masa kedudukan
  5. Pengoptimuman prestasi: Lebih mengoptimumkan algoritma BCWSMA untuk meningkatkan kecekapan pengiraan

Ringkasan

Strategi ini membina sistem dagangan yang lengkap melalui kombinasi penunjuk teknikal yang inovatif dan kawalan risiko yang ketat. Kelebihan teras terletak pada mekanisme pengesahan isyarat berbilang dan sistem kawalan risiko yang komprehensif, tetapi perhatian perlu diberikan kepada pengoptimuman parameter dan daya adaptasi persekitaran pasaran. Melalui pengoptimuman dan peningkatan yang berterusan, strategi ini mempunyai potensi untuk mengekalkan prestasi yang stabil di pelbagai persekitaran pasaran.


/*backtest
start: 2024-01-06 00:00:00
end: 2025-01-05 00:00:00
period: 4h
basePeriod: 4h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Scriptâ„¢ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © hexu90

//@version=6

// Date Range
// STEP 1. Create inputs that configure the backtest's date range
useDateFilter = input.bool(true, title="Filter Date Range of Backtest",
     group="Backtest Time Period")
backtestStartDate = input(timestamp("1 Jan 2020"), 
     title="Start Date", group="Backtest Time Period",
     tooltip="This start date is in the time zone of the exchange " + 
     "where the chart's instrument trades. It doesn't use the time " + 
     "zone of the chart or of your computer.")
backtestEndDate = input(timestamp("15 Dec 2024"),
     title="End Date", group="Backtest Time Period",
     tooltip="This end date is in the time zone of the exchange " + 
     "where the chart's instrument trades. It doesn't use the time " + 
     "zone of the chart or of your computer.")
// STEP 2. See if current bar falls inside the date range
inTradeWindow = true

//KDJ strategy
// indicator("My Customized KDJ", shorttitle="KDJ")
strategy("My KDJ Strategy", overlay = false)

// Input parameters
ilong = input(90, title="Period")
k_isig = input(3, title="K Signal")
d_isig = input(30, title="D Signal")

// Custom BCWSMA calculation outside the function
bcwsma(source, length, weight) =>
    var float prev = na  // Persistent variable to store the previous value
    if na(prev)
        prev := source  // Initialize on the first run
    prev := (weight * source + (length - weight) * prev) / length
    prev

// Calculate KDJ
c = close
h = ta.highest(high, ilong)
l = ta.lowest(low, ilong)
RSV = 100 * ((c - l) / (h - l))
pK = bcwsma(RSV, k_isig, 1)
pD = bcwsma(pK, d_isig, 1)
pJ = 3 * pK - 2 * pD

pJ1 = 0
pJ2 = 80
pJ5 = (pJ-pK)-(pK-pD)

// Plot the K, D, J lines with colors
plot(pK, color=color.rgb(251, 121, 8), title="K Line")  // Orange
plot(pD, color=color.rgb(30, 0, 255), title="D Line")  // Blue
plot(pJ, color=color.new(color.rgb(251, 0, 255), 10), title="J Line")  // Pink with transparency
plot(pJ5, color=#6f03f3e6, title="J Line")  // Pink with transparency

// Background color and reference lines
// bgcolor(pJ > pD ? color.new(color.green, 75) : color.new(color.red, 75))
// hline(80, "Upper Band", color=color.gray)
// hline(20, "Lower Band", color=color.gray)

// Variables to track the conditions
var bool condition1_met = false
var int condition2_met = 0

// Condition 1: pJ drops below pJ5
if ta.crossunder(pJ, pJ5)
    condition1_met := true
    condition2_met := 0  // Reset condition 2 if pJ drops below pJ5 again

if ta.crossover(pJ, pD)
    condition2_met += 1

to_long = ta.crossover(pJ, pD)


var int consecutiveDays = 0
// Update the count of consecutive days
if pJ > pD
    consecutiveDays += 1
else
    consecutiveDays := 0

// Check if pJ has been above pD for more than 3 days
consPJacrossPD = false
if consecutiveDays > 3
    consPJacrossPD := true

// Entry condition: After condition 2, pJ crosses above pD a second time
// if condition1_met and condition2_met > 1
//     strategy.entry("golden", strategy.long, qty=1000)
//     condition1_met := false  // Reset the conditions for a new cycle
//     condition2_met = 0
// 
if ta.crossover(pJ, pD) 
    // and pD < 40 and consPJacrossPD
    // consecutiveDays == 1
    //  consecutiveDays == 3 and
    strategy.entry("golden", strategy.long, qty=1)

// to_short = 
// or ta.crossunder(pJ, 100)

// Exit condition
if ta.crossover(pD, pJ)
    strategy.close("golden", qty = 1)

// Stop loss and trailing profit
trail_stop_pct = input.float(0.5, title="Trailing Stop activation (%)", group="Exit Lonng", inline="LTS", tooltip="Trailing Treshold %")
trail_offset_pct = input.float(0.5, title="Trailing Offset (%)", group="Exit Lonng", inline="LTS", tooltip="Trailing Offset %")
trail_stop_tick = trail_stop_pct * close/100
trail_offset_tick = trail_offset_pct * close/100

sl_pct = input.float(5, title="Stop Loss", group="SL and TP", inline="LSLTP")
// tp_pct = input.float(9, title="Take Profit", group="SL and TP", inline="LSLTP")

long_sl_price = strategy.position_avg_price * (1 - sl_pct/100)
// long_tp_price = strategy.position_avg_price * (1 + tp_pct/100)

strategy.exit('golden Exit', 'golden', stop = long_sl_price)
// trail_points = trail_stop_tick, trail_offset=trail_offset_tick


Berkaitan

Lebih lanjut