Skip to content
Learn

Strategy Development dan Backtesting

Advanced · 4.5 jam

Prasyarat:

  • Modul 7: Membuat indikator EMA-crossover dengan Pine Script v5
  • Paham execution model per-bar Pine Script (series, var, [] historical access)
  • Paham fungsi ta.* (ta.ema, ta.crossover, ta.crossunder)
  • Bisa pakai input.* untuk parameter
  • Akun TradingView (minimal Free untuk latihan; beberapa fitur butuh Premium+)

Tujuan Pembelajaran

  • Mendeklarasikan strategy() dengan parameter produksi yang benar: initial_capital, default_qty_type=strategy.percent_of_equity, pyramiding, dan process_orders_on_close
  • Menggunakan order functions (strategy.entry, strategy.order, strategy.exit, strategy.close, strategy.close_all, strategy.cancel) dan tahu kapan pakai yang mana
  • Membaca state variables (strategy.position_size, strategy.equity, strategy.netprofit, strategy.opentrades) untuk logika dan dashboard
  • Menjelaskan realitas eksekusi order: eksekusi di open bar berikutnya, kalkulasi bar-close-only, dan kenapa hasil backtest beda dari live trading
  • Membaca semua tab Strategy Tester (Overview, Performance Summary, List of Trades) dan menafsirkan profit factor, max drawdown, % profitable, Sharpe/Sortino
  • Mengatur commission dan slippage realistis untuk IDX, dan mengerti kenapa default nol bisa menggelembungkan hasil 20-50%
  • Mempertahankan strategi dari overfitting lewat walk-forward manual (in-sample vs out-of-sample), sample minimal ~100 trade, dan kesadaran repainting
  • Memasang risk management lewat strategy.exit bracket (stop/limit/trail) dan strategy.risk.* (max_drawdown, max_intraday_loss, max_position_size)
  • Mengubah indikator EMA-crossover dari Modul 7 menjadi strategi lengkap, mem-backtest di BBCA Daily, lalu memvalidasi di periode out-of-sample

1. Dari Indikator ke Strategi: Apa Bedanya?

Indikator cuma ngomong, strategi yang ngambil keputusan

Di Modul 7 lo udah bikin indikator EMA-crossover. Indikator itu kayak penasihat: dia kasih sinyal "eh, EMA cepat motong EMA lambat ke atas, mungkin beli nih" lewat panah hijau di chart. Tapi indikator nggak pernah benar-benar mencet tombol beli. Dia nggak tahu lo punya modal berapa, nggak nyatet untung-rugi, nggak ngitung berapa kali lo cuan vs buntung.

Strategi itu beda level. Strategi itu robot yang beneran "buka posisi" di simulasi, nyatet tiap transaksi, dan di akhir kasih lo rapor lengkap: net profit, win rate, drawdown, dan seterusnya. Inilah inti dari backtesting — nguji ide trading lo ke data masa lalu sebelum lo pertaruhkan duit beneran.

Analogi gampang buat trader IDX: indikator itu kayak temen di grup WA yang teriak "BBCA breakout!". Strategi itu kayak lo beneran beli BBCA, catat di Excel harga beli-jual, hitung total cuan setahun, terus tahu strategi lo worth it apa nggak. Bedanya, strategi di TradingView ngerjain Excel itu otomatis dalam hitungan detik buat ribuan bar.

Satu deklarasi, dunia yang beda

Di Pine Script, beda indikator dan strategi cuma satu baris di paling atas:

//@version=5
indicator("EMA Cross", overlay=true)   // versi Modul 7

vs

//@version=5
strategy("EMA Cross Strategy", overlay=true)   // versi modul ini

Begitu lo ganti indicator() jadi strategy(), lo dapat akses ke seluruh keluarga fungsi strategy.* (entry, exit, close, dll) DAN tab Strategy Tester muncul di panel bawah dengan rapor backtest. Tapi awas — lo juga jadi tanggung jawab atas semua jebakan backtest (komisi nol, slippage nol, overfitting) yang bakal kita bahas tuntas di modul ini.

Peringatan dini yang harus lo tanam dari sekarang

Backtest yang keliatan bagus itu MURAH. Semua orang bisa bikin strategi yang "cuan 5000% di backtest". Yang susah dan berharga adalah backtest yang jujur — yang hasilnya mendekati apa yang bakal lo alami beneran. Sepanjang modul ini gue bakal terus-terusan ngingetin soal kejujuran backtest, karena di sinilah 90% trader pemula tertipu sama angka indah yang nggak pernah kejadian di akun riil.

Latihan

  1. Buka script EMA-crossover Modul 7 lo, duplikat filenya (Pine Editor > Save As), lalu ganti baris indicator() jadi strategy("EMA Cross Strategy", overlay=true). Save dan lihat tab Strategy Tester muncul di panel bawah.
  2. Tulis dalam 2 kalimat: apa bedanya peran indikator vs strategi dalam workflow trading lo sendiri?

Pro Tips

  • Pro tip: jangan hapus indikator Modul 7 lo. Simpan sebagai script terpisah. Indikator dipakai buat alert dan visual harian; strategi dipakai buat validasi. Keduanya hidup berdampingan.
  • Begitu deklarasi jadi strategy(), kalau lo lupa kasih order function apapun, Strategy Tester bakal kosong tapi nggak error. Jangan panik — itu wajar, lo cuma belum nyuruh dia buka posisi.

2. Deklarasi strategy(): Setup yang Benar dari Awal

Parameter strategy() bukan sekadar formalitas

Kebanyakan tutorial cuma nulis strategy("Nama") terus lanjut. Itu jebakan. Parameter di deklarasi strategy() menentukan cara robot lo ngelola duit, dan kalau salah, seluruh rapor backtest jadi ngawur. Mari bedah satu-satu yang penting buat trader IDX.

//@version=5
strategy("EMA Cross Strategy",
     overlay              = true,
     initial_capital      = 100000000,                 // modal awal Rp 100 juta
     default_qty_type     = strategy.percent_of_equity,
     default_qty_value    = 10,                          // tiap entry pakai 10% equity
     pyramiding           = 0,                           // nggak nambah posisi
     commission_type      = strategy.commission.percent,
     commission_value     = 0.15,                        // komisi beli IDX ~0.15%
     slippage             = 2,                           // 2 tick slippage
     process_orders_on_close = false,                    // default, eksekusi bar berikutnya
     calc_on_every_tick   = false)                       // default, hitung per bar tutup

Line-by-line buat yang penting:

  • initial_capital = 100000000 — modal awal simulasi. Pakai angka realistis sesuai akun lo. Gue pakai Rp 100 juta sebagai contoh trader IDX retail serius. Kalau lo isi terlalu kecil (misal 10000) dan harga BBCA 9000-an, lo cuma bisa beli 1 lot dan hasil backtest jadi nggak representatif.
  • default_qty_type = strategy.percent_of_equity — INI PENTING BANGET. Ini bikin tiap order pakai persentase dari equity yang lagi berjalan, bukan jumlah saham tetap. Artinya saat akun tumbuh, position size ikut tumbuh (compounding); saat rugi, ukuran mengecil. Ini cara position sizing yang paling realistis dan paling sering dipakai pro. Pasangannya default_qty_value = 10 artinya 10% equity per entry.
  • pyramiding = 0 — berapa kali boleh nambah posisi searah sebelum keluar. 0 = sekali masuk, nggak nambah lagi sampai keluar. Kalau lo set pyramiding = 3, robot boleh nambah posisi 3x (averaging up/down). Buat pemula: SELALU mulai dari 0. Pyramiding bikin hasil keliatan wah tapi risikonya meledak.
  • commission_* dan slippage — kita bahas tuntas di Bagian 6. Tapi catat: gue udah masukin dari awal. Jangan pernah backtest tanpa ini.
  • process_orders_on_close = false — default. Order dieksekusi di open bar berikutnya, bukan di harga close bar sinyal. Ini realistis (lo nggak bisa beli di harga close yang udah lewat). Bahas detail di Bagian 4.
  • calc_on_every_tick = false — default. Strategi dihitung cuma di bar yang udah tutup. Ini bikin backtest konsisten dan menghindari banyak jebakan repainting.

