Data Saham Indonesia
EN Google Play
Kembali ke artikel

Panduan Penulisan Kriteria pada Screener

Tata cara penulisan kriteria Stock Screener dan Stock Scoring: Boolean Expression, Stock Expression, daftar lengkap variabel, fungsi, dan contoh formula.

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.

Tampilan Stock Screener pada aplikasi Data Saham Indonesia Tampilan Stock Scoring pada aplikasi Data Saham Indonesia

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 E digunakan 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

Ilustrasi candle selector

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 stock akan memilih chart saham TLKM dan BMRI.
  • sector — target yang dipilih adalah chart dari index sektoral. Misal untuk saham TLKM dan BMRI, target sector akan 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 index akan 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 singkatPeriode standar
rsi, atr, adx, pdx, ndx, cci, mfi, william_r14
roc12
cmf21
trix15
stochrsi14
dto_stochk, dto_stochd14, 8, 5, 3
stoch_k, stoch_d15, 3, 3
uo7, 14, 28
macd, ppo, pvo12, 26
macd_signal, macd_histogram, ppo_signal, ppo_histogram12, 26, 9
ao5, 34
chaikin_osc3, 10
tsi25, 13
mass_index9, 25
aroon_up, aroon_down, aroon_osc25
donchian_up, donchian_down, donchian_mid20
bollinger_*20, 2
sar0.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 saham
  • macd, macd_signal, macd_histogram — nilai dari chart MACD(12,26,9); macd_histogram = macdmacd_signal
  • rsi — 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 saham
  • top_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)
  • adlAccumulation/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 low
  • dto_stochk, dto_stochd — nilai dari chart DTOStoch(8,5,3)
  • sar — nilai dari chart SAR(0.02,0.2)
  • mid_pricemid_price = (high + low) / 2
  • tick — nilai fraksi harga saham (harga < 200 : 1 ; harga 200–500 : 2 ; harga 500–2000 : 5 ; harga 2000–5000 : 10 ; harga > 5000 : 25)
  • vwapvwap = (high + low + close) / 3
  • avg_price — harga rata-rata transaksi pada bar tersebut; avg_price = value / volume
  • freq — frekuensi (jumlah) transaksi pada bar tersebut
  • change_percent — perubahan harga terhadap penutupan sebelumnya, dalam persen
  • camarilla_h1camarilla_h4, camarilla_l1camarilla_l4 — level pivot Camarilla
  • up_fractal_index, down_fractal_index — berapa bar sejak fractal atas atau bawah terakhir terbentuk
  • frequency_analyzervolume / freq³, ukuran besar-kecilnya rata-rata transaksi. Nilai besar menandakan transaksi didominasi order berukuran besar
  • mfvmoney flow volume, posisi penutupan di dalam rentang harian dikalikan volume
  • ma_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 +12
  • projected_volume, projected_value — perkiraan volume dan nilai transaksi sampai akhir sesi, berdasarkan laju perdagangan sejauh ini
  • iep, ievindicative equilibrium price dan volume pada sesi pra-pembukaan
  • time_progress — proporsi sesi perdagangan yang telah berjalan, 0 sampai 1
  • open_date, close_date, open_time, close_time — tanggal dan waktu pembukaan serta penutupan bar

