Alat Analisis Strategi Dinamis


Tanggal Pembuatan: 2023-10-13 15:54:35 Akhirnya memodifikasi: 2023-10-13 15:54:35
menyalin: 1 Jumlah klik: 680
1
fokus pada
1617
Pengikut

Ringkasan

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.

Prinsip Strategi

  1. Tentukan awal dan akhir dari siklus perhitungan.

  2. Tentukan akurasi hasil statistik dan jumlah minggu yang tercakup dalam setiap kelompok.

  3. Strategi simulasi RSI untuk membeli dan menjual.

  4. Mendefinisikan variabel dalam tabel statistik.

  5. Hitung hasil dari siklus saat ini.

  6. Jika siklus berubah dan memungkinkan transaksi, catat waktu dan hasil dari siklus ini.

  7. Jika garis K terakhir dan memungkinkan transaksi, catat waktu dan hasil dari siklus saat ini.

  8. Jika siklus berubah dan tidak memungkinkan untuk berdagang, catat waktu dan hasil dari siklus sebelumnya.

  9. Carilah hasil siklus tertinggi dan terendah.

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

Analisis Keunggulan

  • 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

Analisis risiko

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

Arah optimasi

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

Meringkaskan

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.

Kode Sumber Strategi
/*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)