default_qty_type: tiga pilihan, satu pemenang

TipeArtinyaKapan dipakai
strategy.fixedJumlah saham/kontrak tetapJarang, kecuali lo emang mau ukuran konstan
strategy.cashNominal rupiah tetap per tradeKalau mau "selalu Rp 10 juta per posisi"
strategy.percent_of_equityPersen dari equity berjalanDefault pro. Compounding otomatis, paling realistis

Untuk modul ini dan exercise akhir, kita pakai percent_of_equity. Ini ngajarin lo mikir dalam persen risiko, bukan jumlah lot — pola pikir yang bener buat manajemen modal.

Lot IDX: jebakan halus

Ingat, di IDX 1 lot = 100 saham. TradingView ngitung dalam jumlah saham (shares), bukan lot. Jadi kalau strategi lo beli 1000 saham BBCA, itu = 10 lot. Saat lo set percent_of_equity, TradingView otomatis ngitung jumlah saham yang muat dalam 10% equity lo — kadang hasilnya bukan kelipatan 100 yang rapi. Untuk backtest ini nggak fatal, tapi sadari kalau mau eksekusi beneran lo harus bulatkan ke lot terdekat.

Konteks Crypto

Di crypto nggak ada konsep lot. Lo bisa beli BINANCE:BTCUSDT dalam pecahan koin — 0.0137 BTC itu valid, nggak perlu dibulatkan ke kelipatan 100 apapun. Jadi percent_of_equity langsung kepakai mulus: kalau equity lo $10.000 dan default_qty_value=10, robot beli BTC senilai $1.000 persis tanpa sisa pembulatan. Bandingkan sama jebakan lot IDX di atas — di crypto justru lebih bersih, tapi sadari minimum order tiap exchange (mis. Binance minimal notional ~$5) tetap berlaku pas eksekusi riil.

Latihan

  1. Ubah deklarasi strategy() di script lo supaya pakai initial_capital sesuai modal trading riil lo, default_qty_type=strategy.percent_of_equity, dan default_qty_value=10.
  2. Eksperimen: ganti default_qty_value dari 10 ke 100 (all-in tiap trade) lalu ke 5. Catat bagaimana net profit dan max drawdown berubah di Strategy Tester. Apa kesimpulan lo soal hubungan ukuran posisi dengan drawdown?
  3. Set pyramiding=2 lalu balik ke 0. Lihat di List of Trades apakah ada entry beruntun searah. Jelaskan apa yang berubah.

Pro Tips

  • Pro tip: taruh semua angka penting (initial_capital, qty %, commission, slippage) di deklarasi strategy() ATAU jadikan input.* biar gampang diubah tanpa ngubek-ubek kode. Untuk belajar, hardcode dulu di deklarasi biar jelas.
  • Common mistake: lupa default_qty_value. Kalau lo set default_qty_type=strategy.percent_of_equity tapi nggak set default_qty_value, TradingView pakai default-nya sendiri (biasanya tiap entry langsung pakai porsi besar). Selalu pasangkan keduanya.
  • Pyramiding=0 bukan berarti lo cuma bisa trade sekali. Artinya lo nggak bisa NAMBAH ke posisi yang lagi terbuka. Setelah posisi ditutup, robot bebas masuk lagi.

3. Order Functions: Kosakata Robot Trading Lo

Lima kata kerja yang harus lo kuasai

Semua aksi trading robot lo diungkapkan lewat fungsi strategy.*. Ini kosakata intinya:

strategy.entry — buka posisi (pintar, auto-reverse)

if ta.crossover(emaCepat, emaLambat)
    strategy.entry("Long", strategy.long)
  • "Long" = ID/nama posisi (lo yang nentuin, dipakai buat ngreferensiin nanti).
  • strategy.long = arah (bisa juga strategy.short).
  • Sifat ajaib: kalau lo lagi short terus panggil strategy.entry("Long", strategy.long), robot otomatis tutup short DAN buka long dalam satu langkah. Ini namanya auto-reverse. 90% strategi pakai strategy.entry.

strategy.order — order mentah (nggak auto-reverse)

strategy.order("Add", strategy.long, qty=500)

Sama kayak entry tapi TANPA logika pintar. Nggak nutup posisi lawan otomatis. Dipakai kalau lo mau kontrol penuh dan tahu persis apa yang lo lakuin (grid, scaling manual). Buat pemula: stick ke strategy.entry dulu.

strategy.exit — keluar dengan TP/SL/trailing (jagoan risk management)

strategy.exit("Keluar", from_entry="Long",
     stop  = hargaStop,      // stop loss di harga absolut
     limit = hargaTarget)    // take profit di harga absolut

Ini yang paling penting buat manajemen risiko. strategy.exit masang bracket order: robot pasang stop loss DAN take profit sekaligus, dan begitu salah satu kena, yang lain otomatis dibatalin (OCO — One Cancels Other). Bisa juga pakai trailing stop (bahas di Bagian 7). from_entry nyambungin exit ini ke entry tertentu.

strategy.close & strategy.close_all — tutup posisi by sinyal

if ta.crossunder(emaCepat, emaLambat)
    strategy.close("Long")     // tutup posisi bernama "Long"

// atau tutup semua sekaligus
strategy.close_all()

Bedanya sama strategy.exit: close itu keluar karena sinyal (misal EMA cross balik), bukan karena kena harga stop/target. Banyak strategi pakai kombinasi: strategy.exit buat jaga-jaga (stop/target), strategy.close buat keluar normal pas sinyal balik.

strategy.cancel — batalin order pending

strategy.cancel("Long")   // batalin entry "Long" yang belum kepicu

Dipakai kalau lo masang limit/stop order yang belum kena dan mau dibatalin (misal sinyal udah basi). strategy.cancel_all() batalin semua pending.

Pola lengkap: gabungan semuanya

//@version=5
strategy("Pola Lengkap", overlay=true,
     default_qty_type=strategy.percent_of_equity, default_qty_value=10)

emaCepat = ta.ema(close, 12)
emaLambat = ta.ema(close, 26)

masuk  = ta.crossover(emaCepat, emaLambat)
keluar = ta.crossunder(emaCepat, emaLambat)

// 1. Buka posisi pas sinyal beli
if masuk
    strategy.entry("Long", strategy.long)

// 2. Pasang jaring pengaman: stop 2% di bawah, target 4% di atas
strategy.exit("Bracket", from_entry="Long",
     stop  = strategy.position_avg_price * 0.98,
     limit = strategy.position_avg_price * 1.04)

// 3. Keluar normal kalau sinyal balik
if keluar
    strategy.close("Long")

