Alat Analisis Strategi Dinamis

Penulis:ChaoZhang, Tanggal: 2023-10-13 15:54:35
Tag:

Gambaran umum

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.

Logika Strategi

  1. Tentukan waktu awal dan akhir untuk periode perhitungan.

  2. Tetapkan presisi statistik dan jumlah minggu di setiap kelompok.

  3. Simulasi strategi RSI untuk masuk dan keluar.

  4. Mendefinisikan variabel untuk tabel statistik.

  5. Menghitung hasil untuk periode saat ini.

  6. Jika perubahan periode dan perdagangan diaktifkan, catat waktu dan hasil untuk periode ini.

  7. Jika itu bar terakhir dan perdagangan diaktifkan, catat waktu dan hasil untuk periode saat ini.

  8. Jika perubahan periode dan perdagangan dinonaktifkan, catat waktu dan hasil untuk periode sebelumnya.

  9. Cari hasil periode tertinggi dan terendah.

  10. 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

Analisis Keuntungan

  • 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

Analisis Risiko

  • 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.

Arahan Optimasi

  • 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.

Ringkasan

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)

Lebih banyak