
Kerangka pengesahan indikator pengesahan pelbagai sumber adalah sistem ujian perdagangan kuantitatif peringkat profesional yang direka khusus untuk menilai indikator dan isyarat perdagangan tersuai. Kerangka ini menggabungkan pelbagai kaedah pengesanan isyarat, sistem penapisan pengesahan lanjutan, dan fungsi pengurusan risiko profesional yang membolehkan pedagang menguji strategi perdagangan mereka secara menyeluruh. Kelebihan utama sistem ini adalah fleksibiliti yang membolehkan pengguna menyambung mana-mana indikator tersuai atau kajian terbina dalam, dan mengesan isyarat dengan pelbagai cara, termasuk perubahan nilai, titik persimpangan dan pemicu nilai.
Prinsip teras strategi ini adalah untuk menyediakan persekitaran ujian yang komprehensif, yang membolehkan peniaga menilai keberkesanan pelbagai petunjuk. Kod ini melaksanakan fungsi utama berikut:
Pelbagai kaedah pengesanan isyaratLima kaedah pengesanan isyarat yang berbeza dilaksanakan melalui fungsi detectLongSignal () dan detectShortSignal ():
Sistem pengesahan: Melalui fungsi longConfirmation ((() dan shortConfirmation ((() mewujudkan sistem pengesahan pelbagai sumber yang memerlukan isyarat perdagangan memenuhi syarat tambahan dalam tempoh pengulangan yang ditetapkan untuk dilaksanakan. Fungsi ini mengurangkan isyarat palsu secara ketara.
Logik masuk dan keluarStrategi menggunakan fungsi strategi.entry dan strategi.exit untuk menguruskan masuk dan keluar dari transaksi. Syarat masuk ditentukan bersama oleh sistem pengesanan dan pengesahan isyarat, dan keluar dapat dilakukan dengan pelbagai cara:
Logik BebanApabila dagangan mencapai jumlah keuntungan yang ditetapkan, strategi akan secara automatik memindahkan stop loss ke harga masuk, melindungi keuntungan yang telah dibuat. Ini dilakukan dengan mengesan perbezaan antara harga semasa dan harga masuk, dan mengubah tahap stop loss apabila mencapai jumlah yang ditetapkan oleh breakEvenTrigger.
Penglihatan dan pengawasanStrategi: menggunakan fungsi plotshape untuk menandakan semua isyarat masuk dan keluar pada carta dan membuat jadual status masa nyata melalui table.new yang menunjukkan tetapan strategi semasa dan status perdagangan.
Fleksibiliti yang tinggiStrategi membolehkan penyambungan mana-mana penunjuk sebagai sumber isyarat, menjadikannya sesuai untuk pelbagai gaya perdagangan dan keadaan pasaran. Pengguna boleh menguji kombinasi penunjuk yang berbeza dengan hanya mengubah sumber input.
Sistem penapisan berlapisDengan menggunakan penapis pengesahan, strategi dapat meminta beberapa syarat untuk dipenuhi pada masa yang sama untuk melakukan perdagangan, mengurangkan isyarat yang salah. Kaedah pengesahan pelbagai sumber ini meniru amalan pedagang profesional yang mencari kesesuaian beberapa petunjuk sebelum membuat keputusan perdagangan.
Pengurusan risiko menyeluruhStrategi ini mempunyai fungsi pengurusan risiko yang profesional, termasuk:
Maklum balas dan pemantauan dalam masa nyata: Melalui tanda isyarat dan jadual status, peniaga dapat mengetahui secara intuitif status dan prestasi operasi strategi, untuk memudahkan pengendalian dan pengoptimuman.
KeserasianStrategi ini serasi dengan Pine Script v6, boleh dijalankan pada mana-mana platform dagangan yang menyokong versi ini, dan menyokong fungsi pengesanan semula yang membolehkan peniaga menilai prestasi sejarah.
Kepercayaan pengesanan isyaratKeberkesanan strategi sangat bergantung pada kaedah pengesanan isyarat yang dipilih dan tetapan had. Konfigurasi yang tidak betul boleh menyebabkan terlalu banyak isyarat palsu atau kehilangan peluang perdagangan penting. Pedagang disarankan untuk menguji pelbagai kombinasi tetapan dalam keadaan pasaran yang berbeza untuk mencari kaedah pengesanan isyarat yang paling sesuai untuk indikator tertentu.
Pengesahan risiko penapisan sistemWalaupun sistem pengesahan pelbagai sumber dapat mengurangkan isyarat palsu, ia juga boleh menyebabkan kehilangan peluang perdagangan yang menguntungkan. Keperluan pengesahan yang terlalu ketat boleh menyebabkan strategi kehilangan pergerakan pasaran yang berkembang dengan pesat. Penyelesaian adalah dengan menyeimbangkan tahap keamatan sistem pengesahan, atau merancang kriteria pengesahan yang berbeza untuk keadaan pasaran yang berbeza.
Batasan penghentian tetap / penghentian kerosakan: Menggunakan titik berhenti / henti mungkin tidak sesuai untuk semua keadaan pasaran, terutamanya di pasaran yang mempunyai perubahan turun naik. Adalah disyorkan untuk menghubungkan titik berhenti / henti dengan indikator turun naik pasaran (seperti ATR) untuk menyesuaikan diri dengan keadaan pasaran yang berbeza.
Perbezaan antara pengesan dan cakera kerasSemua keputusan retest mempunyai risiko perbezaan dengan perdagangan sebenar, kerana retest tidak dapat mensimulasikan sepenuhnya slippage, kos perdagangan dan masalah kecairan. Pedagang harus mengesahkan prestasi strategi dalam persekitaran simulasi sebelum berdagang secara nyata.
Kerumitan kodKompleksiti dasar boleh meningkatkan kesukaran untuk memulakan dan memelihara. Komentar terperinci dan reka bentuk modular dapat membantu menguruskan kerumitan ini dan memastikan kod dapat dijaga.
Pengurusan risiko dinamikStrategi semasa menggunakan stop / loss dengan bilangan titik tetap, yang dapat dioptimumkan untuk sistem pengurusan risiko dinamik berdasarkan turun naik pasaran. Sebagai contoh, titik stop / loss dilampirkan dengan ATR (Average True Range), yang memperluas jangkauan berhenti apabila turun naik turun naik, dan mengurangkan jangkauan berhenti apabila turun naik turun naik.
Meningkatkan sistem pengesahanSistem pengesahan semasa dapat diperluaskan untuk memasukkan lebih banyak syarat penapisan, seperti penapisan masa (mengelakkan perdagangan pada masa pasaran tertentu), penapisan turun naik (mengelakkan perdagangan dalam persekitaran yang tidak stabil), atau penapisan trend (berdagang hanya dalam arah yang selaras dengan trend utama). Ini akan mengurangkan lebih banyak isyarat palsu dan meningkatkan kehandalan strategi.
Bahagian pengurusan kedudukanStrategi boleh menambah fungsi pengurusan kedudukan sebahagian, yang membolehkan masuk dan keluar secara berturut-turut, dan bukannya membuka atau meletakkan keseluruhan kedudukan sekaligus. Kaedah ini dapat mengurangkan risiko masuk / keluar satu titik dan mungkin meningkatkan prestasi strategi secara keseluruhan.
Pengoptimuman Pembelajaran Mesin: Algoritma pembelajaran mesin boleh diperkenalkan untuk mengoptimumkan parameter isyarat dan tetapan risiko, menyesuaikan parameter strategi secara automatik berdasarkan data sejarah untuk menyesuaikan diri dengan keadaan pasaran yang berbeza.
Meningkatkan prestasiWalaupun strategi telah menyediakan pemantauan keadaan asas, lebih banyak petunjuk prestasi boleh ditambah seperti nisbah Sharpe, maksimum pulangan, nisbah kerugian dan sebagainya untuk memberi penilaian strategi yang lebih menyeluruh. Penunjuk ini boleh dipaparkan dalam jadual status untuk membantu peniaga menilai prestasi strategi dengan lebih baik.
Kerangka Pengecekan Indikator Pemulihan Multi-Sumber adalah sistem pengujian perdagangan kuantitatif yang lengkap, yang menyediakan pedagang dengan alat yang kuat untuk menilai dan mengoptimumkan strategi perdagangan mereka dengan mengintegrasikan pelbagai kaedah pengesanan isyarat, sistem pengesahan pelbagai lapisan, dan fungsi pengurusan risiko profesional. Kelebihan utama kerangka ini adalah fleksibiliti dan penyesuaian, yang membolehkan pedagang menguji hampir semua jenis kombinasi indikator dan kaedah penjanaan isyarat.
Walaupun terdapat beberapa risiko dan batasan yang wujud, seperti ketergantungan pengesanan isyarat dan parameter risiko tetap, masalah-masalah ini dapat diselesaikan dengan arah pengoptimuman yang dicadangkan, seperti pelaksanaan pengurusan risiko dinamik, peningkatan sistem pengesahan dan pengenalan pengurusan kedudukan sebahagian. Dengan pengoptimuman ini, rangka kerja ini dapat meningkatkan keberkesanan dan kesesuaian, menjadi alat yang berharga dalam gudang senjata peniaga.
Ringkasnya, kerangka pengesahan indikator pengesahan pelbagai sumber mewakili pendekatan profesional dan sistematik untuk menguji dan menilai strategi perdagangan, yang melampaui penjanaan isyarat yang mudah, untuk memasukkan pengurusan risiko dan pengesahan berlapis, yang merupakan komponen penting dalam sistem perdagangan yang berjaya. Kerangka ini menyediakan penyelesaian menyeluruh bagi pedagang yang ingin membina dan menguji strategi perdagangan tersuai.
/*backtest
start: 2024-07-08 00:00:00
end: 2025-07-04 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
//@version=6
strategy("FULLY FUNCTIONAL INDICATOR TESTER", overlay=true, margin_long=100, margin_short=100)
// Entry/Exit Signal Inputs
longEntry = input.source(close, 'Long Entry Trigger', 'Source for long signal (connect your indicator here)')
shortEntry = input.source(close, 'Short Entry Trigger', 'Source for short signal (connect your indicator here)')
activateLongExit = input.bool(false, 'Activate Long Exit Signals')
longExit = input.source(high, 'Long Exit Trigger', 'Source for long exit signal')
activateShortExit = input.bool(false, 'Activate Short Exit Signals')
shortExit = input.source(low, 'Short Exit Trigger', 'Source for short exit signal')
// Signal Detection Method
signalMethod = input.string('Value Change', 'Signal Detection Method', options=['Value Change', 'Crossover Above', 'Crossover Below', 'Value Above Threshold', 'Value Below Threshold'])
signalThreshold = input.float(0, 'Signal Threshold', tooltip='Threshold value for signal detection methods')
// Take Profit and Stop Loss
fixedTp = input.int(0, 'Static TP (in ticks)', 0, tooltip='0 = disabled')
initialSL = input.int(0, 'Initial SL (in ticks)', 0, tooltip='0 = disabled')
// Break Even Settings
breakEvenTrigger = input.int(0, 'Break Even Trigger (in ticks)', 0, tooltip='Move SL to break even after this many ticks profit. 0 = disabled')
// Confluence Settings
useConfluence = input.bool(false, 'Use Confluence Filter', 'Activate confluence filter for entries')
longConfluence = input.source(high, 'Long Signal Confluence', 'Source for long confluence filter')
longConfluenceTrigger = input.source(low, 'Long Confluence Trigger', 'Value that must be below confluence source for long entry')
shortConfluence = input.source(high, 'Short Signal Confluence', 'Source for short confluence filter')
shortConfluenceTrigger = input.source(low, 'Short Confluence Trigger', 'Value that must be above confluence source for short entry')
confluenceLookback = input.int(0, 'Confluence Lookback Period', 0, 10, 1, 'Number of candles to look back for confluence')
// Variables to track entry prices for break-even
var float longEntryPrice = na
var float shortEntryPrice = na
// Signal Detection Functions
detectLongSignal() =>
switch signalMethod
'Value Change' => longEntry != longEntry[1] and longEntry > 0
'Crossover Above' => ta.crossover(longEntry, signalThreshold)
'Crossover Below' => ta.crossunder(longEntry, signalThreshold)
'Value Above Threshold' => longEntry > signalThreshold and longEntry[1] <= signalThreshold
'Value Below Threshold' => longEntry < signalThreshold and longEntry[1] >= signalThreshold
=> false
detectShortSignal() =>
switch signalMethod
'Value Change' => shortEntry != shortEntry[1] and shortEntry > 0
'Crossover Above' => ta.crossover(shortEntry, signalThreshold)
'Crossover Below' => ta.crossunder(shortEntry, signalThreshold)
'Value Above Threshold' => shortEntry > signalThreshold and shortEntry[1] <= signalThreshold
'Value Below Threshold' => shortEntry < signalThreshold and shortEntry[1] >= signalThreshold
=> false
detectLongExit() =>
switch signalMethod
'Value Change' => longExit != longExit[1] and longExit > 0
'Crossover Above' => ta.crossover(longExit, signalThreshold)
'Crossover Below' => ta.crossunder(longExit, signalThreshold)
'Value Above Threshold' => longExit > signalThreshold and longExit[1] <= signalThreshold
'Value Below Threshold' => longExit < signalThreshold and longExit[1] >= signalThreshold
=> false
detectShortExit() =>
switch signalMethod
'Value Change' => shortExit != shortExit[1] and shortExit > 0
'Crossover Above' => ta.crossover(shortExit, signalThreshold)
'Crossover Below' => ta.crossunder(shortExit, signalThreshold)
'Value Above Threshold' => shortExit > signalThreshold and shortExit[1] <= signalThreshold
'Value Below Threshold' => shortExit < signalThreshold and shortExit[1] >= signalThreshold
=> false
// Confluence confirmation functions
longConfirmation() =>
confirmation = false
if confluenceLookback == 0
confirmation := longConfluenceTrigger < longConfluence
else
for x = 0 to confluenceLookback
if longConfluenceTrigger[x] < longConfluence[x]
confirmation := true
break
confirmation
shortConfirmation() =>
confirmation = false
if confluenceLookback == 0
confirmation := shortConfluenceTrigger > shortConfluence
else
for x = 0 to confluenceLookback
if shortConfluenceTrigger[x] > shortConfluence[x]
confirmation := true
break
confirmation
// Entry conditions
longConfirmed = useConfluence ? longConfirmation() : true
shortConfirmed = useConfluence ? shortConfirmation() : true
longCondition = detectLongSignal() and longConfirmed
shortCondition = detectShortSignal() and shortConfirmed
// Entry logic
if (longCondition and strategy.opentrades == 0)
strategy.entry('Long', strategy.long)
longEntryPrice := close
// Set initial exit orders
if fixedTp > 0 or initialSL > 0
strategy.exit('Long Exit', 'Long',
profit = fixedTp > 0 ? fixedTp : na,
loss = initialSL > 0 ? initialSL : na,
comment_profit = 'TP Hit',
comment_loss = 'SL Hit')
if (shortCondition and strategy.opentrades == 0)
strategy.entry('Short', strategy.short)
shortEntryPrice := close
// Set initial exit orders
if fixedTp > 0 or initialSL > 0
strategy.exit('Short Exit', 'Short',
profit = fixedTp > 0 ? fixedTp : na,
loss = initialSL > 0 ? initialSL : na,
comment_profit = 'TP Hit',
comment_loss = 'SL Hit')
// Custom exit signal logic
if (activateLongExit and detectLongExit() and strategy.position_size > 0)
strategy.close('Long', 'Custom Long Exit')
if (activateShortExit and detectShortExit() and strategy.position_size < 0)
strategy.close('Short', 'Custom Short Exit')
// Break-even logic
if (breakEvenTrigger > 0)
// Long position break-even
if (strategy.position_size > 0 and not na(longEntryPrice))
ticksProfit = math.round((high - longEntryPrice) / syminfo.mintick)
if (ticksProfit >= breakEvenTrigger)
strategy.exit('Long Exit', 'Long', stop = longEntryPrice, comment_loss = 'Break Even')
// Short position break-even
if (strategy.position_size < 0 and not na(shortEntryPrice))
ticksProfit = math.round((shortEntryPrice - low) / syminfo.mintick)
if (ticksProfit >= breakEvenTrigger)
strategy.exit('Short Exit', 'Short', stop = shortEntryPrice, comment_loss = 'Break Even')
// Reset entry prices when no position
if (strategy.position_size == 0)
longEntryPrice := na
shortEntryPrice := na
// Plot signals for debugging
plotshape(longCondition, title='Long Signal', location=location.belowbar, color=color.green, style=shape.triangleup, size=size.small)
plotshape(shortCondition, title='Short Signal', location=location.abovebar, color=color.red, style=shape.triangledown, size=size.small)
plotshape(activateLongExit and detectLongExit() and strategy.position_size > 0, title='Long Exit', location=location.abovebar, color=color.orange, style=shape.xcross, size=size.small)
plotshape(activateShortExit and detectShortExit() and strategy.position_size < 0, title='Short Exit', location=location.belowbar, color=color.orange, style=shape.xcross, size=size.small)
// Display current settings in a table for easy reference
if barstate.islast
var table infoTable = table.new(position.top_right, 2, 8, bgcolor=color.white, border_width=1)
table.cell(infoTable, 0, 0, "Signal Method:", text_color=color.black, bgcolor=color.gray)
table.cell(infoTable, 1, 0, signalMethod, text_color=color.black)
table.cell(infoTable, 0, 1, "Threshold:", text_color=color.black, bgcolor=color.gray)
table.cell(infoTable, 1, 1, str.tostring(signalThreshold), text_color=color.black)
table.cell(infoTable, 0, 2, "TP (ticks):", text_color=color.black, bgcolor=color.gray)
table.cell(infoTable, 1, 2, str.tostring(fixedTp), text_color=color.black)
table.cell(infoTable, 0, 3, "SL (ticks):", text_color=color.black, bgcolor=color.gray)
table.cell(infoTable, 1, 3, str.tostring(initialSL), text_color=color.black)
table.cell(infoTable, 0, 4, "Break Even:", text_color=color.black, bgcolor=color.gray)
table.cell(infoTable, 1, 4, str.tostring(breakEvenTrigger), text_color=color.black)
table.cell(infoTable, 0, 5, "Confluence:", text_color=color.black, bgcolor=color.gray)
table.cell(infoTable, 1, 5, useConfluence ? "ON" : "OFF", text_color=color.black)
table.cell(infoTable, 0, 6, "Position:", text_color=color.black, bgcolor=color.gray)
table.cell(infoTable, 1, 6, strategy.position_size > 0 ? "LONG" : strategy.position_size < 0 ? "SHORT" : "FLAT", text_color=color.black)
table.cell(infoTable, 0, 7, "Status:", text_color=color.black, bgcolor=color.gray)
table.cell(infoTable, 1, 7, "FULLY FUNCTIONAL", text_color=color.green)