Perhatikan strategy.position_avg_price — harga rata-rata masuk posisi yang lagi jalan. Kita pakai buat ngitung level stop/target dinamis: 0.98 = 2% di bawah harga masuk, 1.04 = 4% di atas. Persis kayak yang bakal lo butuhin di exercise akhir.

Kapan pakai exit vs close?

  • strategy.exit = keluar otomatis kalau harga sentuh level (stop loss / take profit). Pasang sekali, jalan terus.
  • strategy.close = keluar karena kondisi logika (sinyal balik, indikator lain, dll).

Strategi yang matang biasanya pakai DUA-DUANYA: bracket buat batasin kerugian/kunci untung, dan close buat exit normal saat tren berbalik.

Latihan

  1. Tambahkan ke script EMA lo: strategy.entry untuk masuk saat crossover, dan strategy.close saat crossunder. Jalankan dan lihat List of Trades.
  2. Tambahkan strategy.exit dengan stop = position_avg_price * 0.97 dan limit = position_avg_price * 1.05. Bandingkan jumlah trade dan win rate sebelum vs sesudah ada bracket.
  3. Eksperimen: pindahkan strategy.exit ke DALAM blok if masuk. Lihat apakah hasilnya berubah. Jelaskan kenapa exit harus dipanggil tiap bar.

Pro Tips

  • Pro tip: strategy.exit harus dipanggil SETIAP bar (taruh di luar if), bukan cuma sekali pas entry. TradingView terus 'mengelola' bracket ini selama posisi terbuka. Kalau lo taruh di dalam if masuk, bracket-nya cuma kepasang di bar entry doang.
  • Common mistake: ID entry dan from_entry harus COCOK. Kalau entry pakai "Long" tapi exit pakai from_entry="long" (huruf kecil), bracket nggak nyambung dan stop/target nggak jalan. Case-sensitive!
  • strategy.close nggak butuh harga — dia keluar di market (open bar berikutnya). strategy.exit butuh level harga stop/limit.

4. State Variables & Realitas Eksekusi Order

State variables: nanya kondisi robot lo kapan aja

Selama backtest jalan, lo bisa nanya ke robot "sekarang kondisi lo gimana?" lewat state variables. Ini berguna buat logika kondisional DAN buat bikin dashboard.

strategy.position_size    // jumlah saham yang lagi dipegang. 0 = flat, >0 = long, <0 = short
strategy.position_avg_price // harga rata-rata masuk posisi sekarang
strategy.equity           // total nilai akun sekarang (cash + nilai posisi)
strategy.netprofit        // total profit/loss bersih sejauh ini
strategy.openprofit       // floating P/L posisi yang lagi terbuka
strategy.opentrades       // jumlah trade yang lagi terbuka
strategy.closedtrades     // jumlah trade yang udah selesai
strategy.wintrades        // jumlah trade yang menang

Contoh pakai dalam logika — cuma masuk kalau lagi nggak punya posisi:

if masuk and strategy.position_size == 0
    strategy.entry("Long", strategy.long)

Contoh dashboard kecil di pojok chart:

var table dash = table.new(position.top_right, 2, 3)
if barstate.islast
    table.cell(dash, 0, 0, "Equity")
    table.cell(dash, 1, 0, str.tostring(strategy.equity, "#,###"))
    table.cell(dash, 0, 1, "Net Profit")
    table.cell(dash, 1, 1, str.tostring(strategy.netprofit, "#,###"))
    table.cell(dash, 0, 2, "Posisi")
    table.cell(dash, 1, 2, str.tostring(strategy.position_size))

Realitas eksekusi: di sinilah backtest bohong (kalau lo nggak ngerti)

Ini section paling penting di seluruh modul. Pahami baik-baik, karena di sinilah perbedaan antara trader yang ketipu backtest dan trader yang nggak.

Aturan 1: Order dieksekusi di OPEN bar berikutnya

Secara default (process_orders_on_close = false), saat sinyal muncul di bar tutup, order BARU dieksekusi di harga open bar SELANJUTNYA. Kenapa? Karena lo nggak bisa beli di harga close yang udah lewat. Pas sinyal terkonfirmasi di penutupan bar, kesempatan paling cepat lo masuk adalah pembukaan bar berikutnya. Ini realistis dan jujur.

Contoh konkret BBCA: EMA cross terjadi, close hari Senin 9000. Robot nggak beli di 9000. Robot beli di OPEN hari Selasa — bisa 9050 (gap up, lo rugi entry lebih mahal) atau 8950 (gap down, lo untung entry lebih murah). Inilah kenyataan.

EKSEKUSI DI OPEN BAR BERIKUTNYABar N (Senin)EMA cross, close 9000sinyal terkonfirmasiclose 9000fill di OPENopen 9050Gap UPentry lebih mahalopen 8950Gap DOWNentry lebih murahBar N+1 (Selasa) — dua kemungkinan harga fillSinyal di close bar N → order dieksekusi di open bar N+1, bukan di harga close
Sinyal terkonfirmasi di close bar N (Senin, 9000), tapi order baru di-fill di open bar N+1 (Selasa) — bisa gap up (9050, lebih mahal) atau gap down (8950, lebih murah).

Aturan 2: Kalkulasi cuma di bar yang udah tutup

Dengan calc_on_every_tick = false (default), strategi dihitung sekali per bar, pas bar TUTUP. Robot nggak ngeliat pergerakan intra-bar. Ini bikin backtest konsisten dan reproducible. Tapi artinya stop loss lo dianggap kena di level persisnya — padahal di dunia nyata harga bisa loncat lewatin stop lo (gap), yang bikin kerugian riil lebih besar. Slippage (Bagian 6) sebagian meng-cover ini.

Aturan 3: Kenapa backtest beda dari live trading

Empat sumber utama divergensi:

  1. Komisi & slippage — kalau lo set nol, hasil backtest jauh lebih indah dari riil (Bagian 6).
  2. Gap & eksekusi — order di open bar berikutnya bisa kena gap yang nggak menguntungkan.
  3. Likuiditas — backtest mengasumsikan order lo selalu kepenuhan di harga yang lo mau. Saham IDX small-cap kadang nggak ada yang jual/beli di harga itu.
  4. Repainting / lookahead — kalau strategi lo nggak sengaja "ngintip masa depan" (pakai request.security yang salah, atau calc_on_every_tick dengan sinyal intra-bar), backtest jadi mustahil bagus tapi live-nya hancur.

Aturan emas: backtest itu BATAS ATAS optimistik dari performa lo. Live trading hampir selalu lebih buruk. Kalau backtest aja udah nggak cuan, live pasti rugi. Tujuan backtest bukan nyari angka indah — tapi nyaring ide yang JELAS jelek sebelum lo buang duit.

Latihan

  1. Tambahkan dashboard table ke strategi lo yang nampilin equity, net profit, dan position size. Verifikasi angkanya cocok sama tab Performance Summary.
  2. Set process_orders_on_close=true lalu false. Bandingkan entry price di List of Trades. Jelaskan kenapa harganya beda dan mana yang lebih realistis.
  3. Tulis penjelasan 3 kalimat ke 'teman pemula' tentang kenapa backtest yang cuan 1000% belum tentu bakal cuan di akun riil.

Pro Tips

  • Pro tip: jangan pernah nyalain calc_on_every_tick=true buat backtest serius kecuali lo bener-bener paham konsekuensinya. Itu bikin hasil di chart historis (pakai bar OHLC) beda dari hasil live (pakai tick beneran), dan gampang menipu.
  • Common mistake: bikin sinyal pakai data yang belum confirmed lalu kaget kenapa live-nya beda. Selalu pakai nilai bar tutup (default ta.* udah aman) dan hindari lookahead.
  • strategy.position_size > 0 artinya long, < 0 artinya short, == 0 artinya flat. Pakai ini buat cegah double-entry.

