Sistem perdagangan strategi crossover trend KDJ berbilang penunjuk yang dioptimumkan berdasarkan corak rawak dinamik

KDJ RSV SL TP ATR
Tarikh penciptaan: 2025-01-06 16:23:38 Akhirnya diubah suai: 2025-01-06 16:23:38
Salin: 1 Bilangan klik: 500
1
fokus pada
1617
Pengikut

Sistem perdagangan strategi crossover trend KDJ berbilang penunjuk yang dioptimumkan berdasarkan corak rawak dinamik

Gambaran keseluruhan

Strategi ini ialah sistem dagangan lanjutan berdasarkan penunjuk KDJ, yang merakam arah aliran pasaran dengan menjalankan analisis mendalam tentang corak silang bagi garis K, garisan D dan garisan J. Strategi ini menyepadukan algoritma pelicinan BCWSMA tersuai dan meningkatkan kebolehpercayaan isyarat dengan mengoptimumkan pengiraan penunjuk stokastik. Sistem ini menggunakan mekanisme kawalan risiko yang ketat, termasuk fungsi stop loss dan trailing stop loss, untuk mencapai pengurusan dana yang kukuh.

Prinsip Strategi

Logik teras strategi adalah berdasarkan elemen utama berikut:

  1. Penunjuk KDJ dikira menggunakan algoritma BCWSMA (purata bergerak wajaran) tersuai, yang meningkatkan kelancaran dan kestabilan penunjuk.
  2. Dengan mengira RSV (nilai rawak belum masak), harga ditukar kepada nilai dalam julat 0-100 untuk lebih mencerminkan kedudukan harga antara mata tinggi dan rendah.
  3. Mereka bentuk mekanisme pengesahan silang J-line dan J5-line (penunjuk terbitan) untuk meningkatkan ketepatan isyarat dagangan melalui pelbagai pengesahan
  4. Mekanisme pengesahan arah aliran berdasarkan kesinambungan telah diwujudkan, memerlukan garisan J kekal di atas garisan D selama tiga hari berturut-turut untuk mengesahkan kesahihan aliran.
  5. Sistem kawalan risiko komposit yang mengintegrasikan peratusan stop loss dan trailing stop loss

Kelebihan Strategik

  1. Mekanisme penjanaan isyarat lanjutan: Melalui pengesahan silang berbilang penunjuk teknikal, kesan isyarat palsu dikurangkan dengan ketara
  2. Kawalan risiko sempurna: mengamalkan mekanisme kawalan risiko berbilang peringkat, termasuk stop loss tetap dan stop loss bergerak, untuk mengawal risiko penurunan dengan berkesan
  3. Kebolehlarasan parameter yang kuat: parameter utama seperti kitaran KDJ, pekali pelicinan isyarat, dll. boleh dilaraskan secara fleksibel mengikut keadaan pasaran
  4. Kecekapan pengiraan tinggi: Menggunakan algoritma BCWSMA yang dioptimumkan mengurangkan kerumitan pengiraan dan meningkatkan kecekapan pelaksanaan strategi
  5. Kebolehsuaian yang baik: boleh menyesuaikan diri dengan persekitaran pasaran yang berbeza dan mengoptimumkan prestasi strategi melalui pelarasan parameter

Risiko Strategik

  1. Risiko pasaran tidak menentu: Isyarat pelarian palsu yang kerap mungkin berlaku dalam pasaran tidak menentu sisi, meningkatkan kos transaksi
  2. Risiko ketinggalan: Disebabkan penggunaan pelicinan purata bergerak, isyarat mungkin ketinggalan pada tahap tertentu
  3. Kepekaan parameter: Kesan strategi adalah sensitif kepada tetapan parameter yang tidak betul boleh mengurangkan kesan strategi dengan ketara.
  4. Pergantungan persekitaran pasaran: Dalam persekitaran pasaran tertentu, prestasi strategi mungkin tidak sesuai.

Arah pengoptimuman strategi

  1. Pengoptimuman mekanisme penapisan isyarat: Penunjuk tambahan seperti volum dagangan dan turun naik boleh diperkenalkan untuk meningkatkan kebolehpercayaan isyarat
  2. Pelarasan parameter dinamik: Laraskan parameter KDJ dan parameter henti kerugian secara dinamik mengikut turun naik pasaran
  3. Pengenalan persekitaran pasaran: Tambah modul pertimbangan persekitaran pasaran untuk menerima pakai strategi dagangan yang berbeza dalam persekitaran pasaran yang berbeza
  4. Kawalan risiko yang dipertingkatkan: Langkah kawalan risiko tambahan seperti kawalan pengeluaran maksimum dan had masa memegang kedudukan boleh ditambah
  5. Pengoptimuman prestasi: mengoptimumkan lagi algoritma BCWSMA untuk meningkatkan kecekapan pengiraan

ringkaskan

Strategi ini membina sistem perdagangan yang lengkap melalui gabungan inovatif penunjuk teknikal dan kawalan risiko yang ketat. Kelebihan teras strategi terletak pada mekanisme pengesahan isyarat berbilang dan sistem kawalan risiko yang sempurna, tetapi perhatian juga harus diberikan kepada isu-isu seperti pengoptimuman parameter dan kebolehsuaian kepada persekitaran pasaran. Melalui pengoptimuman dan penambahbaikan berterusan, strategi ini dijangka dapat mengekalkan prestasi yang stabil dalam persekitaran pasaran yang berbeza.

Kod sumber strategi
/*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