Skip to content
Learn

Pine Script Fundamentals

Intermediate · 3.5 jam

Prasyarat:

  • Modul 1-5: Paham UI TradingView (Pine Editor di panel bawah, cara add indikator ke chart)
  • Ngerti chart candlestick: tau apa itu open, high, low, close, volume
  • Pernah pakai indikator bawaan (MA, RSI) lewat tombol Indicators
  • Paham konsep timeframe/interval (D, 1H, dst.)
  • Punya akun TradingView (Free juga cukup buat modul ini)

Tujuan Pembelajaran

  • Menjelaskan model eksekusi per-bar Pine Script: kenapa kode lo jalan ulang di setiap candle, dan kenapa ini konsep paling penting
  • Menulis deklarasi versi //@version=5 dan menjelaskan kenapa semua kode baru wajib pakai v5 plus perubahan namespace dari v4 (ta., math., str., input.*)
  • Membedakan 5 tipe data dasar Pine (int, float, bool, string, color) dan paham type inference
  • Menggunakan keyword var untuk bikin variabel yang nilainya bertahan antar bar, dan membedakan = (deklarasi) vs := (reassignment)
  • Memakai operator aritmatika, perbandingan, dan logika (and/or/not) dengan benar
  • Mengakses harga bawaan (open, high, low, close, volume, hl2, hlc3) dan variabel status (bar_index, barstate.*, time)
  • Mengambil nilai historis pakai operator [] seperti close[1] dan high[5]
  • Menulis, menyimpan, dan menambahkan script sendiri ke chart lewat Pine Editor
  • Membuat script lengkap yang plot close dan kasih label apakah close hari ini lebih tinggi dari kemarin di chart TLKM

1. Apa Itu Pine Script & Kenapa Lo Harus Peduli

Pine Script itu apa sih?

Oke, sampai modul ini lo udah jago pakai indikator bawaan TradingView. Klik tombol Indicators (ikon beaker di toolbar atas), cari RSI, MACD, Moving Average, pasang ke chart, beres. Tapi pernah kepikiran nggak: gimana kalau lo mau indikator yang nggak ada di daftar? Misalnya, lo mau garis yang nyala kalau close BBCA naik 3 hari berturut-turut. Atau lo mau dashboard kecil di pojok chart yang nampilin status TLKM, ASII, plus BTCUSD/ETHUSD sekaligus.

Nah, itu gunanya Pine Script. Ini bahasa pemrograman buatan TradingView khusus buat bikin indikator (indicator) dan strategi (strategy) yang jalan langsung di chart lo. Anggap aja kayak resep masakan: lo nulis langkah-langkah, terus TradingView yang masak (jalanin) buat lo di setiap candle.

Kabar baiknya: Pine Script itu ringan dan gampang dibanding bahasa pemrograman beneran kayak Python atau Java. Dia dirancang khusus buat trader, bukan buat software engineer. Jadi kalau lo belum pernah ngoding sama sekali, santai aja. Modul ini ngajarin dari nol.

Indikator vs Strategi

Dua jenis script utama:

  • Indikator (indicator) — cuma menggambar dan menghitung di chart. Garis MA, panah sinyal, label. Dia nggak bisa buka/tutup posisi. Ini yang kita fokusin di modul ini.
  • Strategi (strategy) — bisa simulasi beli/jual dan ngasih laporan backtest (profit, drawdown, win rate). Ini kita bahas di modul lanjutan.

Buat sekarang, kita main di dunia indikator dulu.

Analogi buat trader IDX

Bayangin lo lagi mantau chart TLKM harian. Setiap hari market tutup, ada candle baru muncul. Lo punya kebiasaan: tiap candle baru, lo catat di buku — "close hari ini Rp 2.800, naik dari kemarin Rp 2.750, oke bullish." Lo ngulang ritual itu setiap hari, buat setiap candle.

Pine Script kerjanya persis kayak gitu. Lo nulis ritualnya sekali, terus TradingView ngejalanin ritual itu buat setiap candle di chart lo, dari candle paling kiri (paling lama) sampai candle paling kanan (paling baru). Konsep ini namanya model eksekusi per-bar, dan ini bakal jadi inti dari section berikutnya — konsep paling penting di seluruh modul.

Takeaway

  • Pine Script = bahasa buat bikin indikator & strategi custom di TradingView.
  • Dibuat khusus buat trader, jauh lebih simpel dari bahasa coding umum.
  • Modul ini fokus ke indikator (menggambar & menghitung, bukan beli/jual).
  • Mindset kunci: lo nulis 'resep' sekali, TradingView jalanin di setiap candle.

Latihan

  1. Buka chart TLKM di TradingView, set ke timeframe Daily. Lihat panel bawah, klik tab 'Pine Editor'. Belum usah ngetik apa-apa, cuma kenalan sama tempatnya dulu.
  2. Tulis dengan kata-kata lo sendiri (di notes/HP): apa bedanya 'indicator' sama 'strategy' di Pine Script?

Pro Tips

  • Lo nggak perlu install apa-apa. Pine Editor udah nempel di TradingView, ada di panel bawah chart. Gratisan juga bisa.
  • Jangan kebayang Pine Script itu seperti aplikasi yang jalan terus-menerus. Dia lebih kayak rumus spreadsheet yang dihitung ulang per baris (per candle).

2. Model Eksekusi Per-Bar: Konsep PALING Penting

Kalau cuma satu hal yang lo inget dari modul ini, inget yang ini

Ini konsep yang paling sering bikin pemula bingung, dan kalau lo paham ini di awal, sisa Pine Script bakal kerasa gampang. Kalau lo skip ini, lo bakal pusing terus. Jadi pelan-pelan ya.

Kode Pine Script lo jalan ulang dari atas ke bawah, SEKALI untuk setiap bar (candle) di chart.

Ulangi: setiap candle = satu kali eksekusi penuh dari baris pertama sampai baris terakhir.

Gimana detailnya

Misal chart TLKM lo punya 500 candle harian. Pas lo pasang script ke chart, TradingView bakal:

  1. Pergi ke candle paling kiri (paling lama, ~500 hari lalu). Jalanin seluruh kode lo seolah-olah candle itu adalah 'candle sekarang'.
  2. Pindah ke candle berikutnya. Jalanin seluruh kode lo lagi, dari awal.
  3. Terus begitu... candle demi candle...
  4. Sampai candle paling kanan (paling baru / hari ini).

Jadi kode lo nggak cuma jalan sekali. Di contoh ini dia jalan 500 kali. Tiap kali jalan, variabel bawaan kayak close, high, low otomatis nunjuk ke nilai candle yang lagi diproses saat itu.

'Sekarang' itu bergeser

Ini bagian yang penting. Pas script lagi memproses candle ke-100, maka:

  • close = harga close candle ke-100 (bukan candle hari ini!)
  • candle ke-99, ke-98, dst. dianggap 'masa lalu'
  • candle ke-101 dan seterusnya dianggap 'masa depan' yang belum boleh dilihat

