Pada update aplikasi Data Saham Indonesia versi 1.3.03 – 1.3.05 kami menambah fitur Stock Screener dan Stock Scoring. Artikel ini membahas tata cara penulisan kriteria pada Stock Screener dan Stock Scoring.

Boolean Expression
Kriteria pada screener dinyatakan dalam rumus matematika yang disebut Boolean Expression (BE). Boolean Expression adalah ekspresi/pernyataan logika yang akan diproses sistem dan menghasilkan dua kemungkinan nilai, yaitu benar (true) atau salah (false).
Contoh:
4 == 4 ==> true
4 == 3 + 1 ==> true
4 > 5 ==> false
true and false ==> false
true or false ==> true
4 == 4 and 4 == 3 + 1 ==> true
Tanda
==adalah operator untuk menyatakan persamaan nilai.
Proses screener akan menghitung rumus Boolean Expression pada kriteria yang di-input terhadap seluruh saham yang terdaftar di Bursa Efek Indonesia, lalu menampilkan saham-saham yang menghasilkan nilai benar (true).
Contoh:
prev hourly close <= current hourly close
Menampilkan saham-saham yang nilai close pada candle hourly sebelumnya lebih kecil atau sama dengan nilai close pada candle hourly saat ini.
prev hourly close <= current hourly close AND hourly close >= hourly sma("close", 5)
Sama dengan kriteria sebelumnya, DAN close di atas MA5 hourly.
Rumus pada screener criteria bersifat fleksibel dan dapat berbentuk rumus sederhana seperti:
open < close
maupun rumus kompleks seperti:
hourly high > prev hourly hhv("high", 100) and
hourly close > hourly open and
index macd_histogram > 0 and
high < bollinger_top
Hierarki Expression
Boolean Expression dan Arithmetic Expression merupakan turunan dari Expression. Arithmetic Expression adalah ekspresi/pernyataan yang menghasilkan satu nilai dalam himpunan bilangan real. Expression sendiri didefinisikan sebagai “apapun yang menghasilkan satu nilai”.
Hierarki dari Expression adalah sebagai berikut:
Expression :
- Boolean Expression (BE)
- Boolean Value : true, false
- Bracket Expression : ( BE )
- Boolean Operation : and, or, not
- Arithmetic Comparison : >= , <= , > , < , == , !=
- Boolean Function : code_index("<kode indeks>")
- Arithmetic Expression (E)
- Numeric Expression
- Arithmetic Operation : * , / , + , -
- Bracket Expression : ( E )
- Stock Expression
Pada dokumen ini dan pada criteria composer, notasi
Edigunakan sebagai singkatan untuk Arithmetic Expression.
Notasi angka
Nilai numerik dapat ditulis dengan akhiran satuan agar angka besar lebih ringkas dan mudah dibaca:
K = ribu 1.000
M = juta 1.000.000
B = miliar 1.000.000.000
T = triliun 1.000.000.000.000
Contoh:
value > 1B ==> nilai transaksi di atas 1 miliar rupiah
market_cap >= 10T ==> kapitalisasi pasar minimal 10 triliun rupiah
volume > 500K ==> volume di atas 500 ribu
Penulisan tanpa akhiran tetap berlaku — 1B dan 1000000000 bernilai sama.
Operator kondisional
Tanda ? : memilih salah satu dari dua nilai berdasarkan sebuah kondisi:
<kondisi> ? <nilai bila benar> : <nilai bila salah>
Operator ini paling berguna di dalam subformula, karena mengubah sebuah kondisi menjadi angka yang dapat dijumlahkan atau dirata-ratakan.
sum("close > open ? 1 : 0", 20) ==> berapa kali candle hijau dalam 20 bar
sma("volume > 1B ? 1 : 0", 10) ==> proporsi hari bervolume besar
sum("close > prev close ? volume : 0", 5) ==> volume pada hari naik saja
Untuk sekadar menghitung berapa kali sebuah kondisi terpenuhi, tersedia juga fungsi count yang lebih ringkas:
count("close > open", 20) ==> setara dengan contoh pertama di atas
Stock Expression
Bagian yang cukup penting dari kriteria screener adalah Stock Expression, yang merupakan turunan dari Arithmetic Expression.
Struktur dari Stock Expression adalah sebagai berikut:
E: stock_expression: [candle_selector] [timeframe] [target] <stock_attr>
E: stock_expression: [candle_selector] [timeframe] [target] <stock_function>
E: stock_expression: <stock_fundamental_attr>
E: stock_expression: <bid_offer_variables>
candle_selector
candle_selector: prev_N, ..., prev_3, prev_2, prev, current
default: current

timeframe
timeframe: yearly, monthly, weekly, daily, hourly, 15min, 5min, 1min
default: daily
target
target: stock, sector, index
default: stock
- stock — target yang dipilih adalah chart dari saham yang bersangkutan. Misal untuk saham TLKM dan BMRI, target
stockakan memilih chart saham TLKM dan BMRI. - sector — target yang dipilih adalah chart dari index sektoral. Misal untuk saham TLKM dan BMRI, target
sectorakan memilih chart dari index INFRA dan FINANCE. - index — target yang dipilih adalah chart index composite dari saham yang bersangkutan. Misal untuk saham TLKM dan BMRI, target
indexakan memilih chart COMPOSITE (^JKSE).
Penulisan parameter
Parameter yang memiliki nilai default boleh tidak ditulis. Dalam Stock Expression, hanya parameter stock_attr yang wajib ditulis.
current daily stock close == close ==> true
current daily stock close == daily close ==> true
current daily stock close == stock close ==> true
current daily stock close == current daily close ==> true
Tetapi ketika parameter ditulis, urutan penulisan harus sesuai dengan struktur di atas:
stock daily close ==> error
daily current close ==> error
current daily close ==> OK
Daftar stock_attr
open, high, low, close, volume
macd, macd_signal, macd_histogram
ppo, ppo_signal, ppo_histogram, pvo
ao, chaikin_osc, tsi, mass_index, trix
aroon_up, aroon_down, aroon_osc
donchian_up, donchian_down, donchian_mid
rsi, stoch_k, stoch_d, stochrsi, atr, adx, pdx, ndx, cci, uo, roc, william_r, mfi, cmf
up_fractal, down_fractal
alligator_jaw, alligator_teeth, alligator_lips, alligator_ao, alligator_ac
bollinger_top, bollinger_bottom, bollinger_mean, bollinger_bandwidth,
bollinger_percent_b, bollinger_percent_b_avg
value, top_broker, foreign, top_broker_hist, foreign_hist
dto_stochk, dto_stochd, obv, adl, sar
pivot_s1, pivot_s2, pivot_s3, pivot_r1, pivot_r2, pivot_r3
camarilla_h1, camarilla_h2, camarilla_h3, camarilla_h4
camarilla_l1, camarilla_l2, camarilla_l3, camarilla_l4
mid_price, avg_price, tick, freq, change_percent
up_fractal_index, down_fractal_index
frequency_analyzer, mfv, ma_net_buy_sell_signal_count
projected_volume, projected_value
iep, iev, time_progress
open_date, open_time, close_date, close_time
Bentuk singkat dengan periode standar
Nama indikator di atas dapat ditulis tanpa tanda kurung. Bentuk singkat ini memakai periode standarnya masing-masing, sehingga ppo setara dengan ppo(12, 26) dan ao setara dengan ao(5, 34).
| Bentuk singkat | Periode standar |
|---|---|
rsi, atr, adx, pdx, ndx, cci, mfi, william_r | 14 |
roc | 12 |
cmf | 21 |
trix | 15 |
stochrsi | 14 |
dto_stochk, dto_stochd | 14, 8, 5, 3 |
stoch_k, stoch_d | 15, 3, 3 |
uo | 7, 14, 28 |
macd, ppo, pvo | 12, 26 |
macd_signal, macd_histogram, ppo_signal, ppo_histogram | 12, 26, 9 |
ao | 5, 34 |
chaikin_osc | 3, 10 |
tsi | 25, 13 |
mass_index | 9, 25 |
aroon_up, aroon_down, aroon_osc | 25 |
donchian_up, donchian_down, donchian_mid | 20 |
bollinger_* | 20, 2 |
sar | 0.02, 0.2 |
Bila Anda memerlukan periode lain, tuliskan bentuk fungsinya secara lengkap:
rsi < 30 ==> memakai periode standar, yaitu rsi(14)
rsi(7) < 30 ==> periode yang Anda tentukan sendiri
Untuk moving average tersedia pula bentuk bernomor, yaitu nama fungsi diikuti angka periode:
sma20 ==> setara dengan sma("close", 20)
ema50, wma10, aema20, dema20, tema50, vwma20
Definisi stock_attr
open,high,low,close,volume— nilai open, high, low, close, volume dari chart candlestick sahammacd,macd_signal,macd_histogram— nilai dari chart MACD(12,26,9);macd_histogram=macd−macd_signalrsi— nilai dari chart RSI(14)stoch_k,stoch_d— nilai dari chart Stochastic(15,3,3)stochrsi— nilai dari chart StochRSI(9,6)atr— nilai dari chart ATR(14)adx,pdx,ndx— nilai dari chart ADX(14)cci— nilai dari chart CCI(14)uo— nilai dari chart UO(7,14,28)roc— nilai dari chart ROC(12)william_r— nilai dari chart WilliamsR(14)mfi— nilai dari chart MFI(14)cmf— nilai dari chart CMF(21)alligator_jaw,alligator_teeth,alligator_lips,alligator_ao,alligator_ac— nilai dari chart Alligator(13,8,5)bollinger_top,bollinger_bottom,bollinger_mean,bollinger_bandwidth,bollinger_percent_b,bollinger_percent_b_avg— nilai dari chart Bollinger(20,2)value— total nilai transaksi sahamtop_broker— akumulasi dari transaksi top broker (current top_broker=prev top_broker+current top_broker_hist)foreign— akumulasi dari transaksi foreign (current foreign=prev foreign+current foreign_hist)top_broker_hist— nilai dari chart histogram transaksi top broker (dalam satuan lembar saham)foreign_hist— nilai dari chart histogram transaksi foreign (dalam satuan lembar saham)adl— Accumulation/Distribution Line, penjumlahan berjalan dari money flow volume, yaitu posisi harga penutupan di dalam rentang harian dikalikan volume. Naik ketika penutupan cenderung mendekati high, turun ketika mendekati lowdto_stochk,dto_stochd— nilai dari chart DTOStoch(8,5,3)sar— nilai dari chart SAR(0.02,0.2)mid_price—mid_price= (high+low) / 2tick— nilai fraksi harga saham (harga < 200 : 1 ; harga 200–500 : 2 ; harga 500–2000 : 5 ; harga 2000–5000 : 10 ; harga > 5000 : 25)vwap—vwap= (high+low+close) / 3avg_price— harga rata-rata transaksi pada bar tersebut;avg_price=value/volumefreq— frekuensi (jumlah) transaksi pada bar tersebutchange_percent— perubahan harga terhadap penutupan sebelumnya, dalam persencamarilla_h1…camarilla_h4,camarilla_l1…camarilla_l4— level pivot Camarillaup_fractal_index,down_fractal_index— berapa bar sejak fractal atas atau bawah terakhir terbentukfrequency_analyzer—volume/freq³, ukuran besar-kecilnya rata-rata transaksi. Nilai besar menandakan transaksi didominasi order berukuran besarmfv— money flow volume, posisi penutupan di dalam rentang harian dikalikan volumema_net_buy_sell_signal_count— selisih jumlah sinyal beli dan jual dari 12 moving average (SMA dan EMA pada periode 5, 10, 20, 50, 100, 200). Rentangnya −12 sampai +12projected_volume,projected_value— perkiraan volume dan nilai transaksi sampai akhir sesi, berdasarkan laju perdagangan sejauh iniiep,iev— indicative equilibrium price dan volume pada sesi pra-pembukaantime_progress— proporsi sesi perdagangan yang telah berjalan, 0 sampai 1open_date,close_date,open_time,close_time— tanggal dan waktu pembukaan serta penutupan bar
Catatan untuk
adl,top_broker, danforeign. Ketiganya bersifat kumulatif dan dihitung sejak bar tertua yang tersedia, sehingga angkanya bersifat relatif: tidak dapat dibandingkan antar saham, dan tidak dapat disimpan lalu dibandingkan pada hari yang berbeda. Yang bermakna adalah arahnya — perbandingan terhadap bar sebelumnya, atau terhadap rata-rata dari nilainya sendiri.
adl > prev adl ==> akumulasi bertambah hari ini
adl > sma("adl", 20) ==> akumulasi di atas rata-ratanya sendiri
prev adl < prev sma("adl", 20) and adl > sma("adl", 20)

