Ide utama dari strategi ini adalah untuk mensimulasikan perdagangan real-time, mengumpulkan data perdagangan mingguan, dan menyajikan statistik dalam tabel untuk tinjauan kinerja strategi yang lebih intuitif.
Tentukan waktu awal dan akhir untuk periode perhitungan.
Tetapkan presisi statistik dan jumlah minggu di setiap kelompok.
Simulasi strategi RSI untuk masuk dan keluar.
Mendefinisikan variabel untuk tabel statistik.
Menghitung hasil untuk periode saat ini.
Jika perubahan periode dan perdagangan diaktifkan, catat waktu dan hasil untuk periode ini.
Jika itu bar terakhir dan perdagangan diaktifkan, catat waktu dan hasil untuk periode saat ini.
Jika perubahan periode dan perdagangan dinonaktifkan, catat waktu dan hasil untuk periode sebelumnya.
Cari hasil periode tertinggi dan terendah.
Berikan tabel statistik.
Hitung jumlah total periode statistik pertama
Iterate melalui setiap periode, render header, waktu dan hasil
Menghitung hasil kumulatif untuk setiap kelompok
Hasil kode warna positif dan negatif
Dapat mengamati hasil mingguan secara real time untuk evaluasi strategi yang cepat
Presentasi hasil yang intuitif untuk wawasan yang jelas
Membantu mengidentifikasi periode kinerja yang buruk untuk penyesuaian strategi
Nyaman untuk melacak keuntungan kumulatif untuk strategi jangka panjang
Dapat membandingkan gaya perdagangan di berbagai periode waktu
Keakuratan dan kelompok yang dapat disesuaikan untuk memenuhi kebutuhan yang berbeda
Kode sederhana dan jelas, mudah dimengerti dan diperluas
Strategi ini didasarkan pada RSI, yang memiliki tren yang melekat setelah keterbatasan
Biaya perdagangan dapat berdampak signifikan pada hasil yang sebenarnya
Data backtest mungkin tidak mencerminkan kondisi pasar yang sebenarnya
Modal default dalam backtest mungkin tidak sesuai dengan ukuran rekening riil
Hindari overfitting dengan menyetel parameter secara buta berdasarkan statistik
Dapat menggabungkan lebih banyak indikator untuk tren dan mengoptimalkan entri dan keluar untuk meningkatkan strategi dasar RSI. Gunakan biaya perdagangan aktual dalam perdagangan langsung. Tambahkan keacakan ke ukuran modal dalam backtest. Pertahankan skeptisisme daripada over-tuning berdasarkan statistik.
Pertimbangkan untuk menambahkan stop loss untuk membatasi downside
Mengoptimalkan parameter RSI seperti tingkat overbought dan oversold
Coba frekuensi perdagangan yang berbeda seperti intraday vs bulanan memegang
Masukkan lebih banyak indikator untuk tren dan waktu
Tambahkan keuntungan mengambil logika
Mengoptimalkan pengaturan parameter statistik
Perluasan untuk melacak beberapa aset
Stop dapat mengelola risiko / imbalan dengan lebih baik. Penyesuaian RSI meningkatkan tingkat kemenangan. Lebih banyak indikator dan frekuensi membuat strategi kuat. Penyesuaian statistik menyoroti data penting. Memperluas ke beberapa aset memberikan pandangan lengkap.
Tujuan adalah untuk mengumpulkan hasil berkala untuk visualisasi statistik intuitif untuk dengan cepat menilai kinerja dari waktu ke waktu. Hal ini memberikan data untuk mengoptimalkan strategi. Kekuatan termasuk real-time hasil mingguan, kejelasan dan ekstensibilitas. Berhati-hati terhadap ketergantungan yang berlebihan dan kurva yang sesuai dengan output statistik. Gunakan secara rasional bersama dengan logika strategi inti untuk wawasan, bukan sebagai dasar untuk perubahan. Secara keseluruhan, cara yang nyaman untuk menilai kinerja dan penting untuk optimasi.
/*backtest start: 2023-09-12 00:00:00 end: 2023-10-12 00:00:00 period: 3h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 // strategy('Strategy weekly results as numbers v1', overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=25, commission_type=strategy.commission.percent, commission_value=0.04) after = input(title='Trade after', defval=timestamp('01 Jan 2019 00:00 UTC'), tooltip="Strategy will be executed after this timestamp. The statistic table will include only periods after this date.") before = input(title='Trade before', defval=timestamp('31 Dec 2024 23:59 UTC'), tooltip="Strategy will be executes before this timestamp. The statistic table will include only periods before this date.") statisticPrecision = input.int(title='Statistic precision', group='Statistic visualisation', defval=1, tooltip="Defines how many digits should be rendered in every statistic cell.") statisticGroupSize = input.int(title='Statistic group size', group='Statistic visualisation', defval=12, tooltip="Defines how many cells should be in one group inside the statistic table.") // determinet whether the starategy should be traded between the period isTradeEnabled = true // ******************************************************************************************* // Core strategy simulation logic // ******************************************************************************************* // calculate rsi strategy emulation data rsiEmulationData = ta.rsi(close, 7) rsiEmulationCrossover = ta.crossover(rsiEmulationData, 70) rsiEmulationCrossunder = ta.crossunder(rsiEmulationData, 30) // entry loogic based on the rsi calculations if (isTradeEnabled and rsiEmulationCrossover) strategy.entry('Long', strategy.long) if (isTradeEnabled and rsiEmulationCrossunder) strategy.entry('Short', strategy.short) // ******************************************************************************************* // Weekly statistics table // ******************************************************************************************* // define statistic variables var statisticTable = table(na) var statisticPeriodTime = array.new_int(0) var statisticPeriodResult = array.new_float(0) var statisticIsLatestCalculated = bool(na) var statisticResultHighest = float(na) var statisticResultLowest = float(na) var statisticColorGray = color.new(color.gray, transp = 60) var statisticColorGreen = color.new(color.green, transp = 60) var statisticColorRed = color.new(color.red, transp = 60) // claculate current period result barResult = not na(strategy.equity[1]) ? (strategy.equity / strategy.equity[1] - 1) : 0 isPeriodChanged = not na(time[1]) and weekofyear(time) != weekofyear(time[1]) currentPeriodResult = 0.0 currentPeriodResult := not na(currentPeriodResult[1]) and not isPeriodChanged ? ((1 + currentPeriodResult[1]) * (1 + barResult) - 1) : 0.0 // initialise highest and lowest results variables statisticResultHighest := na(statisticResultHighest) ? currentPeriodResult : statisticResultHighest statisticResultLowest := na(statisticResultLowest) ? currentPeriodResult : statisticResultLowest // search for highest and lowest results statisticResultHighest := currentPeriodResult > statisticResultHighest ? currentPeriodResult : statisticResultHighest statisticResultLowest := currentPeriodResult < statisticResultLowest ? currentPeriodResult : statisticResultLowest // new week while trade is active if isPeriodChanged and isTradeEnabled timeCalculated = time - 1000 * 60 * 60 * 24 * 7 resultCalculated = currentPeriodResult[1] statisticIsLatestCalculated := false array.push(statisticPeriodTime, timeCalculated) array.push(statisticPeriodResult, resultCalculated) // latest bar while trade is active if barstate.islast and isTradeEnabled timeCalculated = time - 1000 * 60 * 60 * 24 * (dayofweek(time) - 2) resultCalculated = currentPeriodResult array.push(statisticPeriodTime, timeCalculated) array.push(statisticPeriodResult, resultCalculated) // new week after trade disabled if isPeriodChanged and not isTradeEnabled and not na(statisticIsLatestCalculated) and not statisticIsLatestCalculated timeCalculated = time - 1000 * 60 * 60 * 24 * (dayofweek(time) + 5) resultCalculated = currentPeriodResult[1] statisticIsLatestCalculated := true array.push(statisticPeriodTime, timeCalculated) array.push(statisticPeriodResult, resultCalculated) // render statistics table if barstate.islast statisticLength = array.size(statisticPeriodResult) statisticTableSteps = math.floor(statisticLength / statisticGroupSize) + (statisticLength % statisticGroupSize != 0 ? 1 : 0) statisticTable := table.new(position.bottom_right, columns = statisticGroupSize + 2, rows = statisticTableSteps + 1, border_width = 1) // render headers for i = 0 to (statisticGroupSize - 1) statisticHeaderContent = str.tostring(i + 1) table.cell(statisticTable, 1 + i, 0, statisticHeaderContent, bgcolor = statisticColorGray) // render time points for i = 0 to (statisticTableSteps - 1) statisticPointContent = str.format("{0,date,medium}", array.get(statisticPeriodTime, i * statisticGroupSize)) table.cell(statisticTable, 0, 1 + i, statisticPointContent, bgcolor = statisticColorGray) // render the result statisticResultCummulative = 0.0 for i = 0 to (array.size(statisticPeriodTime) - 1) statisticColumn = 1 + i % statisticGroupSize statisticRow = 1 + math.floor(i / statisticGroupSize) statisticResult = array.get(statisticPeriodResult, i) statisticResultCummulative := (i % statisticGroupSize == 0) ? 0.0 : statisticResultCummulative statisticResultCummulative := (1 + statisticResultCummulative) * (1 + statisticResult) - 1 statisticResultColor = statisticResult > 0 ? statisticColorGreen : statisticColorRed table.cell(statisticTable, statisticColumn, statisticRow, str.tostring(math.round(statisticResult * 100, statisticPrecision)), bgcolor = statisticResultColor) // if it is the last item of the row or data array isStatisticLastOfTheRow = ((i + 1) % statisticGroupSize) == 0 isStatisticLastOfTheData = i == (statisticLength - 1) if (isStatisticLastOfTheRow or isStatisticLastOfTheData) resultsTableCummulativeCellColor = statisticResultCummulative > 0 ? statisticColorGreen : statisticColorRed resultsTableCummulativeCellContent = str.tostring(math.round(statisticResultCummulative * 100, statisticPrecision)) table.cell(statisticTable, 1 + statisticGroupSize, statisticRow, resultsTableCummulativeCellContent, bgcolor = resultsTableCummulativeCellColor)