Strategi menghasilkan hasil baik yang tidak realistis dengan melihat ke masa depan

Salah satu tujuan utama kami dalam mengembangkan bahasa Pine adalah menyediakan sebanyak mungkin alat yang berguna bagi para pengguna kami. Peralatan ini mungkin memiliki berbagai kegunaan yang berbeda, dan dengan manipulasi tertentu, beberapa indikator dan jenis chart tertentu memungkinkan anda untuk mengekstrak data dari bar atau trade di masa mendatang (relatif terhadap bar yang sedang diproses). Karena seorang trader tidak dapat menerima data ini dalam aktifitas trading yang sebenarnya, strategi yang dibangun berdasarkan hal tersebut akan dapat menghasilkan hasil yang menguntungkan namun tidak realistis saat dilakukan pengujian ulang, sementara dalam trading secara real-time, trade tersebut justru menghasilkan kerugian. Kesalahan penggunaan informasi dari masa depan dalam strategi juga dapat disebut sebagai bias look-ahead.

Beberapa pengguna TradingView, karena ketidaktahuan atau dengan niat yang tidak baik, cenderung membuat publikasi ide dan skrip dengan memanfaatkan fitur ini. TradingView tidak dapat menghapus fitur itu sendiri karena mungkin dapat berguna dalam beberapa kasus lainnya, tetapi pada saat yang sama, kami berkomitmen untuk memperingatkan para pengguna tentang hal ini.

Strategi yang menggunakan candle motif Jepang

Alasan yang sangat umum untuk perilaku ini adalah melakukan backtest strategi menggunakan chart dengan motif candle Jepang (Renko, Kagi, dll). Masalahnya muncul dari fakta bahwa Strategy Backtesting Engine menganggap setiap bar nya sebagai 4 transaksi, dengan harga pembukaan, tertinggi, terendah, dan penutupan (seperti halnya dengan chart candle biasa). Karena itu, pada chart Renko, Strategy Backtesting Engine dapat masuk/keluar posisi pada harga yang tidak ada dalam kenyataannya. Selain itu, jika anda menetapkan nilai Ukuran Kotak menjadi lebih kecil dari mintick, adalah suatu hal yang mungkin untuk melihat apakah harga berikutnya akan lebih tinggi atau lebih rendah dari yang ada sekarang kemudian membuat sebuah posisi masuk/keluar secara terlebih dahulu sebelum Backtesting Engine kami dapat memproses harga yang sebenarnya.

//@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 di gambar diatas, strategi sederhana ini dapat membuat order dengan harga yang sangat mendekati harga maksimum/minimumnya.Strategi ini menggunakan parameter calc_on_order_fills = trueSaat parameter calc_on_order_fills = true ditentukan dalam sebuah fungsi strategi, Backtesting Engine melakukan penghitungan tambahan di dalam bar setelah ordernya dijalankan (berbeda dengan situasi biasa ketika strategi dihitung hanya pada penutupan bar). Pada saat yang sama, selama penghitungan, strategi akan mendapatkan akses ke beberapa parameter bar  tambahan, misalnya, nilai tinggi dan rendah. Ini memungkinkan anda untuk menulis strategi yang akan menunjukkan kinerja luar biasa saat melakukan backtest::
//@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 gambar diatas, anda dapat melihat bahwa entri berada pada harga pembukaan sebuah bar, dan keluarnya terjadi pada puncak bar yang sama. Artinya, selama kalkulasi, setelah order dieksekusi, kami menetapkan harga limit strategy.exit  nya setarra dengan level tertinggi dari bar saat ini, yang mana itu tidak dapat dilakukan pada trading yang sebenarnya. 

Parameter lookahead = barmerge.lookahead_on pada security dan seluruh security sebelum Pine v3

Fungsi security di Pine memungkinkan anda meminta data dari simbol dan/atau kerangka waktu lain. Bergantung pada implementasinya, ini memungkinkan strategi untuk menerima data dari masa depan: jika seseorang, misalnya, meminta penutupan atau tertinggi dari bar harian, sementara pada backtest, strategi dapat mengetahui nilai-nilai ini tepat pada pembukaan harinya.

Sebelum versi 3, fungsi security akan mengembalikan nilai dari kerangka waktu yang lebih tinggi bahkan sebelum nilai tersebut dapat diakses. Di versi 3, perilaku ini telah diperbaiki, tetapi untuk tujuan kompatibilitas, parameter lookahead telah ditambahkan ke fungsi security. Secara bawaannya, fungsi ini adalah false (yaitu, visi masa depan dimatikan), tetapi anda dapat mengaktifkannya dengan menyetel nilai parameter lookahead ke barmerge.lookahead_on).

Sebuah contoh dari strategi profitable yang dibangun menggunakan fitur tersebut:

//@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 bilah pertama, kami menganalisis apakah harga akan bergerak lebih ke atas atau ke bawah relatif terhadap harga pembukaan dan berdasarkan ini, kami memasuki posisi pembelian atau penjualan, dan kemudian keluar pada harga maksimum atau minimumnya masing-masing di hari itu.

Perhatikan bahwa tidak semua kasus di mana security() yang memiliki argumen barmerge.lookahead_on akan melihat ke masa depan: misalnya, jika kita mengubah kode di atas dengan mengganti time/high/low didalam security () ke time [1]/high [ 1]/low [1] masing-masingnya, kami akan menerima nilai untuk bar yang telah ditutup. Ini sering digunakan oleh pembuat kode berpengalaman untuk mendapatkan data dari security() tanpa adanya risiko akan terjadinya lookahead.

Saat ini, ini semua adalah cara yang telah kami ketahui dimana sebuah strategi dapat melihat ke masa depan. Kami berharap deskripsi ini akan memungkinkan anda untuk membuat strategi yang tidak memiliki kelemahan ini, serta menghindari strategi terpublikasi yang penulisnya memanfaatkan fitur-fitur ini dalam ide-ide mereka.