Katakan Halo untuk Skrip Pine v5

Oct 7, 2021

Hari ini Pine telah naik kelas ke v5! Versi baru bahasa pemrograman indikator dan strategi kami menghadirkan sejumlah fitur dan peningkatan baru yang menarik. Pine kini menjadi lebih kuat dari sebelumnya, dan perubahan di v5 akan membantu kami membawa bahasa ini ke level yang baru. Posting ini memperkenalkan beberapa fitur terbaru yang tersedia; pastikan untuk membaca Catatan Rilis dan Panduan Migrasi kami.

Converter V4 ke V5

Skrip Pine yang menggunakan versi Pine sebelumnya akan terus berjalan tanpa perubahan, tetapi kami telah menyediakan alat konversi di Editor Pine untuk membantu pembuat kode mengonversi skrip v4 ke v5. Peningkatan di masa depan untuk Pine akan diluncurkan untuk v5 secara eksklusif, jadi kami sarankan untuk mengonversi indikator dan strategi anda jika anda ingin mendapatkan manfaat dari fitur-fitur baru ini. Alat konversi v4 ke v5 tersedia saat skrip v4 dimuat di Editor, melalui menu dropdown Lainnya:

Harap diingat bahwa tidak seluruh code v4 dapat dikonversikan secara otomatis. Jika anda mengalami isu saat melakukan konversi atau memilih untuk mengkonversi skrip anda secar amanual, dokumentasi Panduan Migrasi mencatat seluruh perubahan antara v4 ke v5 yang akan memberikan panduan untuk anda.

Perpustakaan

Tambahan kunci untuk Pine yang turut hadir bersama v5 adalah perpustakaan. Perpustakaan adalah jenis publikasi baru yang memungkinkan anda membuat sebuah fungsi kustom untuk digunakan kembali di skrip lain. Setelah perpustakaan diterbitkan, skrip lain (baik itu indikator, strategi, atau bahkan perpustakaan lain) dapat mengimpornya dan menggunakan fungsinya. Anda dapat menggunakan perpustakaan untuk menyertakan algoritma kompleks atau fungsi yang sering digunakan sehingga anda, atau seluruh komunitas Pine, dapat dengan mudah menggunakannya kembali.

Untuk mulai menggunakan perpustakaan, lihatlah halaman Panduan Pengguna mengenai perpustakaan kami. Di akhir dari posting ini, anda akan menemukan contoh dari perpustakaan yang dipublikasikan oleh member dari tim PineCoders kami. Anda dapat melihat perpustakaan yang telah dipublikasikan dari feed skrip berikut ini.

Nilai bawaan untuk fungsi-fungsi yang ditentukan pengguna

Peningkatan hadir bersama dengan perpustakaan: nilai bawaan dapat ditentukan untuk parameter dalam fungsi yang ditentukan pengguna, yang secara efektif menjadikannya opsional. Dalam contoh di bawah ini, kami mendeklarasikan fungsi kustom customPow() yang menaikkan base kedalam pangkat dari exp. Jika exp tidak ditentukan saat fungsi dipanggil, 2 akan digunakan:

//@version=5
indicator("")
customPow(base, exp = 2) =>
    result = 1
    for i = 1 to exp
        result *= base
plot(customPow(11)) // 11^2
plot(customPow(11, 4)) // 11^4

Switch

Statement switch yang baru adalah ragam dari statement yang sudah familiar yaitu if. Jika anda perlu membuat serangkaian besar dari statement if-else, anda akan menyadari seberapa mudahnya untuk mencapai hasil yang diinginkan dengan menggunakan switch. Anda dapat mempelajarinya lebih lanjut pada Panduan Referensi. Lihat penggunaannya pada kode dibawah ini. Ini merupakan indikator bawaan kami yaitu Average True Range/Rentang Rata-rata Sebenarnya, yang kini menggunakan statement switch untuk memberikan algoritma penghalusan yang berbeda ke dalam kalkulasinya:

//@version=5
indicator(title="Average True Range", shorttitle="ATR", timeframe="")
lengthInput = input.int(title="Length", defval=14, minval=1)
smoothingInput = input.string(title="Smoothing", defval="RMA", options = ["RMA", "SMA", "EMA", "WMA"])

maFunction(source, length) =>
    switch smoothingInput
        "RMA" => ta.rma(source, length)
        "SMA" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        => ta.wma(source, length)

