Penanda persilangan menunjukkan tempat suatu peristiwa terjadi. Untuk mengetahui berapa kali peristiwa tersebut terjadi sejak awal data, program perlu mengingat nilai penghitung.

Mengapa variabel biasa tidak cukup?

Dua baris ini memulai hitungan dari awal pada setiap candle:

count = 0
count += 1

Baris pertama memberi nilai nol setiap kali main() dijalankan. Baris kedua menambahkan satu, sehingga hasil akhirnya selalu 1 pada setiap candle.

+= adalah penugasan ringkas: count += 1 memiliki arti yang sama dengan count = count + 1. Nilai lama dibaca, ditambah satu, lalu hasilnya dimasukkan kembali ke variabel.

Untuk menjumlahkan peristiwa, kita memerlukan inisialisasi yang berbeda. Pengaturan ke nol hanya boleh dilakukan ketika penghitung pertama kali dibuat.

Variabel Persistent

count: Persistent[int] = 0

Penanda Persistent menyatakan bahwa nilai variabel disimpan antarcandle. Nilai awal nol hanya menetapkan variabel sekali. Pada candle berikutnya, kita melanjutkan dengan nilai yang tersimpan dari candle sebelumnya yang sudah selesai.

int di sini menandakan tipe bilangan bulat untuk penghitung. Nama Persistent diimpor dari modul pynecore, seperti nama Series sebelumnya.

Penanda ini tidak menyimpan data ke disk. Eksekusi baru dimulai kembali dari awal data dengan penghitung nol. Penyimpanan ini berlaku antarcandle di dalam program.

Menghitung persilangan naik

Buat file event_counter.py:

"""
@pyne edge
"""
from pynecore import Persistent
from pynecore.lib import close, color, plot, script, ta


@script.indicator("Crossing Counter", overlay=False)
def main():
    fast_average = ta.sma(close, 5)
    slow_average = ta.sma(close, 20)
    crosses_up = ta.crossover(fast_average, slow_average)
    count: Persistent[int] = 0
    if crosses_up:
        count += 1
    plot(count, "Crossing count", color=color.blue, linewidth=2)

Jalankan pada data demo. Penghitung dalam panel terpisah dimulai dari nol. Ketika persilangan naik terjadi, nilainya bertambah satu; pada candle di antaranya, nilainya tetap.

Di samping event_counter.py, grafik PyneIDE memperlihatkan garis jumlah keseluruhan persilangan.
Penghitung bertambah satu setiap persilangan naik dan mempertahankan nilainya pada candle lain.

Jika nilai terakhir pada grafik, misalnya, 12, artinya ada dua belas persilangan naik dalam seluruh data yang diproses. Periode pendek yang terlihat di layar mungkin memiliki lebih sedikit penanda. Memperbesar grafik tidak memulai ulang penghitung.

Status dan riwayat

Kedua penanda memiliki tugas berbeda:

PenandaApa yang kita minta dari runtime?
Series[float]Riwayat nilai per candle bisa diakses kembali
Persistent[int]Variabel memulai candle berikutnya dengan nilai tersimpan

Penugasan variabel Series dijalankan pada setiap candle, dan nilai yang dihasilkan membentuk riwayat. Penugasan awal variabel Persistent hanya terjadi sekali; setelah itu, perubahan dalam kode meneruskan statusnya.

Jika ingin mengakses nilai penghitung sebelumnya secara langsung, kamu bisa memasukkan nilai penghitung saat ini ke variabel Series tersendiri. Mempertahankan nilai dan mengindeks nilai masa lalu adalah dua kebutuhan berbeda.

Riwayat dan status yang disimpanSeries menyediakan nilai sebelumnya melalui indeks. Persistent membawa nilai penghitung ke candle berikutnya; penghitung hanya bertambah saat crosses_up bernilai True. Nilai dan sinyal hanya untuk ilustrasi. price: 102; price[1]: 99; price[2]: 101; price[3]: 100. crosses_up: False → True → False → True. count: 0 → 1 → 1 → 2.price: Series[float] = closeRiwayat setelah candle keempatCandle1100price[3]2101price[2]399price[1]4102pricecount: Persistent[int] = 0Nilai awal: ditetapkan sekaliCandlecrosses_upcount1False02True13False14True2
Riwayat dan status yang disimpanSeries menyediakan nilai sebelumnya melalui indeks. Persistent membawa nilai penghitung ke candle berikutnya; penghitung hanya bertambah saat crosses_up bernilai True. Nilai dan sinyal hanya untuk ilustrasi.

Letak variabel yang disimpan

Penghitung dideklarasikan sebelum kondisi, di tempat yang dijangkau pada setiap candle. Dengan begitu, variabel memiliki nilai meskipun kondisi tidak terpenuhi, dan plot bisa menggambarnya pada setiap candle.

Jangan membuat penghitung global biasa yang bisa diubah di atas main(). Nyatakan status antarcandle melalui penanda, di tempat program menggunakannya.

Eksekusi historis yang kita bahas menghitung sekali per candle. Pada mode yang mengevaluasi satu candle beberapa kali, Persistent dimulai kembali dari status candle sebelumnya yang sudah ditutup. Karena itu, variabel ini tidak menyimpan jumlah seluruh eksekusi teknis. Penghitung buku digunakan untuk peristiwa pada candle yang sudah selesai.

Kondisi juga bisa mengatur ulang nilai

Jika menghitung candle naik berturut-turut, kamu bisa mengatur ulang ke nol pada candle turun atau candle dengan harga pembukaan dan penutupan sama:

if close > open:
    streak += 1
else:
    streak = 0

Variabel streak harus dibuat sebelumnya dengan anotasi Persistent[int]. Pengaturan ulang di sini merupakan tindakan bersyarat yang disengaja. Hal ini tidak terjadi otomatis di awal setiap candle.

Coba sendiri

Tambahkan penghitung persisten kedua ke program. Penghitung ini menghitung persilangan turun dan ditampilkan sebagai garis oranye. Kedua perhitungan harus berjalan pada setiap candle.

Solusi latihan

Di samping perhitungan persilangan naik:

crosses_down = ta.crossunder(fast_average, slow_average)
down_count: Persistent[int] = 0
if crosses_down:
    down_count += 1
plot(down_count, "Downward count", color=color.orange, linewidth=2)

Pertahankan variabel count dan gambarnya. Kedua penghitung independen. Eksekusi baru membangun keduanya kembali dari nol.

Memeriksa pada sebuah sinyal

Bandingkan penanda dari bab tentang persilangan dengan perubahan penghitung pada data yang sama. Pada candle persilangan naik, penghitung harus bertambah tepat satu. Pada candle berikutnya, penghitung hanya boleh bertambah lagi jika terjadi persilangan naik baru.