Bab sebelumnya menghitung nilai dari satu candle. Untuk menghitung perubahan harga penutupan, kita membutuhkan dua candle: candle saat ini dan sebelumnya. Bab ini menghubungkan keduanya.

Programnya sama, candlenya berganti

Saat program dijalankan pada data demo, PyneCore memproses candle secara kronologis. main() bekerja pada candle pertama, kemudian candle kedua, dan seterusnya. Setiap kali, close berarti harga penutupan candle yang sedang diproses.

Karena itu, satu pemanggilan plot(close, "Close") bisa menggambar seluruh garis. Satu eksekusi menambahkan satu titik; rangkaian candle menghasilkan garis lengkap.

Baris midpoint = (high + low) / 2 dari bab sebelumnya juga dijalankan kembali pada setiap candle. Penugasan ini menghitung ulang titik tengah candle tersebut. Nama variabel tetap sama, tetapi nilainya bisa berubah.

Runtime menyediakan urutan pemrosesan. Kamu tidak perlu menulis perulangan sendiri untuk menelusuri seluruh grafik.

Melihat ke belakang dengan tanda kurung siku

close[1] adalah harga penutupan satu candle sebelumnya. Angka dalam tanda kurung siku menentukan seberapa jauh kita melihat ke belakang.

EkspresiHarga penutupan mana?
closeCandle yang sedang diproses
close[0]Juga candle yang sedang diproses
close[1]Satu candle sebelumnya
close[2]Dua candle sebelumnya

Jika tiga harga penutupan berurutan pada data harian adalah 100, 103, dan 101, pada candle ketiga nilai close adalah 101, close[1] adalah 103, dan close[2] adalah 100.

Dalam keadaan ini, close - close[1] berarti 101 - 103, yaitu −2. Ini merupakan selisih dua harga penutupan berturut-turut. close - open membandingkan harga pembukaan dan penutupan candle yang sama. Kedua perhitungan menjawab pertanyaan berbeda.

Jarak ke belakang diukur dalam candle, bukan hari kalender. Pada data pasar harian, akhir pekan atau hari libur perdagangan bisa membuat candle sebelumnya berasal dari beberapa hari sebelumnya.

Nilai buatanmu juga bisa memiliki riwayat

Riwayat harga bawaan sudah tersedia. Jika ingin mengakses riwayat perhitungan sendiri, tandai variabel sebagai Series:

midpoint: Series[float] = (high + low) / 2

Bagian setelah titik dua adalah anotasi tipe. float menandakan angka yang bisa memiliki pecahan. Series[float] juga meminta runtime menyimpan riwayat variabel untuk setiap candle.

Penugasan tetap berjalan pada setiap candle. midpoint adalah nilai yang dihitung saat ini, sedangkan midpoint[1] adalah nilai yang disimpan pada candle sebelumnya. Nama Series harus diimpor dari modul pynecore.

Dua jenis perubahan pada grafik

Buat file history_change.py dalam folder scripts proyek:

"""
@pyne edge
"""
from pynecore import Series
from pynecore.lib import close, color, high, low, plot, script


@script.indicator("Changes Between Candles", overlay=False)
def main():
    midpoint: Series[float] = (high + low) / 2
    close_change = close - close[1]
    midpoint_change = midpoint - midpoint[1]
    plot(close_change, "Close change", color=color.blue)
    plot(midpoint_change, "Midpoint change", color=color.orange)

Simpan, lalu pilih Run Pyne code dan data demo. Dua garis muncul dalam panel terpisah. Garis biru menunjukkan perubahan harga penutupan; garis oranye menunjukkan perubahan titik tengah. Titik positif berarti nilai tersebut naik dibandingkan candle sebelumnya.

Di samping program history_change.py, dua garis perubahan terlihat pada grafik PyneIDE.
Perubahan harga penutupan dan titik tengah yang dihitung antarcandle, dalam panel terpisah.

Arahkan penunjuk mouse ke sebuah candle. Nilai pada grafik selalu sesuai waktu di bawah penunjuk; kamu tidak perlu memilih waktu tersebut secara terpisah dalam file.

Apa yang terjadi pada candle pertama?

Candle pertama tidak memiliki candle sebelumnya dalam file data. Di sana, close[1] adalah nilai yang tidak tersedia: na. Singkatan ini berasal dari “not available”.

