Gagasan utama dari strategi ini adalah untuk mensimulasikan perdagangan secara real-time, mengumpulkan data perdagangan setiap minggu, dan menampilkan hasil statistik dalam bentuk tabel untuk melihat kinerja strategi dengan lebih intuitif. Ini dapat membantu kita untuk dengan cepat mengevaluasi keuntungan dan kerugian dari strategi, menemukan periode waktu di mana strategi berkinerja buruk, dan menyesuaikan dan mengoptimalkan strategi sesuai dengan itu.
Tentukan awal dan akhir dari siklus perhitungan.
Tentukan akurasi hasil statistik dan jumlah minggu yang tercakup dalam setiap kelompok.
Strategi simulasi RSI untuk membeli dan menjual.
Mendefinisikan variabel dalam tabel statistik.
Hitung hasil dari siklus saat ini.
Jika siklus berubah dan memungkinkan transaksi, catat waktu dan hasil dari siklus ini.
Jika garis K terakhir dan memungkinkan transaksi, catat waktu dan hasil dari siklus saat ini.
Jika siklus berubah dan tidak memungkinkan untuk berdagang, catat waktu dan hasil dari siklus sebelumnya.
Carilah hasil siklus tertinggi dan terendah.
Tabel statistik Rendering
Pertama, hitung jumlah total siklus statistik.
Pergi melalui setiap siklus, render tabel, waktu dan hasil
Akumulasi untuk setiap kelompok siklus
Tandai positif negatif dengan warna
Anda dapat melihat hasil perdagangan mingguan secara real-time dan mengevaluasi kinerja strategi dengan cepat.
Hasil yang ditunjukkan secara intuitif, pada pandangan pertama, membantu untuk menemukan siklus di mana strategi berkinerja buruk
Parameter strategi yang dapat disesuaikan dan dioptimalkan sesuai dengan kondisi keuntungan dan kerugian dalam jangka waktu tertentu
Dapat dengan mudah melacak pendapatan kumulatif selama beberapa minggu dari strategi jangka panjang
Analisis komparatif gaya perdagangan untuk periode waktu yang berbeda
Akurasi statistik dan minggu pengelompokan yang dapat disesuaikan untuk memenuhi kebutuhan yang berbeda
Kode yang sederhana dan jelas, mudah dipahami dan digunakan kembali
Strategi ini didasarkan pada simulasi perdagangan RSI, strategi RSI sendiri memiliki kelemahan yang tidak cukup kuat untuk mengikuti tren
Di real-time, biaya transaksi memiliki pengaruh yang lebih besar terhadap hasil.
Data historis yang digunakan untuk retrospeksi tidak selalu mencerminkan situasi perdagangan yang sebenarnya
Hasil statistik bergantung pada jumlah dana akun riil, jumlah dana default dalam pengukuran ulang tidak selalu akurat
Perhatian diperlukan untuk mencegah overfitting, mengubah parameter kebijakan secara membabi buta berdasarkan umpan balik
Strategi RSI dapat diperkuat dengan menggabungkan lebih banyak indikator untuk menilai tren, mengoptimalkan titik masuk dan keluar. Perhatikan untuk mengatur biaya dengan parameter yang sebenarnya saat berdagang secara langsung.
Anda dapat mempertimbangkan untuk menambahkan logika stop loss untuk mengendalikan kerugian tunggal.
Anda dapat mengoptimalkan parameter strategi, seperti mengadaptasi RSI untuk melihat ke bawah atau ke bawah
Anda dapat mencoba frekuensi perdagangan yang berbeda, seperti perdagangan harian atau posisi bulanan.
Anda dapat menambahkan lebih banyak indikator untuk menilai tren pasar dan waktu masuk.
Anda bisa mempertimbangkan untuk menambahkan logika stopgap.
Pengaturan yang dapat mengoptimalkan parameter statistik
Mempertimbangkan untuk mencapai statistik untuk berbagai aset
Dengan menambahkan stop loss, risiko dan rasio keuntungan dapat dikontrol dengan lebih baik. Mengoptimalkan parameter RSI dapat meningkatkan tingkat kemenangan. Mengadopsi lebih banyak indikator dan frekuensi perdagangan yang berbeda dapat membuat strategi lebih stabil.
Tujuan dari strategi ini adalah untuk mengumpulkan hasil perdagangan berkala, untuk ditampilkan secara intuitif dalam bentuk tabel statistik, sehingga dapat dengan cepat menilai keuntungan dari strategi dalam periode waktu yang berbeda. Ini memberikan dukungan data untuk optimasi strategi. Kelebihannya adalah hasil mingguan dapat dilihat secara real-time, intuitif dan jelas, dan mudah untuk dikembangkan ulang. Perlu dicatat bahwa hasil statistik dapat menyebabkan ketergantungan berlebihan dan penyesuaian data pengembalian.
/*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)