5. Membaca Strategy Tester: Tab demi Tab

Strategy Tester ada di panel bawah

Setelah strategi lo nempel di chart, buka panel bawah dan klik tab Strategy Tester. Ada beberapa sub-tab. Mari bedah masing-masing dan apa yang harus lo perhatiin.

Tab Overview: gambaran besar dalam satu layar

Menampilkan tiga hal:

  • Equity curve — grafik nilai akun lo dari waktu ke waktu. Yang lo MAU: garis naik mulus dari kiri bawah ke kanan atas. Yang lo WASPADAI: garis bergerigi tajam, atau naik gara-gara satu lonjakan keberuntungan.
  • Drawdown curve — seberapa dalam akun lo turun dari puncaknya. Ini ukuran "rasa sakit". Drawdown 50% artinya akun lo pernah amblas separuh dari puncak — secara psikologis hampir nggak ada yang tahan.
  • Buy & hold comparison — perbandingan strategi lo vs kalau lo cuma beli dan tahan saham itu sejak awal. KUNCI: kalau strategi lo nggak bisa ngalahin buy-and-hold BBCA, ngapain repot bikin robot? Mending beli dan tidur.

Tab Performance Summary: rapor angka

Ini metrik yang harus lo kuasai:

MetrikArtinyaPatokan kasar
Net ProfitTotal cuan bersihHarus positif & ngalahin buy-hold
Profit Factorgross profitgross loss\frac{\text{gross profit}}{\text{gross loss}}>1>1 = cuan. >1,5>1{,}5 bagus. <1<1 = rugi
Max DrawdownPenurunan terdalam dari puncakMakin kecil makin baik. >3040%>30\text{--}40\% bahaya
% ProfitablePersen trade yang menangNggak harus tinggi! Lihat bareng avg win/loss
Avg Win / Avg Lossavg winavg loss\frac{\text{avg win}}{\text{avg loss}} per tradeRasio win:loss idealnya >1,5>1{,}5
Total Closed TradesJumlah trade selesai<100<100 = statistik nggak bisa dipercaya
Sharpe RatioReturn disesuaikan risiko (volatilitas total)>1>1 lumayan, >2>2 bagus
Sortino RatioMirip Sharpe tapi cuma hukum volatilitas turunBiasanya lebih tinggi dari Sharpe

Profit factor itu metrik favorit gue buat penilaian cepat: total semua untung dibagi total semua rugi.

Profit Factor=gross profitgross loss\text{Profit Factor} = \frac{\text{gross profit}}{\text{gross loss}}

1.0 = impas. 2.0 = lo dapat Rp 2 untung tiap Rp 1 rugi. Di bawah 1.0 = strateginya buang duit.

Jebakan % profitable: banyak pemula ngejar win rate tinggi. Padahal strategi dengan win rate 40% tapi avg win 3x avg loss itu JAUH lebih cuan daripada win rate 70% dengan avg loss = avg win. Lihat dua metrik ini BARENGAN, jangan satu doang.

Tab List of Trades: forensik per transaksi

Daftar tiap trade: tanggal masuk, harga masuk, tanggal keluar, harga keluar, profit/loss, dan running drawdown. Gunakan buat:

  • Cek apakah seluruh profit datang dari 1-2 trade beruntung (kalau iya, strategi lo rapuh).
  • Lihat trade terburuk lo — apa stop loss bekerja?
  • Verifikasi eksekusi masuk akal (entry di open bar berikutnya, dll).

Deep Backtesting (Premium+): fidelitas lebih tinggi

Di plan Premium ke atas ada Deep Backtesting. Bedanya: backtest biasa pakai bar OHLC chart yang lagi lo lihat. Deep Backtesting pakai history tick-level sehingga simulasi urutan harga intra-bar lebih akurat dan bisa nguji rentang waktu yang jauh lebih panjang. Buat strategi yang sensitif ke urutan kena stop vs target dalam satu bar, ini bikin hasil lebih dipercaya. Aktifkan lewat toggle di Strategy Tester (cuma muncul kalau plan lo mendukung).

Latihan

  1. Jalankan strategi EMA lo di BBCA Daily. Catat: net profit, profit factor, max drawdown, % profitable, dan total closed trades. Apakah jumlah trade-nya >= 100?
  2. Bandingkan net profit strategi lo dengan baris buy & hold di tab Overview. Strategi lo menang atau kalah? Apa artinya?
  3. Buka List of Trades, urutkan dari profit terbesar. Berapa persen total net profit yang datang dari 3 trade teratas? Kalau >50%, apa kesimpulan lo soal keandalan strategi ini?

Pro Tips

  • Pro tip: selalu lihat Overview DULU sebelum Performance Summary. Equity curve yang jelek (satu lonjakan, sisanya datar) langsung kasih tahu strateginya rapuh, tanpa perlu baca angka.
  • Common mistake: bangga sama net profit gede tapi ngabaikan max drawdown 60%. Drawdown sebesar itu artinya lo bakal panik jual di titik terburuk dan nggak akan pernah sampai ke profit akhir itu.
  • Patokan minimal 100 trade itu bukan basa-basi. Di bawah itu, profit factor dan win rate lo bisa berubah drastis cuma gara-gara 1-2 trade. Statistiknya nggak signifikan.
  • Buy & hold comparison itu reality check paling jujur. Banyak 'strategi keren' kalah telak sama beli-dan-tahan BBCA/BBRI yang trennya naik panjang.

6. Default Berbahaya: Komisi Nol & Slippage Nol

Default TradingView itu dunia khayalan

Kalau lo bikin strategi tanpa nyetel komisi dan slippage, TradingView mengasumsikan:

  • Komisi = 0 (lo trading GRATIS, nggak ada fee broker)
  • Slippage = 0 (lo selalu dapat harga PERSIS yang lo mau)

Dua-duanya BOHONG. Dan untuk strategi yang sering trading (banyak entry-exit), kebohongan ini bisa menggelembungkan hasil 20-50% atau bahkan ngubah strategi rugi jadi keliatan cuan. Ini sumber penipuan diri sendiri nomor satu di kalangan pemula.

Komisi realistis untuk IDX

Di IDX, broker mungut fee tiap transaksi. Tipikal:

  • Beli: sekitar 0.10% – 0.20% dari nilai transaksi
  • Jual: sekitar 0.20% – 0.30% (lebih mahal karena ada pajak penjualan 0.1% + levy)

Untuk backtest, pakai angka konservatif. TradingView cuma kasih satu nilai komisi (dipakai buat tiap order, beli maupun jual). Kompromi yang aman: pakai 0.15% sebagai rata-rata, atau lebih konservatif 0.2%.

strategy("...",
     commission_type  = strategy.commission.percent,
     commission_value = 0.15)   // 0.15% per order (beli & jual)

Pilihan commission_type:

  • strategy.commission.percent — persen dari nilai transaksi (paling pas buat saham IDX)
  • strategy.commission.cash_per_order — nominal tetap per order
  • strategy.commission.cash_per_contract — per kontrak (lebih relevan futures)
Konteks Crypto