Harga yang tidak tersedia bukan berarti nol. Hasil close - close[1] juga tidak tersedia, sehingga program tidak menggambar perubahan yang valid pada candle pertama. Hasil ini tepat: selisih dua candle tidak bisa dihitung dari satu candle saja.

Pemanggilan na(value) memeriksa apakah sebuah nilai tidak tersedia. Penanganan kondisi dipelajari dalam bab Kondisi dan penanda. Sampai saat itu, jangan mencoba memperbaiki titik yang hilang di awal grafik dengan menganggap harganya nol.

Notasi ini tidak menyediakan akses ke candle masa depan. close[-1] juga tidak berarti harga penutupan berikutnya. Sebuah keputusan hanya boleh menggunakan data yang tersedia saat eksekusi tersebut.

Coba sendiri

Ubah garis biru agar membandingkan harga penutupan dengan harga penutupan lima candle sebelumnya. Cantumkan juga jarak lima candle dalam judul garis.

Sebelum menjalankannya, tentukan: pada berapa candle pertama hasilnya tidak tersedia?

Solusi latihan
close_change = close - close[5]
plot(close_change, "Five-candle change", color=color.blue)

Lima candle pertama tidak memiliki harga penutupan dari lima candle sebelumnya. Candle keenam sudah memilikinya: harga penutupan candle pertama dalam file data.

Garis oranye tidak berubah. Jika ingin menghitung kedua perubahan untuk jarak lima candle, kamu juga harus mengubah ekspresi midpoint[1].

Memeriksa perhitungan

Pilih tiga candle berurutan. Catat harga penutupannya dan hitung perubahan satu candle untuk candle kedua dan ketiga secara manual. Garis biru harus menunjukkan nilai yang sama. Jika berbeda, periksa waktu yang dipilih dan angka jarak ke belakang terlebih dahulu.

Latihan tambahan: menyimpan nilai sebagai pengganti riwayat

Satu nilai sebelumnya juga bisa digunakan dengan menyimpannya untuk candle berikutnya. Inilah kegunaan variabel Persistent, yang akan kamu pelajari dalam bab Yang diingat program. Kamu bisa mengerjakan latihan ini setelah membaca bab tersebut.

Tulis ulang history_change.py tanpa close[1] maupun midpoint[1]. Gunakan dua variabel persisten untuk menyimpan harga penutupan dan titik tengah candle sebelumnya. Kedua garis harus menunjukkan nilai yang sama dengan program asli, dan perubahan pada candle pertama tetap tidak tersedia.

Pikirkan urutannya: kapan nilai tersimpan harus dibaca, dan kapan boleh ditimpa dengan nilai saat ini?

Solusi latihan

Ganti impor Series dengan Persistent:

from pynecore import Persistent

Tambahkan na pada impor dari pynecore.lib. Pertahankan penanda di awal file serta pengaturan indikator, lalu tulis ulang fungsi main() seperti berikut:

def main():
    previous_close: Persistent[float] = na
    previous_midpoint: Persistent[float] = na
    midpoint = (high + low) / 2
    close_change = close - previous_close
    midpoint_change = midpoint - previous_midpoint
    plot(close_change, "Close change", color=color.blue)
    plot(midpoint_change, "Midpoint change", color=color.orange)
    previous_close = close
    previous_midpoint = midpoint

Nilai awal kedua variabel tersimpan adalah na karena belum ada harga sebelumnya pada candle pertama. Akibatnya, selisih pertama juga tidak tersedia. Di akhir fungsi, kita menyimpan nilai saat ini untuk digunakan pada candle berikutnya.

Jika baris previous_close = close diletakkan sebelum pengurangan, harga penutupan saat ini dikurangi dirinya sendiri dan menghasilkan nol. Dalam solusi persisten, kamu harus memastikan urutan pembaruannya.

Kedua pendekatan bisa digunakan untuk melihat satu candle ke belakang. Versi tanda kurung siku lebih singkat dan juga memungkinkan akses langsung ke beberapa candle sebelumnya. Dua variabel persisten ini hanya menyimpan harga terakhir yang diberikan kepadanya.

Jalankan kedua versi pada data demo yang sama dan bandingkan kedua garis pada beberapa candle pilihan.