plot(maFunction(ta.tr(true), lengthInput), title = "ATR", color=#B71C1C)

Kumpulan gambar

Seolah mendapatkan perbaikan kualitas hidup saat bekerja dengan gambar-gambar Pine: variabel array bawaan baru line.all, label.all, box.all, dan table.all akan selalu mengandung ID dari seluruh gambar dari suatu tipe tertentu yang digambarkan oleh skrip anda.

Anda dapat menggunakannya, misalnya, untuk memangkas jumlah gambar yang ditampilkan pada chart berdasarkan nilai yang ditentukan oleh penggunanya. Dalam skrip di bawah, kami menggambar garis pada setiap pembukaan harian baru (hingga batas ~50, berdasarkan batas baris bawaan skrip). Kami kemudian memeriksa apakah jumlah baris yang diizinkan melalui input skrip terlampaui, dan akan hapus garis yang terlama jika telah terlampaui:

//@version=5
indicator("Daily Open", overlay = true)

qtyOfLinesInput = input.int(10, "Draw only last n lines", minval = 0, maxval = 50)

if ta.change(time("1D"))
    line.new(bar_index, open, bar_index + 1, open, extend = extend.right)
    if array.size(line.all) > qtyOfLinesInput
        line.delete(array.get(line.all, 0))

While

Fitur Pine lainnya yang telah lama ditunggu-tunggu yang kini hadir dengan v5 adalah pengulangan while. Pernyataan while membuat perulangan yang akan berhenti ketika kondisinya false atau perintah break digunakan dalam perulangannya.

Sebagai contoh, berikut adalah indikator yang menghitung perbedaan antara jarak rata-rata yang perlu kita lihat ke belakang untuk menemukan volume naik dan turun yang sama dengan total volume n bar terakhir. Semakin jauh kita perlu melihat ke belakang untuk menemukan volume naik atau turun, semakin bearish atau bullish nilainya:

//@version=5
var int MAX_BARS_BACK = 500
indicator("Volume bias", max_bars_back = MAX_BARS_BACK)

int lookBackInput = input.int(20, "Volume Look Back (bars)", minval = 2, maxval = int(MAX_BARS_BACK / 4))

// Stop the script if the chart does not contain volume data.
bool noVol = na(volume) and nz(math.sum(nz(volume), 200) == 0, true)
if noVol
    runtime.error("No volume data.")

volumeBias(lookBack, maxLookBack) =>
    bool  barUp = ta.rising(close, 1)
    bool  barDn = ta.falling(close, 1)
    float upVolume = 0.
    float dnVolume = 0.
    float avgVolume = math.sum(nz(volume), lookBack)
    int[] upBarNos = array.new_int(0)
    int[] dnBarNos = array.new_int(0)
    int   bar = 1
    bool  volumeFound = false
    while (not volumeFound) and bar < maxLookBack
        if barUp[bar] and upVolume < avgVolume
            upVolume += nz(volume[bar])
            array.push(upBarNos, bar)
        else if barDn[bar] and dnVolume < avgVolume
            dnVolume += nz(volume[bar])
            array.push(dnBarNos, bar)
        bar += 1
        volumeFound := upVolume >= avgVolume and dnVolume >= avgVolume
    float volumeBias = bar >= maxLookBack ? na : array.avg(dnBarNos) - array.avg(upBarNos)

float bias = volumeBias(lookBackInput, MAX_BARS_BACK)
plot(bias, "Volume Bias", bias > 0 ? color.lime : color.fuchsia)
hline(0)

Pengulangan skrip while dijalankan hingga volume yang diperlukan ditemukan di volume atas dan bawah, dan kami belum melihat ke belakang melewati jumlah maksimum bar yang diizinkan. Script ini juga menampilkan fitur lainnya yang ditambahkan ke Pine v5: runtime.error().

runtime.error()

Fungsi runtime.error() sekarang memungkinkan untuk menghentikan eksekusi skrip dan menampilkan pesan error pada kondisi apa pun yang dapat anda tentukan di Pine. Ini akan berguna bagi pembuat skrip yang ingin mencegah pengguna menggunakan indikator mereka secara tidak benar. Ini juga dapat digunakan sebagai alat debugging yang tidak lazim, untuk menghentikan eksekusi selama loop atau dari dalam suatu fungsi, misalnya.

Untuk menggunakan fungsi baru ini, cukup panggil fungsi runtime.error() saat kondisi anda telah terpenuhi. Ketika dijalankan, itu akan menghentikan skrip dan menampilkan tanda seru yang sangat familiar di sebelah nama indikatornya. Ketika pengguna mengklik ikon tanda seru tersebut, pesan yang anda gunakan dalam panggilan fungsi tersebut akan muncul.

Kode di bawah ini adalah indikator VWAP mentah dengan dua pesan error khusus. Yang pertama muncul ketika simbol tidak memiliki volume data: VWAP dihitung berdasarkan volume, jadi jika tidak ada volume, skrip tidak dapat bekerja. Yang kedua muncul ketika jangka waktu pada chart adalah 1D atau lebih tinggi. Perhitungan VWAP mengakumulasikan data rata-rata pergerakan terbebani volume pada setiap bar baru dan diatur ulang pada awal hari yang baru, sehingga indikator ini hanya berguna pada kerangka waktu intrahari saja.

//@version=5
indicator("VWAP with custom errors")
if na(volume) // Will be true on symbols with no volume data e.g. TVC:SPX
    runtime.error("There is no volume data for this symbol.")
else if timeframe.isdwm // Will be true on 1D and higher timeframes
    runtime.error("Session-based VWAP does not show meaningful data on timeframes >= 1D.
     Please switch to a lower timeframe.")
plot(ta.vwap)

Parameter strategi baru

Kabar baik untuk pembuat kode strategi! Kami telah menambahkan banyak variabel dan fungsi baru yang memberi anda visibilitas tentang properti trading, statistik, dan metriknya. Nilainya diperbarui saat emulator broker mengeksekusi order anda, sehingga anda dapat mengikuti nilainya seiring dengan progress dari strategi anda.

Klik disini untuk melihat Panduan Referensi Pine untuk keterangan lengkap dari masing-masingnya

strategy.closedtrades.entry_price() / strategy.opentrades.entry_price()

strategy.closedtrades.entry_bar_index() / strategy.opentrades.entry_bar_index()

strategy.closedtrades.entry_time() / strategy.opentrades.entry_time()

strategy.closedtrades.size() / strategy.opentrades.size()

strategy.closedtrades.profit() / strategy.opentrades.profit()

strategy.closedtrades.commission() / strategy.opentrades.commission()

strategy.closedtrades.max_runup() / strategy.opentrades.max_runup()

strategy.closedtrades.max_drawdown() / strategy.opentrades.max_drawdown()

strategy.closedtrades.exit_price()

strategy.closedtrades.exit_bar_index()

strategy.closedtrades.exit_time()

strategy.convert_to_account()

strategy.convert_to_symbol()

strategy.account_currency

 

Namespace baru

Komunitas pembuat kode Pine kami memberi tahu kami bahwa mereka menghargai kecepatan penambahan fitur yang kami buat untuk Pine dalam beberapa tahun terakhir, dan kami bermaksud untuk mempertahankan kecepatan yang sama di masa mendatang. Namun, ini menciptakan aliran konstan fungsi Pine baru dan variabel bawaan. Untuk mendukung pertumbuhan yang cepat ini, kami perlu mengaturnya dengan lebih baik ~600 nama yang saat ini digunakan dalam bahasa tersebut. Kami melakukan ini dengan menambahkan namespace baru untuk mengelompokkan fungsi-fungsi dengan cara yang lebih mencerminkan penggunaannya. Beberapa nama parameter fungsi juga diganti namanya agar lebih mudah untuk dipahami.

Contoh namespace baru adalah ta., yang sekarang mencakup seluruh variabel dan fungsi yang terkait dengan analisis teknikal. Ini memudahkan anda untuk menelusuri Panduan Referensi dan menemukan seluruh variabel dan fungsi yang mengembalikan nilai-nilai dari indikator umum. Dengan demikian, sma() sekarang menjadi ta.sma(). Mengingat masing-masing namespace baru ini tidaklah diperlukan; jika anda mengetikkan nama fungsi yang lama tanpa namespacenya di Editor dan menekan tombol pintas Autocomplete (Ctrl + Space, atau Cmd + Space di MacOS), popup yang menunjukkan saran yang sesuai akan muncul:

Hal yang sama berlaku saat mencari Panduan Referensi; mengetik nama fungsi yang sudah dikenal tanpa namespace-nya akan memunculkan nama barunya. Anda dapat melihat daftar lengkap perubahan ke v5 di Panduan Migrasi kami.

Perpustakaan yang Terpublikasikan

Publikasi berikut ini adalah contoh dari perpustakaan yang dipublikasikan di TradingView oleh PineCoders yang membantu kami untuk menguji fitur-fitur Pine yang baru:

ColorScheme oleh RicardoSantos

Matrix_Functions_Lib_JD oleh Duyck

Enchanced_ta oleh HeWhoMustNotBeNamed

Kami harap fitur baru ini bermanfaat bagi anda. Dan tolong terus beri kami umpan balik dan saran — kami sedang membangun TradingView untuk anda, dan kami selalu ingin tahu pendapat anda tentang pembaruan platform kami.

Look first Then leap

TradingView dibangun untuk anda, karenanya manfaatkan fitur-fitur luar biasa kami semaksimal mungkin
Luncurkan Chart