Backtest paling natural diajarin di pair crypto, dan strategi yang sama persis jalan di BINANCE:BTCUSDT atau ETHUSDT cukup dengan ganti simbol. Tiga beda penting yang harus lo setel ulang:

  • Komisi exchange jauh lebih murah dari broker IDX. Spot di Binance/Bybit tipikal ~0.04% – 0.1% maker/taker, bukan 0.15% – 0.3% broker IDX. Set commission_value = 0.075 (taker) sebagai default konservatif buat crypto.
  • Pasar 24/7, nggak ada gap akhir pekan. Saham IDX tutup malam dan weekend, jadi sering gap pas pembukaan; crypto jalan terus, gap besar lebih jarang. Artinya eksekusi "open bar berikutnya" lebih mulus, tapi flash-crash di likuiditas tipis tetap ada.
  • Tick size beda dan nggak ada lot. BTC tick-nya kecil (mis. $0,1) dan qty pecahan koin; slippage 2 tick di crypto artinya beda nominal yang jauh lebih kecil ketimbang 2 tick Rp 10 di BBCA. Sesuaikan slippage ke karakter pair-nya.

Pelajaran intinya sama: jangan pernah backtest crypto dengan komisi & slippage nol — cuma angkanya yang beda, jebakannya identik.

Slippage: harga yang lo dapat ≠ harga yang lo mau

Slippage = selisih antara harga yang lo harapkan dan harga eksekusi sebenarnya. Penyebabnya: harga gerak antara sinyal dan eksekusi, spread bid-ask, likuiditas tipis. Di TradingView slippage diukur dalam tick.

Di IDX, tick size berbeda per rentang harga (fraksi harga):

  • harga 200–500: tick Rp 1
  • harga 500–2000: tick Rp 2
  • harga 2000–5000: tick Rp 5
  • harga 5000+: tick Rp 10 (kategori BBCA, BBRI)
strategy("...", slippage = 2)   // 2 tick slippage tiap eksekusi

Untuk saham likuid kayak BBCA, slippage 1-3 tick masuk akal. Untuk saham kurang likuid, naikkan. Setting slippage = 2 di BBCA (tick Rp 10) artinya lo asumsikan kena harga jelek Rp 20 tiap eksekusi — realistis.

Eksperimen yang harus lo lihat sendiri

Cara paling ampuh nyadarin bahaya ini: jalankan strategi lo DUA kali.

  1. Run 1: commission=0, slippage=0. Catat net profit & profit factor.
  2. Run 2: commission=0.15%, slippage=2. Catat lagi.

Lo bakal kaget. Strategi yang sering trading bisa kehilangan separuh profit-nya — atau berubah dari cuan jadi rugi. Inilah kenapa strategi high-frequency (banyak sinyal) sangat rentan: tiap trade kena fee + slippage, dan kalau profit per trade kecil, biaya transaksi memakan habis semuanya.

Pelajaran: strategi yang trading-nya jarang tapi profit per trade besar jauh lebih tahan terhadap biaya transaksi daripada strategi yang scalping tipis-tipis. Saat lo desain strategi, perhatikan rasio profit-per-trade vs biaya-per-trade.

Latihan

  1. Jalankan strategi lo dengan commission=0 & slippage=0, catat net profit. Lalu set commission=0.15% & slippage=2, catat lagi. Hitung berapa persen profit yang hilang.
  2. Cari tahu fee beli & jual broker IDX yang lo pakai (Stockbit/Ajaib/IPOT/dll). Set commission_value mendekati angka itu.
  3. Untuk strategi lo: hitung rata-rata profit per trade avg profit/trade=net profitjumlah trade\text{avg profit/trade} = \dfrac{\text{net profit}}{\text{jumlah trade}}. Bandingkan dengan estimasi biaya per trade biaya per trade2×0,15%×nilai posisi\text{biaya per trade} \approx 2 \times 0{,}15\% \times \text{nilai posisi}. Apakah profit per trade jauh lebih besar dari biaya? Kalau nggak, strategi lo dalam bahaya.

Pro Tips

  • Pro tip: SELALU set komisi dan slippage SEBELUM lo lihat hasil pertama kali. Kalau lo lihat angka indah dulu (tanpa biaya), otak lo udah keburu jatuh cinta dan susah objektif pas biaya ditambahkan.
  • Common mistake: pakai komisi terlalu rendah biar hasil tetap cantik. Itu nipu diri sendiri. Lebih baik konservatif (0.2%) — kalau strategi tetap cuan dengan biaya tinggi, itu sinyal bagus.
  • Strategi yang cuma cuan saat komisi=0 adalah strategi MATI. Jangan dilanjutkan.

7. Risk Management: Bracket, Trailing, dan strategy.risk.*

Risk management bukan tambahan — itu inti

Strategi tanpa manajemen risiko itu kayak naik motor di tol tanpa rem. Cepat sampai sampai... nggak sampai. TradingView kasih dua lapis alat: bracket order (strategy.exit) dan aturan tingkat-akun (strategy.risk.*).

Lapis 1: Bracket order via strategy.exit

Ini stop loss dan take profit otomatis per posisi. Tiga gaya:

Stop & limit (harga absolut)

strategy.exit("Exit", from_entry="Long",
     stop  = strategy.position_avg_price * 0.98,   // SL 2% di bawah entry
     limit = strategy.position_avg_price * 1.04)   // TP 4% di atas entry

Rasio risk:reward di sini 2:4 = 1:2. Tiap Rp 1 yang lo risiko, lo incar Rp 2. Ini fondasi risk:reward yang sehat.

Pakai points/ticks

strategy.exit("Exit", from_entry="Long",
     profit = 100,   // TP 100 tick di atas entry
     loss   = 50)    // SL 50 tick di bawah entry

profit/loss dihitung dalam tick, bukan harga absolut. Hati-hati: ini kurang intuitif buat saham IDX dengan tick bervariasi. Gue lebih saranin pakai stop/limit harga absolut.

Trailing stop (kunci profit yang ngikutin harga)

strategy.exit("Trail", from_entry="Long",
     trail_points = 50,    // aktifkan trailing setelah profit 50 tick
     trail_offset = 30)    // stop ngikut 30 tick di belakang harga tertinggi

Trailing stop naik mengikuti harga saat profit, tapi nggak pernah turun. Pas harga balik arah dan kena trail, posisi ditutup — ngunci sebagian besar profit. Cocok buat strategi trend-following.

Lapis 2: Aturan tingkat-akun via strategy.risk.*

Ini rem darurat di level keseluruhan akun, bukan per trade. Ditaruh di mana aja di body script (biasanya di atas), nggak dalam if.

// Robot BERHENTI trading kalau drawdown akun nyentuh 20%
strategy.risk.max_drawdown(20, strategy.percent_of_equity)

// Berhenti trading hari itu kalau rugi harian nyentuh nominal tertentu
strategy.risk.max_intraday_loss(5, strategy.percent_of_equity)

// Batasi ukuran posisi maksimum (dalam saham/kontrak)
strategy.risk.max_position_size(10000)
  • max_drawdown — kalau total drawdown nyentuh batas, robot berhenti buka posisi baru. Penyelamat dari spiral kematian.
  • max_intraday_loss — batas rugi dalam satu hari. Klasik aturan day-trader: "rugi X% hari ini, stop, besok lagi."
  • max_position_size — plafon position size, mencegah satu posisi jadi kebesaran.

Position sizing: jantung dari risk management

Position sizing (Bagian 2) dan stop loss bekerja sama menentukan risiko per trade. Aturan fixed-fractional klasik: risiko maksimal 1-2% equity per trade.

