Idea utama strategi ini adalah untuk mensimulasikan perdagangan dalam masa nyata, mengumpul data perdagangan setiap minggu, dan memaparkan hasil statistik dalam bentuk jadual untuk melihat prestasi strategi dengan lebih intuitif. Ia dapat membantu kita menilai keuntungan dan kerugian strategi dengan cepat, mencari tempoh masa di mana strategi tidak berkinerja baik, dan menyesuaikan dan mengoptimumkan strategi berdasarkan itu.
Tetapkan permulaan dan pengakhiran kitaran pengiraan
Tetapkan ketepatan hasil statistik dan jumlah minggu yang terkandung dalam setiap kumpulan.
Simulasi RSI untuk membeli dan menjual.
Mendefinisikan pembolehubah dalam statistik.
Hitung hasil kitaran semasa.
Jika kitaran berubah dan membolehkan perdagangan, rekodkan masa dan hasil kitaran ini.
Jika ia adalah garis K terakhir dan membolehkan transaksi, rekodkan masa dan hasil kitaran semasa.
Jika kitaran berubah dan tidak membenarkan perdagangan, rekodkan masa dan hasil kitaran sebelumnya.
Cari hasil kitaran tertinggi dan terendah.
Tabel statistik pengendalian.
Pertama, kira jumlah keseluruhan kitaran statistik
Pergi melalui setiap kitaran, kepala, masa dan hasil
Pengumpulan hasil bagi setiap kumpulan kitaran
Tandakan positif dan negatif dengan warna
Anda boleh melihat hasil dagangan mingguan secara langsung dan menilai prestasi strategi dengan cepat.
Menunjukkan hasil secara intuitif, dengan sekilas, untuk mengenal pasti kitaran kegagalan strategi
Parameter strategi boleh disesuaikan dan dioptimumkan mengikut keadaan keuntungan dan kerugian dalam tempoh masa
Kemudahan untuk mengesan keuntungan berminggu-minggu yang terkumpul dari strategi memegang saham jangka panjang
Analisis perbandingan gaya dagangan untuk tempoh masa yang berbeza
Ketepatan statistik tersuai dan minggu pengelompokan untuk memenuhi keperluan yang berbeza
Kode mudah, jelas, mudah difahami dan digunakan semula
Strategi ini berdasarkan simulasi perdagangan RSI, strategi RSI sendiri mempunyai kelemahan yang tidak cukup untuk mengikuti trend
Dalam pasaran sebenar, kos dagangan akan memberi kesan yang lebih besar kepada keputusan.
Data sejarah yang digunakan untuk pengesanan semula tidak semestinya mencerminkan keadaan perdagangan sebenar
Hasil statistik bergantung kepada jumlah dana akaun sebenar, jumlah dana lalai dalam pengukuran semula tidak semestinya tepat
Berhati-hati untuk mengelakkan overfitting, mengubah parameter strategi secara buta mengikut hasil tinjauan
Anda boleh meningkatkan strategi RSI dengan menggabungkan lebih banyak indikator untuk menilai trend, mengoptimumkan titik masuk dan keluar. Berhati-hati untuk menetapkan bayaran dengan parameter sebenar semasa berdagang secara langsung.
Anda boleh pertimbangkan untuk menambah logik stop loss untuk mengawal kerugian tunggal.
Anda boleh mengoptimumkan parameter strategi, seperti membetulkan RSI pada paras penurunan dan penurunan
Anda boleh mencuba frekuensi dagangan yang berbeza, seperti dagangan dalam sehari atau pegangan bulanan
Lebih banyak penunjuk boleh ditambah untuk menilai trend pasaran dan masa masuk
Anda boleh pertimbangkan untuk menambah logik stop
Tetapan yang boleh mengoptimumkan parameter statistik
Mempertimbangkan untuk mencapai statistik pelbagai aset
Dengan menambah stop loss, risiko dan nisbah keuntungan dapat dikawal dengan lebih baik. Mengoptimumkan parameter RSI dapat meningkatkan kadar kemenangan. Menggunakan lebih banyak indikator dan frekuensi perdagangan yang berbeza dapat menjadikan strategi lebih stabil.
Strategi ini bertujuan untuk mengumpul hasil dagangan kitaran, yang dipaparkan secara intuitif dalam bentuk jadual statistik, yang dapat menilai dengan cepat keuntungan strategi dalam tempoh masa yang berbeza. Ini memberikan sokongan data untuk pengoptimuman strategi. Kelebihannya adalah bahawa hasil mingguan dapat dilihat secara langsung, jelas secara intuitif, dan mudah digunakan untuk pembangunan kedua. Perlu diperhatikan bahawa hasil statistik mungkin menyebabkan ketergantungan berlebihan dan data retest yang disesuaikan.
/*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)