Catatan untuk adl, top_broker, dan foreign. 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 dikurangi 5 top net seller

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. ema tetap 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 since dapat menghasilkan angka yang besar, pasangkan dengan fungsi yang tidak memiliki batas periode ketat seperti sum, sma, hhv, llv, count, dan stdev. Pada fungsi seperti ema atau trix, 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 hhv dan llv. Karena itu close > donchian_up(20) tidak akan pernah bernilai benar — untuk mencari breakout, bandingkan dengan bar sebelumnya memakai prev.

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_ao juga tersedia sebagai stock_attr, tetapi nilainya mengikuti pengaturan chart Alligator(13,8,5). Gunakan ao(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. log dengan satu argumen sengaja tidak disediakan: pada sebagian aplikasi log berarti logaritma natural, pada sebagian lain berarti basis 10. Tulis ln(x) untuk basis e, log10(x) untuk basis 10, atau log(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_fractal dan down_fractal mengerjakan hal serupa dengan K yang tetap sebesar 2. pivot_high(2) dan pivot_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.

FungsiPeriode amanCatatan
sma, hhv, llv, sum, rankingsampai 500Tidak ada batas praktis
wma, linreg, slope, linreg_r2sampai 500Tidak ada batas praktis
stdev_p, stdev_s, stdevsampai 500Tidak ada batas praktis
pivot_high, pivot_low, beserta varian _barsK sampai 100Makin besar K, makin sedikit titik balik yang ditemukan
aroon_up, aroon_down, aroon_oscsampai 500Tidak ada batas praktis
donchian_up, donchian_down, donchian_midsampai 500Tidak ada batas praktis
vwma, vwap, aosampai 500Tidak ada batas praktis
ema120Sampai 250 bila dipakai pada harga (close, open, high, low)
aema140Sampai 200 pada harga; lebih akurat dari ema untuk volume dan rasio
dema, tema160
trix75Batasnya jauh lebih ketat daripada fungsi lain
ppo, pvoslow_period sampai 140Sampai 200 untuk ppo; standar (12, 26) sangat aman
ppo_signal, ppo_histogramslow + signal sampai 128Standar (12, 26, 9) sangat aman
chaikin_oscslow_period sampai 60Standar (3, 10) sangat aman
mass_indexema_period sampai 100Standar (9, 25) sangat aman
tsilong + short sampai 120Standar (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 Ratio
  • ebitda / ebitda_anl — Earnings Before Interest, Taxes, Depreciation and Amortization
  • eps / eps_anl — Earning Per Share
  • ev_ebitda / ev_ebitda_anl — Enterprise Multiple
  • market_cap — Market Capitalization
  • netprofit / netprofit_anl — Net Profit
  • pbv / pbv_anl — Price-to-Book Ratio
  • per / per_anl — Price-Earnings Ratio
  • revenue / revenue_anl — Revenue
  • roa / roa_anl — Return on Assets
  • roe / 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

Ilustrasi bid offer variables

  • top1_bid_volume — total volume pada bid di harga terbaik (lembar)
  • top1_bid_count — jumlah order pada bid di harga terbaik
  • top1_offer_volume — total volume pada offer di harga terbaik (lembar)
  • top1_offer_count — jumlah order offer di harga terbaik
  • top3_*, top5_*, top10_* — pola yang sama untuk 3, 5, dan 10 harga terbaik
  • all_bid_volume — total volume pada bid di semua harga (lembar)
  • all_bid_count — jumlah order pada bid di semua harga
  • all_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 saham
  • best_offer_price — harga offer (penawaran jual) terendah/terbaik saham
  • blot — volume transaksi yang terjadi pada harga bid (ha-ki) dalam satuan lot
  • slot — volume transaksi yang terjadi pada harga offer (ha-ka) dalam satuan lot
  • bvol — volume transaksi yang terjadi pada harga bid (ha-ki) dalam satuan lembar
  • svol — volume transaksi yang terjadi pada harga offer (ha-ka) dalam satuan lembar
  • bfreq — 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 dengan bvol / svol
  • all_buy_freq / all_sell_freq — sama dengan bfreq / sfreq
  • broker_buyer_count — jumlah broker yang melakukan pembelian
  • broker_seller_count — jumlah broker yang melakukan penjualan
  • net_broker_buyer_count — jumlah broker yang melakukan pembelian bersih
  • net_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:

Koreksistoch_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:

HargaFraksi1 fraksi+ biaya ±0,4%Porsi target 2%
Rp 10011,00%1,40%70%
Rp 20021,00%1,40%70%
Rp 50051,00%1,40%70%
Rp 1.20050,42%0,82%41%
Rp 1.99950,25%0,65%33%
Rp 4.999100,20%0,60%30%
Rp 10.000250,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:

TargetBatas rugiHarus 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 saham
  • avg_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.

Siap mulai analisis hari ini?

Unduh gratis dan dapatkan akses ke data IDX, sinyal teknikal, dan portofolio Anda dalam satu tempat.

Unduh di Google Play

4.7 ★ · 15.800 ulasan