Contoh logika: kalau lo mau risiko 1% equity dan stop lo 2% dari harga masuk, maka:

ukuran posisi=risiko % equityjarak stop %=1%2%=50% equity\text{ukuran posisi} = \frac{\text{risiko \% equity}}{\text{jarak stop \%}} = \frac{1\%}{2\%} = 50\%\ \text{equity}

Untuk modul ini kita pakai percent_of_equity sederhana, tapi sadari prinsipnya: stop yang lebih lebar harus dibarengi posisi lebih kecil, biar rugi rupiah-nya tetap sama.

Alat bantu visual: Long/Short Position tool

Di luar Pine, TradingView punya Long Position tool (sidebar kiri). Tarik dari entry ke stop ke target, dan dia otomatis ngitung risk:reward ratio, risiko %, dan ukuran posisi sesuai modal lo. Pakai ini buat verifikasi cepat apakah setup R:R strategi lo masuk akal sebelum dikodekan.

Latihan

  1. Tambahkan strategy.exit dengan stop 2% dan target 4% (pakai position_avg_price). Verifikasi di List of Trades bahwa trade keluar di sekitar level itu.
  2. Ganti dari fixed stop/target ke trailing stop (trail_points & trail_offset). Bandingkan max drawdown dan net profit. Mana yang lebih cocok buat tren naik panjang?
  3. Tambahkan strategy.risk.max_drawdown(25, strategy.percent_of_equity). Cari di chart titik di mana robot berhenti trading karena aturan ini (kalau ada).
  4. Pakai Long Position tool di chart BBCA: tarik setup dengan stop 2% & target 4%. Verifikasi R:R yang ditampilkan = 1:2.

Pro Tips

  • Pro tip: panggil strategy.exit di SETIAP bar (luar if), bukan cuma di bar entry. Bracket harus terus aktif selama posisi terbuka.
  • Common mistake: pasang stop terlalu ketat (misal 0.5%) di saham volatil kayak saham IDX. Lo bakal kena stop terus karena noise harian, padahal arah lo bener. Sesuaikan stop dengan volatilitas saham (ATR bisa bantu).
  • strategy.risk.max_drawdown itu jaring pengaman terakhir, bukan strategi. Kalau lo butuh max_drawdown 20% buat 'nyelametin' strategi, mungkin strateginya emang jelek. Perbaiki logikanya, jangan andalkan rem darurat.
  • Risk:reward 1:2 (stop 2%, target 4%) artinya lo bisa profit walau win rate cuma 40%. Hitung sendiri: E=(W×Rwin)(L×Rloss)=(0,40×4%)(0,60×2%)>0E = (W \times R_{win}) - (L \times R_{loss}) = (0{,}40 \times 4\%) - (0{,}60 \times 2\%) > 0.

8. Overfitting & Walk-Forward: Jangan Tertipu Masa Lalu

Overfitting: musuh terbesar backtest

Overfitting (atau curve-fitting) terjadi saat lo terus-terusan ngutak-atik parameter strategi sampai dia sempurna di data masa lalu — tapi sempurna ini cuma karena lo udah "ngafalin jawaban", bukan karena strateginya benar-benar bagus. Begitu ketemu data baru (masa depan), strategi hafalan ini ambruk.

Analogi: bayangkan murid yang ngafalin kunci jawaban ujian tahun lalu. Nilai try-out-nya 100. Tapi pas ujian beneran soalnya beda, dia hancur. Strategi overfitted = murid penghafal kunci jawaban.

Tanda-tanda overfitting:

  • Lo punya 8 parameter dan tiap satu di-tuning pas banget.
  • Equity curve mulus mencurigakan (terlalu indah).
  • Ganti satu parameter dikit aja, hasil langsung jeblok (rapuh).
  • Sample trade sedikit (<100) tapi hasil spektakuler.

Pertahanan 1: Walk-forward (in-sample vs out-of-sample)

Pine Script NGGAK punya optimizer otomatis dan NGGAK punya walk-forward built-in. Jadi pro melakukannya manual. Konsepnya:

  1. In-sample (IS) — periode buat ngembangin & tuning strategi. Misal BBCA 2018–2022.
  2. Out-of-sample (OOS) — periode yang LO SAMA SEKALI NGGAK SENTUH saat tuning. Misal BBCA 2023–2025.
WALK-FORWARD: IN-SAMPLE vs OUT-OF-SAMPLEIn-Sample (IS)2018–2022 — tuning di sini sepuasnyaOut-of-Sample2023–2025 — ujian SEKALI pakai20182023waktu →OOS mirip IS → ada edge. OOS jeblok → cuma overfitting.
Walk-forward: tuning di in-sample, validasi sekali di out-of-sample

Lo tuning sampai puas di IS. Lalu — tanpa ngubah apa-apa lagi — lo jalankan di OOS. Kalau performa OOS mirip IS, strategi lo kemungkinan beneran punya edge. Kalau OOS jeblok, lo cuma overfitting ke masa lalu.

Cara teknis bagi periode di TradingView:

// Input tanggal buat batasi periode trading
mulai  = input.time(timestamp("2018-01-01"), "Mulai")
selesai = input.time(timestamp("2022-12-31"), "Selesai")
dalamPeriode = time >= mulai and time <= selesai

if masuk and dalamPeriode
    strategy.entry("Long", strategy.long)

Ganti tanggalnya buat switch antara periode IS dan OOS tanpa ngedit logika. Cara lain yang lebih simpel: pakai date range di chart, atau geser tanggal lewat Strategy Tester properties.

Pertahanan 2: Sample size minimal ~100 trade

Di bawah 100 trade, statistik lo nggak bisa dipercaya. Profit factor 2.5 dari 12 trade itu bisa jadi keberuntungan murni. Profit factor 1.6 dari 300 trade jauh lebih meyakinkan. Kalau strategi lo terlalu sedikit menghasilkan trade:

  • Pakai timeframe lebih kecil, ATAU
  • Backtest di banyak saham (BBCA, BBRI, TLKM, ASII) buat nambah sample, ATAU
  • Perpanjang periode.

Pertahanan 3: Kesadaran repainting

Repainting = strategi menampilkan sinyal di masa lalu yang sebenarnya NGGAK ADA secara real-time, karena dia diam-diam pakai data masa depan. Backtest jadi mustahil indah, live-nya hancur. Penyebab umum:

  • request.security() ke timeframe lebih tinggi tanpa hati-hati (lookahead bias). Selalu pakai default barmerge.lookahead_off dan referensi bar terkonfirmasi ([1]).
  • calc_on_every_tick=true dengan sinyal intra-bar yang berubah-ubah.
  • Pakai nilai bar yang belum tutup buat ambil keputusan.

Untuk strategi EMA-crossover sederhana di satu timeframe (yang kita pakai di exercise), repainting bukan masalah selama lo pakai default. Tapi sadari konsep ini buat strategi lebih kompleks nanti.

Disiplin walk-forward yang jujur

Godaan terbesar: lo jalankan OOS, hasilnya jelek, terus lo balik tuning lagi sampai OOS-nya bagus. STOP. Begitu lo tuning ke data OOS, dia bukan out-of-sample lagi — lo udah mencemarinya. OOS cuma boleh dipakai SEKALI sebagai ujian akhir. Kalau gagal, kembali ke papan gambar dengan ide BARU, bukan tuning ulang ke data yang sama.