Saat script geser ke candle ke-101, sekarang close = harga close candle ke-101, dan candle ke-100 jadi 'masa lalu'.

Kata 'sekarang' itu bergeser seiring script jalan dari kiri ke kanan. Inilah kenapa pemula sering kaget: "kok close nilainya beda-beda?" Iya, karena close itu bukan satu angka tetap — dia angka yang berubah tergantung candle mana yang lagi diproses.

Series: deret nilai, bukan satu angka

Di Pine, close itu sebenernya bukan satu angka. Dia disebut series — sebuah deret nilai, satu nilai per candle. Bayangin kolom di Excel:

close = series (deret nilai, satu per candle)12.50022.55032.5205002.800candle terakhir / sekarang
close itu bukan satu angka — dia satu kolom nilai, satu per candle. Pas script proses candle ke-3 dia nunjuk 2.520; pas candle ke-500 (yang ungu, candle terakhir/sekarang) dia nunjuk 2.800.

Pas script proses candle ke-3, close nunjuk ke baris ke-3 (2.520). Pas proses candle ke-500, close nunjuk ke baris ke-500 (2.800). Si close itu seluruh kolom, tapi 'penunjuk'-nya geser ke bawah seiring eksekusi.

Konsep series ini penting banget. Nanti pas kita belajar operator [] (di section 7), lo bakal paham gimana caranya 'nengok ke belakang' di kolom ini, kayak close[1] buat ambil close kemarin.

Kenapa lo nggak bisa lihat masa depan

Konsekuensi penting dari model ini: pas script proses candle ke-100, dia nggak tau apa yang terjadi di candle ke-101. Logis kan? Di dunia nyata, pas market hari Senin tutup, lo nggak tau close hari Selasa. Pine Script niru realita ini.

Ini juga kenapa indikator yang 'curang ngelihat masa depan' (istilahnya repainting) itu bahaya dan bikin backtest bohong. Tapi itu topik modul lanjutan. Buat sekarang: inget aja, default-nya lo cuma bisa lihat candle sekarang dan candle-candle sebelumnya.

Bar yang lagi jalan (live bar)

Satu hal tambahan: candle paling kanan (yang lagi berlangsung, belum tutup) itu spesial. Selama market masih buka, harga close-nya masih berubah-ubah tiap detik. Jadi di candle terakhir yang belum tutup, script lo bisa jalan ulang berkali-kali dalam sehari, setiap kali ada harga baru masuk (tiap 'tick'). Begitu candle tutup, nilainya final. Di crypto yang buka 24/7 (mis. BINANCE:BTCUSDT), candle live (mis. di timeframe 1H) terus di-recompute sampai jam candle itu habis — konsep ini malah makin sering kepake dibanding saham IDX yang punya jam bursa.

Nanti di section 6 kita bakal pakai barstate.isconfirmed buat ngecek apakah candle udah tutup beneran atau masih live.

Takeaway

  • Kode lo jalan ulang sekali per candle, dari candle terlama ke terbaru.
  • close, high, dll = series (deret nilai, satu per candle), bukan satu angka tetap.
  • Kata 'sekarang' bergeser seiring eksekusi geser dari kiri ke kanan.
  • Lo nggak bisa lihat candle masa depan (default). Cuma candle sekarang & sebelumnya.
  • Candle paling kanan (live) bisa di-recompute tiap tick sampai dia tutup.

Latihan

  1. Jelasin ke temen lo (atau tulis): kalau chart punya 300 candle, berapa kali kode Pine lo dijalanin? Kenapa?
  2. Pertanyaan logika: pas script lagi proses candle ke-50 dari 300 candle, apakah dia tau nilai close candle ke-51? Jawab dan jelasin alasannya.
  3. Gambar/bayangin kolom Excel berisi close 5 candle TLKM. Tunjuk: pas script proses candle ke-3, 'close' nunjuk ke baris mana?

Pro Tips

  • Kalau bingung, ganti kata 'bar' jadi 'baris di Excel' di kepala lo. Pine Script itu kayak rumus spreadsheet yang dihitung ulang per baris.
  • Pemula sering nulis kode seolah-olah jalan SEKALI buat seluruh chart. Salah. Selalu pikir: 'kode ini bakal jalan ulang di TIAP candle. Apa yang terjadi di candle ini?'
  • Jangan pernah coba 'ngintip' candle masa depan. Bukan cuma terlarang secara default, tapi kalaupun bisa, itu bikin indikator lo bohong dan nggak berguna buat trading beneran.

3. Versi Pine Script & Kenapa Wajib v5

Baris pertama script lo: deklarasi versi

Setiap script Pine WAJIB diawali dengan deklarasi versi. Ini bener-bener baris pertama, sebelum apa pun:

//@version=5

Ini ngasih tau TradingView: "hei, pakai aturan dan fungsi Pine versi 5 ya." Tanpa baris ini, TradingView bakal nebak versi lama dan kode lo kemungkinan error atau jalan dengan aturan kuno.

Perhatiin: walaupun diawali // (yang biasanya tanda komentar/catatan), baris ini spesial. Dia bukan komentar biasa — dia instruksi versi. Jangan diutak-atik.

Kenapa v5 (bukan v4, v3, dst.)?

Pine Script terus berkembang. Versi 5 adalah standar yang dipakai semua kode baru. Versi lama (v4, v3) masih bisa jalan kalau lo nemu script lama, tapi:

  • Tutorial, dokumentasi, dan komunitas sekarang fokus ke v5 (dan v6 yang lebih baru).
  • Banyak fungsi baru cuma ada di v5+.
  • Kode v5 lebih rapi dan konsisten.

Untuk modul ini kita pakai v5 karena ini sweet spot: stabil, dokumentasinya lengkap, dan 99% tutorial yang lo temuin di internet pakai ini. (Ada v6 yang lebih baru dengan fitur tambahan, tapi v5 udah lebih dari cukup buat fundamental, dan konsep yang lo pelajari di sini langsung kepake di v6.)

Perubahan besar v4 ke v5: namespace

Kalau lo googling Pine Script terus nemu kode lama, lo mungkin bingung kenapa beda. Perubahan paling kentara dari v4 ke v5 adalah namespace — fungsi-fungsi dikelompokin ke dalam 'folder' biar rapi. Ini tabel yang wajib lo hafal:

Kategoriv4 (lama)v5 (sekarang)
Indikator teknikalsma(), rsi(), ema()ta.sma(), ta.rsi(), ta.ema()
Fungsi matematikaabs(), max(), round()math.abs(), math.max(), math.round()
Konversi tekstostring()str.tostring()
Input parameterinput() (serba bisa)input.int(), input.float(), input.bool(), dst.
Deklarasi scriptstudy()indicator()

