Strategi berjalan secara rawak

Penulis:ChaoZhang, Tarikh: 2023-10-09 16:10:24
Tag:

Ringkasan

Strategi berjalan secara rawak adalah strategi perdagangan automatik berdasarkan penjanaan nombor rawak. Ia menggunakan penjana kongruensi linear untuk menjana nombor secara rawak berdasarkan benih set. Apabila nombor lebih besar daripada ambang, ia pergi panjang, apabila kurang, ia pergi pendek, melaksanakan entri rawak panjang / pendek.

Logika Strategi

Bahagian utama yang melaksanakan perdagangan rawak adalah:

  1. Tetapkan parameter a, c dan modulus m untuk penjanaan nombor rawak, serta benih awal.

  2. Tentukan fungsi penjanaan nombor rawak GetRandom menggunakan algoritma kongruensi linear untuk menjana nombor rawak antara 0-m.

  3. Pada setiap candlestick, jika tidak ada kedudukan, bandingkan saiz nombor rawak yang dihasilkan, pergi panjang apabila lebih besar daripada m/2, jika tidak pergi pendek.

  4. Tetapkan syarat stop loss dan mengambil keuntungan dalam peratusan.

  5. Tetapkan tempoh backtest mengikut jangka masa.

Melalui langkah-langkah di atas, strategi merealisasikan operasi panjang / pendek secara rawak sepenuhnya. Apabila nombor rawak lebih besar daripada m / 2, ia membuka kedudukan panjang, jika tidak, ia membuka pendek, kemudian menetapkan stop loss dan mengambil keuntungan untuk keluar dari kedudukan.

Analisis Kelebihan

  • Logik strategi yang mudah dan jelas, mudah difahami dan dilaksanakan.

  • Perdagangan rawak berkesan mengelakkan kesan emosi dan mengurangkan kesalahan subjektif.

  • Parameter penjanaan nombor rawak yang boleh disesuaikan untuk menyesuaikan rawak.

  • Tetapan stop loss dan mengambil keuntungan yang fleksibel untuk mengawal keuntungan/kerugian tunggal.

  • Menyokong pengoptimuman parameter melalui backtesting kesan parameter yang berbeza pada keuntungan keseluruhan.

Analisis Risiko

  • Perdagangan rawak boleh mengakibatkan trend jangka panjang yang tidak ditakrifkan dan keuntungan yang tidak pasti.

  • Tidak dapat menyesuaikan kedudukan berdasarkan keadaan pasaran, boleh kehilangan peluang trend.

  • Keuntungan tunggal yang terhad, risiko pengeluaran yang tinggi.

  • Memerlukan nisbah stop loss/take profit yang munasabah untuk mengelakkan kerugian yang ketara.

  • Posisi terbuka/tutup yang kerap disebabkan oleh keacakan meningkatkan kos dagangan.

  • Ujian belakang yang mencukupi diperlukan untuk mengesahkan tetapan parameter yang munasabah, jangan menggunakan secara buta.

Risiko boleh dikurangkan dengan menambah penilaian trend, mengoptimumkan mekanisme stop loss, mengawal keuntungan/kerugian tunggal secara ketat dan lain-lain.

Arahan Penambahbaikan

  • Tambah penilaian trend untuk mengelakkan perdagangan terhadap trend.

  • Tambah saiz kedudukan berdasarkan perubahan modal.

  • Mengoptimumkan algoritma penjanaan nombor rawak untuk rawak yang lebih baik.

  • Peratusan stop loss/take profit dinamik.

  • Batasi kekerapan perintah.

  • Multi-parameter backtest optimum.

Ringkasan

Strategi berjalan rawak mewujudkan perdagangan mekanikal melalui nombor rawak yang dikawal panjang / pendek. Ia mempunyai keacakan yang kuat dan mengelakkan kesan emosi dan kesalahan subjektif. Tetapi entri rawak juga mungkin kehilangan peluang trend, keuntungan tunggal yang terhad, memerlukan mekanisme kawalan risiko yang dioptimumkan. Secara keseluruhan strategi ini sesuai untuk mengesahkan idea perdagangan, menilai kesan parameter, tetapi penilaian yang teliti diperlukan untuk penggunaan praktikal.


/*backtest
start: 2022-10-02 00:00:00
end: 2023-10-08 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
//@author=Tr0sT
strategy(title = "Random strategy", shorttitle = "Random", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100)

a = 16
c = 10
m = 1000
GetRandom(prev) =>
    GetRandom = (a * prev + c) % m

seed = input(200, minval = 2, maxval = m)
stopLoss = input(30, title = "Stop loss percentage(0.1%)")
takeProfit = input(30, title = "Take profit percentage(0.1%)")


curRandom = na
curRandom := nz(curRandom[1]) == 0 ? seed : GetRandom(curRandom[1])
if (strategy.position_size == 0)
    if (curRandom >= m / 2)
        strategy.entry("Enter", strategy.long)
    else
        strategy.entry("Enter", strategy.short)
        
    strategy.exit("Exit", "Enter", loss = close * stopLoss / 1000 / syminfo.mintick, profit = close * takeProfit / 1000 / syminfo.mintick)            

// === Backtesting Dates ===
testPeriodSwitch = input(false, "Custom Backtesting Dates")
testStartYear = input(2018, "Backtest Start Year")
testStartMonth = input(3, "Backtest Start Month")
testStartDay = input(6, "Backtest Start Day")
testStartHour = input(08, "Backtest Start Hour")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0)
testStopYear = input(2018, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(14, "Backtest Stop Day")
testStopHour = input(14, "Backtest Stop Hour")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0)
testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
isPeriod = testPeriodSwitch == true ? testPeriod() : true
// === /END
if not isPeriod
    strategy.cancel_all()
    strategy.close_all()

Lebih lanjut