top_broker_hist = [5 top net buyer] - [5 top net seller]
Daftar stock_function
stock_function merupakan fungsi dari stock_attr.
sma(n), sma(subformula,n)
ema(n), ema(subformula,n)
aema(n), aema(subformula,n)
med(n), med(subformula,n)
highest(subformula,n), hhv(subformula,n)
lowest(subformula,n), llv(subformula,n)
ranking(subformula,n)
ranking_per_sector(subformula,n)
roc(n)
macd(fast_period,slow_period)
macd_signal(fast_period,slow_period,signal_period)
macd_histogram(fast_period,slow_period,signal_period)
sum(subformula,n)
cum(subformula)
since(date)
vwap(n)
vwma(n)
wma(n), wma(subformula,n)
linreg(n), linreg(subformula,n)
slope(n), slope(subformula,n)
linreg_r2(n), linreg_r2(subformula,n)
cci(n)
atr(n)
adx(n)
pdx(n)
ndx(n)
stoch_k(lookback_period,k_period)
stoch_d(lookback_period,k_period,d_period)
bollinger_top(period, multiplier)
bollinger_bottom(period, multiplier)
bollinger_mean(period, multiplier)
bollinger_bandwidth(period, multiplier)
bollinger_percent_b(period, multiplier)
bollinger_percent_b_avg(period, multiplier)
stdev_p(n), stdev_p(subformula,n)
stdev_s(n), stdev_s(subformula,n)
stdev(n), stdev(subformula,n)
rsi(n)
stochrsi(period,dtostoch_period,dtostoch_k_period,dtostoch_d_period)
dto_stochk(period,dtostoch_period,dtostoch_k_period,dtostoch_d_period)
dto_stochd(period,dtostoch_period,dtostoch_k_period,dtostoch_d_period)
mfi(n)
cmf(n)
chaikin_osc(fast_period, slow_period)
aroon_up(period)
aroon_down(period)
aroon_osc(period)
dema(period)
tema(period)
trix(period)
mass_index(ema_period, sum_period)
tsi(long_period, short_period)
donchian_up(period)
donchian_down(period)
donchian_mid(period)
ppo(fast_period, slow_period)
ppo_signal(fast_period, slow_period, signal_period)
ppo_histogram(fast_period, slow_period, signal_period)
pvo(fast_period, slow_period)
ao(fast_period, slow_period)
abs(x)
pow(x, y)
sqrt(x)
exp(x)
ln(x)
log10(x), log(x, base)
ceil(x), ceil(x, decimals)
floor(x), floor(x, decimals)
round(x), round(x, decimals)
trunc(x, decimals)
min(a, b, ...), max(a, b, ...), avg(a, b, ...)
count(subformula, n)
hhvbars(subformula, n)
llvbars(subformula, n)
pivot_high(k), pivot_high(k, n)
pivot_low(k), pivot_low(k, n)
pivot_high_bars(k), pivot_high_bars(k, n)
pivot_low_bars(k), pivot_low_bars(k, n)
trade_book(price)
freq(price)
tick_up(price), tick_down(price)
Definisi stock_function
sma("<stock_attr>", N) — simple moving average dari suatu stock_attr sejumlah N bar.
sma("close", 5) ==> MA5 dari nilai close daily
hourly sma("volume", 20) ==> MA20 dari nilai volume hourly
ema("<stock_attr>", N) — exponential moving average dari suatu stock_attr sejumlah N bar.
ema("close", 5) ==> EMA5 dari nilai close daily
hourly ema("volume", 20) ==> EMA20 dari nilai volume hourly
aema("<stock_attr>", N) — exponential moving average dengan perhitungan yang lebih akurat pada data yang terbatas. Penulisannya sama persis dengan ema.
aema("close", 5) ==> EMA5 dari nilai close daily
aema("volume * close", 20) ==> EMA20 dari nilai transaksi
Gunakan aema bila kriteria Anda memakai periode panjang atau bekerja pada nilai yang berfluktuasi tajam — misalnya volume, selisih harga, atau rasio. Untuk periode pendek pada harga, keduanya memberi hasil yang praktis sama.
Bila Anda sudah punya screener atau alert yang berjalan dengan
ema, tidak perlu diubah.ematetap tersedia dan tidak berubah perilakunya.
highest("<stock_attr>", N) / hhv("<stock_attr>", N) — nilai tertinggi dari suatu stock_attr sejumlah N bar.
daily hhv("high", 5) ==> 5 day highest high daily
hourly hhv("close", 5) ==> 5 hour highest close hourly
lowest("<stock_attr>", N) / llv("<stock_attr>", N) — nilai terendah dari suatu stock_attr sejumlah N bar.
daily llv("low", 5) ==> 5 day lowest low daily
hourly llv("close", 5) ==> 5 hour lowest close hourly
ranking("<stock_attr>", N) — ranking nilai stock_attr dari seluruh saham, dengan ranking 1 adalah nilai tertinggi. Jika diinginkan urutan dari terendah ke tertinggi, kalikan stock_attr dengan −1.
ranking("value") <= 10 ==> filter saham-saham top 10 value
ranking("roc") <= 10 ==> filter saham dengan 10 nilai ROC tertinggi
ranking("roc * -1") <= 10 ==> filter saham dengan 10 nilai ROC terendah
roc(period) — nilai dari chart Rate of Change (ROC).
roc(12) ==> nilai roc(12)
macd(fast_period, slow_period), macd_signal(...), macd_histogram(...) — nilai dari chart macd, macd_signal, dan macd_histogram.
macd(12, 26) ==> nilai macd(12, 26)
macd_signal(12, 26, 9) ==> nilai macd signal(12, 26, 9)
macd_histogram(12, 26, 9) ==> nilai macd histogram(12, 26, 9)
sum("<stock_attr>", N) — jumlah dari stock_attr sejumlah N bar.
sum("foreign", 5) ==> jumlah foreign accumulation 5 hari terakhir
cum("<ekspresi>") — jumlah dari sebuah ekspresi pada seluruh bar yang tersedia, setara dengan Cum() pada AmiBroker maupun MetaStock.
cum("volume") ==> akumulasi volume seluruh data
cum("close > open ? 1 : 0") ==> jumlah candle hijau seluruh data
Karena setiap perhitungan hanya membaca sejumlah bar terakhir yang tersimpan, penjumlahannya dimulai dari bar tertua yang tersedia, bukan sejak saham tersebut pertama kali tercatat. Nilainya karena itu bersifat relatif: tidak dapat dibandingkan antar saham, dan tidak dapat disimpan lalu dibandingkan pada hari yang berbeda — sama halnya dengan adl, top_broker, dan foreign.
Untuk kebanyakan keperluan, sum dengan periode yang jelas justru lebih berguna, karena hasilnya dapat dibandingkan antar saham:
sum("volume", 20) ==> total volume 20 bar terakhir
since("<tanggal>") — jumlah bar sejak tanggal tersebut sampai bar saat ini. Fungsi ini jarang dipakai sendiri; kegunaannya adalah menggantikan angka periode pada fungsi lain, sehingga perhitungan dibatasi oleh tanggal dan bukan oleh jumlah bar.
Tanggal dapat ditulis dalam beberapa bentuk:
since("2026/01/01") ==> YYYY/MM/DD
since("01/01/2026") ==> DD/MM/YYYY
since("20260101") ==> YYYYMMDD
Bentuk dengan tanda hubung seperti 2026-01-01 tidak dikenali.
Contoh pemakaian:
sum("volume", since("2026/01/01")) ==> akumulasi volume sejak awal tahun
hhv("high", since("2026/01/01")) ==> harga tertinggi sejak awal tahun
llv("low", since("2026/07/01")) ==> harga terendah sejak awal Juli
count("close > open", since("2026/01/01")) ==> jumlah candle hijau sejak awal tahun
Bila tanggal yang diminta lebih tua daripada seluruh data yang tersimpan, hasilnya adalah jumlah bar yang tersedia — perhitungan terpotong pada bar tertua, bukan pada tanggal yang Anda tulis.
Karena
sincedapat menghasilkan angka yang besar, pasangkan dengan fungsi yang tidak memiliki batas periode ketat sepertisum,sma,hhv,llv,count, danstdev. Pada fungsi sepertiemaatautrix, rentang tanggal yang panjang dapat melampaui batas periode yang akurat sehingga hasilnya kosong. Lihat tabel batas periode yang akurat.
vwap(N) — nilai dari chart indikator Volume-Weighted Average Price.
vwap(N) = sum("volume * (high + low + close) / 3", N) / sum("volume", N)
vwap(5) ==> nilai vwap dengan periode 5 hari terakhir
atr(period), adx(period), cci(period)
atr(14) ==> nilai garis atr(14)
adx(14) ==> nilai garis adx(14)
pdx(14) ==> nilai garis DI+ pada indikator adx(14)
ndx(14) ==> nilai garis DI- pada indikator adx(14)
cci(20) ==> nilai cci(20)
stoch_k(lookback_period, k_period) / stoch_d(lookback_period, k_period, d_period) — nilai dari chart Stochastic Oscillator.
stoch_k(15, 3) ==> nilai Stochastic %K(15, 3)
stoch_d(15, 3, 3) ==> nilai Stochastic %D(15, 3, 3)
bollinger_*(period, multiplier) — nilai dari chart Bollinger Bands.
bollinger_top(20, 2) ==> nilai Bollinger Band top line(20, 2)
bollinger_bottom(20, 2) ==> nilai Bollinger Band bottom line(20, 2)
stdev_p(n), stdev_s(n), dan stdev(n) — standar deviasi dari N bar terakhir, yaitu ukuran seberapa jauh nilai menyebar dari rata-ratanya. Semakin besar angkanya, semakin bergejolak pergerakannya.
Tersedia dua bentuk, mengikuti penamaan yang dipakai Excel:
stdev_p(20) ==> standar deviasi populasi (sama dengan STDEV.P pada Excel)
stdev_s(20) ==> standar deviasi sampel (sama dengan STDEV atau STDEV.S pada Excel)
stdev(20) ==> sama dengan stdev_s(20)
stdev_p adalah bentuk yang dipakai Bollinger Bands, sehingga berlaku:
stdev_p(20) == bollinger_top(20, 1) - bollinger_mean(20, 1)
Selisih keduanya tipis — sekitar 2,6% pada periode 20 dan 0,5% pada periode 100 — namun melebar pada periode pendek, sekitar 12% pada periode 5. Bila Anda mencocokkan hasil dengan spreadsheet, pakai stdev. Bila Anda menghitung ulang pita Bollinger, pakai stdev_p.
Tanpa subformula, ketiganya menghitung dari harga penutupan. Dengan subformula, ketiganya dapat dipakai pada nilai apa pun:
stdev("volume", 20) ==> sebaran volume 20 hari
stdev("high - low", 20) ==> sebaran rentang harian
stdev("(close - prev close) / prev close * 100", 20)
==> volatilitas return harian, dalam persen
Contoh pemakaian:
close > sma("close", 20) + 2 * stdev_p(20)
==> menembus batas atas dua standar deviasi
stdev("high - low", 20) < stdev("high - low", 60) * 0.7
==> rentang harian menyempit dibanding tiga bulan terakhir
stdev(20) / sma("close", 20) * 100 < 2
==> volatilitas di bawah 2% dari harga
stdev_s dan stdev membutuhkan minimal 2 bar; bila periodenya 1, hasilnya kosong.
rsi(n) — nilai dari chart indikator Relative Strength Index.
rsi(14) ==> nilai garis indikator rsi(14)
stochrsi(...), dto_stochk(...), dto_stochd(...) — nilai dari chart indikator StochRSI.
stochrsi(14, 8, 5, 3) ==> nilai garis indikator stochrsi(14, 8, 5, 3)
dto_stochk(14, 8, 5, 3) ==> nilai garis %K indikator stochrsi(14, 8, 5, 3)
dto_stochd(14, 8, 5, 3) ==> nilai garis %D indikator stochrsi(14, 8, 5, 3)
chaikin_osc(fast_period, slow_period) — Chaikin Oscillator, yaitu selisih dua EMA atas Accumulation/Distribution Line. Mengukur tekanan akumulasi dan distribusi dengan memperhitungkan posisi harga penutupan di dalam rentang harian, dikalikan volume.
Nilai positif menandakan tekanan akumulasi, nilai negatif menandakan distribusi. Perpotongan garis nol sering dipakai sebagai sinyal.
chaikin_osc(3, 10) ==> nilai Chaikin Oscillator dengan periode standar
chaikin_osc(5, 20) ==> versi yang lebih lambat
Contoh: beralih dari distribusi ke akumulasi.
prev chaikin_osc(3, 10) < 0 and chaikin_osc(3, 10) > 0
aroon_up(period) dan aroon_down(period) — mengukur seberapa baru harga tertinggi atau terendah tercapai dalam N periode terakhir, bukan seberapa tinggi harganya.
Nilainya berkisar 0 sampai 100:
- 100 berarti nilai tertinggi (atau terendah) terjadi pada bar saat ini.
- 0 berarti terjadi pada bar tertua di dalam jendela pengamatan.
aroon_up(25) ==> 100 bila hari ini adalah harga tertinggi 25 hari terakhir
aroon_down(25) ==> 100 bila hari ini adalah harga terendah 25 hari terakhir
aroon_osc(period) — selisih keduanya, aroon_up dikurangi aroon_down. Rentangnya −100 sampai +100; nilai positif menandakan kecenderungan naik.
aroon_osc(25) ==> setara dengan aroon_up(25) - aroon_down(25)
Periode yang lazim dipakai adalah 25 (default Chande) dan 14.
dema(period) dan tema(period) — Double dan Triple Exponential Moving Average atas harga penutupan. Keduanya mengikuti pergerakan harga lebih cepat daripada EMA biasa pada periode yang sama, sehingga lebih responsif terhadap perubahan arah.
dema(20) ==> DEMA 20 periode
close > tema(50) ==> harga di atas TEMA50
prev close <= prev dema(20) and close > dema(20)
trix(period) — laju perubahan (dalam persen) dari harga yang telah dihaluskan tiga kali. Nilainya berosilasi di sekitar nol: positif menandakan momentum naik, negatif menandakan momentum turun.
trix(15) ==> nilai TRIX 15 periode
prev trix(15) < 0 and trix(15) > 0 ==> momentum berbalik naik
mass_index(ema_period, sum_period) — mendeteksi pelebaran rentang harga (jarak high ke low), yang sering mendahului pembalikan arah. Parameter standar adalah mass_index(9, 25).
Pola yang biasa dipakai adalah reversal bulge: nilai naik melewati 27, lalu turun kembali di bawah 26,5.
mass_index(9, 25) > 27
prev mass_index(9, 25) > 27 and mass_index(9, 25) < 26.5
tsi(long_period, short_period) — True Strength Index, mengukur kekuatan dan arah momentum pada skala −100 sampai +100. Parameter standar adalah tsi(25, 13).
tsi(25, 13) > 0 ==> momentum bersih positif
prev tsi(25, 13) < 0 and tsi(25, 13) > 0
donchian_up(period), donchian_down(period), dan donchian_mid(period) — batas atas, batas bawah, dan garis tengah Donchian Channel: nilai tertinggi dan terendah selama N bar terakhir.
donchian_up(20) ==> high tertinggi 20 bar terakhir
donchian_down(20) ==> low terendah 20 bar terakhir
donchian_mid(20) ==> titik tengah keduanya
Bar saat ini ikut dihitung, sama seperti
hhvdanllv. Karena ituclose > donchian_up(20)tidak akan pernah bernilai benar — untuk mencari breakout, bandingkan dengan bar sebelumnya memakaiprev.
close > prev donchian_up(20) ==> breakout ke atas
close < prev donchian_down(20) ==> breakdown ke bawah
vwma(n) — Volume Weighted Moving Average, yaitu rata-rata harga penutupan yang dibobot volume. Berbeda dengan vwap, bobotnya diterapkan pada harga close.
vwma(20) ==> VWMA 20 periode
close > vwma(20) ==> harga di atas VWMA20
wma(n) dan wma(subformula, n) — Weighted Moving Average, rata-rata dengan bobot menaik: bar terbaru diberi bobot N, bar terlama diberi bobot 1. Menanggapi perubahan harga lebih cepat daripada sma pada periode yang sama.
wma(20) ==> WMA 20 periode
wma("volume", 20) ==> WMA 20 periode atas volume
close > wma(20)
linreg(n) dan linreg(subformula, n) — nilai garis regresi linier atas N bar terakhir, dibaca pada bar saat ini. Garis tersebut adalah garis lurus yang paling mendekati seluruh titik pada rentang itu, bukan sekadar penghubung titik awal dan titik akhir.
linreg(20) ==> nilai garis regresi 20 bar pada bar terakhir
close > linreg(20) ==> harga berada di atas garis regresinya sendiri
slope(n) dan slope(subformula, n) — kemiringan garis regresi yang sama, dalam satuan harga per bar. Positif bila garis menanjak, negatif bila menurun.
slope(20) > 0 ==> tren 20 bar menanjak
slope(20) > slope(50) ==> tren jangka pendek lebih curam
prev slope(20) < 0 and slope(20) > 0 ==> kemiringan baru berbalik naik
Karena satuannya harga per bar, slope tidak dapat dibandingkan langsung antar saham yang rentang harganya berbeda jauh. Untuk penyaringan lintas saham, ubah dahulu menjadi persen:
slope(20) / close * 100 > 0.5 ==> menanjak lebih dari 0,5% per bar
slope membutuhkan sekurang-kurangnya 2 bar; bila periodenya 1, hasilnya kosong.
linreg_r2(n) dan linreg_r2(subformula, n) — ukuran seberapa rapat harga mengikuti garis regresi tersebut, bernilai antara 0 dan 1. Nilai 1 berarti seluruh titik tepat berada pada garis; nilai mendekati 0 berarti garis itu praktis tidak menjelaskan pergerakan harga.
slope menyatakan arah dan kecuraman tren, sedangkan linreg_r2 menyatakan seberapa layak tren tersebut dipercaya. Keduanya saling melengkapi: dua saham dapat memiliki kemiringan yang nyaris sama, yang satu menanjak rapi, yang lain bergerak acak namun kebetulan berakhir lebih tinggi.
linreg_r2(20) > 0.7 ==> pergerakan 20 bar mengikuti garis dengan rapi
slope(20) > 0 and linreg_r2(20) > 0.7 ==> tren naik yang rapi
slope(20) < 0 and linreg_r2(20) > 0.8 ==> tren turun yang konsisten
Pada rentang yang harganya datar sepenuhnya, hasilnya 0. Sama seperti slope, dibutuhkan sekurang-kurangnya 2 bar.
ppo(fast_period, slow_period) — Percentage Price Oscillator, yaitu MACD yang dinyatakan dalam persen. Karena satuannya persen, nilainya dapat dibandingkan antar saham dengan rentang harga yang berbeda.
ppo(12, 26) ==> PPO dengan periode standar
ppo(12, 26) > 0 ==> tren jangka pendek di atas jangka panjang
prev ppo(12, 26) < 0 and ppo(12, 26) > 0
ppo_signal(fast_period, slow_period, signal_period) dan ppo_histogram(fast_period, slow_period, signal_period) — garis sinyal dan histogram untuk PPO, sejalan dengan macd_signal dan macd_histogram.
Garis sinyal adalah rata-rata bergerak dari nilai PPO itu sendiri, sedangkan histogram adalah selisih keduanya (ppo dikurangi ppo_signal).
ppo_signal(12, 26, 9) ==> garis sinyal dengan periode standar
ppo_histogram(12, 26, 9) ==> selisih PPO terhadap garis sinyalnya
Perpotongan PPO dengan garis sinyalnya — setara dengan histogram yang berubah dari negatif menjadi positif:
prev ppo_histogram(12, 26, 9) < 0 and ppo_histogram(12, 26, 9) > 0
Momentum menguat sementara tren masih di bawah nol:
ppo(12, 26) < 0 and ppo_histogram(12, 26, 9) > 0
pvo(fast_period, slow_period) — Percentage Volume Oscillator, rumus yang sama diterapkan pada volume. Berguna untuk mendeteksi lonjakan atau pengeringan aktivitas perdagangan.
pvo(12, 26) > 0 ==> volume jangka pendek di atas rata-rata jangka panjang
ao(fast_period, slow_period) — Awesome Oscillator, selisih dua simple moving average dari median price. Parameter standar adalah ao(5, 34).
ao(5, 34) ==> nilai Awesome Oscillator
prev ao(5, 34) < 0 and ao(5, 34) > 0 ==> perpotongan garis nol
alligator_aojuga tersedia sebagaistock_attr, tetapi nilainya mengikuti pengaturan chart Alligator(13,8,5). Gunakanao(5, 34)bila Anda menginginkan periode standar.
Fungsi matematika
Fungsi berikut bekerja pada angka biasa, bukan pada deret harga, sehingga dapat dipakai di mana saja dalam rumus.
abs(x) ==> nilai mutlak
pow(x, y) ==> x pangkat y
sqrt(x) ==> akar kuadrat
exp(x) ==> e pangkat x
ln(x) ==> logaritma natural, basis e
log10(x) ==> logaritma basis 10
log(x, basis) ==> logaritma dengan basis yang ditentukan sendiri
ceil(x), ceil(x, d) ==> pembulatan ke atas, opsional d angka desimal
floor(x), floor(x, d) ==> pembulatan ke bawah
round(x), round(x, d) ==> pembulatan terdekat
trunc(x, d) ==> pemotongan desimal tanpa pembulatan
min(a, b, ...) ==> nilai terkecil dari beberapa argumen
max(a, b, ...) ==> nilai terbesar
avg(a, b, ...) ==> rata-rata dari beberapa argumen
Contoh:
abs(close - open) / open * 100 > 3 ==> pergerakan intrabar di atas 3%, naik maupun turun
max(high, prev high) > bollinger_top
Catatan penamaan logaritma.
logdengan satu argumen sengaja tidak disediakan: pada sebagian aplikasilogberarti logaritma natural, pada sebagian lain berarti basis 10. Tulisln(x)untuk basis e,log10(x)untuk basis 10, ataulog(x, basis)bila basisnya ingin ditentukan sendiri.
Logaritma natural berguna untuk menghitung log return, satuan yang lazim dipakai pada analisis kuantitatif:
ln(close / prev close) ==> log return harian
sum("ln(close / prev close)", 20) ==> log return kumulatif 20 hari
stdev("ln(close / prev close)", 20) * sqrt(252) * 100
==> volatilitas tahunan, dalam persen
ln dan log10 menghasilkan nilai kosong bila argumennya nol atau negatif, begitu pula sqrt bila argumennya negatif.
med(n) dan med(subformula, n) — nilai median (bukan rata-rata) dari N bar terakhir. Lebih tahan terhadap satu bar ekstrem dibanding sma.
med("volume", 20) ==> volume median 20 hari
volume > med("volume", 20) * 3
count(subformula, n) — menghitung berapa kali sebuah kondisi terpenuhi dalam N bar terakhir.
count("close > open", 20) >= 14 ==> minimal 14 candle hijau dari 20 bar
count("volume > sma(\"volume\", 20)", 10) >= 5
hhvbars(subformula, n) dan llvbars(subformula, n) — berapa bar telah berlalu sejak nilai tertinggi atau terendah terjadi dalam N bar terakhir. Nilai 0 berarti terjadi pada bar saat ini.
hhvbars("high", 50) == 0 ==> hari ini adalah harga tertinggi 50 hari
llvbars("low", 20) <= 3 ==> harga terendah 20 hari terjadi dalam 3 bar terakhir
Titik balik ayunan
pivot_high(k) dan pivot_low(k) — harga pada titik balik ayunan (swing point) terakhir yang sudah terkonfirmasi. Sebuah bar disebut pivot high bila harga tertingginya berada di atas seluruh bar dalam jarak K bar di kiri dan kanannya; pivot low berlaku sebaliknya.
Nilai K menentukan besar ayunan yang dicari. Makin besar K, makin sedikit titik balik yang ditemukan, dan makin besar pula ayunan yang diwakilinya.
pivot_high(5) ==> harga puncak ayunan terakhir
pivot_low(5) ==> harga lembah ayunan terakhir
Sebuah titik balik baru dapat dipastikan setelah terbentuk K bar sesudahnya. Karena itu nilai yang dihasilkan tidak pernah berubah di kemudian hari.
pivot_high_bars(k) dan pivot_low_bars(k) — berapa bar telah berlalu sejak titik balik tersebut terjadi. Nilai terkecil yang mungkin adalah K, sesuai jeda konfirmasi di atas.
pivot_high_bars(5) == 5 ==> puncak baru saja terkonfirmasi
pivot_high_bars(5) < pivot_low_bars(5) ==> puncak lebih baru daripada lembah
Keempatnya menerima argumen kedua yang bersifat opsional, yaitu titik balik ke berapa dihitung mundur dari yang terbaru:
pivot_high(5, 1) ==> puncak terakhir, sama dengan pivot_high(5)
pivot_high(5, 2) ==> puncak sebelumnya
Dengan begitu dua ayunan berturut-turut dapat dibandingkan langsung:
pivot_high(5, 1) > pivot_high(5, 2) ==> higher high
pivot_low(5, 1) > pivot_low(5, 2) ==> higher low
pivot_high(5, 1) < pivot_high(5, 2) and pivot_low(5, 1) < pivot_low(5, 2)
==> lower high sekaligus lower low
Bila titik balik yang diminta tidak ditemukan pada data yang tersedia, hasilnya kosong.
Variabel
up_fractaldandown_fractalmengerjakan hal serupa dengan K yang tetap sebesar 2.pivot_high(2)danpivot_low(2)adalah padanan terdekatnya — keduanya berbeda tipis dalam menangani beberapa bar yang harga tertingginya sama persis — dengan tambahan kemampuan mengatur K dan menelusuri titik balik sebelumnya.
Fungsi trade book
Fungsi berikut membaca trade book, yaitu rincian transaksi pada setiap level harga dalam satu bar.
trade_book(price) — volume transaksi yang terjadi pada harga tersebut.
freq(price) — frekuensi transaksi pada harga tersebut.
trade_book(close) > trade_book(open)
tick_up(price) dan tick_down(price) — harga satu tick di atas atau di bawah harga yang diberikan, mengikuti aturan fraksi harga bursa.
close == tick_up(prev close) ==> naik tepat satu tick dari penutupan kemarin
Batas periode yang akurat
Setiap perhitungan hanya membaca sejumlah bar terakhir yang tersimpan. Semakin panjang periode yang Anda minta, semakin besar porsi riwayat yang dibutuhkan — dan pada titik tertentu hasilnya tidak lagi dapat diandalkan.
Tabel berikut adalah periode maksimum yang masih memberikan hasil akurat. Melewati batas ini, fungsi akan mengembalikan nilai kosong dan saham tidak akan muncul pada hasil screening.
| Fungsi | Periode aman | Catatan |
|---|---|---|
sma, hhv, llv, sum, ranking | sampai 500 | Tidak ada batas praktis |
wma, linreg, slope, linreg_r2 | sampai 500 | Tidak ada batas praktis |
stdev_p, stdev_s, stdev | sampai 500 | Tidak ada batas praktis |
pivot_high, pivot_low, beserta varian _bars | K sampai 100 | Makin besar K, makin sedikit titik balik yang ditemukan |
aroon_up, aroon_down, aroon_osc | sampai 500 | Tidak ada batas praktis |
donchian_up, donchian_down, donchian_mid | sampai 500 | Tidak ada batas praktis |
vwma, vwap, ao | sampai 500 | Tidak ada batas praktis |
ema | 120 | Sampai 250 bila dipakai pada harga (close, open, high, low) |
aema | 140 | Sampai 200 pada harga; lebih akurat dari ema untuk volume dan rasio |
dema, tema | 160 | |
trix | 75 | Batasnya jauh lebih ketat daripada fungsi lain |
ppo, pvo | slow_period sampai 140 | Sampai 200 untuk ppo; standar (12, 26) sangat aman |
ppo_signal, ppo_histogram | slow + signal sampai 128 | Standar (12, 26, 9) sangat aman |
chaikin_osc | slow_period sampai 60 | Standar (3, 10) sangat aman |
mass_index | ema_period sampai 100 | Standar (9, 25) sangat aman |
tsi | long + short sampai 120 | Standar (25, 13) sangat aman |
Angka pada tabel adalah batas konservatif yang berlaku untuk segala jenis masukan. Bila kriteria Anda bekerja pada harga penutupan, ema dan aema masih akurat sampai periode yang lebih panjang seperti dicatat di kolom keterangan.
Untuk keperluan sehari-hari, periode yang lazim dipakai — 5, 9, 14, 20, 26, 50, bahkan 100 — berada jauh di dalam batas aman untuk seluruh fungsi.
Fungsi boolean
Berbeda dengan stock_function yang menghasilkan angka, fungsi berikut langsung menghasilkan nilai benar atau salah — sehingga dapat dipakai sebagai kriteria tanpa perlu operator perbandingan.
code_index("<kode indeks>") — memeriksa apakah saham yang sedang dievaluasi merupakan anggota indeks tersebut. Menghasilkan true bila ya, dan false bila tidak.
code_index("ISSI") ==> true untuk saham anggota indeks ISSI
Karena hasilnya sudah berupa Boolean Expression, fungsi ini ditulis apa adanya dan digabungkan memakai and atau or:
code_index("ISSI") and rsi < 30
code_index("ISSI") and code_index("LQ45")
code_index("LQ45") and close > sma("close", 20)
Menuliskannya dengan operator perbandingan — misalnya code_index("ISSI") > 0 — tidak valid, karena yang dibandingkan bukan nilai numerik.
stock_fundamental_attr
debt_equity, ebitda, ebitda_anl, eps, eps_anl
ev_ebitda, ev_ebitda_anl, market_cap, netprofit, netprofit_anl
pbv, pbv_anl, per, per_anl, revenue, revenue_anl
roa, roa_anl, roe, roe_anl
Akhiran _anl berarti nilai annualized; tanpa akhiran berarti nilai dari laporan keuangan terakhir.
debt_equity— Debt to Equity Ratioebitda/ebitda_anl— Earnings Before Interest, Taxes, Depreciation and Amortizationeps/eps_anl— Earning Per Shareev_ebitda/ev_ebitda_anl— Enterprise Multiplemarket_cap— Market Capitalizationnetprofit/netprofit_anl— Net Profitpbv/pbv_anl— Price-to-Book Ratioper/per_anl— Price-Earnings Ratiorevenue/revenue_anl— Revenueroa/roa_anl— Return on Assetsroe/roe_anl— Return on Equity
bid_offer_variables
Variabel pada bagian ini, beserta Variabel lain dan Variabel transaksi broker di bawahnya, memiliki keterbatasan dalam pengambilan nilai bar sebelumnya. Lihat Nilai bar sebelumnya pada variabel bid, offer, dan broker.
top1_bid_volume, top1_bid_count, top1_offer_volume, top1_offer_count
top3_bid_volume, top3_bid_count, top3_offer_volume, top3_offer_count
top5_bid_volume, top5_bid_count, top5_offer_volume, top5_offer_count
top10_bid_volume, top10_bid_count, top10_offer_volume, top10_offer_count
all_bid_volume, all_bid_count, all_offer_volume, all_offer_count