Jadi ta. itu singkatan dari technical analysis, math. buat matematika, str. buat string (teks), dan input. buat input. Pikirnya kayak folder di HP lo: foto di folder 'Camera', screenshot di folder 'Screenshots'. Lebih gampang dicari.

Kenapa namespace bagus buat lo

Di v4, semua fungsi numpuk jadi satu tanpa pengelompokan, gampang ketuker. Di v5, begitu lo ngetik ta. di Pine Editor, autocomplete bakal nampilin SEMUA fungsi technical analysis yang ada. Ngetik math. nampilin semua fungsi matematika. Ini bikin lo gampang nemu fungsi tanpa hafal semuanya.

Common mistake: nyampur kode v4 dan v5

Kesalahan klasik pemula: copas kode dari tutorial lama (v4) ke script v5 lo. Hasilnya error kayak Could not find function or function reference 'sma'. Solusinya: tambahin namespace-nya. sma(close, 20) jadi ta.sma(close, 20).

Takeaway

  • Baris pertama SELALU //@version=5. Wajib, bukan opsional.
  • Pakai v5 buat semua kode baru — ini standar komunitas & dokumentasi.
  • v5 ngelompokin fungsi pakai namespace: ta. (teknikal), math. (matematika), str. (teks), input. (input).
  • Kalau nemu error 'function not found', kemungkinan lo lupa namespace (kode v4).

Latihan

  1. Buka Pine Editor, perhatiin baris pertama dari template default. Apa isinya?
  2. Convert mental: fungsi v4 ini jadi apa di v5? (a) rsi(close, 14), (b) max(high, low), (c) tostring(close). Tulis jawabannya.
  3. Kenapa menurut lo TradingView mutusin buat ngelompokin fungsi pakai namespace? Apa untungnya?

Pro Tips

  • Pas lo bikin script baru di Pine Editor, TradingView otomatis ngasih template dengan '//@version=5' di atas. Jangan dihapus.
  • Lupa nama fungsi? Ketik namespace-nya (misal 'ta.') terus tunggu autocomplete muncul. Daftar fungsinya bakal nongol sendiri.
  • Kalau lo copas script orang dan banyak error, cek dulu versinya di baris pertama. Kalau '//@version=4' atau lebih kecil, itu kode lama — wajar kalau beda sama yang lo pelajari di sini.

4. Tipe Data: int, float, bool, string, color

Setiap nilai punya 'tipe'

Di Pine Script (dan hampir semua bahasa pemrograman), setiap nilai punya tipe data — jenis dari nilai itu. Ini 5 tipe dasar yang wajib lo kenal:

TipeIsinyaContoh
intBilangan bulat (integer)14, -3, 0, 200
floatBilangan desimal (pecahan)1.5, 2800.0, 3.14
boolBenar atau salah (boolean)true, false
stringTeks"TLKM", "sinyal beli"
colorWarnacolor.red, color.green, #FF0000

Kenapa ini penting? Karena Pine peduli sama tipe. Lo nggak bisa, misalnya, nambahin teks "TLKM" ke angka 14 — nggak masuk akal, dan Pine bakal protes.

int vs float: jangan ketuker

  • int = bilangan bulat, nggak ada koma. Periode indikator biasanya int: RSI 14, MA 20, MA 50.
  • float = bilangan desimal. Harga saham itu float: 2800.0, 1.5. Hasil bagi juga biasanya float.

Contoh praktis: periode MA itu int (20), tapi harga close itu float (2800.0). Kalau lo bagi dua angka, hasilnya float walaupun input-nya int: 10 / 4 = 2.5 (float).

bool: dasar dari semua sinyal

bool cuma punya dua nilai: true (benar) atau false (salah). Ini fondasi dari setiap sinyal trading lo. Contoh:

bullish = close > open    // hasilnya bool: true kalau close > open, false kalau nggak

Kalau candle hijau (close di atas open), bullish jadi true. Kalau merah, false. Hampir semua logika sinyal lo (kapan kasih panah beli, kapan warnain background) ujung-ujungnya adalah bool.

string: teks buat label

string itu teks, selalu dibungkus tanda kutip ganda "...". Dipakai buat judul indikator, teks di label, nama. Contoh: "close naik", "BBCA", "RSI Overbought".

Kalau lo mau gabungin angka ke teks (misal nampilin harga di label), lo perlu konversi dulu pakai str.tostring():

teks = "Close: " + str.tostring(close)

str.tostring(close) ngubah angka close jadi teks, baru bisa digabung pakai + ke string lain.

color: warna

color buat ngewarnain garis, label, background. Pine punya warna bawaan: color.red, color.green, color.blue, color.orange, color.white, color.gray, dll. Lo juga bisa pakai kode hex kayak di desain: #FF0000 (merah).

Mau warna transparan? Pakai color.new(color.green, 80) — angka 80 itu transparansi (0 = solid, 100 = bening total). Berguna buat background biar nggak nutupin candle.

Type inference: Pine bisa nebak

Kabar baik: lo nggak selalu harus nyebut tipe secara eksplisit. Pine sering nebak otomatis (namanya type inference) dari nilai yang lo kasih:

panjang = 14          // Pine nebak: ini int
harga = 2800.5        // Pine nebak: ini float
aktif = true          // Pine nebak: ini bool
nama = "TLKM"         // Pine nebak: ini string
warna = color.red     // Pine nebak: ini color

Lo boleh nyebut tipe eksplisit kalau mau jelas:

int panjang = 14
float harga = 2800.5

Buat pemula, biarin Pine nebak aja kebanyakan waktu — lebih ringkas. Sebut eksplisit kalau lo mau maksa tipe tertentu (misal lo mau total jadi float walaupun mulai dari 0).

Takeaway

  • 5 tipe dasar: int (bulat), float (desimal), bool (true/false), string (teks), color (warna).
  • Periode indikator = int. Harga = float. Sinyal = bool. Label = string.
  • Gabungin angka ke teks: konversi dulu pakai str.tostring().
  • Warna transparan: color.new(warna, transparansi).
  • Pine sering nebak tipe otomatis (type inference) — lo nggak harus selalu nyebut.

Latihan

  1. Tentuin tipe dari nilai-nilai ini: (a) 50, (b) "BBRI", (c) 1750.5, (d) false, (e) color.blue
  2. Tulis variabel bernama 'periode' berisi angka 20, dan variabel 'judul' berisi teks 'My Indicator'. Pine bakal nebak tipe apa buat masing-masing?
  3. Bikin variabel bool bernama 'turun' yang true kalau close lebih kecil dari open. Tulis kodenya.