Latihan

  1. Bagi data BBCA jadi IS (2018-2022) dan OOS (2023-2025) pakai input.time. Tuning EMA period di IS, lalu jalankan SEKALI di OOS. Bandingkan profit factor & max drawdown kedua periode.
  2. Jalankan strategi lo (parameter sama) di BBCA, BBRI, TLKM, dan ASII. Apakah cuan di semua? Apa kesimpulan lo soal keandalannya?
  3. Hitung: kalau strategi lo cuma menghasilkan 30 trade dalam 5 tahun, apakah hasilnya bisa dipercaya secara statistik? Apa yang bisa lo lakukan untuk menambah sample?

Pro Tips

  • Pro tip: makin sedikit parameter, makin tahan strategi terhadap overfitting. Strategi 2 parameter (EMA cepat & lambat) jauh lebih kokoh daripada 8 parameter. Kesederhanaan = keandalan.
  • Common mistake: tuning di OOS setelah gagal. Itu menghancurkan seluruh tujuan walk-forward. OOS = ujian sekali pakai.
  • Pro tip: validasi silang saham. Strategi yang cuan di BBCA tapi rugi di BBRI, TLKM, ASII mungkin cuma kebetulan cocok sama BBCA. Edge sejati biasanya jalan di banyak saham sejenis.
  • Backtest itu sains, bukan seni jualan. Tujuannya membuktikan strategi lo SALAH. Kalau lo gagal membuktikannya salah setelah usaha keras, baru lo boleh agak percaya.

9. EXERCISE BESAR: EMA-Crossover Strategy di BBCA dengan Validasi OOS

Tujuan akhir modul

Sekarang lo gabungkan SEMUA yang udah dipelajari. Lo bakal ubah indikator EMA-crossover Modul 7 jadi strategi lengkap: stop 2%, target 4%, komisi & slippage IDX realistis, backtest di BBCA Daily, lalu validasi di periode out-of-sample. Di akhir lo laporkan profit factor dan max drawdown kedua periode.

Kode lengkap

//@version=5
strategy("BBCA EMA Cross Strategy",
     overlay              = true,
     initial_capital      = 100000000,                 // Rp 100 juta
     default_qty_type     = strategy.percent_of_equity,
     default_qty_value    = 10,                          // 10% equity per entry
     pyramiding           = 0,
     commission_type      = strategy.commission.percent,
     commission_value     = 0.15,                        // 0.15% per order (IDX)
     slippage             = 2,                           // 2 tick (BBCA tick Rp10 = Rp20)
     process_orders_on_close = false,
     calc_on_every_tick   = false)

// === INPUT PARAMETER ===
panjangCepat = input.int(12, "EMA Cepat", minval=1)
panjangLambat = input.int(26, "EMA Lambat", minval=1)
stopPct   = input.float(2.0, "Stop Loss %", step=0.5) / 100
targetPct = input.float(4.0, "Take Profit %", step=0.5) / 100

// === FILTER PERIODE (untuk walk-forward IS vs OOS) ===
mulai   = input.time(timestamp("2018-01-01"), "Mulai Periode")
selesai = input.time(timestamp("2022-12-31"), "Selesai Periode")
dalamPeriode = time >= mulai and time <= selesai

// === LOGIKA INDIKATOR (dari Modul 7) ===
emaCepat  = ta.ema(close, panjangCepat)
emaLambat = ta.ema(close, panjangLambat)

masuk  = ta.crossover(emaCepat, emaLambat)
keluar = ta.crossunder(emaCepat, emaLambat)

// === PLOT (visual, sama kayak indikator) ===
plot(emaCepat, "EMA Cepat", color.orange, 2)
plot(emaLambat, "EMA Lambat", color.blue, 2)

// === LOGIKA STRATEGI ===
// Masuk: crossover & dalam periode & belum punya posisi
if masuk and dalamPeriode and strategy.position_size == 0
    strategy.entry("Long", strategy.long)

// Bracket: stop 2% & target 4% (dipanggil tiap bar!)
strategy.exit("Bracket", from_entry="Long",
     stop  = strategy.position_avg_price * (1 - stopPct),
     limit = strategy.position_avg_price * (1 + targetPct))

// Keluar normal: crossunder
if keluar
    strategy.close("Long")

// === DASHBOARD ===
var table dash = table.new(position.top_right, 2, 4)
if barstate.islast
    table.cell(dash, 0, 0, "Net Profit", text_color=color.white)
    table.cell(dash, 1, 0, str.tostring(strategy.netprofit, "#,###"), text_color=color.white)
    table.cell(dash, 0, 1, "Profit Factor", text_color=color.white)
    table.cell(dash, 1, 1, str.tostring(strategy.grossprofit / math.max(strategy.grossloss, 1), "#.##"), text_color=color.white)
    table.cell(dash, 0, 2, "Trades", text_color=color.white)
    table.cell(dash, 1, 2, str.tostring(strategy.closedtrades), text_color=color.white)
    table.cell(dash, 0, 3, "Posisi", text_color=color.white)
    table.cell(dash, 1, 3, str.tostring(strategy.position_size), text_color=color.white)

Penjelasan bagian kunci

  • Deklarasi — semua setting produksi yang udah kita bahas: modal realistis, percent_of_equity, pyramiding 0, komisi & slippage IDX.
  • stopPct / targetPct — dibagi 100 supaya input "2.0" jadi 0.02. Dipakai di strategy.exit.
  • Filter periodedalamPeriode ngebatesin entry cuma di rentang tanggal. Ini kunci walk-forward: ganti tanggal buat switch IS/OOS.
  • strategy.position_size == 0 di kondisi masuk — cegah double-entry, pastikan cuma satu posisi terbuka.
  • strategy.exit di luar if — bracket aktif terus selama posisi hidup.
  • Dashboard — pakai state variables buat nampilin metrik live di pojok chart.

Langkah-langkah eksekusi

  1. Buka chart BBCA (ketik BBCA di symbol search), set timeframe ke Daily (D). PASTIKAN chart type = Candlestick standar, BUKAN Heikin Ashi/Renko (backtest di chart non-standar kasih hasil palsu!).
  2. Buka Pine Editor (tab di panel bawah), paste kode di atas, klik Save lalu Add to Chart.
  3. Buka tab Strategy Tester. Pastikan filter periode di-set ke IS: 2018-01-01 s/d 2022-12-31 (lewat Settings/gear strategi).
  4. Catat dari Performance Summary: net profit, profit factor, max drawdown, % profitable, total closed trades.
  5. Cek di Overview: apakah equity curve naik? Kalahin buy & hold?
  6. VALIDASI OOS: buka Settings strategi, ubah Mulai jadi 2023-01-01 dan Selesai jadi 2025-12-31. JANGAN ubah parameter EMA atau stop/target. Jalankan.
  7. Catat lagi profit factor & max drawdown untuk OOS.
  8. Bandingkan. Kalau OOS mirip IS = strategi punya edge. Kalau OOS jeblok = overfitting.

Format laporan akhir

Buat tabel kecil:

MetrikIn-Sample (2018-2022)Out-of-Sample (2023-2025)
Net Profit......
Profit Factor......
Max Drawdown......
% Profitable......
Total Trades......

Lalu tulis kesimpulan 3-4 kalimat: Apakah strategi lulus validasi OOS? Apakah jumlah trade cukup (>100 gabungan)? Apakah ngalahin buy-and-hold? Worth dilanjutkan ke paper trading atau nggak?

Catatan kejujuran

