Kumpulan data sendiri: array
Menyimpan harga terbaru dalam array berukuran terbatas dan mengikuti urutan elemennya.
Series menyimpan riwayat yang terkait dengan candle. Namun, terkadang kamu ingin menentukan sendiri nilai yang dikumpulkan, urutannya, dan kapan sebagian nilai dihapus. Untuk itu, gunakan array.
Apa yang disimpan array?
Array terdiri dari elemen yang berurutan. Setiap elemen memiliki indeks; indeks pertama adalah nol.
Satu array menyimpan elemen bertipe sama. Misalnya, kamu bisa memiliki array angka atau array teks, tetapi tidak memasukkan teks ke array angka. Tipe yang sama tidak berarti nilainya sama: 100, 103, dan 101 adalah angka berbeda dalam array yang sama.
Jika 100, 103, dan 101 dimasukkan dalam urutan tersebut, elemen indeks 0 adalah 100, indeks 1 adalah 103, dan indeks 2 adalah 101. Indeks di sini menunjukkan tempat penyimpanan. Indeks tidak otomatis berarti nilai beberapa candle sebelumnya.
close[1] adalah harga penutupan candle sebelumnya. array.get(prices, 1) adalah elemen kedua array prices. Umur elemen bergantung pada cara kamu mengisi array.
Namespace array
array.new_float(0) membuat array angka yang awalnya kosong. Nol adalah jumlah elemen awal, bukan harga awal.
| Operasi | Tugas |
|---|---|
array.push(prices, close) | Menambah elemen di akhir array |
array.size(prices) | Mengembalikan jumlah elemen |
array.shift(prices) | Menghapus dan mengembalikan elemen pertama |
array.get(prices, 0) | Membaca elemen pertama |
array.avg(prices) | Menghitung rata-rata angka yang disimpan |
Indeks array.get harus menunjuk elemen yang ada. Untuk array tiga elemen, 0, 1, dan 2 valid, sedangkan 3 tidak.
Menyimpan lima harga terbaru
Buat file recent_prices.py:
"""
@pyne edge
"""
from pynecore import Persistent
from pynecore.lib import array, close, color, plot, script, ta
@script.indicator("Recent Prices", overlay=True)
def main():
prices: Persistent[list[float]] = array.new_float(0)
array.push(prices, close)
if array.size(prices) > 5:
array.shift(prices)
stored_average = array.avg(prices)
full_average = ta.sma(close, 5)
plot(stored_average, "Stored average", color=color.blue, linewidth=2)
plot(full_average, "SMA 5", color=color.orange)Anotasi list[float] merupakan tipe array yang menyimpan angka. Persistent memastikan array tetap ada pada candle berikutnya. Pembuatan array tidak diulang pada setiap candle.
Operasi array dilakukan melalui namespace array. Kamu tidak perlu mengimpor pustaka Python umum atau menulis literal list sendiri.
Tambahan jika kamu sudah mengenal Python: dalam runtime Python PyneCore, array disimpan sebagai list Python. Karena itu, tipenya juga menggunakan anotasi list[float]. Elemen harus mengikuti tipe elemen array yang ditentukan; berbeda dari list Python umum, kita tidak mencampurkan angka dan teks di sini.
Dalam program bertanda @pyne yang menggunakan kemampuan Python, operasi list sendiri juga bisa digunakan: prices.append(close) menambahkan elemen, sedangkan prices.pop(0) menghapus elemen pertama. Program @pyne edge dalam buku menggunakan array.push dan array.shift untuk tindakan tersebut. Dalam Edge, pembacaan langsung prices[0] juga diganti dengan array.get(prices, 0), dan array dibuat melalui, misalnya, array.new_float(0), bukan literal list [].
Jalankan pada data demo. Garis biru menggambar rata-rata harga yang sudah dikumpulkan. Pada candle pertama ada satu harga, candle kedua dua harga, lalu tiga dan empat. Mulai candle kelima, lima elemen dipertahankan.

Urutan penambahan dan penghapusan
Pada candle keenam, harga penutupan keenam ditambahkan terlebih dahulu. Saat itu array memiliki enam elemen. Kondisi if benar, sehingga elemen pertama yang paling lama dihapus. Saat rata-rata dihitung, array hanya berisi lima harga penutupan dari candle kedua sampai keenam.
Dalam program ini, awal array berisi harga tersimpan paling lama dan akhirnya berisi harga terbaru. Jadi, setelah ada lima elemen, array.get(prices, 0) menghasilkan harga empat candle sebelumnya. Nilai itu bukan harga saat ini.
Untuk membaca yang terbaru, indeks terakhir adalah array.size(prices) - 1. Jumlah elemen dan indeks terakhir berbeda satu karena penomoran dimulai dari nol.
Jendela parsial dan lengkap
Kedua rata-rata berperilaku berbeda pada awalnya. Rata-rata array bisa dihitung dari harga yang sudah dikumpulkan, meskipun jumlahnya baru paling banyak empat. ta.sma(close, 5) hanya menghasilkan nilai saat tersedia jendela lengkap lima elemen.
Mulai candle kelima, keduanya merata-ratakan lima harga penutupan yang sama. Sejak itu, kedua garis harus sama dalam batas ketelitian representasi angka.
Karena itu, rata-rata array tidak otomatis menjadi pengganti moving average siap pakai. Kamu harus menentukan sendiri aturan jendela awalnya.
Mengapa ukurannya dibatasi?
Jika kamu hanya menambahkan satu elemen pada setiap candle, array bertambah besar seiring panjang data. Di akhir eksekusi, array akan menyimpan seluruh harga penutupan yang diproses.
Di sini kita membutuhkan lima harga terakhir, sehingga elemen lebih lama dihapus. Ukuran penyimpanan paling banyak lima saat perhitungan dilakukan. Untuk tugas pengumpulan data yang sebenarnya, tentukan juga data mana yang perlu disimpan dan berapa lama.
Coba sendiri
Ubah program agar array mempertahankan tiga harga. Ubah juga panjang SMA siap pakai menjadi tiga. Lalu gambar elemen tersimpan paling lama sebagai garis ketiga.
Solusi latihan
Kondisi penghapusan:
if array.size(prices) > 3:
array.shift(prices)Rata-rata siap pakai dan garis baru:
full_average = ta.sma(close, 3)
oldest_price = array.get(prices, 0)
plot(oldest_price, "Oldest stored price", color=color.gray)array.push dijalankan sebelum pembacaan pada setiap candle, sehingga array sudah memiliki setidaknya satu elemen. Setelah berkembang menjadi tiga elemen, harga paling lama berasal dari dua candle sebelumnya.
Menuliskan isi array
Dengan tiga elemen yang dipertahankan, bukan lima, dan urutan harga 100, 103, 101, 105, tuliskan isi array setelah masing-masing dari empat candle. Setelah candle keempat, isinya harus 103, 101, dan 105 dalam urutan tersebut.