top1_bid_volume— total volume pada bid di harga terbaik (lembar)top1_bid_count— jumlah order pada bid di harga terbaiktop1_offer_volume— total volume pada offer di harga terbaik (lembar)top1_offer_count— jumlah order offer di harga terbaiktop3_*,top5_*,top10_*— pola yang sama untuk 3, 5, dan 10 harga terbaikall_bid_volume— total volume pada bid di semua harga (lembar)all_bid_count— jumlah order pada bid di semua hargaall_offer_volume— total volume pada offer di semua harga (lembar)all_offer_count— jumlah order offer di semua harga
Tersedia juga bentuk fungsi:
bid_volume(n) : volume pada bid di harga terbaik ke-n, dimana n: 1,2,3,...
bid_count(n) : jumlah order pada bid di harga terbaik ke-n
offer_volume(n) : volume pada offer di harga terbaik ke-n
offer_count(n) : jumlah order pada offer di harga terbaik ke-n
sum_bid_volume(n) : total volume pada bid di n harga terbaik
sum_bid_count(n) : jumlah order pada bid di n harga terbaik
sum_offer_volume(n) : total volume pada offer di n harga terbaik
sum_offer_count(n) : jumlah order pada offer di n harga terbaik
Variabel lain
Untuk memeriksa nilai variabel atau mengetes formula, gunakan menu Formula Evaluator.
best_bid_price— harga bid (penawaran beli) tertinggi/terbaik sahambest_offer_price— harga offer (penawaran jual) terendah/terbaik sahamblot— volume transaksi yang terjadi pada harga bid (ha-ki) dalam satuan lotslot— volume transaksi yang terjadi pada harga offer (ha-ka) dalam satuan lotbvol— volume transaksi yang terjadi pada harga bid (ha-ki) dalam satuan lembarsvol— volume transaksi yang terjadi pada harga offer (ha-ka) dalam satuan lembarbfreq— frekuensi transaksi yang terjadi pada harga bid (ha-ki)sfreq— frekuensi transaksi yang terjadi pada harga offer (ha-ka)all_buy_volume/all_sell_volume— sama denganbvol/svolall_buy_freq/all_sell_freq— sama denganbfreq/sfreqbroker_buyer_count— jumlah broker yang melakukan pembelianbroker_seller_count— jumlah broker yang melakukan penjualannet_broker_buyer_count— jumlah broker yang melakukan pembelian bersihnet_broker_seller_count— jumlah broker yang melakukan penjualan bersih
Variabel transaksi broker
Tersedia dalam pola top{1,3,5,10}_net_broker_{buyer,seller}_{volume,value,avg_price}:
top1_net_broker_buyer_volume : total volume saham pembelian bersih 1 broker teratas (lembar)
top1_net_broker_buyer_value : nilai transaksi saham pembelian bersih 1 broker teratas
top1_net_broker_buyer_avg_price : harga rata-rata saham pembelian bersih 1 broker teratas
Pola yang sama berlaku untuk top3_, top5_, top10_, dan untuk sisi seller, sehingga daftar lengkapnya adalah:
top1_net_broker_buyer_volume top1_net_broker_buyer_value top1_net_broker_buyer_avg_price
top3_net_broker_buyer_volume top3_net_broker_buyer_value top3_net_broker_buyer_avg_price
top5_net_broker_buyer_volume top5_net_broker_buyer_value top5_net_broker_buyer_avg_price
top10_net_broker_buyer_volume top10_net_broker_buyer_value top10_net_broker_buyer_avg_price
top1_net_broker_seller_volume top1_net_broker_seller_value top1_net_broker_seller_avg_price
top3_net_broker_seller_volume top3_net_broker_seller_value top3_net_broker_seller_avg_price
top5_net_broker_seller_volume top5_net_broker_seller_value top5_net_broker_seller_avg_price
top10_net_broker_seller_volume top10_net_broker_seller_value top10_net_broker_seller_avg_price
Versi tanpa kata net juga tersedia dalam pola yang sama, mencakup _volume, _value, dan _avg_price:
top1_broker_buyer_volume top1_broker_buyer_value top1_broker_buyer_avg_price
top3_broker_buyer_volume top3_broker_buyer_value top3_broker_buyer_avg_price
top5_broker_buyer_volume top5_broker_buyer_value top5_broker_buyer_avg_price
top10_broker_buyer_volume top10_broker_buyer_value top10_broker_buyer_avg_price
top1_broker_seller_volume top1_broker_seller_value top1_broker_seller_avg_price
top3_broker_seller_volume top3_broker_seller_value top3_broker_seller_avg_price
top5_broker_seller_volume top5_broker_seller_value top5_broker_seller_avg_price
top10_broker_seller_volume top10_broker_seller_value top10_broker_seller_avg_price
Nilai bar sebelumnya pada variabel bid, offer, dan broker
Variabel pada tiga bagian di atas — bid_offer_variables, Variabel lain, dan Variabel transaksi broker — berasal dari umpan data langsung, bukan dari perhitungan atas riwayat candle.
Untuk sebagian bar yang telah lewat, nilainya tidak tersimpan. Bila itu terjadi, prev dan prev_N mengembalikan nilai terkini, bukan nilai pada bar yang Anda maksud.
prev top5_net_broker_buyer_volume ==> dapat menghasilkan nilai yang sama
dengan bar saat ini
Akibatnya, perbandingan antar bar pada variabel-variabel ini belum dapat diandalkan — hasilnya dapat berupa perbandingan sebuah nilai dengan dirinya sendiri:
top5_net_broker_buyer_volume > prev top5_net_broker_buyer_volume
all_bid_volume > prev all_bid_volume
Hal yang sama berlaku bila variabel-variabel ini dipakai di dalam subformula sma, hhv, llv, sum, atau count, karena seluruhnya membaca nilai per bar.
Sebaliknya, variabel dan fungsi yang dihitung dari riwayat candle mendukung prev sepenuhnya:
close > prev close
volume > prev volume
foreign > prev foreign
top_broker > prev_5 top_broker
rsi(14) < prev rsi(14)
Untuk memeriksa apakah sebuah variabel memberikan nilai yang berbeda pada bar sebelumnya, gunakan menu Formula Evaluator.
Kami sedang menyiapkan penyimpanan nilai historis untuk variabel-variabel ini, dimulai dari timeframe harian. Halaman ini akan diperbarui begitu tersedia.
Menyusun rumus sendiri
Selain memakai fungsi bawaan, Anda dapat menyusun perhitungan sendiri. Kuncinya: sma, ema, aema, sum, hhv, llv, dan ranking menerima subformula berupa ekspresi, bukan sekadar nama stock_attr. Perhatikan definisi vwap di atas — isinya sum("volume * (high + low + close) / 3", N), sebuah ekspresi utuh di dalam tanda kutip.
Bagian ini memperlihatkan cara kerjanya lewat beberapa indikator yang sudah dikenal luas.
Semua indikator pada bagian ini kini tersedia sebagai fungsi tersendiri. Untuk pemakaian sehari-hari, panggil fungsinya langsung — lebih ringkas, lebih cepat, dan lebih kecil kemungkinan salah ketik. Rumus panjangnya tetap ditampilkan di sini sebagai contoh, agar Anda dapat menerapkan pola yang sama pada indikator lain yang belum tersedia.
Donchian Channel
Batas atas dan bawah Donchian adalah nilai tertinggi dan terendah pada N bar terakhir:
hhv("high", 20) ==> garis atas
llv("low", 20) ==> garis bawah
(hhv("high", 20) + llv("low", 20)) / 2 ==> garis tengah
Tersedia langsung sebagai donchian_up(20), donchian_down(20), dan donchian_mid(20).
VWMA — Volume Weighted Moving Average
Rata-rata harga penutupan yang dibobot volume. Polanya sama dengan definisi vwap:
sum("volume * close", 20) / sum("volume", 20)
Tersedia langsung sebagai vwma(20).
PPO dan PVO
MACD yang dinyatakan dalam persen, dan versi yang sama pada volume:
(ema("close", 12) - ema("close", 26)) / ema("close", 26) * 100
(ema("volume", 12) - ema("volume", 26)) / ema("volume", 26) * 100
Tersedia langsung sebagai ppo(12, 26) dan pvo(12, 26).
Awesome Oscillator
Selisih dua simple moving average dari median price. Karena mid_price sudah bernilai (high + low) / 2, penulisannya menjadi:
sma("mid_price", 5) - sma("mid_price", 34)
Tersedia langsung sebagai ao(5, 34).
Sinyal perpotongan dan breakout
Sinyal yang biasa dipakai — golden cross, death cross, breakout — pada dasarnya adalah perbandingan antara bar sebelumnya dan bar saat ini. Menuliskannya sendiri membuat periodenya dapat Anda sesuaikan, dan kriterianya tetap terbaca.
Polanya selalu sama: kondisi belum terpenuhi pada prev, lalu terpenuhi pada bar sekarang.
Golden cross dan death cross MA 5–20
prev sma("close", 5) < prev sma("close", 20) and sma("close", 5) > sma("close", 20)
prev sma("close", 5) > prev sma("close", 20) and sma("close", 5) < sma("close", 20)
Ganti angka 5 dan 20 dengan periode lain sesuai strategi Anda, atau ganti sma dengan ema maupun aema.
MACD memotong garis nol
prev macd(12, 26) < 0 and macd(12, 26) > 0 ==> golden cross
prev macd(12, 26) > 0 and macd(12, 26) < 0 ==> death cross
MACD memotong garis sinyalnya — setara dengan histogram berpindah tanda
prev macd_histogram(12, 26, 9) < 0 and macd_histogram(12, 26, 9) > 0
prev macd_histogram(12, 26, 9) > 0 and macd_histogram(12, 26, 9) < 0
Stochastic %K memotong %D
prev stoch_k(15, 3) < prev stoch_d(15, 3, 3) and stoch_k(15, 3) > stoch_d(15, 3, 3)
prev stoch_k(15, 3) > prev stoch_d(15, 3, 3) and stoch_k(15, 3) < stoch_d(15, 3, 3)
Breakout dari fractal
high > up_fractal and prev close <= up_fractal ==> menembus fractal atas
low < down_fractal and prev close >= down_fractal ==> menembus fractal bawah
Konfirmasi banyak moving average sekaligus
Variabel ma_net_buy_sell_signal_count menghitung selisih sinyal beli dan jual dari 12 moving average sekaligus, dengan rentang −12 sampai +12.
ma_net_buy_sell_signal_count >= 6 ==> mayoritas moving average menguat
ma_net_buy_sell_signal_count <= -6 ==> mayoritas melemah
Fibonacci retracement
Aplikasi ini tidak menyediakan satu fungsi fib(), dan itu disengaja. Hasil Fibonacci sepenuhnya bergantung pada titik mana yang dipakai sebagai jangkar: dua orang yang menarik garis pada ayunan yang berbeda akan memperoleh angka yang berbeda, dan keduanya sama-sama sah. Karena itu jangkarnya Anda tentukan sendiri.
Perhitungannya sendiri sederhana. Setelah puncak dan lembah ditentukan:
puncak - (puncak - lembah) * rasio ==> ayunan naik, koreksi diukur turun dari puncak
lembah + (puncak - lembah) * rasio ==> ayunan turun, koreksi diukur naik dari lembah
Rasio yang lazim dipakai adalah 0.236, 0.382, 0.5, 0.618, dan 0.786. Angka 0.5 sebenarnya bukan rasio Fibonacci, melainkan sekadar titik tengah, namun sudah terlanjur menjadi kebiasaan umum.
Jangkar pada titik balik ayunan
Cara yang paling mendekati garis yang Anda tarik sendiri di chart:
pivot_low_bars(5) > pivot_high_bars(5)
? pivot_high(5) - (pivot_high(5) - pivot_low(5)) * 0.618
: pivot_low(5) + (pivot_high(5) - pivot_low(5)) * 0.618
Operator ? : di sini menentukan arah ayunan. Bila lembah lebih tua daripada puncak, berarti harga baru saja menanjak, sehingga koreksi diukur turun dari puncak.
Jangkar pada rentang N bar
Lebih sederhana, memakai harga tertinggi dan terendah dalam N bar terakhir:
llvbars("low", 60) > hhvbars("high", 60)
? hhv("high", 60) - (hhv("high", 60) - llv("low", 60)) * 0.618
: llv("low", 60) + (hhv("high", 60) - llv("low", 60)) * 0.618
Menyaring saham yang menyentuh sebuah level
low <= pivot_high(5) - (pivot_high(5) - pivot_low(5)) * 0.618
and close > pivot_high(5) - (pivot_high(5) - pivot_low(5)) * 0.618
==> harga sempat menembus level 61,8% pada hari itu, lalu ditutup kembali di atasnya.
Jalan pintas: seberapa jauh harga sudah terkoreksi
Untuk keperluan screening, yang dicari umumnya bukan angka levelnya, melainkan seberapa jauh harga sudah terkoreksi terhadap ayunannya. Angka itu sudah tersedia lewat stoch_k dengan periode perataan 1:
stoch_k(60, 1) ==> posisi harga di dalam rentang 60 bar, dalam persen
Pada ayunan naik, koreksi sebesar R berarti stoch_k bernilai 100 − R:
| Koreksi | stoch_k(N, 1) |
|---|---|
| 23,6% | 76,4 |
| 38,2% | 61,8 |
| 50,0% | 50,0 |
| 61,8% | 38,2 |
| 78,6% | 21,4 |
Sehingga “harga terkoreksi mendekati 61,8% dari ayunan 60 bar” cukup ditulis:
stoch_k(60, 1) > 35 and stoch_k(60, 1) < 42
Pola yang belum punya fungsi
Berikut beberapa perhitungan yang tidak memiliki nama fungsi, namun tetap mudah ditulis dengan pola yang sama.
Jarak harga terhadap moving average — berguna untuk menyaring saham yang sudah terlalu jauh dari rata-ratanya.
(close - sma("close", 20)) / sma("close", 20) * 100 > 5
Lonjakan volume
volume > sma("volume", 20) * 2
Rata-rata dari sebuah ekspresi — apa pun yang dapat Anda tulis sebagai ekspresi satu bar, dapat Anda rata-ratakan.
sma("(high - low)", 14) ==> rata-rata rentang harian
sma("(close - open) / open * 100", 5) ==> rata-rata perubahan intrabar
sum("top_broker_hist * close", 5) ==> nilai akumulasi broker 5 hari
Rasio antar timeframe
volume / weekly volume ==> porsi volume harian terhadap mingguan
close / weekly sma("close", 4) ==> harga terhadap rata-rata 4 minggu
Contoh formula screener
Higher high higher low
prev high < high and prev low < low
Inside bar
prev high > high and prev low < low
Golden cross MA 5-20 (garis MA 5 memotong ke atas MA 20)
prev sma(5) < prev sma(20) and sma(5) > sma(20)
MACD naik
prev macd < macd and macd > 0
Three white soldiers
prev_2 close > prev_2 open
and prev close > prev open
and close > open
10 saham tertinggi akumulasi berdasarkan nilai top-5-net-broker-accumulation
ranking("top_broker_hist * daily_price_avg") <= 10
Stochastic %K memotong %D dari bawah ke atas
prev stoch_k < prev stoch_d and stoch_k > stoch_d
Saham yang baru mencetak harga tertinggi 25 hari
aroon_up(25) == 100
Tren naik kuat menurut Aroon — harga tertinggi masih baru, harga terendah sudah lama
aroon_up(25) > 70 and aroon_down(25) < 30
Aroon Oscillator berpotongan ke atas — pergantian arah dari turun ke naik
prev aroon_osc(25) < 0 and aroon_osc(25) > 0
Tren baru terbentuk tetapi belum jenuh beli
aroon_up(14) > 70 and aroon_down(14) < 30 and rsi < 70
Akumulasi menurut Chaikin Oscillator, disertai volume di atas rata-rata
chaikin_osc(3, 10) > 0
and prev chaikin_osc(3, 10) < 0
and volume > sma("volume", 20)
Divergensi akumulasi — harga mencetak tertinggi baru sementara akumulasi justru menurun
close == hhv("close", 20) and adl < prev_5 adl
Akumulasi ganda — Chaikin positif sekaligus akumulasi top 5 broker
chaikin_osc(3, 10) > 0 and top_broker_hist > 0
Membatasi hasil pada anggota indeks tertentu
code_index("ISSI") and close > sma("close", 20)
Saham likuid dengan nilai transaksi besar — rata-rata nilai transaksi 5 hari di atas 1 miliar
sma("value", 5) > 1B
Kombinasi: harga di atas SMA26 mingguan, MACD histogram bergerak naik di bawah center line, dan Stochastic %K di bawah 19 memotong %D dari bawah ke atas.
close > weekly sma("close", 26)
and macd_histogram < 0
and prev_2 macd_histogram < prev macd_histogram
and prev macd_histogram < macd_histogram
and stoch_k < 19
and prev stoch_k < prev stoch_d
and stoch_k > stoch_d
Contoh screener lengkap
Bagian sebelumnya memperlihatkan kondisi tunggal. Bagian ini merangkainya menjadi screener utuh, lengkap dengan penyaring kelayakan dagang yang sering terlewat.
Satu hal perlu diluruskan lebih dahulu: screener menyaring, bukan meramal. Ia mempersempit ratusan saham menjadi beberapa yang memenuhi syarat yang Anda tentukan sendiri. Kapan masuk, kapan keluar, dan berapa batas kerugian tetap merupakan keputusan Anda — dan di situlah hasil sesungguhnya ditentukan. Rumus di bawah ini adalah contoh untuk dipelajari dan diuji, bukan rekomendasi.
Biaya bolak-balik yang sering terlupakan
Setiap transaksi menanggung dua biaya sebelum harga bergerak sedikit pun: selisih satu fraksi harga, dan biaya broker beserta pajak penjualan. Fraksi harga di bursa berjenjang, sehingga bobotnya terhadap harga berbeda jauh antar level:
| Harga | Fraksi | 1 fraksi | + biaya ±0,4% | Porsi target 2% |
|---|---|---|---|---|
| Rp 100 | 1 | 1,00% | 1,40% | 70% |
| Rp 200 | 2 | 1,00% | 1,40% | 70% |
| Rp 500 | 5 | 1,00% | 1,40% | 70% |
| Rp 1.200 | 5 | 0,42% | 0,82% | 41% |
| Rp 1.999 | 5 | 0,25% | 0,65% | 33% |
| Rp 4.999 | 10 | 0,20% | 0,60% | 30% |
| Rp 10.000 | 25 | 0,25% | 0,65% | 33% |
Biaya paling berat justru terjadi tepat di atas batas fraksi: pada Rp 200, Rp 500, Rp 2.000, dan Rp 5.000, satu fraksi bernilai 1% atau 0,5% dari harga. Pada target 2%, biaya ini memakan 30% sampai 70% target sebelum sahamnya bergerak.
Akibatnya terlihat jelas bila dihitung seberapa sering sebuah strategi harus benar sekadar untuk impas:
| Target | Batas rugi | Harus benar |
|---|---|---|
| 2% | 2% | 72,5% |
| 2% | 1% | 63,3% |
| 3% | 1,5% | 53,3% |
| 7% | 3% | 39,0% |
| 10% | 5% | 37,7% |
Inilah sebabnya target 5–10% dalam beberapa hari umumnya lebih mudah dijalani daripada 2–3% harian. Bukan karena lebih mudah ditebak, melainkan karena biaya tetapnya jauh lebih ringan secara proporsional.
Penyaring kelayakan dagang
Ketiga contoh berikut diawali baris yang sama. Baris ini membuang saham yang terlalu sepi, sekaligus saham yang fraksi harganya terlalu mahal dibandingkan harganya:
value > 5B and tick / close * 100 < 0.30
Variabel tick berisi fraksi harga yang berlaku, sehingga tick / close * 100 langsung memberikan biaya satu fraksi dalam persen. Tidak perlu menebak batas harga.
Momentum intraday
Menjaring saham yang sedang bergerak dengan volume di atas kebiasaannya, namun belum terlalu jauh berlari:
value > 5B
and tick / close * 100 < 0.30
and projected_volume > sma("volume", 20) * 2
and change_percent > 1
and change_percent < 6
and bvol > svol
projected_volume adalah kuncinya: variabel ini memperkirakan volume sampai akhir sesi berdasarkan laju perdagangan sejauh ini, sehingga “volume tidak wajar” dapat dideteksi pada pukul sepuluh pagi, bukan hanya menjelang penutupan. Batas change_percent < 6 menyingkirkan saham yang kenaikannya sudah habis. bvol > svol menandakan transaksi lebih banyak terjadi pada sisi permintaan.
Breakout dengan konfirmasi
Untuk rentang tahan 2–3 hari:
value > 5B
and tick / close * 100 < 0.30
and close > prev hhv("high", 20)
and volume > sma("volume", 20) * 2
and slope(50) > 0
and linreg_r2(50) > 0.5
and close > sma("close", 200)
linreg_r2 di sini yang membedakan breakout dari sebuah basis yang rapi dengan breakout dari pergerakan acak. Tanpa baris itu, keduanya terlihat sama.
Koreksi di dalam tren yang rapi
Membeli kelemahan di dalam kekuatan, dengan menunggu tanda berbalik:
value > 5B
and tick / close * 100 < 0.30
and slope(60) > 0
and linreg_r2(60) > 0.6
and close > sma("close", 200)
and rsi < 40
and close > prev close
Baris terakhir menunggu harga berbalik naik lebih dahulu, alih-alih menangkap pisau jatuh.
Menyesuaikan dengan cara Anda sendiri
Setiap angka pada rumus di atas — 20, 50, 60, 5B, 0.30, 40 — adalah pilihan, bukan ketetapan. Ubah dan uji sendiri terhadap saham yang biasa Anda pantau. Screener yang baik adalah screener yang mencerminkan cara Anda membaca pasar, bukan cara orang lain.
Untuk pemantauan menit per menit, tersedia pula bentuk yang jauh lebih ringkas, misalnya menjaring saham dengan nilai haka minimal satu miliar rupiah dalam satu menit terakhir:
1min slot * 100 * close >= 1B
Pertanyaan yang sering muncul
Berikut hal-hal yang paling sering ditanyakan, beserta jawabannya.
Rumusnya terlihat benar, tetapi hasilnya selalu kosong
Penyebab yang paling sering: hhv, highest, llv, dan lowest sudah termasuk bar saat ini. Karena itu rumus berikut hampir tidak pernah terpenuhi:
close > hhv("close", 20) ==> hampir selalu salah
Bila hari ini memang harga tertinggi dalam 20 bar, hhv("close", 20) bernilai sama dengan close, sehingga close > hhv(...) menjadi salah. Bandingkanlah terhadap bar-bar sebelumnya saja:
close > prev hhv("close", 19) ==> menembus tertinggi 19 bar sebelumnya
Untuk menyatakan “hari ini adalah tertinggi dalam 20 bar”, tersedia bentuk yang lebih ringkas:
hhvbars("close", 20) == 0
Tanda perkalian
Perkalian ditulis dengan tanda bintang *, bukan huruf x:
volume >= 2 * ema("volume", 5) ==> benar
volume >= 2 x ema("volume", 5) ==> tidak valid
Variabel tick pada batas fraksi harga
tick berisi fraksi harga yang berlaku pada harga saat itu. Karena fraksi berubah pada Rp 200, Rp 500, Rp 2.000, dan Rp 5.000, perhitungan yang melintasi batas tersebut dapat memberi hasil di luar dugaan.
Misalnya sebuah saham dibuka pada 1.980 dan ditutup pada 2.020:
close >= open + 5 * tick
2020 >= 1980 + 5 * 10 ==> 2020 >= 2030, bernilai salah
Kenaikannya sebenarnya melintasi dua jenjang fraksi, namun tick pada saat penutupan bernilai 10. Untuk rentang yang mungkin melewati batas fraksi, lebih aman memakai persentase:
close >= open * 1.02
Angka bandarmology berbeda bila dijumlahkan sendiri
Nilai 20 days top 5 broker accumulation pada tab Bandarmology dihitung seperti ini:
sum("top_broker_hist * avg_price", 20)
Uraiannya:
top_broker_hist— selisih volume beli bersih dan jual bersih 5 broker teratas, dalam satuan lembar sahamavg_price— harga rata-rata transaksi pada bar tersebut, sehingga hasil perkaliannya berupa nilai transaksi- keduanya dijumlahkan atas 20 bar terakhir
Menjumlahkan top_broker_hist saja, tanpa dikalikan harga, akan memberi angka yang berbeda — satuannya lembar saham, bukan rupiah.
Kapan data transaksi broker diperbarui
top_broker_hist dan variabel transaksi broker lainnya diperbarui setelah pasar tutup, sekitar pukul 18.00 pada setiap hari bursa, dan tersedia sampai kira-kira enam bulan ke belakang.
Apa saja yang dipindai screener
Saham, warrant, dan ETF ikut terpindai apabila memenuhi kriteria. Indeks, indeks sektoral, indeks dunia, komoditas, dan mata uang tidak termasuk dalam hasil screener.
Seberapa sering hasilnya diperbarui
Selama jam perdagangan, screener menyegarkan hasilnya secara otomatis setiap satu menit.
Bila masih menemui kesulitan
Kirimkan gambaran kondisi yang Anda cari ke idx.datasaham@gmail.com. Sebutkan apa yang ingin dicari, bukan rumusnya, dan kami bantu menyusunkannya.