Jangan kaget kalau hasilnya nggak spektakuler. EMA-crossover sederhana itu strategi klasik yang sering kalah sama buy-and-hold di saham bluechip uptrend kayak BBCA. ITU NORMAL DAN BAGUS — lo baru aja belajar membuktikan sebuah strategi lewat metode yang jujur. Itu jauh lebih berharga daripada percaya buta sama backtest indah yang nggak teruji.

Latihan

  1. Jalankan kode lengkap di BBCA Daily untuk periode IS (2018-2022). Isi baris IS di tabel laporan: net profit, profit factor, max drawdown, % profitable, total trades.
  2. Tanpa mengubah parameter apapun, ganti periode ke OOS (2023-2025) dan isi baris OOS di tabel laporan.
  3. Tulis kesimpulan: apakah strategi lulus validasi out-of-sample? Bandingkan profit factor IS vs OOS. Apakah strategi ini ngalahin buy & hold BBCA?
  4. Tantangan: eksperimen ganti stop ke 3% dan target ke 6% (tetap rasio 1:2). Apakah profit factor & jumlah trade membaik? Validasi lagi di OOS sebelum menyimpulkan.
  5. Varian crypto: ganti simbol ke BINANCE:BTCUSDT (atau ETHUSDT), set commission_value = 0.075 dan sesuaikan slippage, lalu jalankan kode lengkap yang sama. Catat baris IS/OOS di tabel laporan kedua. Bandingkan karakter sinyalnya dengan BBCA: pasar 24/7 bikin lebih banyak trade dan nggak ada gap weekend — apakah edge-nya bertahan di OOS?

Pro Tips

  • Pro tip: sebelum klik Add to Chart, double-check chart type-nya Candlestick standar. Ini kesalahan #1 yang bikin hasil backtest jadi fantasi.
  • Common mistake: pas validasi OOS, diam-diam ngubah parameter biar OOS keliatan bagus. JANGAN. Itu mencemari ujian dan lo cuma nipu diri sendiri.
  • Pro tip: kalau total trade IS+OOS gabungan masih di bawah 100, jalankan juga di BBRI/TLKM/ASII pakai parameter sama buat nambah keyakinan statistik.
  • Kalau strategi lulus OOS dengan profit factor >1.3 dan drawdown wajar, langkah berikutnya BUKAN langsung pakai duit beneran — tapi Paper Trading dulu (Modul lain) buat uji di kondisi live.

Kuis

Apa fungsi parameter default_qty_type=strategy.percent_of_equity di deklarasi strategy()?
  • A. Membuat tiap order pakai jumlah saham tetap
  • B. Membuat tiap order pakai persentase dari equity yang berjalan, sehingga position size tumbuh/menyusut seiring akun (compounding)
  • C. Menetapkan komisi sebagai persentase
  • D. Membatasi maksimum drawdown akun
Answer

Membuat tiap order pakai persentase dari equity yang berjalan, sehingga position size tumbuh/menyusut seiring akun (compounding)

percent_of_equity adalah cara position sizing paling realistis: tiap entry pakai persen dari equity berjalan (dipasangkan dengan default_qty_value). Saat akun tumbuh posisi membesar, saat rugi mengecil — efek compounding yang dipakai pro.

Secara default (process_orders_on_close=false, calc_on_every_tick=false), kapan order strategi dieksekusi setelah sinyal muncul?
  • A. Di harga close bar tempat sinyal muncul
  • B. Di tengah bar sinyal saat harga sentuh sinyal
  • C. Di harga open bar BERIKUTNYA setelah bar sinyal tutup
  • D. Langsung saat tick masuk secara real-time
Answer

Di harga open bar BERIKUTNYA setelah bar sinyal tutup

Sinyal terkonfirmasi di penutupan bar, jadi kesempatan tercepat masuk adalah pembukaan bar berikutnya. Ini realistis karena lo nggak bisa beli di harga close yang sudah lewat, dan menjelaskan kenapa entry bisa kena gap.

Kenapa membiarkan komisi=0 dan slippage=0 di backtest itu berbahaya?
  • A. Karena membuat backtest jalan lebih lambat
  • B. Karena bisa menggelembungkan hasil 20-50% — terutama strategi yang sering trading — sehingga strategi rugi bisa terlihat cuan
  • C. Karena TradingView akan menolak menjalankan strategi
  • D. Karena equity curve jadi tidak muncul
Answer

Karena bisa menggelembungkan hasil 20-50% — terutama strategi yang sering trading — sehingga strategi rugi bisa terlihat cuan

Default nol mengasumsikan trading gratis dan eksekusi sempurna — dua hal yang bohong. Tiap trade kena fee + slippage di dunia nyata. Untuk strategi high-frequency, biaya ini bisa memakan separuh profit atau mengubah strategi cuan-palsu jadi rugi nyata.

Apa prinsip kunci walk-forward (in-sample vs out-of-sample) untuk melawan overfitting?
  • A. Tuning parameter berkali-kali di seluruh data sampai hasil sempurna
  • B. Mengembangkan & tuning di periode in-sample, lalu menguji SEKALI di periode out-of-sample yang tidak pernah disentuh saat tuning
  • C. Selalu backtest di chart Heikin Ashi untuk hasil lebih halus
  • D. Memakai sebanyak mungkin parameter agar strategi fleksibel
Answer

Mengembangkan & tuning di periode in-sample, lalu menguji SEKALI di periode out-of-sample yang tidak pernah disentuh saat tuning

OOS adalah ujian sekali pakai pada data 'baru'. Kalau performa OOS mirip IS, strategi kemungkinan punya edge sejati. Begitu lo tuning ke data OOS, dia tercemar dan bukan out-of-sample lagi — itu menghancurkan seluruh tujuan validasi.

Kenapa metrik profit factor lebih informatif daripada hanya melihat % profitable (win rate)?
  • A. Karena profit factor selalu lebih besar dari win rate
  • B. Karena profit factor (gross profit ÷ gross loss) menangkap ukuran menang vs kalah — strategi win rate 40% dengan avg win 3x avg loss bisa jauh lebih cuan daripada win rate 70% dengan win=loss
  • C. Karena win rate tidak pernah relevan dalam trading
  • D. Karena profit factor mengukur kecepatan eksekusi order
Answer

Karena profit factor (gross profit ÷ gross loss) menangkap ukuran menang vs kalah — strategi win rate 40% dengan avg win 3x avg loss bisa jauh lebih cuan daripada win rate 70% dengan win=loss

Win rate sendiri menyesatkan karena mengabaikan besarnya menang vs kalah. Profit factor >1 berarti cuan, >1.5 bagus. Selalu baca win rate bersama avg win/avg loss dan profit factor, jangan satu metrik saja.

Untuk strategy.exit dengan bracket stop/target, di mana fungsi ini harus dipanggil dalam kode?
  • A. Hanya di dalam blok if saat entry, sekali saja
  • B. Di setiap bar (di luar if), agar bracket terus aktif selama posisi terbuka
  • C. Di paling atas script sebelum deklarasi strategy()
  • D. Hanya di bar terakhir saat barstate.islast
Answer

Di setiap bar (di luar if), agar bracket terus aktif selama posisi terbuka

strategy.exit harus dipanggil tiap bar supaya TradingView terus mengelola bracket (stop & target) selama posisi hidup. Kalau ditaruh di dalam if masuk, bracket hanya terpasang di bar entry dan tidak akan dikelola di bar-bar berikutnya.