Strategi menghasilkan hasil yang baik secara realistik dengan mengintip masa depan

Salah satu tujuan utama kami dalam menghasilkan bahasa Pine adalah menyediakan pengguna dengan sebanyak mungkin alatan berguna. Alatan ini mungkin mempunyai pelbagai kegunaan yang berbeza, dan dengan manipulasi tertentu, beberapa petunjuk dan jenis carta membolehkan anda mengekstrak data dari bar atau dagangan masa depan (berbanding dengan bar yang sedang diproses). Oleh kerana pedagang tidak dapat menerima data ini dalam dagangan nyata, strategi yang dibina di sekitarnya dapat menghasilkan hasil yang menguntungkan secara tidak realistik ketika menguji semula, sementara dalam perdagangan waktu nyata perdagangan ini akan menjadi kerugian. Kesalahan menggunakan maklumat dari masa depan dalam strategi juga disebut bias melihat ke depan.

 

Sebilangan pengguna TradingView, karena tidak tahu atau dengan niat jahat, cenderung membuat idea dan penerbitan skrip yang memanfaatkan ciri ini. TradingView tidak dapat membuang ciri itu sendiri kerana mungkin berguna dalam beberapa kes, tetapi pada masa yang sama, kami komited untuk memberi amaran kepada pengguna mengenai tingkah laku ini.

 

Strategi menggunakan lilin gaya Jepun

 

Sebab yang sangat umum untuk tingkah laku ini adalah menguji strategi pada carta gaya Jepun (Renko, Kagi, dll). Masalahnya timbul dari kenyataan bahawa Strategi Backtesting Engine menganggap setiap bar sebagai 4 transaksi, dengan harga buka, tinggi, rendah dan tutup (seperti yang berlaku dengan carta candlestick biasa). Oleh kerana itu, pada carta Renko, Strategi Backtesting Engine dapat memasuki / keluar dari posisi pada harga yang tidak wujud pada keadaan sebenar. Di samping itu, jika anda menetapkan nilai Box Size menjadi lebih kecil daripada mintick, ada kemungkinan untuk memeriksa apakah harga seterusnya akan lebih tinggi atau lebih rendah daripada harga semasa dan masukkan / keluar dari kedudukan terlebih dahulu, sebelum Backtesting Engine memproses harga sebenar.

//@version=4
strategy("My Strategy", overlay=true)
if close < close[1]
    strategy.entry("ShortEntryId", strategy.short)
strategy.close("ShortEntryId", when = close > close[1])

if close > close[1]
    strategy.entry("LongEntryId", strategy.long)
strategy.close("LongEntryId", when = close < close[1])

Seperti yang anda lihat pada tangkapan skrin, strategi semudah ini dapat membuat penawaran dengan harga yang hampir dengan yang maksimum / minimum.

Strategi menggunakan parameter calc_on_order_fills = true

 

Apabila parameter calc_on_order_fills = true ditentukan dalam fungsi strategi, Backtesting Engine melakukan pengiraan tambahan di dalam bar setelah pesanan dilaksanakan (berbeza dengan situasi biasa ketika strategi dihitung hanya pada waktu penutupan bar). Pada masa yang sama, semasa perhitungan, strategi mendapat akses ke pada banyak parameter bar tambahan, misalnya, nilai tinggi dan rendah. Ini membolehkan anda menulis strategi yang akan menunjukkan prestasi yang sangat baik semasa menguji semula:

//@version=4
strategy("CalcOnOrderFillsStrategy", overlay=true, calc_on_order_fills=true)

// a variable is used to prevent double entry on the same bar
var lastTimeEntry = 0

longCondition = close > sma(close, 14)  and lastTimeEntry != time
if longCondition
    strategy.entry("LongEntryId", strategy.long)

strategy.exit("exitId", "LongEntryId", limit=high)
lastTimeEntry := time

Pada tangkapan skrin, anda dapat melihat bahawa kemasukan berada pada harga bar yang terbuka, dan pengeluaran berlaku di ketinggian bar yang sama. Itu ialah, semasa perhitungan, setelah pesanan dilaksanakan, kami menetapkan strategi had harga keluar sama dengan tahap tinggi bar semasa, yang mana kita tidak dapat lakukan dalam perdagangan nyata.

 

Parameter lookahead = barmerge.lookahead_on dalam keselamatan dan sebarang keselamatan sebelum Pine v3 

 

Fungsi keselamatan di Pine membolehkan anda meminta data dari simbol dan / atau jangka masa lain. Bergantung pada pelaksanaannya, ini memungkinkan strategi untuk menerima data dari masa depan: jika seseorang, misalnya, meminta penutupan atau tinggi bar harian, sementara menguji strategi dapat mengetahui nilai-nilai ini tepat pada awal hari.

Sebelum versi 3, fungsi keselamatan akan mengembalikan nilai dari jangka waktu yang lebih tinggi sebelum ia seharusnya dapat diakses. Dalam versi 3, tingkah laku ini telah diperbaiki, tetapi untuk keserasian, parameter lookahead telah ditambahkan ke fungsi keselamatan. Ini salah secara lalai (iaitu, penglihatan masa depan dimatikan), tetapi anda boleh mengaktifkannya dengan menetapkan nilai parameter lookahead ke barmerge.lookahead_on).

Contoh strategi yang menguntungkan yang dibina menggunakan ciri ini:

//@version=4
strategy("My Strategy", overlay=true)
dayStart = security(syminfo.tickerid, "1D", time, lookahead=barmerge.lookahead_on)
dayHigh = security(syminfo.tickerid, "1D", high, lookahead=barmerge.lookahead_on)
dayLow = security(syminfo.tickerid, "1D", low, lookahead=barmerge.lookahead_on)

// entry at first bar of a day
if time == dayStart
    // distance to daily high is further, so we can earn more
    if abs(open - dayHigh) > abs(open - dayLow)
        strategy.entry("LongEntryId", strategy.long)
        strategy.exit("exitLongId", "LongEntryId", limit=dayHigh)
    else
        strategy.entry("ShortEntryId", strategy.short)
        strategy.exit("exitShortId", "ShortEntryId", limit=dayLow)
        
plot(dayHigh)
plot(dayLow)

Pada bar pertama, kami menganalisis sama ada harga akan bergerak lebih tinggi atau turun berbanding dengan harga pembukaan dan berdasarkan ini, kami memasuki posisi panjang atau pendek, dan kemudian keluar pada harga maksimum atau minimum pada hari itu.

 

Perlu diingatkan bahawa tidak semua kes di mana security() mempunyai argumen barmerge.lookahead_on ke masa depan: sebagai contoh, jika kita menukar kod di atas dengan mengganti masa / tinggi / rendah di dalam security()  ke waktu [1] / tinggi [ 1] / rendah [1] masing-masing, kita akan menerima nilai untuk bar yang sudah ditutup. Perkara ini sering digunakan oleh pengkod yang berpengalaman untuk mendapatkan data dari security() tanpa risiko lookahead.

Pada masa ini, ini adalah semua cara yang diketahui untuk strategi melihat masa depan. Kami berharap keterangan ini akan membolehkan anda membuat strategi yang tidak mempunyai kekurangan ini, dan juga mengelakkan strategi yang diterbitkan yang penulisnya mengeksploitasi ciri-ciri ini dalam idea mereka.