Pro Tips

  • String SELALU pakai tanda kutip GANDA ("), bukan kutip satu ('). Pemula sering kebalik.
  • Kalau lo mau angka jadi float, kasih '.0' di belakang: tulis 0.0 bukan 0 kalau variabel itu bakal nyimpen desimal nanti.
  • Mau warna nggak nutupin candle? Selalu pakai color.new() dengan transparansi tinggi (70-90) buat background.

5. Variabel, var, dan = vs := (Beda yang Bikin Pemula Error)

Variabel = wadah bernama

Variabel itu cuma nama buat nyimpen nilai, biar bisa dipakai ulang. Kayak label di toples: lo kasih nama 'gula', isinya gula. Di Pine:

panjang = 14
hargaTutup = close
namaSaham = "TLKM"

Sekarang lo bisa pakai panjang di mana aja, dan Pine tau itu maksudnya 14.

= adalah DEKLARASI (bikin baru)

Tanda = dipakai buat bikin variabel baru (deklarasi). Lo cuma boleh deklarasi satu variabel sekali. Ini bikin wadah baru dan ngisi nilai awal:

hitung = 0      // bikin variabel baru 'hitung', isi awal 0

Kalau lo deklarasi dua kali dengan nama sama, Pine bakal error.

:= adalah REASSIGNMENT (ganti isi)

Tanda := (titik dua + sama dengan) dipakai buat ngubah nilai variabel yang udah ada. Bukan bikin baru, tapi ngeganti isi wadah yang udah dibuat:

hitung = 0          // = deklarasi (bikin baru)
hitung := hitung + 1   // := reassignment (ubah nilai jadi nilai lama + 1)

Baca baris kedua: "isi hitung yang baru = isi hitung yang lama + 1". Jadi kalau tadinya 0, sekarang jadi 1.

INI kesalahan #1 pemula Pine

Serius, ini error paling sering. Pemula nulis = padahal maksudnya :=:

hitung = 0
hitung = hitung + 1   // SALAH! Ini error: variabel udah dideklarasi

Pine bakal teriak Cannot use a variable assignment operator '=' here atau semacamnya. Aturannya simpel:

  • Pertama kali bikin variabel → pakai =
  • Setelah itu, mau ganti nilainya → pakai :=

Ingat-ingat: = buat lahir, := buat berubah.

Masalah: variabel di-reset tiap candle!

Inget model per-bar dari section 2? Kode lo jalan ulang tiap candle. Artinya, variabel biasa juga dibuat ulang dari nol di setiap candle. Contoh:

hitung = 0
hitung := hitung + 1
plot(hitung)

Lo mungkin ngarep hitung terus nambah: 1, 2, 3, 4... Tapi nggak! Karena tiap candle kode jalan dari awal, hitung di-reset ke 0 tiap candle, terus jadi 1. Jadi hasilnya 1, 1, 1, 1... terus. Nggak naik. Kenapa? Karena baris hitung = 0 jalan ulang tiap candle dan ngreset semuanya.

Solusinya: keyword var

Keyword var artinya: inisialisasi SEKALI aja, terus nilainya bertahan antar candle. Bedanya gede:

var hitung = 0      // 'var' = baris ini cuma jalan SEKALI, di candle pertama
hitung := hitung + 1   // ini jalan tiap candle
plot(hitung)

Sekarang hasilnya: 1, 2, 3, 4, 5... terus naik! Karena var hitung = 0 cuma dieksekusi sekali (di candle pertama), terus nilainya diingat dari candle sebelumnya. Baris hitung := hitung + 1 tetap jalan tiap candle, jadi nilainya akumulasi.

Kapan pakai var?

Pakai var kalau lo butuh nilai yang bertahan/akumulasi antar candle:

  • Counter (ngitung berapa candle hijau berturut-turut)
  • Akumulasi (total volume sejak awal)
  • Nyimpen 'state' (harga tertinggi yang pernah kecatat sejak script jalan)

Kalau nilai lo cukup dihitung ulang fresh tiap candle (kayak ma = ta.sma(close, 20)), nggak usah pakai var.

Analogi

Variabel biasa = papan tulis yang dihapus bersih tiap pagi (tiap candle). Variabel var = buku catatan yang lo tulis terus dari hari ke hari, nggak dihapus. Counter candle hijau berturut-turut? Itu butuh buku catatan (var), bukan papan tulis.

Takeaway

  • = buat deklarasi (bikin variabel baru, sekali).
  • := buat reassignment (ubah nilai variabel yang udah ada).
  • Salah pakai keduanya = error #1 pemula. Lahir pakai =, berubah pakai :=.
  • Variabel biasa di-reset tiap candle (karena model per-bar).
  • var = inisialisasi sekali, nilai bertahan antar candle. Pakai buat counter/akumulasi/state.

Latihan

  1. Apa bedanya '=' dan ':=' di Pine Script? Kasih satu contoh masing-masing.
  2. Kode ini hasilnya apa di tiap candle, dan kenapa?
x = 0
x := x + 1
plot(x)

Apa yang harus diubah biar x naik terus (1,2,3,...)? 3. Tulis kode yang ngitung total volume terakumulasi dari candle pertama sampai sekarang, pakai var. (Hint: var total = 0.0, terus total := total + volume)

Pro Tips

  • Aturan jempol: kalau lo lihat ':=' tapi variabelnya belum pernah dideklarasi pakai '=' atau 'var' di atasnya, itu pasti error.
  • Lupa pasang 'var' adalah penyebab #1 'kok counter gue nggak naik?'. Kalau angka lo mentok di nilai yang sama terus, cek apakah lo butuh var.
  • Ada juga 'varip' (var intra-bar persist) buat nilai yang bertahan bahkan antar tick di dalam satu candle live. Tapi itu jarang dipakai pemula — fokus ke 'var' dulu.

6. Operator & Variabel Bawaan (Harga, Waktu, Status Bar)

Operator: alat buat ngitung & ngebandingin

Operator itu simbol buat ngolah nilai. Ada tiga grup yang wajib lo kuasai:

Aritmatika (hitung-hitungan)

+    // tambah:     high + low
-    // kurang:     close - open
*    // kali:       close * 2
/    // bagi:       (high + low) / 2
%    // sisa bagi:  bar_index % 2  (berguna buat selang-seling)

Perbandingan (hasilnya bool: true/false)

>    // lebih besar:        close > open
<    // lebih kecil:        close < open
>=   // lebih besar/sama:   close >= 2800
<=   // lebih kecil/sama:   low <= 2700
==   // sama dengan:        close == open   (DUA sama-dengan!)
!=   // tidak sama:         close != open

Awas: buat ngecek 'sama dengan' pakai == (dua kali), BUKAN = (satu kali). = itu buat deklarasi variabel, beda fungsi. Ketuker ini error klasik.

Logika (gabungin kondisi, hasilnya bool)

and   // DAN:  kedua syarat harus true
or    // ATAU: salah satu syarat true udah cukup
not   // BUKAN: balik nilainya (true jadi false)

Contoh nyata:

// candle hijau DAN volume gede
sinyal = close > open and volume > 1000000

// close break high kemarin ATAU low kemarin
breakout = close > high[1] or close < low[1]

// BUKAN candle hijau (alias merah atau doji)
bukanHijau = not (close > open)

Variabel bawaan: data harga yang udah disediain

TradingView otomatis ngasih lo data harga & waktu tiap candle, tanpa lo perlu ngambil dari mana-mana. Ini semua series (inget section 2 — deret nilai per candle):

Harga OHLCV

open     // harga buka candle
high     // harga tertinggi candle
low      // harga terendah candle
close    // harga tutup candle
volume   // volume candle

Harga rata-rata siap pakai

Daripada ngitung sendiri, Pine udah nyediain:

hl2      // (high + low) / 2          -> titik tengah candle
hlc3     // (high + low + close) / 3  -> 'typical price'
ohlc4    // (open + high + low + close) / 4

hl2 sering dipakai sebagai input MA biar lebih halus. hlc3 itu basis perhitungan VWAP.

Waktu & posisi bar

time          // timestamp candle (angka UNIX milidetik — jarang dipakai langsung)
bar_index     // nomor urut candle, mulai 0 di candle paling kiri
last_bar_index // nomor urut candle terakhir

bar_index berguna banget. Candle pertama bar_index-nya 0, berikutnya 1, 2, 3... terus. Bisa lo pakai buat ngecek 'udah berapa candle dari awal'.

barstate: status candle yang lagi diproses

Ini grup variabel bool yang ngasih tau lo lagi di candle yang gimana:

barstate.isfirst      // true kalau ini candle paling kiri (pertama)
barstate.islast       // true kalau ini candle paling kanan (terakhir/terbaru)
barstate.isconfirmed  // true kalau candle udah TUTUP (final), bukan live
barstate.ishistory    // true kalau candle historis (udah lewat)
barstate.isrealtime   // true kalau candle live (lagi jalan)

barstate.islast super berguna buat hal yang cuma mau lo tampilin sekali di candle terbaru — kayak label atau dashboard (biar nggak numpuk di tiap candle). barstate.isconfirmed buat mastiin candle udah tutup sebelum lo ambil keputusan (menghindari sinyal yang berubah-ubah di candle live).

Contoh gabungan

//@version=5
indicator("Contoh Operator", overlay=true)

// candle hijau dengan volume di atas rata-rata 20 candle
bullishKuat = close > open and volume > ta.sma(volume, 20)

// warnain background hijau transparan kalau sinyal nyala
bgcolor(bullishKuat ? color.new(color.green, 85) : na)

Tanda ?: itu operator ternary: kondisi ? nilai_kalau_true : nilai_kalau_false. Di sini: kalau bullishKuat true, kasih warna hijau transparan; kalau nggak, kasih na (na = 'nggak ada nilai' = nggak diwarnain).

Takeaway

  • 3 grup operator: aritmatika (+ - * / %), perbandingan (> < >= <= == !=), logika (and or not).
  • Cek 'sama dengan' pakai == (dua), bukan = (satu).
  • Data harga bawaan: open high low close volume, plus hl2 hlc3 ohlc4.
  • bar_index = nomor urut candle (mulai 0). time = timestamp.
  • barstate.islast (candle terbaru), barstate.isconfirmed (candle udah tutup) — penting buat label & sinyal yang stabil.

Latihan

  1. Tulis kondisi bool: candle hijau (close > open) DAN range candle (high - low) lebih besar dari 50.
  2. Apa bedanya '=' dan '==' di Pine? Kasih contoh kapan masing-masing dipakai.
  3. Tulis kode yang ngewarnain background merah transparan kalau close di bawah low candle sebelumnya. (Hint: butuh low[1] dari section berikutnya, atau coba pakai low dulu)

Pro Tips

  • Mau ngewarnain background cuma kalau kondisi true? Pakai pola: bgcolor(kondisi ? warna : na). 'na' artinya 'jangan warnain'.
  • Pakai 'barstate.islast' buat label/dashboard — kalau nggak, label bakal kegambar di TIAP candle dan chart lo penuh sampah.
  • Kalau sinyal lo 'kedip-kedip' atau berubah pas candle belum tutup, bungkus kondisinya dengan 'and barstate.isconfirmed' biar cuma nyala di candle yang udah final.

7. Operator [] : Nengok ke Belakang (close[1], high[5])

Masalah: gimana lihat candle kemarin?

Dari section 2, lo tau close itu series — deret nilai, satu per candle. Pas script proses candle ke-100, close nunjuk ke candle ke-100. Tapi gimana kalau lo butuh close candle ke-99 (kemarin) buat dibandingin? Misal: "close hari ini lebih tinggi dari kemarin nggak?"

Jawabannya: operator history-reference [] (kurung siku).

Cara kerja []

Angka di dalam [] artinya 'mundur berapa candle dari candle yang lagi diproses sekarang':

close      // close candle SEKARANG (yang lagi diproses)
close[1]   // close 1 candle yang lalu (kemarin, kalau timeframe Daily)
close[2]   // close 2 candle yang lalu
close[5]   // close 5 candle yang lalu
high[1]    // high candle sebelumnya
low[3]     // low 3 candle lalu
volume[1]  // volume candle sebelumnya

Jadi [0] (atau tanpa kurung) = candle sekarang, [1] = mundur satu, [2] = mundur dua, dst. Inget analogi kolom Excel: kalau lo lagi di baris 100, maka close[1] itu nilai di baris 99.

Visualisasi

Misal script lagi proses candle ke-100 di chart TLKM Daily:

close[n] = n candle ke belakang dari sekarang962.700close[4]972.720close[3]982.710close[2]992.750close[1]1002.800closeSEKARANG (candle ke-100)
Dari candle 100 (yang ungu, SEKARANG), lo nengok ke belakang pakai close[n]. close[1] itu candle 99, close[2] candle 98, dst. Makin gede angkanya, makin jauh mundurnya.

Penting: [] itu relatif terhadap candle yang lagi diproses, bukan absolut. Pas script geser ke candle ke-101, close[1] otomatis nunjuk ke candle ke-100. 'Mundur 1' selalu relatif ke 'sekarang' yang bergeser.

Contoh: bandingin hari ini vs kemarin

naik = close > close[1]    // true kalau close hari ini > close kemarin

Ini bool. naik jadi true di candle-candle yang close-nya lebih tinggi dari candle sebelumnya. Simpel tapi powerful — ini dasar dari banyak sinyal.

Contoh: deteksi gap up

gapUp = open > close[1]    // candle buka di atas close candle kemarin = gap up

Berguna buat saham IDX yang sering gap pas pembukaan sesi. Di saham IDX gap sering muncul pas pembukaan sesi; di crypto (BINANCE:BTCUSDT, ETHUSDT) yang jalan 24/7 gap lebih jarang — berguna buat tau karakter market yang lo pantau.

Bisa dikombinasi sama operator lain

// close break high 5 candle terakhir
breakout = close > high[1] and close > high[2] and close > high[3]

// momentum: selisih close sekarang vs 10 candle lalu
momentum = close - close[10]

// candle ini lebih tinggi dari rata-rata 3 candle sebelumnya
rataTiga = (close[1] + close[2] + close[3]) / 3
diAtasRata = close > rataTiga

Awas: na di candle-candle awal

Di candle paling kiri (paling lama), close[1] itu nggak ada — karena nggak ada candle sebelum candle pertama. Pine ngasih nilai na (not available / kosong) buat ini. Begitu juga close[5] di 5 candle pertama. Ini normal. Kalau lo butuh, cek pakai na() atau kasih default pakai nz():

closePrev = nz(close[1], close)   // kalau close[1] kosong, pakai close sekarang

Buat indikator simpel, biasanya lo nggak perlu pusingin ini — Pine handle na dengan baik di kebanyakan kasus.

Batas 'nengok ke belakang'

Default, Pine cuma 'inget' beberapa ratus candle ke belakang per variabel. Kalau lo butuh close[500] (mundur 500 candle), lo mungkin perlu set max_bars_back di deklarasi indicator. Tapi buat akses normal (mundur beberapa sampai puluhan candle), nggak masalah.

Takeaway

  • Operator [] = akses nilai historis. Angkanya = mundur berapa candle dari 'sekarang'.
  • close[1] = close kemarin, high[5] = high 5 candle lalu, close (tanpa kurung) = sekarang.
  • Bersifat relatif ke candle yang lagi diproses — bergeser ikut eksekusi.
  • Inti dari banyak sinyal: close > close[1] (naik dari kemarin), gap, breakout, momentum.
  • Di candle-candle paling awal, [] bisa ngasih na (nggak ada data sebelumnya). Wajar.

Latihan

  1. Tulis bool 'turun' yang true kalau close hari ini lebih rendah dari close kemarin.
  2. Pas script proses candle ke-200, close[3] itu nunjuk ke candle nomor berapa?
  3. Tulis kondisi 'higher high': high candle sekarang lebih tinggi dari high candle sebelumnya DAN low sekarang lebih tinggi dari low sebelumnya.

Pro Tips

  • close = close[0] = candle sekarang. Lo nggak perlu nulis [0], cukup 'close' aja.
  • Pemula sering kebalik: [1] itu MUNDUR satu (masa lalu), bukan maju. Pine nggak bisa lihat masa depan, jadi nggak ada [-1].
  • Mau bandingin tren beberapa candle? Daripada nulis close[1], close[2], close[3] satu-satu, sering lebih bersih pakai fungsi ta.* (kayak ta.highest, ta.rising) — tapi itu nanti di modul lanjutan.

8. Pine Editor: Nulis, Simpan, Pasang ke Chart

Di mana Pine Editor?

Pine Editor itu tempat lo nulis kode, dan dia udah nempel di TradingView. Cara bukanya:

  1. Buka chart apa aja (misal TLKM) di TradingView.
  2. Lihat ke panel bawah chart. Ada beberapa tab: Stock Screener, Strategy Tester, dll.
  3. Klik tab Pine Editor.
  4. Panel editor bakal kebuka di bawah. Kalau kekecilan, lo bisa drag batas atasnya ke atas buat ngegedein, atau klik ikon maximize.

Kalau lo nggak lihat panel bawahnya, ada tombol kecil di pojok kanan bawah chart buat munculin/sembunyiin panel.

Bikin script baru

Pas pertama buka Pine Editor, biasanya ada template default. Buat mulai bersih:

  1. Di Pine Editor, klik menu 'Open' (atau ikon dropdown) di pojok kiri atas editor.
  2. Pilih 'New indicator' (atau 'New blank indicator').
  3. Lo bakal dapet template kosong dengan //@version=5, baris indicator(...), dan satu plot(close).

Template default biasanya kayak gini:

//@version=5
indicator("My script")
plot(close)

Anatomi script minimal

  • Baris 1: //@version=5 — deklarasi versi (wajib, section 3).
  • Baris 2: indicator("My script") — deklarasi tipe script + nama yang muncul di chart. Tambah overlay=true kalau mau gambar di ATAS candle (bukan di panel terpisah bawah).
  • Baris 3+: logika lo. plot(close) ngegambar garis harga close.

Nyimpan script (WAJIB sebelum pasang)

Lo HARUS nyimpan dulu sebelum bisa pasang ke chart:

  1. Klik tombol 'Save' di pojok kanan atas Pine Editor (atau tekan Ctrl+S / Cmd+S di Mac).
  2. Kalau pertama kali nyimpan, dia minta nama. Kasih nama yang jelas, misal 'Close vs Kemarin'.
  3. Klik Save. Script lo sekarang kesimpen di akun TradingView lo (cloud), bisa diakses dari device mana aja.

Pasang ke chart

Setelah disimpan:

  1. Klik tombol 'Add to chart' di pojok kanan atas Pine Editor (kadang tulisannya 'Add to Chart' atau ikon).
  2. Script lo langsung jalan dan kegambar di chart. Namanya muncul di pojok kiri atas chart (di legend).

Kalau ada error, dia bakal muncul di bagian bawah editor (warna merah) dengan nomor baris dan pesan errornya. Betulin dulu, save lagi, baru bisa tampil.

Ngedit & update

Kalau lo ubah kode terus save lagi (Ctrl+S), chart otomatis update — script yang udah kepasang langsung ngikut versi baru. Nggak perlu remove-add ulang.

Hapus dari chart

Mau lepas script dari chart? Hover nama script di legend (pojok kiri atas chart), klik ikon X. Atau klik kanan di chart → Remove. Ini cuma ngelepas dari chart; kodenya tetap kesimpen di Pine Editor lo.

Error umum & cara baca

Pesan error muncul di bawah editor. Yang sering:

  • Mismatched input — salah sintaks, sering gara-gara indentasi (spasi di depan baris). Pine peka sama indentasi, kayak Python.
  • Undeclared identifier 'xxx' — lo pakai variabel yang belum dideklarasi (salah ketik nama, atau lupa bikin).
  • Could not find function 'sma' — lupa namespace (kode v4). Tambahin ta. jadi ta.sma.
  • Cannot use '=' here — harusnya := (lihat section 5).

Nomor baris di pesan error nunjukin di mana masalahnya. Mulai dari error pertama (paling atas) — sering yang lain cuma efek domino.

Takeaway

  • Pine Editor ada di panel bawah chart, tab 'Pine Editor'.
  • Bikin baru: menu Open → New indicator. Template kasih //@version=5 + indicator() + plot().
  • Save dulu (Ctrl+S, kasih nama) SEBELUM bisa 'Add to chart'.
  • overlay=true di indicator() = gambar di atas candle. Tanpa itu = panel terpisah.
  • Edit + save = chart auto-update. Error muncul merah di bawah editor dengan nomor baris.

Latihan

  1. Buka Pine Editor di chart TLKM, bikin indicator baru, save dengan nama 'Latihan 1', terus Add to chart. Pastiin garis close muncul.
  2. Tambahin 'overlay=true' ke baris indicator(), save lagi. Apa bedanya tampilan sebelum vs sesudah?
  3. Sengaja bikin error: ganti 'plot' jadi 'plott', save. Baca pesan errornya. Terus betulin lagi.

Pro Tips

  • Selalu kasih nama script yang jelas pas nyimpan. 'My script' bakal numpuk dan bikin lo bingung sendiri nanti.
  • Lupa 'overlay=true' adalah penyebab #1 'kok garis harga gue muncul di panel kosong terpisah, bukan nempel di candle?'. Buat indikator harga, hampir selalu mau overlay=true.
  • Kalau error, baca dari yang PALING ATAS dulu. Satu typo bisa bikin 5 error muncul — betulin yang pertama, sisanya sering hilang sendiri.

9. EXERCISE BESAR: Script Close vs Kemarin di TLKM

Sekarang kita gabungin semuanya

Target: bikin indikator yang (1) plot garis close, dan (2) nampilin label yang ngasih tau apakah close hari ini lebih tinggi dari kemarin (close[1]), di chart TLKM. Ini ngegabungin semua yang lo pelajari: versi, tipe, variabel, operator, [], dan Pine Editor.

Versi 1: paling sederhana (plot + warna)

Mulai dari yang gampang. Buka chart TLKM Daily, Pine Editor, new indicator, terus ketik:

//@version=5
indicator("TLKM Close vs Kemarin", overlay=true)

// bandingin close hari ini dengan kemarin
naik = close > close[1]

// plot garis close, warna ikut: hijau kalau naik, merah kalau nggak
plot(close, title="Close", color = naik ? color.green : color.red, linewidth=2)

Penjelasan baris per baris:

  • //@version=5 — wajib, pakai Pine v5.
  • indicator("TLKM Close vs Kemarin", overlay=true) — deklarasi indikator, nama muncul di chart, overlay=true biar nempel di candle.
  • naik = close > close[1] — bikin variabel bool (= deklarasi). close = close candle sekarang, close[1] = close kemarin. Hasilnya true/false.
  • plot(close, ...) — gambar garis close. color = naik ? color.green : color.red pakai ternary: kalau naik true → hijau, kalau false → merah. linewidth=2 biar garisnya tebel.

Save (Ctrl+S, nama 'TLKM Close vs Kemarin'), Add to chart. Lo bakal lihat garis close yang warnanya ganti-ganti ngikutin naik/turun.

Versi 2: tambahin label (target asli exercise)

Sekarang kita tambahin label yang munculin teks. Karena label bakal numpuk kalau digambar tiap candle, kita pakai barstate.islast (section 6) biar cuma muncul di candle TERBARU:

//@version=5
indicator("TLKM Close vs Kemarin", overlay=true)

// 1. bandingin close hari ini dengan kemarin
naik = close > close[1]

// 2. plot garis close, warna ikut kondisi
plot(close, title="Close", color = naik ? color.green : color.red, linewidth=2)

// 3. siapin teks & warna label
teks = naik ? "Close NAIK dari kemarin" : "Close TURUN/SAMA dari kemarin"
warnaLabel = naik ? color.green : color.red

// 4. label cuma muncul di candle terakhir (biar nggak numpuk)
if barstate.islast
    label.new(x = bar_index, y = high,
              text = teks,
              color = warnaLabel,
              textcolor = color.white,
              style = label.style_label_down,
              size = size.normal)

Penjelasan bagian baru:

  • teks = naik ? "..." : "..." — string yang isinya beda tergantung naik. Ternary lagi.
  • warnaLabel = naik ? color.green : color.red — warna label ikut kondisi.
  • if barstate.islast — blok ini cuma jalan di candle paling kanan (terbaru). Inget: tanpa ini, label bakal kegambar di tiap candle = chart penuh. (Perhatiin indentasi 4 spasi di baris dalam if — wajib di Pine.)
  • label.new(...) — bikin label baru:
    • x = bar_index — posisi horizontal: di candle sekarang (yang terakhir).
    • y = high — posisi vertikal: di harga high candle.
    • text = teks — isi teksnya.
    • color = warnaLabel — warna kotak label.
    • textcolor = color.white — warna tulisan.
    • style = label.style_label_down — bentuk label (nunjuk ke bawah).
    • size = size.normal — ukuran.

Save, Add to chart. Sekarang di candle TLKM paling baru bakal muncul label hijau 'Close NAIK dari kemarin' atau merah 'Close TURUN/SAMA dari kemarin'.

Versi 3 (bonus): tambahin angka selisihnya

Mau lebih informatif? Tampilin berapa poin selisihnya pakai str.tostring():

//@version=5
indicator("TLKM Close vs Kemarin", overlay=true)

naik = close > close[1]
selisih = close - close[1]

plot(close, title="Close", color = naik ? color.green : color.red, linewidth=2)

teks = (naik ? "NAIK " : "TURUN ") + str.tostring(selisih, "#.##")
warnaLabel = naik ? color.green : color.red

if barstate.islast
    label.new(bar_index, high, teks,
              color = warnaLabel, textcolor = color.white,
              style = label.style_label_down, size = size.normal)
  • selisih = close - close[1] — selisih harga (float). Bisa positif (naik) atau negatif (turun).
  • str.tostring(selisih, "#.##") — ubah angka jadi teks, format 2 desimal. (Inget section 3: di v5 wajib pakai namespace str.)
  • + gabungin string: "NAIK " + "15.5" jadi "NAIK 15.5".

Uji di TLKM. Ganti-ganti timeframe (Daily, Weekly) buat lihat label berubah ngikutin perbandingan close.

Cara verifikasi hasilnya bener

  1. Pasang script di TLKM Daily.
  2. Lihat candle terakhir: kalau hijau (close > open biasanya), cek apakah label bilang NAIK — tapi inget, perbandingannya vs close KEMARIN, bukan vs open. Jadi candle bisa aja merah tapi label NAIK kalau close-nya masih di atas close kemarin.
  3. Hover candle terakhir & sebelumnya, catat close masing-masing dari data window. Hitung manual: close sekarang > close kemarin? Cocokin sama label.

Common mistakes di exercise ini

  • Label numpuk di tiap candle → lupa if barstate.islast.
  • Error 'Could not find tostring' → lupa namespace, tulis str.tostring bukan tostring.
  • Garis muncul di panel terpisah → lupa overlay=true.
  • Error indentasi → baris di dalam if harus menjorok (4 spasi konsisten).
  • Pakai = buat bandingin → harusnya > atau ==, bukan =.

Takeaway

  • Lo baru aja bikin indikator lengkap dari nol yang ngegabungin SEMUA konsep modul ini.
  • Pola kunci: bikin bool kondisi → plot dengan warna kondisional → label di barstate.islast.
  • label.new() buat anotasi teks. str.tostring() buat masukin angka ke teks.
  • Selalu verifikasi manual: cocokin label sama data close beneran.

Latihan

  1. Ketik ulang Versi 2 dari nol (jangan copas) di chart TLKM, save, dan pasang. Pastiin labelnya muncul bener di candle terakhir.
  2. Modifikasi: ganti perbandingan jadi 'close hari ini lebih tinggi dari close 5 candle lalu' (pakai close[5]). Update teks labelnya juga.
  3. Tantangan: tambahin background hijau/merah transparan (bgcolor) yang ikut kondisi naik, di SAMPING garis dan label. (Hint: bgcolor(naik ? color.new(color.green, 90) : color.new(color.red, 90)))
  4. Pasang Versi 3 di TLKM, BBCA, dan satu crypto (BINANCE:BTCUSDT atau ETHUSDT) lewat ganti simbol. Catat label yang muncul — script yang sama jalan di saham maupun crypto karena pakai variabel bawaan close/high.

Pro Tips

  • Simpen script ini sebagai template pribadi lo. Pola 'bikin bool → warnai plot → label di candle terakhir' bakal lo pakai terus di indikator-indikator berikutnya.
  • Mau label nggak ketiban candle? Naikin posisi y, misal y = high * 1.01 (1% di atas high). Atau pakai style label_down yang nunjuk ke bawah dari atas candle.
  • Coba ganti TLKM ke BBCA, BBRI, atau ASII — script yang sama jalan di saham apa aja karena pakai variabel bawaan (close, high) yang otomatis ngikut simbol di chart.

Kuis

Apa konsep PALING penting dalam Pine Script yang menjelaskan kenapa nilai 'close' berubah-ubah?
  • A. Pine Script jalan sekali untuk seluruh chart sekaligus
  • B. Pine Script jalan ulang sekali untuk setiap bar/candle, dari yang terlama ke terbaru (model eksekusi per-bar)
  • C. Pine Script hanya jalan di candle terakhir
  • D. close adalah variabel acak yang di-generate TradingView
Answer

Pine Script jalan ulang sekali untuk setiap bar/candle, dari yang terlama ke terbaru (model eksekusi per-bar)

Model eksekusi per-bar adalah inti Pine Script: kode lo jalan ulang dari atas ke bawah sekali untuk SETIAP candle, dari candle terlama (kiri) ke terbaru (kanan). Tiap kali jalan, 'close' nunjuk ke candle yang lagi diproses, jadi nilainya bergeser. 'close' itu series (deret nilai), bukan satu angka tetap.

Apa perbedaan antara '=' dan ':=' di Pine Script v5?
  • A. Keduanya sama persis, cuma gaya penulisan
  • B. '=' untuk deklarasi (bikin variabel baru), ':=' untuk reassignment (ubah nilai variabel yang sudah ada)
  • C. '=' untuk angka, ':=' untuk teks
  • D. ':=' untuk deklarasi, '=' untuk reassignment
Answer

'=' untuk deklarasi (bikin variabel baru), ':=' untuk reassignment (ubah nilai variabel yang sudah ada)

'=' dipakai SEKALI saat bikin variabel baru (deklarasi). ':=' dipakai setelahnya untuk mengubah nilai variabel yang sudah dideklarasi. Ingat: '=' buat lahir, ':=' buat berubah. Salah pakai keduanya adalah error paling sering dialami pemula Pine Script.

Kalau script lagi memproses candle ke-150, nilai apa yang ditunjuk oleh 'close[1]'?
  • A. close candle ke-151 (candle berikutnya/masa depan)
  • B. close candle ke-149 (satu candle sebelum yang sedang diproses)
  • C. close candle pertama di chart
  • D. close candle terakhir di chart
Answer

close candle ke-149 (satu candle sebelum yang sedang diproses)

Operator [] mengakses nilai historis secara relatif terhadap candle yang sedang diproses. Angka di dalam [] = mundur berapa candle. Jadi saat memproses candle ke-150, close[1] = mundur 1 = candle ke-149. Pine tidak bisa melihat masa depan, jadi tidak ada [-1].

Kenapa kode 'var hitung = 0' lalu 'hitung := hitung + 1' menghasilkan angka yang terus naik (1,2,3,...), tapi tanpa 'var' hasilnya selalu 1?
  • A. var membuat variabel jadi tipe float
  • B. Tanpa var, variabel di-reset ke 0 di setiap candle karena model per-bar; dengan var, inisialisasi cuma sekali dan nilainya bertahan antar candle
  • C. var membuat kode jalan lebih cepat
  • D. Tanpa var, variabel tidak bisa di-reassignment
Answer

Tanpa var, variabel di-reset ke 0 di setiap candle karena model per-bar; dengan var, inisialisasi cuma sekali dan nilainya bertahan antar candle

Karena model eksekusi per-bar, kode jalan ulang tiap candle. Variabel biasa di-reset ke nilai awal setiap candle, jadi 'hitung' jadi 0 lalu 1, terus-terusan 1. Keyword 'var' bikin inisialisasi cuma jalan SEKALI (di candle pertama) dan nilainya diingat antar candle, sehingga akumulasi terus naik.

Di Pine Script v5, fungsi mana yang BENAR untuk menghitung Simple Moving Average 20 periode dari close?
  • A. sma(close, 20)
  • B. ta.sma(close, 20)
  • C. math.sma(close, 20)
  • D. average(close, 20)
Answer

ta.sma(close, 20)

Di v5, fungsi technical analysis dikelompokkan dalam namespace 'ta.'. Jadi sma() versi v4 menjadi ta.sma() di v5. Menulis sma() saja (tanpa ta.) akan menghasilkan error 'Could not find function' karena itu sintaks v4 yang sudah usang. math. dipakai untuk fungsi matematika seperti math.abs(), bukan indikator teknikal.

Saat membuat label di script, kenapa kita bungkus 'label.new()' dengan 'if barstate.islast'?
  • A. Supaya label muncul lebih cepat
  • B. Supaya label hanya digambar di candle terbaru/terakhir, bukan numpuk di setiap candle
  • C. Karena label.new() error tanpa barstate
  • D. Supaya warna label berubah otomatis
Answer

Supaya label hanya digambar di candle terbaru/terakhir, bukan numpuk di setiap candle

Karena model per-bar, kode label.new() akan jalan di SETIAP candle kalau tidak dibatasi, sehingga ratusan label numpuk dan chart penuh. 'barstate.islast' bernilai true hanya saat memproses candle paling kanan (terbaru), jadi label cuma digambar sekali di sana. Ini pola standar untuk label, dashboard, dan tabel ringkasan.