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.

OperasiTugas
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.

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.

Grafik recent_prices.py menampilkan rata-rata harga tersimpan berwarna biru dan SMA lima berwarna oranye.
Rata-rata array sendiri dibandingkan dengan SMA dari jendela lengkap lima elemen.

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.