Catatan aturan · VPS paper-trade

Aturan Alert Saham IDX

Tiga laporan Telegram harian plus screening fundamental kuartalan yang memasok universe-nya. Halaman ini merekam kriteria persisnya, ambangnya, dan — yang paling gampang terlupa — alasan di balik pilihan yang sengaja diambil.

kuartalanScreening fundamental
—Bandarmologi harian (dimatikan 21 Sep 2026)
Selasa 07:30🏦 Bandar sedang mengumpulkan
Sen–Jum 08:10RSI Buy — di luar portfolio
—RSI Sell (dimatikan 30 Sep 2026)
Sen 07:15💪 Kuat saat pasar lemah
Rabu 08:20📉 Dasar 52 minggu
tiap jam :20 (07–23)📝 Tautan alasan transaksi
tgl 28 07:10📑 Kesegaran laporan keuangan
tgl 28 07:20📊 Pembanding sumber screening
Kamis 08:00📉 Di atas wajar tapi rugi
Sen–Jum 08:00🎯 Rencana — portfolio saja
Sen–Jum 13:00Trailing profit — disaring
tiap hari 08:35·12:35·17:35·21:35Kumpul berita RSS
Sen–Jum 12:30RSI Buy & Sell · grup teman
—Dekat 52w low (dimatikan 27 Sep 2026)
Sab 09:30Saham baru terbit (senyap, isi arsip)
Sen 07:30 · 07:50Repair (hitung saja, tanpa kirim)
Sab 10:00Konsolidasi+volume (senyap, isi arsip)
Sab 10:30Aksi korporasi (senyap, isi arsip)
Sab 11:00Orang dalam membeli (senyap, isi arsip)
Sab 12:00Laporan keuangan (senyap, isi arsip)
—Laporan emas mingguan (dimatikan 12 Okt 2026)
tiap hari 10:00Emas: terendah 30 hari
🪜Tangga avg down 1:1,5:2,5:5
—🛟 Program penyelamatan (dimatikan 12 Okt 2026)
tiap tgl 28Screening fundamental (bulanan)
bot@screener_saham1_bot
rev16 Oktober 2026

→ Mau gambaran besarnya saja? Lihat Ringkasan Strategi Saham — satu halaman, tanpa riwayat perubahan.

→ Daftar saham yang lolos screening: Watchlist Screening Fundamental — bisa dicari dan diurutkan, ditulis ulang otomatis tiap screening bulanan.

Screening fundamental

15 Apr · 28 Mei · Ags · Nov, 06:00

Sebab gugur dicatat per emiten (7 Okt 2026)

Dulu screen_stock() mengembalikan “tidak lolos” untuk dua keadaan yang artinya jauh berbeda, dan dari luar keduanya identik:

Akibatnya nyata. CITA gugur pada screening 1 Okt 2026 lalu lolos semua kriteria sehari kemudian, dan tidak ada yang bisa menjelaskan kenapa — log screening mencatat Error: 0 dan CITA memang ada di universe 533 yang diproses, jadi ia bukan korban galat dan bukan tidak diperiksa. Alasannya sekadar hilang. Sebelum ini keterangan yang sempat ditulis di halaman ini (“kemungkinan datanya gagal dibaca”) adalah dugaan, bukan temuan.

Sekarang tiap penolakan menyimpan sebab dan golongannya ke data/screening_sebab.json. Ringkasan screening ikut menyebut “gugur karena kriteria” dan “gugur karena DATA (perlu diuji ulang)” secara terpisah.

Uji ulang harian 06:30

cek_sebab_data.py mengambil yang bergolongan data saja (maksimal 40 nama sehari, menjaga kuota yfinance) dan mengujinya ulang dengan fungsi dan ambang yang sama persis dengan screening bulanan — tidak ada kriteria yang dilonggarkan di sini.

Dua hari berturut-turut lulus baru dimasukkan ke watchlist, lalu diberitahukan lewat Telegram. Kelulusan sehari bisa datang dari data yang kebetulan lengkap sesaat; yang dicari emiten yang memang layak tapi luput, bukan kedipan ke arah sebaliknya. Yang pernah lulus lalu gagal lagi hitungannya dikembalikan ke nol — itu justru bukti datanya goyah.

Jam 06:30 dipilih supaya hasilnya sudah siap sebelum Rencana 08:00, jadi nama yang masuk pagi itu langsung ikut dipertimbangkan hari itu juga. Yang bergolongan kriteria tidak pernah diuji ulang — ROE 4% hari ini tidak akan berubah besok, dan itu memang urusan screening bulan depan.

Celah yang ditutup: sejak 7 Okt universe RSI Buy hanya watchlist, jadi emiten yang luput dari screening tidak lagi muncul dengan vonis — ia hilang sepenuhnya selama sebulan. Uji ulang harian ini yang membuat kehilangan itu tidak permanen.

Jalan sekali per kuartal setelah musim laporan keuangan, menyaring seluruh emiten IDX jadi watchlist.json. Hasilnya dipakai bandarmologi sebagai universe, dan sejak 31 Ags juga sebagai penjaga tanda CICIL.

SaringanAmbangKalau tidak memenuhi
Laba bersih positif4 tahun beruntungugur
Dividen dibagikan3 tahun beruntungugur
Rata-rata dividend yield≥ 1%gugur
ROE> 5%gugur
PBV< 3gugur
Arus kas bebas (FCF)> 0gugur
DER — umum≤ 2,5gugur
DER — energi & basic materials≤ 3,0gugur
DER — sektor keuangantidak diuji—
Payout ratio< 70%ditandai

gugur berarti sahamnya tidak masuk watchlist sama sekali — bukan berarti harus dijual kalau kebetulan kamu pegang. ditandai berarti tetap masuk, hanya diberi catatan.

Cara nilai wajarnya dihitung di sini

Tiap sektor punya daftar metodenya sendiri, hasilnya dirata-rata, lalu dipotong margin of safety 20–35% sesuai risiko sektor. Target analis tidak dipakai di sini.

Sejak 31 Ags 2026 angka ini tidak lagi dipakai untuk seleksi harian — bandarmologi memakai nilai wajar harian yang sama dengan RSI Alert. Yang masih dipakai dari screening: daftar sahamnya (universe bandarmologi) dan penjaga tanda CICIL.

SektorMetodePER wajarPBV wajarMargin
basic materialsPER81,535%
energyPER81,235%
propertyPBV · PER70,625%
industrialsPER · Graham101,225%
telecom · infrastructurePER · Graham122,025%
consumerPER · Graham153,020%
healthcare · technologyPER · Graham182,5–4,020%
financialsPBV · ROE-PBV101,520%

Keputusan yang sengaja diambil

  • RSI tidak dipakai sebagai saringan. RSI tinggi sementara harga masih jauh di bawah nilai wajar tetap boleh dibeli — itu keputusan manual, bukan otomatis.
  • Payout ratio hanya ditandai, tidak menggugurkan saham. Payout tinggi bisa berarti manajemen murah hati, bukan otomatis bahaya.
  • Data hilang meloloskan, bukan menggugurkan. DER tidak tersedia dianggap lolos — menggugurkan saham karena data bolong lebih merugikan daripada meloloskannya untuk diperiksa manual.
  • Emiten berlaporan mata uang asing (ITMG, ADRO, dsb) dikonversi dulu ke rupiah sebelum PBV dihitung. Tanpa itu PBV-nya ngawur — PTSN pernah terbaca 12.416×.

Laporan pendatang baru

Tiap screening selesai, watchlist baru dibandingkan dengan yang lama dan hasilnya dikirim terpisah: saham yang baru memenuhi syarat (diurut dari upside terbesar, lengkap dengan ROE, nilai wajar, dan dividend yield) serta yang gugur.

Tanpa perbandingan ini pendatang baru tidak meninggalkan jejak — watchlist ditimpa tiap kuartal, jadi kandidat segar yang belum pernah dipertimbangkan akan lewat begitu saja. Sebagai gambaran, antara dua watchlist di Agustus terdapat 36 saham masuk dan 35 gugur.

Gugur bukan perintah jual. Kalau sahamnya sedang dipegang, yang berhenti adalah tanda CICIL; keputusan melepas tetap manual.

Jadwal Februari digeser ke 15 April (19 Sep 2026)

28 Februari jatuh sebelum batas rilis laporan tahunan (akhir Maret), sehingga screening itu masih memakai data Q3 tahun sebelumnya. Sekarang jalan 15 April, memakai laporan tahunan yang sudah diaudit. Tiga jadwal lain tetap: 28 Mei (sesudah batas Q1 akhir April), 28 Agustus (sesudah laporan semester), 28 November (sesudah batas Q3 akhir Oktober).

Laporan keuangan tetap dicek jauh lebih sering dari ini: alert “laporan keuangan baru” tiap Sabtu, dan baris Lapkeu di RSI Buy/Rencana/dekat titik terendah membaca laporan terbaru setiap kali jalan. Yang kuartalan hanya penyusunan ulang daftar watchlist. Pengecekan bulanan tidak menambah apa-apa: emiten IDX wajib melapor per kuartal, dan laporan bulanan (praktis hanya bank, ke OJK) tidak ada di TradingView maupun yfinance.

Ambang dividen diturunkan 3% → 1% (22 Ags 2026)

Universe melebar dari 126 ke 175 saham, 38 di antaranya beryield di bawah 3%. Perbarui berikutnya 28 November 2026 — sampai saat itu komposisinya tidak berubah, walaupun laporan keuangan baru sudah keluar.

Kapan status valuasi & nilai wajar berubah

dihitung ulang tiap jalan

Pertanyaan Djoko 29 Sep 2026: “mulai kapan harga suatu saham statusnya bisa berubah dari undervalue jadi overvalue atau sebaliknya? Apakah setiap keluar laporan per kuartal?”

Nilai wajar dihitung ulang setiap kali laporan jalan — tiap hari kerja 08:00 dan 08:10 — bukan per kuartal. Laporan kuartalan memang mengubahnya, tapi ia cuma salah satu bahan.

BahanDari manaBerubah kapan
HargaTradingView, harianbukan bahan nilai wajar — ia cuma pembanding. Tapi label under/overvalue ikut bergerak tiap hari karenanya
Target analisprice_target_averagekapan saja analis merevisi. Hanya 106 dari 287 saham (37%) punya ini
EPS TTMearnings_per_share_diluted_ttmmelangkah tiap laporan kuartalan masuk data
BVPSbook_value_per_share_fqtiap kuartal juga
Pengali sektorconfig.json → fair_value_paramstetap (energi PER 8x, konsumer 15x, dst). Hanya berubah kalau kita sendiri yang mengubahnya

Jadi untuk 181 saham yang tidak punya target analis (63%), nilai wajarnya praktis cuma bergerak saat laporan kuartalan masuk. Sisanya bisa bergerak kapan saja mengikuti revisi analis.

Seberapa besar gerakan yang dibutuhkan untuk berpindah status

Ambangnya ±15% (BATAS_LABEL): undervalue kalau harga ≥15% di bawah nilai wajar, overvalue kalau ≥15% di atas.

  • Kalau nilai wajarnya diam, harga harus naik 35% untuk berpindah dari undervalue ke overvalue
  • Kalau harganya diam, nilai wajar harus turun 26% untuk efek yang sama

Dampak lapkeu tergantung sektor. EPS TTM cuma mengganti satu kuartal dari empat, jadi laba kuartal yang anjlok 50% menurunkannya sekitar 12%. Sektor yang memakai beberapa metode teredam karena nilai wajarnya diambil median antar metode. Tapi energi dan basic materials cuma memakai satu metode (PER) — di situ nilai wajar praktis mengikuti EPS TTM, jadi ITMG/ADRO/ELSA bisa berpindah status tajam begitu lapkeu masuk.

Sering salah dibaca: tulisan median energy: target 1.153 · PER 895 itu median antar-metode untuk saham itu, bukan median saham se-sektor.

Penanda ⚡ perubahan status (29 Sep 2026)

Sebelum ini tidak ada yang bisa menjawab “sejak kapan”, karena hasil hitungan tiap pagi tidak pernah disimpan — angka kemarin hilang begitu saja. Sekarang lib/status_valuasi.py menyimpan label dan nilai wajar terakhir tiap saham (data/status_valuasi.json, 287 saham per 29 Sep 2026), lalu mencetak perubahannya di RSI Buy dan Rencana:

⚡ Status valuasi: ⚪fair → 🟢undervalue sejak 27 Sep
⚡ Nilai wajar direvisi Rp980 → Rp1.024 (+4,5%) sejak 29 Sep (hari ini)

Ditulis oleh Rencana (08:00) dan RSI Buy (08:10). Yang jalan lebih dulu mencatat perubahannya; yang kedua melihat label yang sama sehingga tidak mencatat apa-apa, dan keduanya mencetak baris yang sama dari simpanan.

Blok ⚡ PERUBAHAN STATUS VALUASI — supaya tidak telat jual

Kekhawatiran Djoko 29 Sep 2026: “kemarin kamu bilang saham ini masih undervalue sehingga tidak dijual, tapi mendadak hari ini ada perubahan EPS/BVPS atau target analis — kan bisa mendadak harus dijual. Apakah bisa langsung diinformasikan?” Jawabannya: paling lambat pagi berikutnya, dan itu disepakati cukup (“telat 1–2 hari saya masih tidak masalah, yang penting kamu notice dan segera info”).

Lubang yang ditutup: penanda ⚡ di dalam blok saham hanya terlihat kalau sahamnya muncul di salah satu blok aksi. Perubahan yang belum cukup memicu tangga jual tidak muncul di mana pun — padahal justru itu yang mengubah keputusan “belum dijual”. Karena itu Rencana sekarang membuka dengan blok tersendiri untuk saham yang kamu pegang yang label atau nilai wajarnya bergeser dalam 2 hari terakhir, lengkap dengan akibatnya:

⚡ PERUBAHAN STATUS VALUASI — saham yang kamu pegang (2)
• ELSA · ⚡ Nilai wajar direvisi Rp1.180 → Rp1.024 (−13,2%) sejak 28 Sep · sekarang diskon 33%
• MCOL · ⚡ Status valuasi: ⚪fair → 🔴overvalue sejak 29 Sep (hari ini) · sekarang premium 18% → masuk tangga jual hari ini

Ekornya menyebut keadaan sekarang dan konsekuensinya: masuk tangga jual hari ini, atau sinyal jual masih ditahan (belum cukup mahal). Maksimal 12 baris, sisanya dihitung.

Blok ini dibuang dari pesan Rencana (21 Okt 2026). Djoko, setelah blok itu berisi 12 saham yang cuma bergeser dari 🟢undervalue ke ⚪fair: “yang ini juga kayaknya enggak perlu ditambahkan di alert rencana. toh tidak jadi action plan apa apa.” Yang hilang hanya blok ringkasannya. Tidak ada yang berubah pada: (1) penghitungan perubahan status dan penyimpanannya; (2) baris ⚡ Status valuasi: … di dalam rapor tiap saham yang memang muncul sebagai saran; (3) tangga jual, yang tetap berbunyi sendiri kalau sebuah saham benar-benar masuk zona jual. Konsekuensinya: saham yang statusnya bergeser tetapi belum memicu tangga jual tidak lagi disebut di mana pun, dan itulah tepatnya keputusan Djoko.

Sebabnya harga atau laporan keuangan (19 Okt 2026)

Djoko: “kamu harus info perbandingan dengan quarter sebelumnya apakah valuenya berubah jadi premium atau jadi diskon karena perubahan harga saham atau karena perubahan laporan keuangan, dan trend labanya gimana.”

Dasarnya aturan yang dia tetapkan hari itu: kalau jadi premium karena labanya turun, bukan karena harganya naik, posisinya ditahan — menunggu nilai wajarnya pulih. Supaya aturan itu bisa dipakai, laporannya harus memisahkan dua sebab yang selama ini tercampur.

Potret sebelum laporan kuartalan masuk (nilai wajar + harga) disimpan tepat saat periode lapkeu-nya berganti, karena sesudah itu nilai wajar lamanya hilang. Barisnya tampil 60 hari sesudah laporan masuk, di bawah saham yang bersangkutan — di RSI Buy maupun di rapor Rencana, jadi ikut terbaca di saran beli dan saran jual.

📑 Sejak laporan Q2 2026 masuk (19 Okt):
   nilai wajar Rp120 → Rp41 (−66%)
   harga Rp70 → Rp46 (−34%)
   → bergeser karena nilai wajarnya, bukan harganya
📈 Laba 6 kuartal (lama → baru): 12,3 M · 6,3 M · 11,4 M · 12,1 M · 7,1 M · 1,4 M
   pola: cenderung turun, kuartal terbaru paling rendah
   ⚠️ bukan satu kuartal jelek — arah labanya memang menurun

Satu sebab disebut dominan kalau geraknya dua kali atau lebih dari yang lain (dan setidaknya 5%); kalau tidak, ditulis “keduanya bergerak sebanding”. Pola labanya digolongkan dari enam kuartal terakhir: tangga turun, tangga naik, cenderung turun/naik (mayoritas langkah terakhir searah dan kuartal terbaru ada di ujung terjauh deretnya), atau bergerigi.

Arah deret laba — sumber kesalahan yang nyata

net_income_fq_h dari TradingView tersimpan kuartal terbaru di indeks 0. Dibaca dari arah yang salah, tangga turun terbaca sebagai tangga naik. 19 Okt 2026 kesalahan itu benar-benar terjadi: ASLC dan SMBR sempat disebut “tidak turun”, padahal ASLC 12,1 → 7,1 → 1,4 dan SMBR 25,6 → 17,3 → 3,9. Karena itu urutannya dibalik sekali, di satu tempat (tren_laba()), bukan di tiap pemanggil. Kesalahan itu juga alasan baris ini ada: deret seperti itu tidak bisa dibaca dengan mata, harus dihitung dan dicetak.

Lubang yang ketahuan hari itu: posisi tidak pernah disimpan

Hanya rsi_alert yang mengisi data/status_valuasi.json, dan universe RSI Buy sengaja membuang saham yang sudah dipegang — uji 19 Okt: “86 saham lolos mutu, 102 dibuang karena sudah dipegang”, sisa universe 12 saham. Jadi harga dan periode lapkeu untuk posisi yang dipegang tidak pernah disegarkan, justru di sisi jual yang membutuhkannya.

Sekarang rencana_harian (08:00) ikut menyimpan untuk semua posisi, lalu rsi_alert (08:10) menambah kandidat di luar portfolio. Sesudah diperbaiki: 182 saham tersimpan per jalan, 190–194 dari 294 entri punya harga & periode lapkeu.

Penanda “berubah hari ini” dari jalan pertama dibuang. Karena simpanannya lama tidak disegarkan, jalan pertama mencatat 44 label dan 32 nilai wajar “berubah” sekaligus — itu menyusul ketinggalan, bukan perubahan hari itu. Penandanya dihapus di 64 saham supaya laporan tidak mengaku tahu tanggal yang sebenarnya tidak diketahui. Sisa 11 penanda yang memang asli dibiarkan.

Mulai berguna dari laporan kuartalan BERIKUTNYA. Potret “sebelum laporan masuk” baru terbentuk saat periode lapkeu-nya berganti. Semua posisi sekarang berada di Q2 2026, jadi barisnya masih kosong sampai laporan Q3 2026 masuk (sekitar akhir Oktober–November). Yang sudah jalan sejak hari ini: penyimpanan harga, periode, dan riwayat labanya.

Batas kejujuran soal kecepatan

  • Sistemnya jalan dari cron VPS — 08:00 dan 08:10 tiap hari kerja. Tidak ada yang memantau intraday, jadi perubahan yang masuk siang ini ketahuan besok pagi.
  • Tertinggalnya bisa lebih panjang dari itu: EPS/BVPS baru berubah setelah TradingView memproses laporan emitennya, biasanya beberapa hari sesudah rilis resmi.
  • Yang dipantau hanya saham yang dipegang (dari avgdown_watch + Mirae). Watchlist yang belum dibeli tidak masuk blok ini — mereka sudah tercakup RSI Buy.

Beda RSI Buy Alert dan 🎯 Rencana hari ini

08:00 vs 08:10

Pertanyaan Djoko 29 Sep 2026: “sebenernya apa bedanya antara Rencana hari ini dan RSI Buy Alert ya? Soalnya harusnya titik belinya juga berdasarkan RSI Buy Alert kan?” Betul — titik masuknya memang sama, dan keduanya memakai RSI penutupan resmi yang sama persis (lib/rsi_resmi, aturan turun 2x / naik 1x sejak 18 Sep 2026). Bedanya bukan pada sinyalnya, tapi pada cakupan dan keluarannya.

🎯 Rencana hari ini (08:00)RSI Buy Alert (08:10)
Melihat apaSaham yang kamu PEGANG — 192 posisiSaham yang TIDAK kamu pegang — 96 saham lolos saringan mutu (30 Sep 2026)
Menjawab“saham apa saja yang sedang bersinyal?”“hari ini saya harus apa?”
Keluarannyadaftar pantau + konteks: valuasi, fundamental, dividen & yield band, bandar, posisi 52 mingguaksi bernama: AVG DOWN, AVG UP, BELI BARU, JUAL, layak dilepas
SyaratnyaRSI + valuasi + fundamentalitu semua plus turun ≥10% dari pembelian terakhir, kategori portfolio (Long/Trading/Spekulatif), daftar exit
Versi grup temanada (12:30, tanpa isi portfolio)tidak ada — pribadi

30 Sep 2026: dipisah tegas — tidak ada lagi saham di dua laporan

Djoko: “mending isi dari RSI Buy alert dan Rencana jangan ada yang sama, jadi RSI Buy bener-bener yang sahamnya tidak ada di portfolio saya (mungkin karena sudah saya sold out atau memang belum pernah saya beli sama sekali)”.

Pemicunya TKIM: barisnya di RSI Buy terbaca seperti ajakan avg down padahal Rencana tidak menyarankan apa pun, karena satu saham tampil di dua laporan dengan bahasa berbeda. Sekarang:

  • Rencana (08:00, lebih dulu) = hanya saham yang dipegang: AVG DOWN, AVG UP, JUAL, TANGGA JUAL, sinyal jual ditahan, pasangan cut loss, perubahan status valuasi.
  • RSI Buy (08:10) = hanya saham yang tidak dipegang. Universe menyusut 287 → 96 saham (105 dibuang karena sudah dipegang). Posisi di bawah 1 lot tetap dianggap “tidak dipegang” — WINS 71 lembar misalnya, karena itu bukan posisi yang bisa dijual di pasar reguler.
  • Urutan kiriman dibalik: Rencana dulu, RSI Buy sesudahnya. Keputusan atas uang yang sudah ada di pasar lebih dulu daripada tawaran baru.

Kandidat beli baru ikut pindah. Blok “🆕 KANDIDAT BELI BARU” di Rencana dibuang — kandidat itu saham yang belum dipegang, jadi tumpang tindihnya cuma berpindah tempat kalau dibiarkan (13 saham hari ini ada di dua-duanya). Dua keterangan yang dulu hanya ada di sana dibawa ke RSI Buy supaya tidak hilang: ➡️ Kalau dibeli: Stockbit Trading (dividen 0.9%/th) dan 🔁 Pernah dijual 2026-09-12 @Rp740 · sekarang −6,8% dari harga jual.

RSI Sell Alert dimatikan total, versi pribadi (08:40) maupun grup teman (12:35). Universe-nya toh praktis daftar portfolio — 218 ticker, 192 di antaranya posisi nyata — dan keputusan jual untuk saham yang dipegang sudah lengkap di Rencana. Grup teman kini hanya menerima RSI Buy 12:30. Skripnya dibiarkan ada, hanya jadwalnya dicabut.

Tidak ada titik buta baru. Posisi yang bersinyal beli tapi belum lewat pemicu −10% dulu masih terlihat di RSI Buy; sekarang ia dicatat di kaki Rencana: “Bersinyal beli tapi belum boleh menambah (2): TKIM −4,9% dr beli terakhir · ISSP −3,1% …”.

Akibat samping yang diketahui: analisa bandar (kuota NeoBDM) tetap di kandidat RSI Buy atas keputusan Djoko, dan kandidat itu sekarang semuanya saham di luar portfolio. Jadi penguat “smart money” di Rencana — yang membaca bandar_kandidat.json — akan jarang cocok lagi. Kalau nanti analisa bandar diperlukan untuk posisi sendiri, itu butuh kuota tersendiri.

RSI Buy tidak pernah menyuruh beli. Ia cuma bilang “ini yang bersinyal, ini kondisinya”. Rencana yang menerjemahkannya jadi tindakan berikut besaran uangnya.

Kenapa satu saham bisa muncul di satu laporan tapi tidak di lainnya

  • Di RSI Buy, tidak di Rencana: sahamnya bersinyal, tapi belum turun 10% dari pembelian terakhirmu — jadi belum ada aksi. Bisa bertahan berhari-hari begitu.
  • Di Rencana, tidak di RSI Buy: AVG DOWN bisa muncul untuk saham yang RSI-nya sudah di atas 40, di luar jendela RSI Buy.
  • Di Rencana tapi bukan dari RSI sama sekali: daftar “layak dilepas” Senin dan kandidat cut loss berangkat dari fundamental, bukan dari sinyal harga.

Sejak tangga avg down dipasang (29 Sep 2026) keduanya sama-sama menyebut jatah rupiah, jadi kamu bisa bertindak langsung dari pesan mana pun. Yang membedakan tinggal cakupannya: RSI Buy menyaring pasar untuk menemukan, Rencana menyaring portfolio untuk memutuskan.

Strategi trading portfolio · 🎯 Rencana hari ini

Sen–Jum 08:00

Satu pesan tiap pagi bursa yang menjawab apa yang dieksekusi hari ini: jual, avg down, beli tambah, atau beli lagi — per portfolio, berapa lot, dan kenapa. Aturannya keputusan Djoko 14–15 Sep 2026, ditulis di lib/strategi.py; pengambilan data dan pesannya di rencana_harian.py. Hanya dikirim ke pemilik, tidak pernah ke grup teman, dan tidak pernah mengeksekusi order.

Dasar saran beli: syarat lengkap tiap jenis (21 Okt 2026)

Djoko: “untuk alert buy atau avg down pada rencana hari ini didasarkan apa ya? apakah karena rsi dibawah 40 dan mulai naik dan harga sudah turun lebih dari 10% dari pembelian sebelumnya?” Dua syarat itu benar, tetapi bukan satu-satunya. Isi di bawah dibaca langsung dari lib/strategi.py dan rencana_harian.py. Pada tiap jenis, semua syarat harus terpenuhi sekaligus.

🟢 AVG DOWN (portfolio Long dan Trading)

#SyaratRincian
1Sinyal RSI hari iniRSI penutupan resmi pernah ≤ 40 dalam 10 sesi terakhir (titik terendahnya), lalu angka hari ini lebih tinggi dari semua angka sejak titik terendah itu (sudah naik sedikitnya sekali, selisih lebih dari 0,05). Sinyal dihitung dari hari pertama syarat terpenuhi dan tetap berlaku sampai 2 sesi sesudahnya (tiga hari bursa), selama RSI hari ini masih lebih tinggi dari semua angka sejak titik terendahnya. Barisnya diberi penanda 🔁 sinyal beli sejak … (hari ke-N dari 3). Sesudah itu tidak diulang. (Sejak 23 Okt 2026; sebelumnya hanya hari pertama. Konstanta SINYAL_BELI_SESI di lib/strategi.py.) Episode dianggap selesai kalau RSI pernah ≥ 50, dan harus mulai dari awal lagi.
2Harga turun ≥ 10% dari pembelian terakhirPatokannya pembelian terakhir, bukan harga rata-rata (kalau datanya tidak ada, dipakai harga rata-rata). Harga juga harus di bawah harga rata-rata posisimu.
3Fundamental hari iniLaba positif, ROE > 5%, PBV < 3, DER ≤ 2,5 (3,0 untuk energi dan bahan dasar; keuangan dilewati). Data yang kosong sebagian dianggap lolos; kalau laba, ROE, dan PBV semuanya kosong, ditolak. Ini bukan syarat masuk watchlist: saham di luar watchlist tetap bisa muncul, dan diberi tanda ⚠️ di barisnya.
4UndervalueDiskon ke nilai wajar ≥ 15% (label 🟢undervalue). Wajib sejak 1 Okt 2026. Sebelum 21 Okt, saham yang belum undervalue ditampilkan di blok “AVG DOWN ditahan”; blok itu sudah dibuang.
5Tangga masih memberi jatahTahap ditentukan dari floating loss terhadap harga rata-rata: tahap 1 di 0%, tahap 2 di −10%, tahap 3 di −19%, tahap 4 di −27,1%. Jatah = batas kumulatif tahap itu dikurangi uang yang sudah masuk (bentuk 1 : 1,5 : 2,5 : 5 satuan). Kalau uang yang masuk sudah melewati batas tahapnya, tidak ada saran. Rinciannya di tangga avg down.

Portfolio Spekulatif tidak pernah otomatis: sinyal beli hanya berubah menjadi “keputusan manual” kalau ada katalis dalam 90 hari terakhir (pengendali baru, akuisisi, merger, rights issue, orang dalam membeli, atau laporan keuangan membaik).

🟢 AVG UP (portfolio Long, posisi sedang untung)

Tidak ada pemicu RSI sama sekali sejak 7 Okt 2026. Komentar di kode sempat masih menyebut “RSI ≤ 50 + mulai naik” dan “masih undervalue”; itu sudah dibersihkan 21 Okt 2026 (hanya komentar dan docstring, kodenya terbukti identik). Yang menggantikan pemicu RSI adalah kekuatan relatif terhadap IHSG. RSI tinggal sebagai pagar. Sinyal ≤ 50 itu sendiri masih dihitung, tetapi hanya untuk menampilkan deret RSI di baris AVG UP, bukan sebagai pemicu. Kaki pesan Rencana (“Pemeriksaan hari ini”) sampai 21 Okt 2026 mencetak “Sinyal avg up (RSI ≤50 mulai naik): N posisi”, yang menyesatkan karena angka itu bukan pemicu; sekarang barisnya berbunyi “AVG UP: N saran · tidak dipicu RSI, melainkan kekuatan relatif terhadap IHSG, fundamental, dan tangga naik”, dengan N = jumlah saran AVG UP yang tampil di pesan itu.

#SyaratRincian
1Posisi Long dan harga ≥ harga rata-rataPosisi yang rugi hanya bisa dibeli lewat avg down.
2Fundamental hari ini dan masuk watchlistFundamental sama dengan avg down. Berbeda dari avg down, avg up juga mensyaratkan saham itu lolos screening bulanan (alasan 1 Okt 2026: ia memasukkan uang baru ke posisi yang sudah untung, jadi sifatnya seperti beli baru).
3Tidak kalah dari IHSG sebulan terakhirKinerja sebulan saham dikurangi kinerja sebulan IHSG harus ≥ 0. Data kosong dianggap lolos.
4RSI hari ini < 70Pagar overbought, sama dengan ambang sinyal jual.
5Bukan di zona jualPremium di atas nilai wajar kurang dari 15%. Di sana tangga jual sudah bekerja, dan sistem tidak boleh menyuruh dua hal berlawanan untuk harga yang sama.
6Tangga naik memberi jatahDividend yield > 5%; harga tidak di atas nilai wajar (diskon ≥ 0%); minimal 5% di atas pembelian terakhir (kalau kurang, statusnya “tunggu”); selama di atas harga rata-rata, total di saham itu ≤ 5 satuan; harga rata-rata baru tidak melewati 80% nilai wajar. Ukuran: diskon ≥ 30% = 1 satuan, ≥ 20% = 0,7, ≥ 10% = 0,4, ≥ 0% = 0,25.

Undervalue bukan syarat avg up (dicabut 7 Okt 2026); label itu hanya dicetak sebagai keterangan. AVG UP yang tertahan tidak dilaporkan (8 Okt 2026).

🔁 BELI LAGI

Berlaku sesudah kamu menjual sebagian (“separo”). Syaratnya: sinyal RSI yang sama dengan avg down, ada bagian yang dijual dan belum dibeli kembali, harga ≥ 10% di bawah harga jualmu, dan tangga memberi jatah. Dari kode yang kubaca, cabang ini tidak memeriksa fundamental maupun undervalue.

🆕 Kandidat beli baru

Tidak diproses di Rencana lagi: saham watchlist yang belum kamu pegang ditangani RSI Buy (undervalue, fundamental bersih, ada dividen, dan sinyal RSI).

Jam kirim (23 Okt 2026)

Djoko: “untuk alert rencana dan rsi buy harian dikirim jam berapa ya? bisa dibuat lebih awal misalnya jam 8?” lalu “maksimum jam 8.15”. Jadwal sekarang, hari bursa (Sen–Jum):

AlertDuluSekarangLama jalan
🎯 Rencana hari ini08:3008:00±1–2 menit
RSI Buy Alert (pemilik)08:4508:10< 1 menit
RSI Buy untuk grup teman12:3012:30 (tidak berubah)—

Penanda potongan pesan Telegram (21 Okt 2026)

Telegram membatasi satu pesan sekitar 4.096 huruf, jadi pesan yang lebih panjang dipotong otomatis di batas antar-bagian (baris kosong) dan tiap potongan diberi penanda di barisnya yang pertama. Djoko: “kalau potong pesan telegram kan ada (bagian 7/9), nah bisa tolong tambahin (bagian 7/9 dari rencana) supaya saya tau ini potongan telegram yang mana.” Sekarang potongan Rencana berbunyi:

(bagian 7/9 dari rencana)

Urutan daftar beli: bulat paling bagus di atas (21 Okt 2026)

Djoko: “untuk rencana buy/avg down, tolong diurutkan dari atas (diutamakan) yang semua faktornya positif (bulat hijau) atau setidaknya netral (bulat putih) ya. supaya mempermudah saya memprioritaskan saham yang memang bagus duluan.” Disusul koreksi sore harinya: “MAIN ada warning tidak masuk watchlist, harusnya statusnya di grup kedua … grup pertama adalah yang bener bener bersih dari tanda negatif (warning atau merah)”, lalu “paling ideal adalah grup pertama kalau semua hijau aja, lalu grup kedua kalau hijau+putih aja, lalu yang ada warning, lalu yang merah.” Blok AVG DOWN, AVG UP, BELI LAGI, dan KANDIDAT BELI BARU diurutkan dalam empat kelompok, dari yang paling diutamakan:

  1. Hanya 🟢 (tidak ada ⚪, ⚠️, maupun 🔴).
  2. 🟢 + ⚪ saja (tanpa warning dan tanpa merah).
  3. Ada ⚠️ warning (tanpa 🔴), misalnya “tidak masuk kriteria watchlist”, lapkeu berstatus warning, atau dividen setahun terakhir jauh di atas biasanya.
  4. Ada 🔴. Kalau sebuah saham punya 🔴 dan ⚠️ sekaligus, ia masuk kelompok ini.

Di dalam satu kelompok: tanda negatif yang lebih sedikit dulu, lalu ⚪ yang lebih sedikit, lalu 🟢 yang lebih banyak. Skor sama persis: urutan lama dipertahankan (kelompok portfolio, lalu abjad; untuk kandidat beli baru, diskon terbesar). Saham tanpa satu pun bulat (data kosong) dimasukkan ke kelompok 2, bukan 1, karena “semua hijau” mensyaratkan ada hijaunya.

Yang dihitung hanya bulat di baris rapor tiap saham (nilai wajar, DV, yield, ROE/PBV/DER/laba, PER, Lapkeu, dan peringatan watchlist/dividen/status valuasi). Hanya urutan yang berubah, isi daftar tetap. Keterangan urutan tidak dicetak di Telegram (dibuang 21 Okt 2026 atas permintaan Djoko); penjelasannya cukup di halaman ini. Contoh Rencana 21 Okt 2026 siang, AVG DOWN 19 saham: nomor 1–5 (MAHA, MSTI, INKP, MAPA, MAPI) di kelompok 🟢 + ⚪, MAIN dan delapan lainnya di kelompok warning, enam terakhir (NISP sampai MTEL) di kelompok merah. Belum ada saham yang “hanya hijau”, karena hampir selalu ada satu ⚪ seperti “laba positif”.

Upside ke nilai wajar (21 Okt 2026)

Djoko: “untuk jarak dari harga sekarang ke fair value (upside) apakah bisa disertakan juga dalam info nya. supaya saya bisa memperkirakan masih bisa naik berapa persen dari harga sekarang. jadi enggak cuman diskonnya.” Baris nilai wajar di Rencana dan RSI Buy kini ditutup dengan upside:

🟢undervalue · wajar Rp889 (median consumer: PER 1,012 · target 889 · Graham 714) → diskon 38% · upside +61%

Sinyal RSI — dihitung pada penutupan harian

SyaratContoh
BELIRSI pernah ≤ 40, lalu mulai naik: angka terakhir lebih tinggi dari semua angka sejak titik terendahnya. Dilonggarkan 15 Sep 2026 sore dari ≤35 & naik 2 kali, supaya tidak terus ketinggalan saat pasar bullish — simulasi 1–14 Sep: 6 → 18 sinyal35,9 → 34,7 → 46,5 ✅ (MAPI)
38 → 36 belum
JUALRSI pernah > 70. Sejak puncaknya sudah turun minimal 2 kali, dan angka terakhir lebih rendah dari semua angka sejak puncak itu93 → 91 → 92 → 89 ✅
93 → 91 → 92 belum

Tiga pagar — tanpa ini aturannya menyesatkan

  • Hari pertama + 2 sesi. RSI yang terus naik 34 → 36 → 38 → 42 → 55 memenuhi syarat setiap hari, karena tiap angka baru selalu tertinggi. Tanpa pagar ini, di RSI 55 pun masih disuruh avg down. Sinyal = hari pertama syarat terpenuhi, dan tetap berlaku sampai 2 sesi sesudahnya selama RSI hari ini masih di atas semua angka sejak titik terendahnya (sejak 23 Okt 2026; sebelumnya hanya hari pertama, sehingga avg down hanya muncul satu pagi dan hilang kalau saringan lain baru lolos besoknya).
  • Titik terendah/puncak dicari dalam 10 hari bursa terakhir, dan sejak RSI terakhir melewati 50. RSI yang pernah 25, naik ke 55, lalu turun ke 34 adalah dip baru. Batas 10 hari ditemukan saat uji: TCPI punya dasar RSI 13 pada 26 Agustus dan RSI-nya tidak pernah melewati 50 sesudahnya — tanpa batas itu, dip baru RSI 21 pada 12 September tidak pernah terbaca karena patokannya terkunci di 13.
  • RSI identik bukan "naik" — selisih harus lebih dari 0,05 poin, sama dengan alert RSI.

RSI harian dihitung sendiri dari bar yfinance (rumus Wilder, sama dengan TradingView), karena TradingView hanya memberi tiga hari terakhir. Dicocokkan pada 13 saham: selisih terbesar 0,6 poin.

Aturan per portfolio

Portfolio🟢 Beli🔴 Jual
Long (dulu Hold)
dividen > 5% atau diyakini naik terus
Avg down saat sinyal beli + fundamental lolos.
Beli tambah kalau posisinya untung atau impas (bukan yang rugi — itu jalur avg down) kalau sinyal beli + fundamental lolos + undervalue (diskon ke nilai wajar ≥ 15%, label yang sama dengan alert RSI)
Tidak ada saran jual, kecuali fundamental jelek: laporan keuangan terbaru masih rugi / berbalik rugi (atau laba negatif kalau lapkeu tak terbaca) → jual semua saat sinyal jual
Trading
dividen > 0
Avg down saat sinyal beli + fundamental lolosJual semua saat sinyal jual & untung
Spekulatif (dulu NO-DIV)
fundamental belum menarik, dipegang karena harapan katalis
Tidak pernah avg down otomatis. Sinyal beli + ada katalis ≤ 90 hari (pengendali baru/akuisisi, merger, rights issue, orang dalam beli, laporan keuangan membaik) → 👀 Keputusan manual, dengan katalisnya dicetak. Tanpa katalis → satu baris info "tidak disarankan"Jual semua saat sinyal jual & minimal impas
  • Avg down hanya kalau posisinya rugi dan harga ≥ 10% di bawah pembelian terakhir (18 Sep 2026, dulu 5% — keputusan Djoko: “jangan kecepatan beli”). Sejak siang 18 Sep, Rencana satu-satunya laporan yang menyarankan avg down: tanda CICIL (dulu 5%) dimatikan, dan repair Senin (dulu 8%) kini hanya mengirim daftar posisi layak dilepas.
  • Beli tambah hanya untuk posisi yang untung atau impas (18 Sep 2026). Dulu posisi Long yang rugi tapi belum turun cukup jauh dari pembelian terakhir bisa lolos lewat jalur beli tambah kalau kebetulan undervalue — ambang avg down jadi percuma. Sekarang posisi rugi hanya bisa dibeli lewat avg down. Uji 9 kasus: Long rugi −7% undervalue → diam; −10% → avg down; untung/impas undervalue → beli tambah; Trading −6% → diam, −11% → avg down.
  • Fundamental lolos = lib/avgdown.layak_tambah: laba positif, ROE > 5%, PBV < 3, DER wajar — penjaga yang sama dengan CICIL dan screener mingguan.
  • Portfolio tiap posisi: Stockbit dari field portfolio. Mirae dibagi tiga yang sama (15 Sep 2026), dicatat di data/mirae_portfolio.json dengan pola mengikuti Stockbit — saham yang juga dipegang di Stockbit memakai portfolio Stockbit-nya (AMRT, ICBP, PGEO, TOWR … jadi Long), sisanya dari DY rata-rata 36 bulan: ≥5% Long, >0 Trading, 0 Spekulatif. Saham Mirae yang belum terdaftar memakai pola dividen dan tertulis (pola dividen) di pesan; DY tak terbaca → Long.
  • Besar pembelian: dari tangga, bukan lagi rumus tranche (30 Sep 2026). AVG DOWN memakai tangga turun, AVG UP memakai tangga naik. Rumus lama Rp625 rb + Rp312,5 rb per penguat, maksimal Rp1,25 jt sudah pensiun di pesan Rencana — masih dipakai laporan repair Senin, yang punya skor sendiri.
  • Penguat (dicetak dengan tanggalnya): laporan keuangan membaik · orang dalam membeli · pengendali/investor baru · rights issue · merger (dari berita) · saham baru terbit · skor bandarmologi ≥ 67. Kejadian yang sama dari arsip IDX dan berita dihitung satu. Katalis Spekulatif hanya bagian penguat yang ≤ 90 hari dan bukan skor bandarmologi / saham baru terbit. Batasnya: tujuan rights issue ada di PDF, jadi sistem hanya menulis "cek tujuannya"; skor bandarmologi hanya ada untuk 126 saham watchlist. Lonjakan volume ikut dicetak tapi tidak dihitung sebagai penguat — arahnya perkiraan.
  • ⚖️ Pasangan cut loss — info, bukan perintah. Kalau hari itu ada saran jual untung Rp X, dicetak posisi rugi yang bisa dilepas bersamaan dengan total rugi ≤ X (Spekulatif, atau yang fundamentalnya jelek), sebagian lot kalau perlu. Djoko yang memilih.
  • 🔁 Beli lagi separo: separo yang pernah dijual dan belum dibeli kembali, disarankan saat sinyal beli menyala dan harga ≥10% di bawah harga jualnya (ambang dipasang 30 Sep 2026, lihat di bawah). Aturan "Long jual separo" sendiri sudah pensiun.

30 Sep 2026: beli lagi separo pakai ambang −10% dan nominal dari tangga

Pertanyaan Djoko: “ini dasar belinya apa dan berapa banyak?” Aturan lamanya punya dua kelemahan:

  • Tanpa ambang. Cukup “di bawah harga jual”, jadi CFIN yang −2,7% dari harga jual sudah memicu — padahal biaya transaksi dua arah saja 0,3–0,5%, sehingga membalikkan keputusan jual sendiri belum tentu untung.
  • Jumlahnya lepas dari anggaran. Yang disarankan sebanyak lembar yang dijual, terlepas dari tahap tangga dan uang yang sudah masuk ke saham itu.

Sekarang: harga harus ≥10% di bawah harga jual (angka yang sama dengan pemicu avg down), sinyal RSI Buy tetap wajib, dan nominalnya dari tangga — tahap dari kedalaman harga, jatah dari kumulatif tahap dikurangi uang yang sudah masuk. Kalau tangganya tidak punya jatah (uang yang masuk sudah melewati kumulatif tahap itu), sarannya tidak muncul.

Uji 30 Sep 2026 atas 22 penjualan separo yang masih terbuka: dengan ambang baru yang lolos 5 — SSMS −13,9% · TAPG −13,2% · LTLS −12,3% · TOWR −11,9% · GJTL −11,4%. Yang sebelumnya muncul tapi kini diam: CFIN −3,8%, BBRI −2,7%, BNGA −0,3%, PTBA 0,0%, ERAA +0,8%, BSSR +1,6%. Dari 5 yang lolos, hanya GJTL (3 lot ≈ Rp439 rb) dan TAPG (1 lot ≈ Rp385 rb) yang tangganya masih punya jatah; LTLS, SSMS, dan TOWR uangnya sudah melewati kumulatif tahapnya. Semuanya masih menunggu sinyal RSI Buy juga, jadi hari itu blok ini tetap kosong.

🆕 Kandidat beli baru — saham yang belum dipegang (15 Sep 2026)

Sinyal jual hanya untuk saham yang dipegang, tapi sinyal beli dicari lebih luas (keputusan Djoko): semua saham watchlist kuartalan yang belum ada di Stockbit, termasuk yang pernah dijual habis — per 15 Sep, 44 dari 126 saham watchlist.

Beli baru hanya di Stockbit, Mirae cuma untuk avg down (15 Sep 2026)

  • Kandidat beli baru selalu diarahkan ke Stockbit Long/Trading. Saham yang sudah dipegang di Mirae tetap bisa jadi kandidat, dengan baris ℹ️ sudah dipegang di Mirae (posisi −12,4%) — beli barunya di Stockbit.
  • Saran beli tambah (Long undervalue) dan beli lagi separo yang berasal dari posisi Mirae ditulis sebagai beli di Stockbit. Kalau posisi Stockbit saham itu sudah dapat saran sendiri, saran versi Mirae tidak dicetak.
  • Avg down Mirae tetap disarankan di Mirae, termasuk keputusan manual avg down saham Spekulatif. Saham yang hari itu sudah dapat saran avg down tidak dobel muncul sebagai kandidat baru.

Kaki pesan: hasil pemeriksaan (16 Sep 2026)

Pesan selalu ditutup blok 🔎 Pemeriksaan hari ini: berapa posisi dan kandidat watchlist yang diperiksa, berapa sinyal jual dan beli yang ditemukan, dan sinyal jual yang sengaja tidak jadi saran beserta sebabnya — misalnya POWR [Mirae Long] +43,4% — portfolio Long, hanya dijual kalau fundamental jelek atau IMPC [Stockbit Trading] −34,2% — belum untung.

Alasannya diminta Djoko: tanpa itu, pesan tanpa saran jual tidak bisa dibedakan dari alert yang gagal terkirim. Contoh 16 Sep: 5 sinyal jual, nol saran jual — empat di Long, satu belum untung.

Senin pertama tiap bulan: 📋 Posisi layak dilepas (sejak 18 Sep 2026, jadi bulanan 12 Okt 2026)

Dari mingguan jadi bulanan, 12 Okt 2026. Djoko: “kalau tiap minggu berasa redundant” — isinya memang berubah lambat, dan daftar yang itu-itu saja tiap minggu berhenti dibaca. Senin PERTAMA tiap bulan dipilih supaya berkas penilaian repair tetap segar: weekly_mirae_repair.py jalan tiap Senin 07:30 dan 07:50, dan bagian ini menuntut berkasnya dibuat hari itu juga.

Tiap Senin pesan ini ditutup dengan daftar posisi yang layak dilepas dari penilaian mingguan — pengganti laporan repair yang dulu terkirim terpisah. Rinciannya di bagian Portfolio repair.

Pairing supaya impas (26 Okt 2026). Djoko: “untuk alert POSISI LAYAK DILEPAS tolong carikan pairingnya dong, supaya at least tidak rugi atau bep.” Pairing ditulis langsung di bawah tiap kandidat (baris ⚖️ Pairing), bukan di blok terpisah: rugi bersih saham itu ditutup dengan menjual sebagian posisi yang sedang untung. Satu paragraf ringkasan di atas daftar memuat total rugi dan total sumber. Semua angka sudah dikurangi ongkos 0,25%.

  • Sumber untung hanya posisi untung yang bukan kandidat lepas, dan yang (a) kantongnya Trading atau Spekulatif, atau (b) harganya sudah dekat atau di atas nilai wajar (sisa upside ≤ 10%).
  • Dividen besar (DY ≥ 5%) tidak dipakai selama harganya masih di bawah nilai wajar, karena itu kantong “hold”. Kalau dividen besar tapi harga sudah di atas nilai wajar, ia dipakai dan diberi tanda ⚠️.
  • Urutan sumber: harga di atas nilai wajar dulu, lalu Trading/Spekulatif, lalu sisa upside terkecil.
  • Urutan kandidat: rugi terkecil dulu supaya sebanyak mungkin tertutup. Satu sumber bisa dipakai beruntun, lot-nya dikurangi tiap kali.
  • Kandidat yang sumbernya tidak cukup ditandai di bawah sahamnya sendiri. Paragraf ringkasan menyebut total rugi, untung dari sumber layak, dan seluruh untung terbuka, supaya kelihatan seberapa jauh impas penuh dari kenyataan.
  • Avg beli vs nilai wajar (26 Okt 2026). Tiap kandidat punya baris “avg beli X% di atas/di bawah nilai wajar sekarang” (Djoko: “tampilkan berapa persentase harga beli terhadap fair valuenya”). 🔴 kalau ≥15% di atas (overvalue), 🟢 kalau ≥15% di bawah (undervalue), ⚪ di antaranya. Yang dibandingkan nilai wajar hari ini, bukan nilai wajar saat transaksi; yang terakhir ada di catatan alasan transaksi.
  • Kode: lib/daftar_exit.py fungsi pairing(). Hanya info, bukan perintah jual.

Nomor di tiap blok (14 Okt 2026)

Djoko: “bisa tolong dikasih nomor untuk tiap saham supaya saya mudah membedakan batasannya.” Tiap baris saham sekarang bernomor, seperti RSI Buy. Nomornya mulai dari 1 lagi di tiap blok, jadi nomor terakhir sekaligus menunjukkan jumlah isi blok itu.

🔴 JUAL SEMUA (1)
1. PSSI [Stockbit Trading] 57 lot @ ±Rp372 · +2,4% (Rp50.103)

💰 TANGGA JUAL — sudah di atas nilai wajar (1)
1. MEGA [Stockbit Trading] pegang 4 lot …

Berlaku di semua blok: jual semua, tangga jual, di atas wajar tapi rugi, avg down, avg up, kandidat beli baru, beli lagi, pasangan cut loss, keputusan manual, dan perubahan status valuasi.

Kenapa disuruh jual semua (14 Okt 2026)

Djoko: “kalau suruh jual semua, bisa kasih tau alasannya?” Sebelumnya yang tercetak cuma alasan pendek trading, untung, padahal keputusannya lewat tiga lapis. Sekarang ketiganya ditulis sebagai baris → di bawah deret RSI:

  1. Aturan kategorinya — Trading dilepas penuh saat sinyal jual RSI dan harga di atas rata-rata beli; Spekulatif saat minimal impas; Long hanya kalau laporan keuangannya rusak.
  2. Pemicunya — RSI pernah di atas 70 lalu turun 2 kali berturut-turut.
  3. Rem jualnya — lapis yang paling tidak kelihatan. Saham yang masih diskon ≥15% normalnya ditahan. Kalau tetap disuruh jual, berarti remnya dicabut, dan sebabnya ikut dicetak.
1. PSSI [Stockbit Trading] 57 lot @ ±Rp372 · +2,4% (Rp50.103)
   RSI 78 → 67 → 58 · trading, untung
   → Aturan Trading: muncul sinyal jual RSI dan harganya di atas
     rata-rata beli — dilepas semua, untungnya diambil.
   → Pemicunya: RSI pernah di atas 70 lalu turun 2 kali berturut-turut.
   → Harganya masih diskon 29% ke nilai wajar, dan normalnya sinyal
     jual seperti ini DITAHAN selama diskonnya ≥15%. Remnya dicabut karena
     laporan keuangannya rusak (berbalik rugi).

Contoh PSSI itu justru kasus yang dulu membingungkan: diskonnya masih 29%, jadi pembacanya wajar bertanya kenapa disuruh dijual. Jawabannya ada di lapis ketiga — lapkeu Q2 2026 berbalik rugi, dan rem jual memang dicabut kalau fundamentalnya rusak. Aturannya tidak berubah 14 Okt 2026, cuma jadi kelihatan.

Isi di bawah tiap saham

Rekomendasi hanya berguna kalau bisa ditolak — Djoko belum tentu menjual saham yang ternyata masih bagus. Karena itu setiap saham di pesan (jual, avg down, beli tambah, beli lagi, pasangan cut loss, keputusan manual) membawa:

Sumber berita: RSS media, bukan IDX (15 Sep 2026)

IDX memblokir akses otomatis dari VPS sejak 14 Sep 2026 (semua permintaan ditolak 403). Blokir itu sengaja tidak diakali. Akibatnya screener Sabtu yang membaca IDX (orang dalam membeli, kandidat aksi korporasi, saham baru) dan Layer 8 bandarmologi ikut tidak bisa jalan selama blokir — arsip 👤/🏗️ berhenti di data 12 Sep.

Penggantinya lib/berita_rss.py: RSS CNBC Indonesia Market, IDX Channel, Kontan Investasi, dan Antara Bursa, dikumpulkan kumpul_berita.py tiap hari 08:35, 12:35, 17:35, 21:35 ke data/berita_rss.json (disimpan 120 hari).

  • Yang disimpan hanya berita yang menyebut kode atau nama emiten dan cocok salah satu kategori: pengendali/akuisisi/backdoor/tender offer · merger · rights issue/private placement · orang dalam beli ("pengendali borong saham") · nego/crossing · buyback · divestasi.
  • Penyangkalan dibuang: "Bank Jago pastikan tidak ada rencana merger dengan BFIN" tidak dihitung merger.
  • Kode saham yang juga kata umum (DATA, BANK, BUMI, RISE …) hanya diterima dalam kurung atau dekat kata "saham/emiten". Kode yang tidak ada di daftar TradingView (emiten suspensi, contoh MKNT) diterima kalau di awal judul atau dalam kurung.
  • Batasannya: hanya yang diberitakan media, jadi emiten kecil sering tidak terliput; kategori dibaca dari judul + ringkasan, nilai transaksinya tetap perlu dicek; arsip mulai 15 Sep 2026 tanpa data mundur; transaksi nego hanya tertangkap kalau diberitakan. Kaki pesan menyebut umur arsip dan memberi ⚠️ kalau > 24 jam tidak diperbarui atau ada feed yang gagal.
  • Hari pertama: 8 berita — antara lain pengendali IMPC borong 3,4 juta saham, Edwin Soeryadjaya borong SRTG, pengendali baru DPUM dan MKNT, rights issue LAPD dan FORU.

Yang berubah di laporan lain (15 Sep 2026)

  • Saran 🎯/💰 dihapus dari RSI Buy dan RSI Sell. Aturan lamanya menyuruh Long jual separo — bertentangan dengan strategi ini. Daftar sinyal RSI di kedua alert tetap ada sebagai bahan bacaan; rekomendasi hanya dari pesan Rencana.
  • Laporan repair Senin & tanda CICIL memakai sinyal beli yang sama, untuk semua posisi (bukan lagi hanya dividen <3%): laporan Senin melihat 5 sesi terakhir, CICIL hari ini. Syarat "≤35 lalu naik sehari" dari 14 Sep sudah digantikan. Uji pertama: kedua laporan Senin jadi 0 AVG DOWN — tidak ada posisi rugi yang RSI-nya menyentuh 35 dalam 10 hari terakhir.
  • Daftar sinyal di RSI Sell Alert memakai hitungan yang sama dengan Rencana sejak 17 Sep 2026 (turun 2 kali; rinciannya). Saham masih bisa muncul di sana tanpa saran jual di Rencana, tapi sekarang hanya karena aturan portfolio — misalnya Long yang fundamentalnya sehat, Trading yang sedang rugi — atau karena sinyalnya sudah lewat hari pertama. Sebelum 17 Sep cukup turun sekali.
  • Tanda CICIL di bandarmologi belum memakai sinyal ini.

Diuji sebelum dipasang

Revisi sinyal beli 15 Sep sore (RSI ≤40 lalu naik): 8 kasus uji lolos, termasuk sinyal jual yang tidak berubah; teks "tunggu sinyal beli" di RSI Buy dan laporan repair Senin kini dibentuk dari satu fungsi (strategi.teks_syarat_beli()), jadi angkanya tidak bisa tertinggal lagi.

Revisi 15 Sep sore (Spekulatif, Mirae dibagi tiga, berita RSS): uji mundur 0/1/2/3/7 hari tanpa error — BBHI 11 Sep berubah dari avg down otomatis jadi keputusan manual dengan katalis lapkeu membaik, WINS [Mirae Trading] jual semua, RISE di kedua broker keputusan manual; uji IMPC dengan berita "pengendali borong" → katalis orang dalam beli.

18 kasus sinyal (termasuk contoh-contoh Djoko) dan 15 kasus keputusan per portfolio. Simulasi 10 hari bursa ke belakang (opsi --mundur N; harga saat itu, fundamental dan posisi hari ini): 3 hari berisi rekomendasi — 11 Sep avg down BBHI [NO-DIV], 10 Sep jual semua WINS [Mirae] +36% dengan tiga kandidat pasangan cut loss, 3 Sep beli tambah MYOR [Long] (diskon 31% ke nilai wajar) dan keputusan manual RISE [NO-DIV] (PBV 4,7x) — tujuh hari lainnya kosong. Pesan kosong tetap dikirim singkat, supaya kelihatan alertnya jalan.

Basis RSI: penutupan resmi

16 Sep 2026

RSI di TradingView selalu dihitung pada bar hari ini yang masih berjalan. Sebelum bursa buka, bar itu berisi harga transaksi terakhir, bukan penutupan resmi — IDX menutup dengan lelang penutupan, jadi keduanya bisa berbeda. Pada 15 Sep 2026: AUTO transaksi terakhir Rp3.340 vs penutupan resmi Rp3.360; JECC Rp935 vs Rp985. Selisih RSI-nya 3–11 poin, cukup untuk membuat satu laporan bersinyal dan laporan lain tidak.

Pembanding (119 saham, 16 Sep 2026)Medianp90
TradingView vs Wilder-yfinance termasuk bar hari ini0,141,38
TradingView vs Wilder-yfinance tanpa bar hari ini2,485,93

Sumbernya sama; yang berbeda cuma barnya.

  • Sejak 16 Sep 2026 semua sinyal memakai penutupan resmi. lib/rsi_resmi.ganti_rsi() menghitung ulang RSI(14) Wilder dari bar harian yfinance (bar hari ini dibuang), lalu menimpa angka TradingView. Dipasang di RSI Buy Alert, RSI Sell Alert, dan bandarmologi; pesan 🎯 Rencana memang sudah memakai basis itu sejak awal.
  • Gagal ambil data → tetap pakai angka TradingView dan dicatat di log. Saham hilang dari laporan lebih merugikan daripada angka yang sedikit berbeda. Uji pertama: 301 saham RSI Buy dan 194 RSI Sell, nol yang gagal, tambahan waktu ±20 detik.
  • Harga yang dicetak tetap harga terakhir dari TradingView — sinyalnya dari penutupan resmi, eksekusinya tetap di harga pasar. Karena itu laporan siang untuk grup teman tetap memakai harga sesi pagi.
  • Seluruh laporan ikut, termasuk trailing profit dan screener Sabtu (16 Sep 2026): dekat 52w low, saham baru terbit, konsolidasi+volume, kandidat aksi korporasi, orang dalam membeli, dan laporan keuangan. Di screener, RSI hanya ditimpa untuk saham yang benar-benar tampil — bukan 1.200 emiten universe — supaya unduhannya tetap ringan untuk VPS 1 GB. Uji pertama: semua di bawah 3 detik, trailing profit 15 detik untuk 193 posisi.
  • Bandarmologi harus dijalankan dengan ./venv/bin/python3, bukan python sistem — modul mcp hanya ada di venv itu.

RSI Buy Alert

Sen–Jum 08:10

Mencari saham yang sudah berada di zona lemah lalu mulai berbalik naik — bukan sekadar RSI rendah yang masih terus turun.

27 Sep 2026: empat laporan Sabtu pindah ke sini sebagai info pendukung

Kata Djoko: “saya kira 4 hal ini juga lebih baik dibuat sebagai tambahan informasi pada saham yang masuk kriteria RSI Buy saja, dengan ditambahkan waktu kejadiannya masing-masing”. Jadi konsolidasi+volume (Sab 10:00), aksi korporasi (Sab 10:30), orang dalam membeli (Sab 11:00), dan laporan keuangan (Sab 12:00) tidak lagi mengirim laporan Telegram sendiri. Keempatnya tetap jalan pada jam yang sama dengan --tanpa-kirim: menghitung, memperbarui state/halaman arsipnya, dan mengisi arsip peristiwa yang dibaca RSI Buy. Menyusul “saham baru terbit” yang sudah lebih dulu disenyapkan pagi itu juga.

Alasannya sama dengan sebelumnya: titik masuk selalu dari RSI. Kabar bagus pada saham yang RSI-nya belum berbalik tidak akan ditindaklanjuti, jadi tidak perlu jadi pesan tersendiri — cukup muncul saat sahamnya benar-benar bersinyal.

Tetap hanya untuk kandidat (undervalue + fundamental bersih + dividen > 0), sama seperti konteks lain. Tiap baris membawa tanggal kejadiannya, dan yang ≤ 7 hari diberi tanda · minggu ini:

📦 Konsolidasi sempit + lonjakan volume · minggu ini: harga 30 hari di Rp1.635–1.760 (sempit, 7%) · volume melonjak 4,9x
🏗️ Aksi korporasi 22 Sep: rights issue …
👤 Orang dalam membeli 24 Sep · minggu ini: komisaris beli Rp3,2 M
📊 Rilis laporan keuangan 26 Sep · minggu ini: laba 9 bln 2026 +34%

Jenis peristiwa baru lapkeu. Tiga yang lain sudah mengisi arsip sejak 19–21 Sep; laporan keuangan belum, jadi ditambahkan ikon 📊, judul “Rilis laporan keuangan”, dan masa tampil 100 hari (satu kuartal — sesudah itu sudah ada rilis berikutnya). Tanggalnya adalah hari rilisnya kita ketahui, bukan akhir periode fiskalnya: yang berguna adalah kapan kabarnya sampai. Yang diarsipkan bukan cuma yang membaik — yang memburuk juga, ditandai “perlu ditinjau”.

Diuji 27 Sep: keempat script lolos py_compile, crontab kanonik diterapkan dan diff-nya hanya empat baris yang dimaksud, dan baris 📊 dirender benar lewat uji langsung lib/peristiwa (peristiwa uji dihapus lagi sesudahnya). Catatan: aksi korporasi masih gagal mengambil data karena IDX memblokir VPS sejak 14 Sep — jadwalnya dibiarkan jalan supaya arsipnya langsung terisi begitu aksesnya pulih.

Setiap baris juga membawa konteks laporan keuangan terbaru (YTD dibanding periode yang sama tahun lalu): 🟢 berbalik untung atau laba bertumbuh, ⚠️ laba turun, dan 🔴 berbalik rugi atau masih rugi.

27 Sep 2026: blok “Jenuh jual (RSI ≤ 30)” dihapus

Kata Djoko: “rasanya belum ada manfaatnya karena toh kebanyakan belum masuk kriteria RSI balik arah … saya belum akan take action dengan kondisi yang belum ada tanda balik arah”. Blok itu memuat semua saham RSI ≤ 30 tanpa syarat berbalik. Yang sudah berbalik toh sudah tampil di daftar utama (RSI 3 hari < 40 + berbalik naik), jadi isi sisanya persis yang tidak akan ditindaklanjuti. Ambang RSI_OVERSOLD = 30 masih dipakai di tempat lain; yang hilang hanya blok tampilannya.

1min(RSI, RSI[1], RSI[2]) ≤ 40dasar tiga hari, bukan RSI hari ini
DAN
2RSI > RSI[1] + 0,05hari terakhir naik
DAN
3RSI > RSI[2] + 0,05sudah melewati awal jendela
UnsurIsi
UniverseUniverse mutu yang sama dengan laporan keuangan (seluruh IDX yang lolos saringan mutu) ∪ posisi nyata Stockbit & Mirae
Kalau nihilTampilkan 5 saham RSI terendah yang sedang berbalik naik — syarat berbaliknya tetap, hanya batas 40 yang dilepas
Penanda tambahanRSI ≤ 30 masuk daftar “jenuh jual” terpisah — dihapus 27 Sep 2026, lihat catatan di bawah

Saran beli-lagi (alert pribadi saja)

Direvisi 30 Sep 2026 — lihat blok di bawah. Aturan aslinya: untuk saham PENSION yang separonya pernah dijual lewat strategi RSI Sell, saat RSI Buy menyala alert menyarankan beli lagi sebanyak lot yang dijual — hanya kalau harganya sekarang di bawah harga jualnya, karena membeli kembali lebih mahal membatalkan gunanya. Saran ini hanya untuk sinyal sungguhan, tidak untuk daftar cadangan. Kalau sebagian sudah dibeli lagi, yang disarankan sisanya saja. Aturan lengkap di bagian RSI Sell.

Bagian tambahan: pernah dilepas, kini terkoreksi

Saham yang dulu dijual habis lalu turun ≥ 10% dari harga jualnya muncul di bagian tersendiri — kandidat masuk kembali dari nol, bukan menambah posisi. Ambangnya lebih tinggi daripada CICIL (5%) karena keputusannya berbeda.

Fundamentalnya diuji ulang dengan syarat yang sama seperti penjaga CICIL, supaya yang ditawarkan bukan saham yang dulu dilepas justru karena mulai rusak. Entri saham terjual habis sengaja tidak dihapus dari portfolio — riwayat harga jualnya justru yang dipakai di sini.

Urutan final RSI Buy (21 Sep 2026 siang): sinyal RSI gerbangnya, sisanya penguat

Kata Djoko: “titik masuk saya di RSI, jadi percuma ngecek hal lain kalau RSI-nya lebih tinggi atau lagi turun dan belum ada tanda mau balik arah”. Jadi sinyal RSI tetap gerbangnya (dasar 3 hari ≤ 40 lalu berbalik naik) — saham tanpa sinyal tidak masuk daftar sama sekali, sebagus apa pun fundamentalnya. Sesudah gerbang itu, urutannya:

1🟢 undervalue dan lolos screening dulupemisah keras; ⚪fair tetap tampil, di bawah
2skor tanda: hanya 🟢, lalu 🟢 + ⚪, lalu ada ⚠️, lalu ada 🔴21 Okt 2026; makin ke bawah makin tidak ideal
3fundamental bersih (kandidat)+ dividen > 0
4⚡ jumlah PENGUATmakin banyak makin atas
5💪 sehat, lalu ⭐ nilaipemisah kalau penguatnya sama
6diskon terbesar, lalu RSI terendahpenentu terakhir

Skor tanda (21 Okt 2026). Djoko: “patokan prioritas ini juga terapkan untuk rsi buy alert ya”, dan “intinya yang paling ideal yang paling atas. makin ke bawah makin tidak ideal (karena ada hal yang kurang bagus, misalnya ada warningnya atau ada icon merah)”. Aturannya sama dengan Rencana dan satu sumber di lib/tanda.skor_tanda: kelompok 1 hanya 🟢; kelompok 2 🟢 + ⚪ saja; kelompok 3 ada ⚠️ (tanpa 🔴); kelompok 4 ada 🔴. Di dalam kelompok: tanda negatif lebih sedikit dulu, lalu ⚪ lebih sedikit, lalu 🟢 lebih banyak. Yang dihitung adalah bulat di bagian fundamental tiap saham (peringkat, Lapkeu, DV, yield, nilai wajar, PBV/ROE/PER, status valuasi), sebelum konteks kandidat. Dua tanda khas RSI Buy, ❌ MAHAL dan ⛔ bukan kandidat, dihitung sebagai merah. Konsekuensinya: urutan lama (kandidat, jumlah ⚡ penguat, 💪 sehat, ⭐ nilai, diskon, RSI) kini hanya menjadi pembeda kalau skor tandanya persis sama. Saham dengan banyak penguat tetapi ada warning bisa turun di bawah saham yang bersih tanpa penguat. Kalau kamu ingin penguat tetap di atas, bilang saja.

Penjelasan urutan di bagian atas pesan Telegram RSI Buy (“Sinyal RSI adalah gerbangnya; …”) sudah diperbarui mengikuti aturan ini.

Saham yang sengaja tidak ditampilkan di RSI Buy (22 Okt 2026). Djoko: “saya kurang suka dengan saham rokok dan syariah, jadi untuk BTPS, WIIM, HSMP, GGRM enggak usah ditampilkan di rsi buy alert ya.” “HSMP” dibaca sebagai HMSP (HM Sampoerna): tidak ada kode HSMP di IDX, dan HMSP ikut tampil di RSI Buy 21 Okt.

  • Daftarnya di data/rsi_buy_dikecualikan.json ({"KODE": "alasan"}), bukan di kode, jadi bisa ditambah atau dikurangi tanpa menyentuh skrip. Isi sekarang: BTPS dan BRIS (bank syariah), MIKA (rumah sakit), WIIM, HMSP, GGRM (rokok); MIKA dan BRIS ditambah 29 Okt 2026 (Djoko: “saya tidak suka bisnis syariah dan rumah sakit”). Kunci berawalan _ diabaikan, dipakai untuk catatan.
  • Mereka dikeluarkan dari universe: harga, RSI, dividen, dan NeoBDM tidak diambil untuk mereka, dan mereka tidak muncul di daftar mana pun di RSI Buy, termasuk “pernah dilepas, kini terkoreksi”. Berlaku juga untuk versi grup teman (12:30). Log mencatat dikecualikan atas permintaan: N saham (…).
  • Beda dari diabaikan(), yang khusus emiten tanpa harga (delisting). Berkas hilang atau rusak berarti tidak ada yang dikecualikan; RSI Buy tetap jalan.
  • Tidak mempengaruhi Rencana, yang hanya membahas saham yang kamu pegang. Kalau kamu memegang salah satunya, ia tetap dibahas di sana.

Yang dihitung sebagai ⚡ penguat (dicetak apa adanya di bawah tiap kandidat, mis. ⚡ 2 penguat: asing masuk · dekat dasar 52 mg):

  • 🏦 bandar berbalik akumulasi atau asing masuk (NeoBDM)
  • 📦 konsolidasi sempit + lonjakan volume
  • 🆕 saham baru terbit
  • 👤 orang dalam membeli dalam seminggu terakhir
  • 📍 harga masih di 20% terbawah rentang 52 minggu (dekat dasar)

Semuanya cuma penguat, bukan syarat: saham tanpa penguat tetap tampil selama sinyal RSI-nya ada. Penguat hanya dihitung untuk kandidat (undervalue + fundamental bersih + dividen > 0), karena hanya mereka yang mengambil konteks tambahan. Uji 21 Sep: GGRM (asing masuk), PANR & BLOG (dekat dasar) masing-masing 1 penguat, lalu empat saham ⚪fair.

RSI Buy 21 Sep 2026: overvalue disembunyikan, undervalue duluan, bandar hanya untuk kandidat

Keputusan Djoko sesudah membaca laporan 21 Sep: yang dicari saham undervalue dengan fundamental bagus.

  • Saham yang BELUM PERNAH bagi dividen tidak ditampilkan (30 Sep 2026). Sesudah posisi dikeluarkan dari RSI Buy, daftarnya didominasi saham spekulatif tanpa dividen — uji 30 Sep menyembunyikan BUKA dan GIAA. Yang pernah membagi lalu berhenti tetap tampil dengan tahun terakhirnya (BMTR 2018, MLPL 2017, MSIN 2021): itu informasi, bukan alasan menyembunyikan. Sakelarnya TANPA_DIVIDEN_DISEMBUNYIKAN di rsi_alert.py.
  • 🔴 Overvalue tidak ditampilkan sama sekali di RSI Buy — disaring sebelum daftar sinyal, cadangan, dan jenuh jual disusun. Jumlah yang disembunyikan dicatat di log (uji 21 Sep: 97 saham dari universe). Sejak 5 Okt 2026 ⚪fair ikut disembunyikan (permintaan Djoko, soal BWPT: lolos screening, laba tumbuh +23%, tapi diskonnya 1% dan tetap dicetak lengkap dengan tangga dan veto). Alasannya sama: titik masuk menuntut undervalue, jadi yang fair tidak akan pernah jadi kandidat dan mencetaknya cuma melatih mata untuk melewati baris. Uji 5 Okt: 54 overvalue + 9 fair disembunyikan (BUMI, BWPT, CYBR, GEMS, KIJA, MIKA, OMED, SILO, TINS), sisa 8 kandidat. Yang ⚫belum dinilai — nilai wajarnya tidak ada — tetap ditampilkan: itu keadaan yang berbeda, dan menyembunyikannya sama dengan menyembunyikan ketidaktahuan.
  • Sejak 7 Okt 2026 universe RSI Buy HANYA watchlist screening fundamental (permintaan Djoko: “yang tidak lolos screening fundamental enggak usah dinotif lagi”). Sebelumnya mereka tetap tampil dengan vonis “⛔ Bukan kandidat beli baru” — sisa dari masa sebelum 1 Okt, waktu screening masih penanda dan belum syarat. Disaring di universe, bukan di cetakan, jadi ongkos harga TradingView, RSI penutupan resmi, riwayat dividen yfinance, dan peringkat ikut hilang: uji 7 Okt 92 → 14 saham, laporan jadi 3 nama. Baris “✅ Lolos screening” juga tidak dicetak per saham lagi — semua yang tampil pasti lolos, jadi barisnya identik di tiap nama.
    Penjaga: kalau watchlist.json kosong atau gagal dibaca, saringan ini dilewati dan dicatat sebagai PERINGATAN di log. Berkas rusak tidak boleh mengosongkan laporan dengan tenang, karena laporan kosong akan terbaca sebagai “tidak ada peluang” padahal artinya “datanya hilang”.
    Harga yang dibayar: saham yang luput dari screening karena kedipan data (kasus CITA 1 Okt — sebenarnya lolos semua kriteria tapi tidak masuk daftar) sekarang tidak terlihat sama sekali sampai tanggal 28 berikutnya. Dulu ia masih muncul dengan vonis, jadi setidaknya kelihatan.
  • Urutan: undervalue dulu (pemisah pertama, bukan sekadar +1 poin ⭐ nilai), lalu 💪 sehat, lalu ⭐ nilai, lalu diskon terbesar ke nilai wajar.
  • Definisi KANDIDAT (21 Sep 2026) = undervalue + fundamental bersih + dividen > 0. Rinciannya di kotak di bawah.
  • Konteks tambahan hanya untuk kandidat: 🔊 lonjakan volume, 📦 konsolidasi sempit, 👤 orang dalam membeli, 🆕 saham baru terbit, 📍 posisi 52 minggu. (Sejak 5 Okt 2026 saham ⚪fair tidak ditampilkan sama sekali, jadi butir ini hanya berlaku untuk yang ⚫belum dinilai.) Pengambilan lonjakan volume (satu panggilan yfinance per saham) kini juga hanya untuk kandidat.
  • 🏦 Analisa bandar NeoBDM untuk kandidat yang sama, maksimal 10 saham per hari (--neo N untuk uji) — kuota NeoBDM ~200/hari, dan sejak alert bandarmologi dimatikan 21 Sep jatah itu tidak lagi dipakai laporan lain. Kandidat di atas batas ditandai “bandar tidak dicek”. Harga yang belum murah tidak jadi dibeli hanya karena bandarnya bagus — dan sejak 5 Okt 2026 saham ⚪fair memang sudah tidak muncul di daftar.
  • Fungsi pengambil bandar dipindah ke lib/bandar.py, dipakai bersama screener dekat titik terendah.
“Fundamental bersih” = tanpa satu pun poin pengurangPoin
DER tinggi (> 2,5x; energi & tambang 3x)−2
Rugi−2
ROE negatif−2
Ekuitas negatif−2
Dividen berhenti / belum pernah membagi−2
Laba turun — BUKAN pengurang, masih ditoleransi (sejak 19 Sep 2026)0

Dividen harus di atas 0. Syarat ini ditulis terpisah karena “bersih” hanya menghukum dividen yang berhenti; saham yang riwayat dividennya tidak terbaca sama sekali bisa lolos tanpa syarat ini.

Contoh 21 Sep 2026: PANR labanya turun 17% tapi tetap jadi kandidat — undervalue (diskon 55%), DER < 1, PBV 0,62x, dividen 7,25%. Dari 7 saham yang tampil pagi itu, 3 jadi kandidat (GGRM, PANR, BLOG) dan 4 lainnya ⚪fair tanpa konteks tambahan.

  • Satuan angka NeoBDM diperbaiki: B = miliar, tapi M = juta. Sebelumnya hanya B yang diterjemahkan, sehingga angka juta terbaca miliar (PANR “-Rp170M” = 170 juta, tercetak seperti 170 miliar). Sekarang T → T, B → M, M → jt. Laporan Sabtu 19 Sep sempat membawa kekeliruan ini.

Urut dari paling layak DIBELI — satu rumus untuk RSI Buy & dekat titik terendah (19 Sep 2026)

Prinsip Djoko: daftar ini untuk memutuskan beli. Valuasi kemahalan = pasti tidak dibeli, sedangkan laba turun masih oke — bisa pulih kalau perusahaannya sehat. Rumusnya satu, di lib/peringkat.py:

  1. ❌ MAHAL selalu paling bawah, berapa pun skornya: PER lebih mahal dari sektor, PBV > 3x, atau harga di atas nilai wajar (🔴overvalue). Alasannya dicetak, mis. ❌ MAHAL (PER lebih mahal dari sektor, PBV 10.4x, di atas nilai wajar 312%) — bukan untuk dibeli.
  2. 💪 Sehat menentukan lebih dulu: ROE ≥15% +1 (negatif −2), DER <1 +1 (>2,5x, energi/tambang 3x −2; bank tidak dinilai), laba YTD tumbuh +1, laba turun 0, rugi −2.
  3. ⭐ Nilai memisahkan yang sehatnya sama: PBV <1, PER lebih murah dari sektor, undervalue, dividen rata-rata ≥5% (masing-masing +1); dividen berhenti / tanpa dividen −2. Di laporan dekat titik terendah, bandar NeoBDM ikut di sini (berbalik akumulasi +2, asing masuk +1).

Tiap saham membawa baris 💪 sehat X · ⭐ nilai Y dan rincian poinnya. Di RSI Buy urutan lama (RSI terendah dulu) diganti; daftar cadangan ikut, daftar “Jenuh jual” tidak. Uji 18 Sep: RSI Buy — OMED (sehat 3), GGRM (sehat 2 · nilai 3, undervalue) teratas; DATA, BREN, BYAN, UNVR, BKSL, TPIA ❌ MAHAL di bawah. Dekat titik terendah — kandidat bersih 12 → 18 karena laba turun tak lagi pengurang; saham mahal (mis. HEAL) tersisih dari 25 yang tampil. Ikut diperbaiki: DER dulu tidak pernah terbawa ke data RSI Buy.

Tanda portfolio dari posisi nyata & kebocoran di grup teman ditutup (18 Sep 2026)

Tanda [..] di sebelah kode saham — di RSI Buy, RSI Sell, dan bandarmologi — sekarang dibaca dari posisi yang benar-benar dipegang (Stockbit per portfolio + Mirae, minimal 1 lot; lib/avgdown.peta_tanda()). Sebelumnya diambil dari grup di data/sell_watch_universe.json, yang sebenarnya daftar pantau dan tidak dibersihkan saat saham dijual. Ketahuan dari IPCC yang tertulis [MIRAE·Long] padahal posisi Mirae-nya dijual habis 11 Ags. Per 18 Sep ada 34 saham bertanda portfolio yang tidak dipegang (14 di antaranya MIRAE: IPCC, OILS, WINS, UNTR, ASII …) dan 4 posisi tanpa tanda (ASSA, KLBF, MIDI di Trading; INCO di Long). Angka untung/rugi di baris Posisi dari dulu sudah benar — yang salah hanya tandanya. Grup daftar pantau sendiri tidak diubah.

Versi grup teman ikut diperbaiki: penyaring (lib/notify.versi_publik) dulu hanya membuang tanda sesudah kode saham bercetak tebal, jadi di bagian Jenuh jual tanda seperti HEXA [MIRAE] lolos ke grup teman (dilaporkan 16 Sep). Sekarang ada dua lapis tambahan: tanda sesudah kode saham tanpa cetak tebal, dan jaring terakhir untuk kurung yang isinya hanya nama portfolio (termasuk nama lama Hold/Main/NO-DIV/DIV<3%/PENSION) di mana pun letaknya. Diuji penuh: RSI Buy & Sell versi teman nol tanda, nol harga rata-rata, nol jumlah lembar.

Yield band 3 tahun — dividennya murah atau biasa saja? (16 Sep 2026)

Pertanyaan Djoko: “kalau sekarang di bawah rata-rata tiga tahunnya, berarti sudah murah kan?” Jawabannya belum tentu, dan cara membacanya ada di bawah. Tiap saham yang tampil di RSI Buy sekarang membawa satu baris tambahan: di mana dividend yield hari ini berada dalam kisarannya sendiri selama 3 tahun.

1yield(t) = dividen 12 bulan terakhir ÷ harga hari tderet harian, 3 tahun ke belakang
LALU
2posisi yield hari ini di deret itupersentil, bukan rata-rata

Persentil dipakai karena rata-rata gampang dirusak satu angka ekstrem — cukup sekali dividen jumbo, rata-rata setahun penuh jadi tidak berarti. Yang dicetak tetap kalimat (“termasuk 13% yield tertinggi 3 th”), bukan angka persentil telanjang, karena arahnya kebalikan dari PER: pada yield, makin tinggi justru makin murah. Angka persentil telanjang terlalu gampang kebalik dibaca jam setengah sembilan pagi.

Yang dicetakArtinya
yield TERTINGGI 3 th (harga paling murah dibanding dividennya) 🟢persentil 100 — belum pernah semurah ini dalam 3 tahun
termasuk X% yield tertinggi 3 th (harga relatif murah dibanding dividennya) 🟢persentil ≥ 80
biasa sajapersentil 20–80, tidak ada yang istimewa
termasuk X% terendah 3 th (harga relatif mahal dibanding dividennya) 🔴persentil ≤ 20
kisaran dirusak dividen luar biasa masa lalumaks > 3× median dan persentil ≤ 20 — vonisnya dibuang, lihat penjelasan di bawah

Diubah 21 Okt 2026 atas pertanyaan Djoko soal NISP: “kenapa merah kalau devidendnya gede?” Kata “termahal” terbaca sebagai vonis harga saham seluruhnya, padahal yang dinilai cuma yield hari ini terhadap kisarannya sendiri selama 3 tahun. Sekarang bunyinya menyebut yield-nya dan menjelaskan artinya untuk harga. Di Rencana, bulatnya juga dipindah ke depan baris seperti baris lain (🟢 DV, ⚪️ ROE); “biasa saja” dan band yang dirusak distorsi memakai ⚪️. RSI Buy tetap menaruh bulat di ujung baris, sama seperti semua barisnya yang lain.

Empat jebakan yang sudah ditangani

1. Ex-date bergeser tiap tahun

Mayoritas emiten IDX membagi setahun sekali dan tanggalnya maju-mundur. Kalau ex-date tahun ini jatuh lebih lambat daripada tahun lalu, ada celah beberapa minggu ketika jendela 12 bulan kosong — yield terbaca 0% dan langsung jadi “titik termahal sepanjang 3 tahun” yang palsu. Jadi kalau jendelanya kosong, dividen terakhir dibawa maju, bukan dianggap nol.

2. Tapi jangan dibawa maju selamanya

Lewat 18 bulan tanpa membagi, itu dividen yang sudah berhenti, bukan yield yang masih berlaku. Band-nya dinyatakan tidak berlaku dan barisnya tidak dicetak sama sekali — yang bicara baris “dividen terakhir 2024” yang sudah ada. IMPC contohnya: ex-date terakhir 31 Mei 2024, jadi tidak dapat band.

3. Saham siklikal merusak kisarannya sendiri

Ini jebakan terbesarnya. Batu bara 2022–2024 membagi dividen rejeki nomplok yang tidak akan berulang, dan itu menetapkan langit-langit yang mustahil dikejar:

SahamYield kiniKisaran 3 thMedianKalau persentil dipercaya
ADRO10,17%6,97–101,76%17,53%persentil 3 → “mahal”, padahal 10% itu tinggi menurut ukuran mana pun
PTBA3,79%3,69–61,90%14,46%persentil 1
ITMG6,61%2,75–53,40%13,56%persentil 2

Karena itu band yang maksimumnya lebih dari 3× median dinyatakan terdistorsi. Tapi penandanya hanya dipasang kalau persentilnya juga rendah — artinya yang merusak ada di masa lalu dan membuat hari ini terbaca mahal. Kalau persentilnya justru tinggi, yang besar itu dividen sekarang, dan itu cerita lain yang ditangani butir 4.

4. Dividen luar biasa — dan angka yang benar-benar dipakai

Kalau dividen 12 bulan terakhir lebih dari 1,5× median dividen TTM-nya sendiri, alert menambahkan satu baris peringatan, lengkap dengan yield seandainya dividennya kembali sebesar biasanya. Peringatan tanpa angka itu gampang diabaikan:

  • MIDI — yield kini 4,36%, tapi dividen setahun terakhir Rp12 vs biasanya Rp5. Kalau kembali biasa, yield ≈ 1,71%.
  • CMRY — yield kini 6,59%, dividen Rp300 vs biasanya Rp90. Kalau kembali biasa, yield ≈ 1,98%.

Pembandingnya median dividen TTM bergulir, bukan total per tahun kalender. Yang kedua bikin positif palsu untuk emiten yang membagi dua kali setahun dengan tanggal bergeser — BBCA sempat terbaca “luar biasa” padahal dividennya naik wajar.

Koreksi harga yfinance — baris “DV 3 th” lama sedikit kebesaran

Waktu membangun band ini ketahuan dua hal sekaligus tentang data yfinance, dan yang pertama sudah memengaruhi baris “DV 3 th” yang jalan sejak lama:

  • history() default auto_adjust=True memundurkan harga lama untuk dividen. Dividen dibagi harga yang sudah dimundurkan → yield historis membengkak. ITMG 2022 terbaca 40,4% padahal sebenarnya 21,1%. Makin besar dividennya makin jauh melesetnya.
  • Tapi dengan auto_adjust=False, harga tidak lagi disesuaikan pemecahan saham, sementara saham.dividends tetap disesuaikan. SCCO 4:1 Maret 2024: harga 2022 (9.451) harus dibagi 4 dulu supaya sepadan dengan dividennya.

Jadi keduanya dikerjakan sendiri sekarang: ambil harga mentah, sesuaikan split saja (harga_riwayat()). Akibatnya angka DV historis turun tipis — UNVR 2024 dari 5,5% jadi 4,6%, 2025 dari 8,3% jadi 7,4%; saham berdividen kecil hampir tidak berubah. Angka yang baru ini yang benar.

28 Sep 2026: perbaikan di atas ternyata baru sampai di RSI Buy — sekarang satu sumber

Ketahuan waktu Djoko bertanya kenapa dividen BISI tidak kelihatan di Rencana. Dividennya ada, tapi angkanya beda dengan RSI Buy: Rencana menyebut BISI 2024 5,6%, RSI Buy 5,15%; ITMG jauh lebih jauh, 14,11% vs 11,38% (2024) dan 14,22% vs 12,93% (2025).

Sebabnya: koreksi auto_adjust 16 Sep hanya dipasang di rsi_alert.py, yang punya salinan riwayat_dividen() sendiri. lib/dividen.py — yang dipakai Rencana dan 11 script lain (RSI Sell, trailing profit, repair, laporan keuangan, semua screener Sabtu) — masih memakai history() apa adanya, jadi tetap membengkak. Ironisnya modul itu dibuat justru supaya tidak ada dua angka untuk saham yang sama.

Sekarang harga_riwayat(), hitung_yield_band(), dan renderer barisnya (teks_band()) tinggal di lib/dividen.py; rsi_alert.py mengimpor dari sana, salinannya dihapus. Diuji dengan membandingkan langsung terhadap rsi_alert versi lama: BISI, ITMG, SCCO, BBCA identik sampai 4 desimal, termasuk kini/min/maks/persentil band-nya. Semua laporan lain yang memakai lib/dividen ikut terbetulkan — angka DV mereka turun tipis, dan itu yang benar.

28 Sep 2026: yield band ikut tampil di Rencana, blok dividen digeser ke atas

Djoko: “saya kelewat lihatnya” — blok Rencana sepuluh baris per saham, dan dividen dulu terkubur di antara PER dan Lapkeu. Dua perubahan di lib/rapor_fundamental.baris():

  • Dividen jadi baris pertama dari blok fundamental, jadi di Rencana ia langsung menempel di bawah baris valuasi/nilai wajar — terbaca bersama harganya.
  • Yield band ditambahkan, memakai lib/dividen.teks_band() yang sama dengan RSI Buy, jadi bunyinya tidak mungkin berbeda.

Hasil uji dry-run 28 Sep untuk BISI (urutan sesudah baris ⚪fair · wajar Rp652):

⚪ DV 3 th: 2024 5.2% · 2025 2.9% · 2026* 3.4% (rata2 3.8%)
Yield kini 3.69% · kisaran 3 th 2.89–8.56% → biasa saja

Tanpa panggilan yfinance tambahan: band dihitung dari unduhan yang sudah dilakukan riwayat_dividen(). Kalau saham memang tidak membagi dividen, barisnya tetap ada dan berbunyi “belum pernah membagi” atau “berhenti sejak <tahun>” — bukan hilang begitu saja.

Keputusan yang sengaja diambil

  • Penanda, bukan saringan. Yield band tidak pernah membuang saham dari laporan — sama seperti RSI. Konteks antar sektor terlalu beda untuk diotomatiskan.
  • 3 tahun, bukan 1 tahun. Satu tahun terlalu pendek: kalau setahun terakhir kebetulan lesu, rata-ratanya sudah tertekan duluan, jadi “di bawah rata-rata” jadi terlalu ketat.
  • Yield band, bukan PER band. Dipilih lebih dulu karena dividen jauh lebih stabil daripada laba kuartalan, datanya paling lengkap, dan emiten yang memotong dividen langsung kelihatan jelek dengan sendirinya. PER band belum dipasang.
  • Nol panggilan API tambahan. Band memakai unduhan yfinance yang sama dengan baris “DV 3 th”, dan itu hanya diambil untuk saham yang benar-benar dicetak (maksimal 5), bukan seluruh universe 300-an.
  • Ikut ke versi grup teman. Tidak memuat apa pun tentang posisi.

Konteks dari screener mingguan & lonjakan volume (12 Sep 2026)

RSI menjawab kapan, screener mingguan menjawab ada apa — sampai 12 Sep keduanya tidak pernah bertemu. Pembelian orang dalam di GULA dikabarkan Sabtu; kalau GULA bersinyal RSI Buy hari Selasa, laporan paginya tidak menyinggungnya sama sekali, padahal justru gabungan keduanya yang jadi alasan beli. Sekarang tiap saham yang dicetak membawa peristiwanya sendiri, lengkap dengan angka dan tanggal kejadiannya.

BarisIsinyaMasa berlaku
👤 Orang dalam membelijabatan, jumlah lembar, nilai rupiah, porsi saham beredar — tanggal laporan ke IDX120 hari
🏗️ Aksi korporasikategori (termasuk ganti pengurus), mcap, ciri cangkang — tanggal pengumuman terbaru90 hari
🆕 Saham baru terbitpenambahan lembar dalam 24 bulan + lonjakan terbesarnya — tanggal perkiraan terbit400 hari
📉 Dekat dasar 52 mgposisi dalam rentang, rentangnya, jarak dari puncak — sejak kapan masuk daftar21 hari
🔊 Lonjakan volumerasio terhadap rata-rata 20 hari, tanggalnya, dan arah perkiraannya5 hari
📦 Konsolidasi sempit + lonjakan volumerentang konsolidasi, kelipatan volume, jarak harga dari atap, arah (akumulasi/campur) — dari screener Sabtu, diarsipkan sejak 19 Sep 202614 hari

Masa berlakunya beda-beda karena artinya beda. Pembelian orang dalam bulan lalu masih jadi bahan pertimbangan; “dekat dasar 52 minggu” sebulan lalu sudah tidak berarti apa-apa kalau harganya sudah naik 30%. Peristiwa yang lewat umurnya tidak dihapus dari arsip — hanya berhenti dicetak.

  • Alert RSI tidak mengambil data baru untuk ini. Yang dibaca arsip lokal data/peristiwa.json, diisi keempat screener mingguan lewat lib/peristiwa.py. Scraping keterbukaan informasi IDX 30 hari tiap pagi jam 08:30 terlalu mahal dan bisa membuat alert telat atau gagal — dan alert yang tidak datang jauh lebih merugikan daripada alert tanpa konteks.
  • Pengulangan tidak menumpuk. Screener mingguan melihat jendela 8–30 hari, jadi kejadian yang sama terlihat beberapa Sabtu berturut-turut. Kuncinya jenis + ticker + tanggal kejadian, sehingga yang kedua hanya memperbarui angkanya. data/jejak_broker.json kena masalah ini sebelumnya — TCID tercatat dua kali.
  • Arsipnya ikut ditulis saat --dry-run, karena isinya data nyata dan tidak ada risiko ganda. Itu juga cara mengisinya mundur: 12 Sep 2026 keempat screener dijalankan dalam mode uji dan menghasilkan 65 peristiwa (30 dekat dasar, 19 orang dalam, 9 aksi korporasi, 7 saham baru) tanpa satu pun kiriman Telegram.
  • Maksimal 4 baris peristiwa per saham, terbaru lebih dulu — GULA punya dua pembelian orang dalam dalam dua hari (9 dan 10 Sep), dan keduanya berarti.
  • Tidak memuat apa pun tentang posisi, jadi ikut terkirim utuh ke grup teman tanpa penyaringan tambahan. Diuji: versi --publik nol pola bocor.
  • Porsi saham beredar di atas 100% tidak dicetak apa adanya. Lembar beredar dihitung dari market cap ÷ harga, dan basis itu belum memuat saham yang baru diterbitkan — SQMI keluar “179,78% saham beredar” (7 Sep 2026). Bukan salah hitung, tapi terbaca seperti kekeliruan, jadi diganti keterangan “melebihi saham beredar tercatat — dari penerbitan saham baru?”.

Tambahan 19 Sep 2026: 📍 posisi 52 minggu untuk semua saham, 📦 konsolidasi, tanda “minggu ini”

  • 📍 Setahun dicetak untuk setiap saham, contoh 📍 Setahun: terendah Rp384 · tertinggi Rp755 → sekarang 8% di atas terendah, 45% di bawah tertinggi (dekat dasar). Kedua persen memakai patokan HARGA (naik dari terendah, turun dari tertinggi) — versi awal mencampur “8% dari rentang” (dibagi selisih terendah–tertinggi) dengan “45% di bawah puncak” (dibagi harga tertinggi) dan membingungkan karena tidak berjumlah 100%. Posisi dalam rentang kini hanya untuk label (dekat dasar ≤20%, dekat puncak ≥80%); laporan dekat titik terendah memakai bahasa yang sama — dari kolom TradingView price_52_week_low/high. Dulu hanya muncul kalau saham kebetulan masuk daftar “dekat dasar” (≤20% rentang). Baris arsip dekat-dasar dilebur ke sini (“📉 di daftar dekat dasar sejak …”) supaya angkanya tidak tercetak dua kali.
  • 📦 Konsolidasi sempit + lonjakan volume kini ikut diarsipkan screener Sabtu-nya, jadi muncul di RSI Buy (dan RSI Sell) selama 14 hari.
  • Kejadian arsip ≤ 7 hari diberi tanda “minggu ini” — terutama pembelian orang dalam. Yang lebih lama tetap dicetak dengan tanggalnya sampai masa berlakunya habis.
  • Ikut diperbaiki: tanda portfolio di screener konsolidasi kini dari posisi nyata.

Lonjakan volume — arahnya perkiraan, bukan data beli/jual

Volume harian tidak memisahkan beli dan jual: tiap transaksi punya kedua sisinya. Yang dipakai dua penanda tak langsung, sama dengan screener konsolidasi+volume: posisi penutupan dalam rentang harian (close − low) ÷ (high − low), dan arah harga dibanding penutupan sebelumnya.

AturanNilaiAlasan
Jendela diperiksa5 hari perdagangan“hari ini atau beberapa hari sebelumnya”
Ambang lonjakan≥ 2× rata-rata 20 harirata-ratanya tidak memuat hari lonjakan itu sendiri — kalau ikut, rasionya selalu tertarik ke bawah
condong belitutup ≥ 60% rentang & harga naikpembeli mau bayar lebih mahal sampai penutupan
condong jualtutup ≤ 40% rentang & harga turunpenjual mau melepas lebih murah
arah campursisanyapenutupan dan arah harga bertentangan
Rasio di atas 50×ditulis “>50x”biasanya emiten yang rata-ratanya nyaris nol, bukan lonjakan 50 kali lipat sungguhan

Arahnya tidak dipakai menyaring — dan itu disengaja

Di alert BELI, lonjakan volume dengan penutupan lemah adalah informasi paling penting di baris itu: ada yang memborong lalu melepas di penutupan. Kalau yang ditampilkan hanya lonjakan “condong beli”, alert beli berubah jadi alat yang cuma memperlihatkan hal-hal yang mendukung keputusan beli. Contoh nyata 12 Sep: IFII volume >50× dan harga +11%, tapi tutup cuma di 31% rentang harian — dilabeli arah campur, bukan disembunyikan.

Untuk tahu SIAPA yang membeli, itu ranah NeoBDM (bandarmologi). Sengaja tidak dipanggil dari alert RSI: kuotanya ~200 panggilan sehari dan setelah itu mengembalikan nol pembeli tanpa error — gejalanya diam, bukan gagal. Yang di sini cuma gambaran kasar dari bar harian yfinance.

Keputusan yang sengaja diambil

  • Baris Posisi menampilkan untung/rugi terhadap harga rata-rata, per broker kalau dipegang di dua tempat. Jangan tertukar dengan angka pada tanda CICIL di bawahnya: yang itu mengukur jarak ke pembelian terakhir, dan keduanya bisa berlawanan arah — saham yang −3% dari beli terakhir bisa masih +40% dari rata-rata. Kalau baru dibeli sekali, kedua angka memang sama.
  • Universe mengikuti laporan keuangan (7 Sep 2026): RSI Buy membaca emiten yang lolos saringan mutu /lapkeu ditambah posisi nyata kedua broker. Dengan begitu saham kandidat dari laporan keuangan tidak hilang hanya karena belum masuk grup watchlist.
  • Bisa dikirim ke lebih dari satu orang (9 Sep 2026). Daftar tujuannya di config.json → telegram.chat_ids_rsi; kalau kunci itu tidak ada, dipakai chat_id tunggal seperti sebelumnya. Hanya dua alert RSI ini yang berbagi — alert lain tetap satu tujuan. Tiap penerima dikirimi sendiri-sendiri, jadi satu orang yang memblokir bot tidak menjatuhkan kiriman ke yang lain.
  • Penerima selain pemilik dapat versi TANPA POSISI (10 Sep 2026). Dua daftar terpisah: chat_ids_rsi menerima laporan lengkap, chat_ids_rsi_publik menerima versi yang sudah dibuang untung/rugi terhadap harga rata-rata, jarak ke pembelian terakhir, bobot posisi di portfolio, jumlah lembar, dan tag akun/broker di sebelah kode saham. Sinyal, valuasi, dividen, dan fundamentalnya tetap utuh — yang rahasia posisinya, bukan sahamnya.
  • Versi publik dibuat dengan menyaring teks jadi, bukan menyusun ulang laporan (lib/notify.versi_publik). Baris posisi bentuknya khas dan stabil; menyusun ulang berarti dua versi laporan yang bisa menyimpang diam-diam. Penyaringnya sengaja galak — kalau ragu, dibuang: kehilangan satu baris konteks jauh lebih ringan daripada membocorkan posisi. Yang gampang terlewat dan ikut dibuang: 0.2% portfolio pada baris tanda CICIL. Paragraf Catatan: dari AI juga dibuang utuh (11 Sep 2026): di RSI Sell, bahan yang dikirim ke DeepSeek memuat untung/rugi tiap posisi, jadi narasinya bisa berbunyi “ERAA sudah untung 53,7%” — kalimat bebas yang tidak tertangkap penyaring per baris. Ketahuan sebelum kiriman pertama ke grup teman. Narasi RSI Buy (yang tidak memuat posisi) ikut terbuang; itu harga yang wajar untuk aturan yang tidak bisa kecolongan.
  • Paling praktis lewat grup Telegram (11 Sep 2026). Buat grup, masukkan @screener_saham1_bot, daftarkan chat_id grupnya ke chat_ids_rsi_publik — sesudah itu keluar-masuk anggota diatur langsung di Telegram tanpa SSH. Chat_id grup berupa angka negatif (-100…). Grup atau channel tidak pernah boleh masuk daftar versi lengkap: cek_chat_id.py menolaknya, karena semua anggota akan melihat posisimu. Saran: aktifkan Approve new members supaya tautan undangan yang tersebar tidak bisa dipakai masuk tanpa persetujuan.
  • Teman memakai bot terpisah (11 Sep 2026). Versi tanpa posisi dikirim lewat bot_token_publik, versi lengkap tetap lewat bot pribadi @screener_saham1_bot. Alasannya: nama bot di grup teman sesuai isinya, berbagi bisa diputus kapan saja dengan mematikan bot teman tanpa menyentuh alert pribadi, pesan iseng teman tidak masuk ke bot pribadi, dan kalau token bot teman bocor, bot pribadi tidak ikut kena. Kalau bot_token_publik belum dipasang, penerima publik tetap dikirimi lewat bot pribadi. cek_chat_id.py mencari grup lewat bot teman, karena grupnya berisi bot teman, bukan bot pribadi.
  • Token bot tidak pernah lewat percakapan dengan asisten. Dipasang lewat pasang_bot_publik.py di terminal, dengan input tersembunyi yang tampil sebagai bintang. Script itu memeriksa bentuknya, menanyakan keabsahannya ke Telegram, dan menolak token bot pribadi karena itu menggagalkan pemisahannya. Token tidak dicetak ke layar maupun log. config.json dan semua backup-nya dikunci ke izin 600; sebelumnya 664/644 dan bisa dibaca semua user di VPS, padahal sudah memuat token bot pribadi.
  • Jadwal terpisah untuk grup teman (11 Sep 2026). Pagi (08:30/08:40) hanya ke pemilik, versi lengkap. Siang (12:30 RSI Buy, 12:35 RSI Sell, dengan --publik) hanya ke grup teman, versi tanpa posisi. Teman sengaja tidak menerima alert pagi. Jam 12:30 bursa sedang istirahat (sesi 1 tutup 12:00, Jumat 11:30), jadi harga yang dipakai adalah penutupan sesi pagi yang beku; kepala pesannya menyebut terang bahwa bar hari itu belum final. Hasilnya dua potret sehari: pagi dari penutupan kemarin, siang dari sesi pagi hari itu.
  • Kenapa isi pagi dan siang bisa sangat berbeda: sebelum pasar buka, bar harian terakhir adalah bar kemarin; begitu pasar buka, bar hari ini mulai terbentuk. Jendela RSI 3 hari jadi bergeser satu hari, bukan cuma angkanya berubah sedikit. Kalau jam siang tidak ada sinyal, alert memakai daftar cadangan (5 saham terdekat, batas 40 dilepas) — itu bukan sinyal. Dua script RSI tidak menulis state apa pun, jadi jalan dua kali sehari aman; satu-satunya tulisan adalah cache PER industri harian. Jadwal siang tidak memanggil DeepSeek, karena narasi AI dibuang dari versi publik.
  • Mode privasi bot aktif — di grup ia tidak membaca obrolan anggota, cuma perintah yang ditujukan kepadanya. Jadi kalau grupnya tidak muncul di cek_chat_id.py, kirim /start@screener_saham1_bot di grup itu; “halo” biasa tidak terlihat oleh bot.
  • Grup yang naik jadi supergroup berganti chat_id. Telegram menolak kiriman ke id lama sambil menyebut id barunya (migrate_to_chat_id). Pengirim alert mengulang ke id baru supaya kiriman hari itu tetap sampai, lalu mencatat di log bahwa config perlu diganti. Config sengaja tidak ditulis otomatis dari cron — ia juga disunting agen lain.
  • Bot Telegram tidak bisa mengirim ke nomor HP. Yang dipakai chat_id, dan bot hanya boleh mengirim ke orang yang sudah pernah menekan Start di bot itu — aturan Telegram, bukan batasan script. Alur menambah penerima: orangnya buka @screener_saham1_bot → tekan Start → jalankan cek_chat_id.py di VPS dalam 24 jam untuk melihat chat_id-nya (Telegram hanya menyimpan pesan yang belum diambil selama itu), lalu tambahkan yang itu saja: cek_chat_id.py --tambah <chat_id>. Tidak ada yang ditambahkan otomatis — versi pertama script ini memasukkan semua chat yang terlihat, dan itu berbahaya: bot Telegram bisa ditemukan siapa saja, sementara alert RSI memuat harga rata-rata, untung/rugi, dan harga beli terakhir. Sekarang chat_id wajib disebut, dan chat_id yang belum pernah menghubungi bot ditolak — satu angka salah ketik tidak bisa mengirim portfolio ke orang asing. Mencabut: cek_chat_id.py --hapus <chat_id>.
  • Tetap tiap hari kerja — sempat diubah ke Senin & Rabu pada 2 Sep 2026, lalu dikembalikan hari itu juga. Jendela RSI cuma 3 hari, jadi pembalikan yang terjadi Selasa atau Kamis benar-benar hilang, bukan sekadar telat terbaca. Bandarmologi boleh dua kali seminggu justru karena skornya dihitung ulang tiap laporan.
  • Yang diuji terhadap 40 adalah dasar tiga hari, bukan harga hari ini. Versi lama menuntut RSI hari ini < 40, sehingga saham yang memantul dari 32 ke 41 justru hilang tepat saat pembalikannya paling meyakinkan.
  • Tidak disyaratkan naik berturut-turut. Satu hari koreksi kecil di tengah dulu membatalkan sinyal, padahal pola 30 → 32 → 31 → 33 jelas pembalikan.
  • Syarat ke-3 adalah penjaganya. Tanpa itu aturannya jatuh jadi “naik 1 hari” polos — pola 40 → 30 → 31 akan ikut lolos padahal cuma pantulan di tengah penurunan.

RSI Sell Alert

Sen–Jum 08:40

Pernah menyentuh zona jenuh beli lalu sudah turun dua kali. Sejak 17 Sep 2026 hitungannya sama dengan sinyal jual di 🎯 Rencana hari ini — dihitung fungsi yang sama (strategi.sinyal()), jadi keduanya tidak bisa lagi bertentangan.

Setiap baris juga membawa konteks laporan keuangan terbaru (YTD dibanding periode yang sama tahun lalu): 🟢 berbalik untung atau laba bertumbuh, ⚠️ laba turun, dan 🔴 berbalik rugi atau masih rugi.

1puncak RSI > 70 dalam 10 hari bursadihitung sejak RSI terakhir di bawah 50
DAN
2sejak puncak turun ≥ 2 kalitidak harus berturut: 93 → 91 → 92 → 89 sah
DAN
3RSI hari ini < semua angka sejak puncakmasih mencetak titik terendah baru
DAN
4syarat 1–3 pertama kali terpenuhi ≤ 3 hari bursa lalujendela lama dipertahankan

Direvisi 17 Sep 2026: turun 2 kali, sama dengan Rencana

Sebelumnya cukup turun sekali dalam jendela 3 titik (max(RSI, RSI[1], RSI[2]) ≥ 70, RSI di bawah RSI[1] dan RSI[2]). Rencana menuntut turun dua kali, jadi saham bisa tercantum di RSI Sell padahal Rencana belum menganggapnya sinyal. Keputusan Djoko: jual = turun 2 kali, beli = naik 1 kali, di ketiga laporan. RSI Buy tidak diubah — syarat 3 titiknya memang sudah “naik sekali”.

Yang sengaja dibiarkan beda dari Rencana: RSI Sell tetap daftar pantauan. Saham tetap tercantum selama RSI masih mencetak titik terendah baru sejak puncak, paling lama 3 hari bursa sesudah sinyalnya — Rencana cuma menyebutnya di hari pertama. Setiap saham yang bersinyal jual di Rencana hari itu pasti ada di RSI Sell, tapi tidak sebaliknya.

Tiga angka RSI dari TradingView tidak cukup untuk menghitung dua kali turun, jadi deretnya diambil dari lib/rsi_resmi (60 sesi penutupan resmi, yang memang sudah dihitung — tanpa unduhan tambahan). Kalau data saham itu gagal diambil, jatuh ke tiga titik TradingView: tetap terbaca kalau ketiganya turun berturut dari puncak.

Uji 17 Sep dengan data penutupan 16 Sep: 7 → 5 saham.

SahamRSI terakhirAturan lamaAturan baruKenapa
JECC85,2 → 78,7 → 82,1 → 88,1 → 70,2sinyaltidakpuncak baru 88,1 kemarin, baru turun sekali
AUTO · BSSR · KKGI—sinyaltidakturun 2 kalinya sudah terjadi 4–5 hari bursa lalu
SAMF82,3 → 82,3 → 63,2 → 55,3 → 53,5tidaksinyalpuncaknya 4 hari lalu, terlewat oleh jendela 3 titik
RALS71,4 → 61,4 → 61,4 → 64,3 → 59,5 → 51,2tidaksinyalsama — turun kedua terjadi kemarin

Sempat diuji tanpa syarat 4 (memakai jendela 10 hari Rencana apa adanya): daftarnya melonjak 7 → 16, berisi saham yang sinyalnya seminggu lalu dan RSI-nya sudah 51–59. Karena itu jendela 3 hari dipertahankan.

UnsurIsi
UniverseHanya posisi nyata Stockbit & Mirae
Daftar pantauRSI ≥ 70 tapi belum berbalik turun — belum sinyal, kandidat hari berikutnya
Konteks posisiUntung/rugi terhadap harga rata-rata per broker, diurutkan dari yang paling untung. Posisi yang sedang floating loss ditandai ⚠️ (10 Sep 2026)
Sisa < 1 lotDilewati — pecahan di bawah 1 lot tidak bisa dijual di pasar reguler. Tepat 1 lot IKUT dinilai sejak 3 Sep 2026: sisa “pengingat” sudah dijual, dan ada saham yang sengaja dipegang 1 lot karena harga per lotnya mahal — itu posisi trading sungguhan. Dihitung gabungan dua broker, dan ambangnya kini sejalan dengan laporan repair

Saran eksekusi (alert pribadi saja)

Sejak 11 Sep 2026, tiap saham bersinyal yang posisinya floating profit diberi saran konkret: berapa lot, di broker mana. Ringkasannya di paling atas pesan (🎯), rinciannya di bawah tiap saham (💰). Tinggal eksekusi.

StrategiRSI Sell menyala & untungRSI Buy menyala
PENSION (grup Main)jual separo, dibulatkan ke bawah per lot; separo sisanya inti yang tidak dijualbeli lagi separo yang tadi dijual, kalau harga di bawah harga jualnya
TRADING (DIV<3%, NO-DIV)jual semua—
  • Per broker, bukan gabungan. PRDA pada uji pertama: di Stockbit untung (disarankan jual separo), di Mirae rugi (diam). Strategi tiap saham dibaca dari data/sb_strategy.json dan data/mirae_strategy.json — berkas yang sama dengan laporan repair, boleh dikoreksi manual.
  • Belum ada di berkas strategi → ditebak dari grup Stockbit (Main = PENSION, DIV<3%/NO-DIV = TRADING), selebihnya PENSION. Salah tebak ke arah jual separo jauh lebih ringan daripada menyarankan jual semua. Sarannya diberi tanda supaya berkasnya dilengkapi.
  • Posisi rugi tidak dapat saran — tanda ⚠️ di baris posisi sudah cukup.
  • Inti tidak pernah dijual. Kalau separo PENSION sudah dijual dan belum dibeli lagi, RSI Sell berikutnya tidak menyarankan jual lagi. Posisi 1 lot tidak bisa diseparo.
  • Harga di saran = harga terakhir saat alert dibuat (untuk alert pagi: penutupan kemarin). Eksekusinya di harga pasar.
  • Riwayat jual ada di data/catatan_jual.json, diisi lewat catat_jual.py setiap Claude atau GPT mencatat penjualan (Kesepakatan Format butir 5 di NOTES.md). Status “sudah dibeli lagi” tidak disimpan — dihitung dari jumlah lembar di portfolio dibanding sisa lembar saat jual, jadi tidak ada penanda yang bisa lupa diperbarui.
  • Versi grup teman membuang ringkasan 🎯 dan saran 💰, karena memuat jumlah lot dan harga.

Konteks dari screener mingguan & lonjakan volume (12 Sep 2026)

Sama seperti RSI Buy — aturan, masa berlaku, dan batasannya dijelaskan di sana. Bedanya hanya arah yang disorot: di sini lonjakan volume dengan penutupan lemah yang menguatkan alasan melepas. Arahnya tetap tidak dipakai menyaring, jadi lonjakan condong beli pada posisi yang sudah untung juga ikut tercetak — itu justru alasan untuk menahan dulu (SCCO 9 Sep: volume 4,9× dengan tutup di 75% rentang harian, dua hari berturut melonjak).

Peristiwa yang sama dibaca dari arsip yang sama, jadi satu saham tidak pernah diberi angka berbeda di dua laporan.

Keputusan yang sengaja diambil

  • Sell hanya untuk posisi nyata (7 Sep 2026): saham yang hanya berada di grup watchlist tidak lagi dinilai RSI Sell. Ini mencegah alert jual muncul untuk saham yang tidak dimiliki.
  • Bisa dikirim ke lebih dari satu orang (9 Sep 2026). Daftar tujuannya di config.json → telegram.chat_ids_rsi; kalau kunci itu tidak ada, dipakai chat_id tunggal seperti sebelumnya. Hanya dua alert RSI ini yang berbagi — alert lain tetap satu tujuan. Tiap penerima dikirimi sendiri-sendiri, jadi satu orang yang memblokir bot tidak menjatuhkan kiriman ke yang lain.
  • Penerima selain pemilik dapat versi TANPA POSISI (10 Sep 2026). Dua daftar terpisah: chat_ids_rsi menerima laporan lengkap, chat_ids_rsi_publik menerima versi yang sudah dibuang untung/rugi terhadap harga rata-rata, jarak ke pembelian terakhir, bobot posisi di portfolio, jumlah lembar, dan tag akun/broker di sebelah kode saham. Sinyal, valuasi, dividen, dan fundamentalnya tetap utuh — yang rahasia posisinya, bukan sahamnya.
  • Versi publik dibuat dengan menyaring teks jadi, bukan menyusun ulang laporan (lib/notify.versi_publik). Baris posisi bentuknya khas dan stabil; menyusun ulang berarti dua versi laporan yang bisa menyimpang diam-diam. Penyaringnya sengaja galak — kalau ragu, dibuang: kehilangan satu baris konteks jauh lebih ringan daripada membocorkan posisi. Yang gampang terlewat dan ikut dibuang: 0.2% portfolio pada baris tanda CICIL. Paragraf Catatan: dari AI juga dibuang utuh (11 Sep 2026): di RSI Sell, bahan yang dikirim ke DeepSeek memuat untung/rugi tiap posisi, jadi narasinya bisa berbunyi “ERAA sudah untung 53,7%” — kalimat bebas yang tidak tertangkap penyaring per baris. Ketahuan sebelum kiriman pertama ke grup teman. Narasi RSI Buy (yang tidak memuat posisi) ikut terbuang; itu harga yang wajar untuk aturan yang tidak bisa kecolongan.
  • Paling praktis lewat grup Telegram (11 Sep 2026). Buat grup, masukkan @screener_saham1_bot, daftarkan chat_id grupnya ke chat_ids_rsi_publik — sesudah itu keluar-masuk anggota diatur langsung di Telegram tanpa SSH. Chat_id grup berupa angka negatif (-100…). Grup atau channel tidak pernah boleh masuk daftar versi lengkap: cek_chat_id.py menolaknya, karena semua anggota akan melihat posisimu. Saran: aktifkan Approve new members supaya tautan undangan yang tersebar tidak bisa dipakai masuk tanpa persetujuan.
  • Teman memakai bot terpisah (11 Sep 2026). Versi tanpa posisi dikirim lewat bot_token_publik, versi lengkap tetap lewat bot pribadi @screener_saham1_bot. Alasannya: nama bot di grup teman sesuai isinya, berbagi bisa diputus kapan saja dengan mematikan bot teman tanpa menyentuh alert pribadi, pesan iseng teman tidak masuk ke bot pribadi, dan kalau token bot teman bocor, bot pribadi tidak ikut kena. Kalau bot_token_publik belum dipasang, penerima publik tetap dikirimi lewat bot pribadi. cek_chat_id.py mencari grup lewat bot teman, karena grupnya berisi bot teman, bukan bot pribadi.
  • Token bot tidak pernah lewat percakapan dengan asisten. Dipasang lewat pasang_bot_publik.py di terminal, dengan input tersembunyi yang tampil sebagai bintang. Script itu memeriksa bentuknya, menanyakan keabsahannya ke Telegram, dan menolak token bot pribadi karena itu menggagalkan pemisahannya. Token tidak dicetak ke layar maupun log. config.json dan semua backup-nya dikunci ke izin 600; sebelumnya 664/644 dan bisa dibaca semua user di VPS, padahal sudah memuat token bot pribadi.
  • Jadwal terpisah untuk grup teman (11 Sep 2026). Pagi (08:30/08:40) hanya ke pemilik, versi lengkap. Siang (12:30 RSI Buy, 12:35 RSI Sell, dengan --publik) hanya ke grup teman, versi tanpa posisi. Teman sengaja tidak menerima alert pagi. Jam 12:30 bursa sedang istirahat (sesi 1 tutup 12:00, Jumat 11:30), jadi harga yang dipakai adalah penutupan sesi pagi yang beku; kepala pesannya menyebut terang bahwa bar hari itu belum final. Hasilnya dua potret sehari: pagi dari penutupan kemarin, siang dari sesi pagi hari itu.
  • Kenapa isi pagi dan siang bisa sangat berbeda: sebelum pasar buka, bar harian terakhir adalah bar kemarin; begitu pasar buka, bar hari ini mulai terbentuk. Jendela RSI 3 hari jadi bergeser satu hari, bukan cuma angkanya berubah sedikit. Kalau jam siang tidak ada sinyal, alert memakai daftar cadangan (5 saham terdekat, batas 40 dilepas) — itu bukan sinyal. Dua script RSI tidak menulis state apa pun, jadi jalan dua kali sehari aman; satu-satunya tulisan adalah cache PER industri harian. Jadwal siang tidak memanggil DeepSeek, karena narasi AI dibuang dari versi publik.
  • Mode privasi bot aktif — di grup ia tidak membaca obrolan anggota, cuma perintah yang ditujukan kepadanya. Jadi kalau grupnya tidak muncul di cek_chat_id.py, kirim /start@screener_saham1_bot di grup itu; “halo” biasa tidak terlihat oleh bot.
  • Grup yang naik jadi supergroup berganti chat_id. Telegram menolak kiriman ke id lama sambil menyebut id barunya (migrate_to_chat_id). Pengirim alert mengulang ke id baru supaya kiriman hari itu tetap sampai, lalu mencatat di log bahwa config perlu diganti. Config sengaja tidak ditulis otomatis dari cron — ia juga disunting agen lain.
  • Bot Telegram tidak bisa mengirim ke nomor HP. Yang dipakai chat_id, dan bot hanya boleh mengirim ke orang yang sudah pernah menekan Start di bot itu — aturan Telegram, bukan batasan script. Alur menambah penerima: orangnya buka @screener_saham1_bot → tekan Start → jalankan cek_chat_id.py di VPS dalam 24 jam untuk melihat chat_id-nya (Telegram hanya menyimpan pesan yang belum diambil selama itu), lalu tambahkan yang itu saja: cek_chat_id.py --tambah <chat_id>. Tidak ada yang ditambahkan otomatis — versi pertama script ini memasukkan semua chat yang terlihat, dan itu berbahaya: bot Telegram bisa ditemukan siapa saja, sementara alert RSI memuat harga rata-rata, untung/rugi, dan harga beli terakhir. Sekarang chat_id wajib disebut, dan chat_id yang belum pernah menghubungi bot ditolak — satu angka salah ketik tidak bisa mengirim portfolio ke orang asing. Mencabut: cek_chat_id.py --hapus <chat_id>.
  • Tetap tiap hari kerja — sempat diubah ke Senin & Rabu pada 2 Sep 2026, lalu dikembalikan hari itu juga. Jendela RSI cuma 3 hari, jadi pembalikan yang terjadi Selasa atau Kamis benar-benar hilang, bukan sekadar telat terbaca. Bandarmologi boleh dua kali seminggu justru karena skornya dihitung ulang tiap laporan.
  • Posisi yang floating loss ditandai ⚠️ (10 Sep 2026). Angka +12% dan −12% terbaca sama cepat waktu men-scroll, padahal untuk alert JUAL bedanya menentukan: melepas di atas harga rata-rata itu merealisasikan untung, di bawahnya merealisasikan rugi — dan pertanyaannya berubah dari “sudah waktunya panen?” jadi “apakah ceritanya memang sudah rusak?”. Ditandai per broker, bukan gabungan: satu saham bisa +15,9% di Stockbit dan −26,4% di Mirae (TOWR pernah begitu), dan itu dua keputusan berbeda. Sengaja memakai ⚠️, bukan 🔴/🟢 — warna merah/hijau di laporan ini sudah dipakai untuk menilai valuasi.
  • Tidak menunggu RSI kembali di bawah 70. RSI 93 yang turun ke 89 sudah sah — puncaknya jauh di atas ambang.
  • Bukan “turun 2 hari berturut”. Sempat dipakai, lalu dibuang: satu hari pantulan kecil membatalkan sinyal padahal 93 → 91 → 92 → 89 arahnya jelas turun.
  • Laporan tidak dipecah antara yang sudah tembus balik dan yang masih di atas 70. Nilai RSI dan puncaknya tetap dicetak, jadi bedanya masih terlihat.

Trailing profit

Sen–Jum 13:00

Memberi tahu kalau untung sebuah posisi sudah turun banyak dari untung tertingginya — supaya untung yang pernah ada tidak habis tanpa disadari. Jam 13:00 sejak 2 Okt 2026 (sebelumnya 17:00, atas permintaan Djoko). Harga diambil langsung dari TradingView, bukan dari cache 16:45, jadi pemindahannya tidak mengubah apa pun selain jamnya; jam segitu bursa sedang istirahat sehingga harganya penutupan sesi pagi yang sudah beku. Hanya dikirim ke pemilik.

Disaring sejak 2 Okt 2026

Alert ini dulu berbunyi untuk setiap untung yang mengempis, dan itu bikin bingung. Kejadiannya di NCKL: untungnya turun 56% dari puncak, jadi alert berbunyi — padahal harganya 42% di bawah nilai wajar dan labanya rekor (lima kuartal naik berturut-turut, semester I 2026 +41%). Pesannya terbaca seperti perintah jual untuk posisi yang justru ditahan oleh rem jual. Djoko: “berarti sebenernya trailing profit alert ini enggak gitu penting juga ya, mending matikan aja daripada bikin bingung.”

Tapi mematikannya meninggalkan lubang: saham yang fundamentalnya rusak lalu merosot perlahan dan tidak pernah naik ke atas nilai wajar tidak akan pernah memunculkan saran jual, karena jalur jual menuntut RSI >70 atau harga di atas wajar. Alert inilah satu-satunya yang berbunyi di kasus itu. Jadi ia disaring, bukan dimatikan: untung mengempis plus setidaknya satu hal yang bisa ditindaklanjuti.

Syarat tambahanArtinya
Harga sudah di atas nilai wajartangga jual memang hidup di situ
Yield sudah di bawah 3%alasan memegangnya sebagai Long hilang
Fundamentalnya memburuklapkeu merah atau laba negatif — rem jual lepas sendiri

Ketiganya sengaja cerminan dari rem_jual() dan JUAL_HOLD_YIELD_MIN di lib/tangga, supaya alert ini tidak pernah lagi menyarankan sesuatu yang akan ditahan sistem sendiri. Yang tersaring dicatat di log, bukan dibuang diam-diam; kalau semuanya tersaring, tidak ada pesan yang dikirim. Kalau pengambilan datanya gagal, pemicunya disimpan — satu pesan berlebih lebih baik daripada kehilangan peringatan yang benar.

Uji 2 Okt: NCKL tersaring (diskon 42%), sementara TOTL (2% di atas wajar), CITA (21% di atas wajar), dan PTMP (tanpa dividen + laba negatif) tetap lolos.

1untung tertinggi posisi ≥ 25%di bawah ini tidak dipantau
DAN
2untung sekarang ≤ 70% dari untung tertinggi= untung turun ≥ 30% dari puncaknya
UnsurIsi
PuncakHarga penutupan tertinggi sejak mulai dipantau 4 Sep 2026, hanya bisa naik. Tidak direkonstruksi dari grafik 52 minggu. Disimpan per posisi di data/trailing_peak.json; posisi yang dijual habis dibuang, jadi pembelian ulang mulai dari puncak baru
Per portfolioBBCA di Long dan BBCA di Trading dihitung terpisah, masing-masing dengan harga rata-rata sendiri
Bunyi ulangSesudah sekali memberi tahu, baru bunyi lagi kalau turunnya bertambah ≥ 10 poin, atau harga membuat puncak baru
Nilai kecilBerkurang < Rp100.000 dari puncak → cuma disebut namanya dalam satu baris
Sudah rugiTetap dilaporkan, ditandai UNTUNG HABIS, SEKARANG RUGI — itu kasus terburuk aturan ini
Ambangconfig.json → trailing_profit

17 Sep 2026: bahasa sehari-hari + data fundamental

Permintaan Djoko: pesannya membingungkan, dan untuk memutuskan “jual semua atau tahan sebagian” butuh kondisi bisnisnya, bukan cuma harga.

DuluSekarang
giveback 30%bunyi kalau untung turun ≥30% dari untung tertinggi
aktivasi profit ≥25%hanya posisi yang untungnya pernah ≥25%
profit +29,4% → +18,7% (mengempis 36%)untung +29,4% → +18,7% (turun 36% dari untung tertinggi)
nilai Rp218.255 · menguap dari puncak Rp125.000untung sekarang Rp218.255 · berkurang Rp125.000 dari puncaknya
picu Rp2.814alert bunyi di bawah Rp2.814
posisi memicuposisi kena alert
label MAIN / TRADINGdibuang — portfolio sudah tertulis (SB/Long), label lama berdasar dividen cuma membuat “SB/Long · MAIN” yang membingungkan

Tiap saham yang dirinci kini membawa:

  • Baris jual separo: berapa lembar/lot (dibulatkan ke bawah per lot) dan untung yang terkunci, plus sisa yang tetap dipegang. Tidak dicetak kalau posisinya cuma 1 lot atau sudah rugi.
  • Rapor fundamental yang sama dengan RSI Buy dan Rencana: label valuasi + nilai wajar, ROE/PBV/DER/laba bertanda 🔴⚪🟢, PER vs industri, dividen 3 tahun, laporan keuangan terbaru, lalu peristiwa dan berita 90 hari.

Rapor hanya diambil untuk saham yang dirinci, bukan 227 posisi. Kalau pengambilannya gagal, alertnya tetap terkirim tanpa rapor. Uji dengan SCCO (kasus 17 Sep): undervalue diskon 54%, PBV 0,40x, DER 0,00x, laba Q2 tumbuh +12%, dividen rata-rata 4,0% — jual separo = 2 lot, untung dikunci Rp87.302.

🏦 Bandar sedang mengumpulkan

Selasa 07:30

16 Okt 2026. Djoko menghidupkan lagi analisa bandarmologi yang dimatikan 21 Sep 2026, tapi dengan urutan terbalik: “namanya juga analisa bandarmologi, jadi syarat utamanya bandar lagi ada indikasi kumpulin. kalau syarat teknikal lain itu sebagai penunjang aja supaya entry nya enggak lagi jenuh beli.”

Jadi daftarnya berangkat dari indikasi kepemilikan, bukan dari harga. Saham yang bandarnya tidak mengumpulkan tidak pernah masuk, semurah apa pun harganya — itu urusan RSI Buy.

Semestanya: watchlist + saham yang dipegang

Indikasi kepemilikan NeoBDM menyapu seluruh pasar, tapi daftarnya langsung dipotong ke watchlist fundamental + posisi yang sedang dipegang sebelum kuota NeoBDM dipakai. Saham di luar keduanya tidak akan pernah dibeli, jadi tidak ada gunanya diperiksa. Yang dipegang tapi tidak lolos screening tetap tampil dan ditandai, karena aturan beli harian tidak akan menyarankannya.

Daftarnya jadi pendek, dan itu memang maksudnya. Uji 16 Okt 2026: 42 saham berindikasi mengumpulkan di seluruh pasar → cuma 7 yang ada di watchlist atau dipegang → 1 lolos penjaga (LSIP, diskon 45%, RSI 43, asing masuk +266% di atas rata-rata setahun). Minggu-minggu kosong akan biasa. Kalau tidak ada yang lolos, tidak ada pesan sama sekali.

Kenapa ini bukan pengulangan RSI Buy

RSI Buy juga memeriksa bandar, tapi hanya untuk saham yang sudah memberi sinyal beli: RSI pernah ≤40 lalu mulai naik, dan harus lolos screening fundamental. Laporan ini tidak menunggu pembalikan RSI dan tidak terbatas pada watchlist, karena yang dicari jejak pengumpulan — yang biasanya terjadi sebelum harganya bergerak.

Sumbernya dashboard kepemilikan, bukan tabel “Top Akumulasi”

Tool get_bandarmologi_screener rusak. NeoBDM merombak halaman screener-nya: tabel Tabulator yang dibaca parser sudah tidak ada, diganti tab bulanan BPOS. Diperiksa 16 Okt 2026, jawabannya “Gagal mengambil data screener”. Jadi daftar peringkat akumulasi siap pakai tidak tersedia lagi.

Yang masih hidup dan cuma butuh satu permintaan: dashboard kepemilikan. Tiga kategorinya dibaca sebagai indikasi mengumpulkan, dan kategori asalnya dicetak di tiap baris karena bobotnya tidak sama:

KategoriArtinyaBobot
🏢 Potensi Buyback Institusiemitennya sendiri yang menampungpaling langsung
📥 Scripless Bertambahsaham masuk ke penitipan, ciri institusisedang
🚶 Lokal Individu Berkurangritel keluar, barangnya diserappaling tidak langsung — ia hanya mengatakan ritel berkurang, bukan siapa yang menampung

Penjaganya — penunjang, bukan pemicu

Saham yang tidak lolos screening fundamental tetap ditampilkan tapi ditandai, karena aturan beli harian tidak akan pernah menyarankannya.

Cara membaca baris arus dana asing dan lokal (20 Okt 2026)

Djoko, setelah melihat PTBA: “asing berkurang 231% dibanding rata rata? lokal yang +146.7M dari sebelumnya jual terus 81.4M/bulan?” Lalu: “ubah jadi kalimat biasa.”

Yang diukur. Arus bersih, yaitu nilai beli dikurangi nilai jual dari data broker, bukan jumlah saham yang dipegang. “Bln ini” di NeoBDM berarti 30 hari terakhir, bukan bulan kalender. Pembandingnya rata-rata per bulan selama 12 bulan sebelum 30 hari itu. “M” artinya miliar rupiah.

sebelum: 🌏 Asing: -Rp122.5 M bln ini | rata2 setahun: +Rp93.3 M/bln → -231% vs rata2
sesudah: 🌏 Asing berbalik jual Rp122.5 M dalam 30 hari (setahun terakhir rata-rata beli Rp93.3 M per bulan)
         🏠 Lokal berbalik beli Rp146.7 M dalam 30 hari (setahun terakhir rata-rata jual Rp81.4 M per bulan)

Kenapa persen lama menyesatkan. Rumusnya (bulan ini − rata-rata) ÷ rata-rata. Kalau tandanya berbalik, hasilnya bisa lewat dari 100%: (−122,5 − 93,3) ÷ 93,3 = −231%. Itu terbaca “asing berkurang 231%”, padahal yang terjadi asing berbalik dari pembeli menjadi penjual. Untuk lokal tidak ada persen sama sekali karena pembaginya negatif; NeoBDM menggantinya dengan label “BERBALIK AKUMULASI”.

KeadaanKalimat
tanda sama dengan rata-rata“beli Rp180.0 M dalam 30 hari (rata-rata setahun beli Rp90.0 M per bulan, 100% lebih besar dari biasanya)”. Dalam 10% ditulis “kira-kira sama dengan biasanya”.
tanda berbalik“berbalik jual” atau “berbalik beli”, tanpa persen, dengan rata-rata setahun di dalam kurung
tanpa pembanding setahun“(pembanding setahun tidak tersedia)”

Jangan terlalu cepat membaca “bandar mulai masuk”. Pada PTBA, asing menjual dan lokal membeli dengan nilai yang hampir sama. Gambaran yang lebih tepat adalah pergantian pemegang, bukan akumulasi dari luar. NeoBDM juga tidak membedakan “lokal” itu institusi atau ritel, dan satu transaksi blok besar sudah cukup untuk membalik angka sebulan. Baris sinyal 🏦 dan poin +2 dipicu oleh arah berbaliknya saja, tanpa memeriksa apakah sisi asing justru menjual. Cek daftar broker pembeli dan penjual teratas di bawahnya untuk melihat siapa yang menampung.

Diubah di lib/bandar.py, bukan di server NeoBDM (yang juga dipakai konektor lain). Penghitung poin diuji setara: enam kombinasi tanda (beli/jual, berbalik, tanpa pembanding, hanya satu sisi) menghasilkan poin yang sama persis dengan versi lama. Penanda “asing masuk” kini mengenali format baru dan tetap mengenali format lama. Pola baris yang tidak dikenali diproses dengan cara lama.

Kuota NeoBDM yang menentukan bentuknya

Arus dana per saham makan 5–7 permintaan, kuotanya ±200 sehari, dan RSI Buy tiap pagi sudah memakai sampai 10 saham. Karena itu laporan ini mingguan dan arus dananya hanya diambil untuk 8 nama teratas; maksimal 12 baris ditampilkan. Jalannya ±9 menit, selesai sebelum Rencana 08:00. Selasa dipilih karena Senin sudah “kuat saat pasar lemah”, Rabu “dasar 52 minggu”, Kamis “di atas wajar tapi rugi”.

Uji 16 Okt 2026 sebelum semestanya dipotong (seluruh pasar): 42 indikasi → 9 lolos penjaga → 8 diambil arus dananya, 8/8 berdata, ±9 menit. Tujuh dari sembilan nama itu di luar watchlist, dan itulah yang membuat pemotongan semesta perlu. Sesudah dipotong: 7 saham diperiksa, 1 lolos, ±1 menit dan hanya ±7 permintaan NeoBDM.

Batas waktu NeoBDM dinaikkan 60 → 180 detik di lib/bandar.py. Satu panggilan arus dana memakan 30–60 detik, jadi batas 60 detik yang lama kadang lewat tipis dan hasilnya terbaca “0 berdata” — terlihat seperti kuota habis padahal cuma kehabisan waktu. Tercatat 3 dari 5 hari bursa 12–16 Okt.

INFORMASI, BUKAN SARAN BELI. Indikasi kepemilikan itu jejak yang sudah terjadi. Yang boleh dieksekusi tetap dari pesan Rencana.

Kriteria yang gagal disebut (27 Okt 2026). Djoko: “kalau tidak masuk kriteria watchlist, tolong tampilkan kriteria spesifik yang mana.” Di bawah baris ⚠️ “tidak masuk kriteria watchlist” kini ada baris ↳ yang menyebut saringannya satu per satu, misalnya ERAA: “FCF negatif”, CFIN: “ROE 4,1% (perlu >5%) · dividen belum 3 tahun berturut”. Sumbernya sama dengan baris serupa di Rencana (lib/sebab_gugur, dihitung ulang dengan data hari ini dan disimpan sebulan).

Bandarmologi

Sen & Rab 08:00

DIMATIKAN 21 Sep 2026 — analisa bandar pindah ke kandidat RSI Buy

Keputusan Djoko: laporan ini memakai ±100 permintaan NeoBDM tiap Senin & Rabu (kuota ±200/hari), sementara yang benar-benar dipakai untuk memutuskan beli cuma segelintir saham. Sekarang analisa bandar hanya dijalankan untuk kandidat RSI Buy: undervalue + fundamental bersih + ada dividen + lolos kriteria RSI, maksimal 10 saham per hari lewat lib/bandar.py. Cron root dimatikan (8 → 7 baris); bandarmologi_daily.py masih ada, jangan dihidupkan tanpa diminta.

16 Okt 2026: analisa bandar yang berdiri sendiri hidup lagi dalam bentuk lain — 🏦 Bandar sedang mengumpulkan, Selasa 07:30. Bukan laporan ini yang dihidupkan: yang itu menyapu pasar lalu memeriksa bandar per saham (±100 permintaan), yang baru berangkat dari dashboard kepemilikan (satu permintaan) dan dipotong ke watchlist + posisi yang dipegang sebelum kuota dipakai (±7 permintaan).

Penguat “smart money” di 🎯 Rencana dihitung ulang dari kandidat RSI Buy. Skor 0–150 tidak bisa dihitung lagi (jejak broker, kepemilikan, likuiditas, dan konfirmasi IDX ikut berhenti), jadi yang dipakai arus dana dari analisa bandar kandidat: RSI Buy 08:10 menulis data/bandar_kandidat.json (ticker → poin & alasannya: bandar berbalik akumulasi +2, asing masuk +1), lalu Rencana 08:00 (hari bursa berikutnya) membacanya dan mencetak mis. smart money: asing masuk +1. Berkas lebih tua dari 1 hari diabaikan. Skor bandarmologi lama masih dipakai sebagai cadangan selama ≤ 7 hari dan ditandai (data lama); sesudah itu penguat ini hanya datang dari kandidat RSI Buy. Aturan di bawah ini arsip.

Menyaring saham fundamental sehat yang harganya di bawah nilai wajar, lalu memeriksa siapa yang sedang mengumpulkan. Delapan lapisan, berurutan.

#LapisanIsi
0Rotasi sektorMatriks sektor NeoBDM, sebagai konteks — tidak menyaring
1Universe fundamentalwatchlist.json, hasil screening kuartalan
2Diskon vs nilai wajarMinimal 20% di bawah nilai wajar harian → ambil 20 teratas
3Flow bandarAsing & lokal 30 hari vs rata-rata 12 bulan
4Jejak harga brokerHarga rata-rata broker 3 jendela, hanya 8 teratas
5KepemilikanRitel melepas · nominee · scripless bertambah
6Perubahan vs kemarinSinyal baru / menguat / melemah (selisih ≥ 20)
7Float & tekananFlow dibagi nilai transaksi harian; float < 15% ditandai rawan
8Konfirmasi IDXLaporan perubahan kepemilikan & pengumuman buyback

Skor 0–150

KomponenNilai
Asing berbalik akumulasi setelah setahun cenderung jual+25
Direksi/komisaris menambah kepemilikan (lapor IDX)+25
Asing net beli · asing beli > 2× rata-rata+20
Broker lolos uji perilaku menguasai ≥ 30% pembelian+20
Broker averaging down (keyakinan tinggi)+20
Ritel melepas, smart money mengambil · tekanan ≥ 10× · buyback · pemegang ≥5% menambah+15
Scripless bertambah · porsi broker terverifikasi ≥ 10%+10
Indikasi nominee · tekanan 3–10× · pola ambigu+5
Free float tipis (< 15%)−5
Broker mengejar harga · tak ada pola akumulasi · flow kecil vs likuiditas · pemegang ≥5% melepas−10
Direksi/komisaris MELEPAS kepemilikan−20

Membaca skornya

  • Jalan Senin & Rabu saja (sejak 2 Sep 2026). Skornya tidak terpengaruh — dihitung ulang dari nol tiap laporan. Yang berubah cuma pembandingnya: “perubahan vs laporan sebelumnya” berarti 2–5 hari, bukan sehari, dan “median N laporan” bukan N hari kalender.
  • STRONG ≥ 105 WATCH ≥ 67 — masing-masing 70% dan 45% dari plafon 150.
  • Yang menentukan isi laporan adalah peringkat, bukan ambang. Selalu tampil 5 teratas berapa pun skornya, sampai 8 kalau banyak yang lewat WATCH. Sistem yang hanya memakai ambang bisa diam total berminggu-minggu — tidak berguna untuk menabung rutin.
  • Kode broker tidak menentukan kualitas pembeli. Nama besar dipakai ritel, broker ritel dipakai institusi. Yang dinilai perilakunya: skala, harga rata-rata di bawah air, dan konsistensi lintas jendela.

Sehat & dekat titik terendah setahun

Sabtu 09:00

DIMATIKAN 27 Sep 2026 — sudah tertutup RSI Buy

Keputusan Djoko. Info yang dicari dari laporan ini — seberapa jauh harga dari titik terendah 52 minggu — sudah dicetak RSI Buy untuk tiap kandidatnya (baris 📍, dihitung langsung dari kolom TradingView, bukan dari arsip laporan ini), dan “dekat dasar 52 mg” juga dihitung sebagai ⚡ penguat di sana. Titik masuknya tetap sinyal RSI, jadi daftar saham murah tanpa sinyal tidak dipakai.

Pemicunya: Sabtu 26 Sep analisa bandar di laporan ini gagal total — 12 saham dicek, 0 berdata, semuanya dalam ~30 detik (bukan timeout, tapi balasan kosong cepat dari NeoBDM). Diperiksa 27 Sep: langganan NeoBDM aktif (sisa 23 hari), layanan MCP hidup sejak 18 Ags tanpa restart, uji BBRI normal, dan kuota jelas belum terpakai karena laporan ini yang pertama jalan Sabtu pagi. Jadi gangguannya sesaat dari sisi NeoBDM dan tidak meninggalkan jejak error.

Cron claude-scripts dikomentari (18 → 17 baris aktif); screen_dekat_low.py masih ada, jangan dihidupkan tanpa diminta. Analisa bandar di RSI Buy tetap jalan untuk kandidatnya. Arsip peristiwa dekat dasar berhenti terisi — baris “di daftar dekat dasar sejak …” akan hilang sendiri dalam 21 hari; angka posisi 52 minggunya sendiri tidak terpengaruh. Aturan di bawah ini arsip.

🏦 Analisa bandar NeoBDM untuk kandidat terbaik (19 Sep 2026)

Saham yang PBV, PER vs sektor, ROE, dan dividennya tidak ada yang bertanda 🔴 (semua 🟢 atau ⚪) mendapat analisa bandar dari NeoBDM, sama dengan yang dipakai laporan lain: sinyal (mis. “🔄 berbalik akumulasi”), arus dana asing dan lokal 30 hari terakhir dibanding rata-rata setahun, dan 3 broker pembeli & penjual teratas dengan harga rata-rata mereka.

  • Kenapa hanya kandidat bersih (keputusan Djoko): satu saham memakan ±5–7 permintaan NeoBDM dan kuotanya ±200 sehari, sementara hari Sabtu screener konsolidasi (10:00) dan orang dalam (11:00) ikut memakainya. Saham yang sudah punya tanda merah punya alasan untuk dilewati tanpa perlu melihat bandarnya.
  • Batas 12 saham sebagai jaring pengaman. Kandidat bersih di atas batas diberi keterangan “bandar tidak dicek — lewat batas”, dan kepala pesan menulis “dicek X dari Y kandidat”. Uji 19 Sep: 15 kandidat bersih dari 25 yang ditampilkan.
  • NeoBDM yang kena kuota tidak error — ia diam-diam memberi data kosong. Sesudah 3 saham berturut tanpa data, pengambilan berhenti dan sisanya ditandai “NeoBDM berhenti menjawab (kemungkinan kuota)”, bukan “tidak ada bandar”.
  • Diambil lewat layanan MCP NeoBDM (HTTP), cara yang sama dengan screener konsolidasi — skrip ini jalan dengan python sistem.
  • Ikut diperbaiki: tanda “dipegang [..]” kini dari posisi nyata (avgdown.peta_tanda()), bukan grup daftar pantau yang basi.

⭐ Urut dari kandidat paling ideal (19 Sep 2026)

Permintaan Djoko. Dulu urutannya hanya kedekatan ke titik terendah 52 minggu — saham paling dekat dasar bisa saja dividennya berhenti. Sekarang tiap saham diberi poin dan dicetak dengan nomor peringkat serta rinciannya:

FaktorPoin
PBV < 1 (🟢)+1
PER lebih murah dari sektor (🟢) / lebih mahal (🔴)+1 / −2
ROE ≥ 15% (🟢)+1
Dividen rata-rata ≥ 5% (🟢) / berhenti atau belum pernah (🔴)+1 / −2
Bandar “berbalik akumulasi” (NeoBDM)+2
Asing net beli 30 hari terakhir+1
  • Poin sama → yang lebih dekat ke dasar didahulukan. Merah dihukum −2 supaya satu cacat tidak tertutup dua tanda hijau.
  • Dividen kini diambil untuk semua saham yang lolos (dulu hanya 25 yang tampil), karena ikut menentukan siapa yang masuk 25 teratas. Uji 19 Sep: ASII, HMSP, KLBF, PWON, NRCA, MAIN masuk daftar tampil; ASSA & MAIN di puncak (4 poin).
  • Urutannya dua tahap: skor mutu menentukan 25 yang tampil dan 12 kandidat bersih yang dicek NeoBDM, lalu poin bandar ditambahkan dan daftar diurut ulang.
  • Bobot sengaja sederhana dan mudah diubah (skor_mutu(), skor_bandar() di screen_dekat_low.py).

Direvisi siang 19 Sep 2026: KESEHATAN FINANSIAL dulu — diperbarui sore: kini memakai rumus bersama di bagian RSI Buy (gerbang ❌ MAHAL, laba turun 0)

Keputusan Djoko: “utamakan kesehatan finansialnya dulu”. Urutan kini dua lapis — 💪 sehat menentukan lebih dulu, ⭐ nilai (tabel di atas tanpa ROE) hanya memisahkan yang sehatnya sama, lalu kedekatan ke dasar.

💪 SehatPoinPatokan
ROE ≥ 15%+1sama dengan rapor fundamental
DER < 1x / > 2,5x (energi & tambang 3x)+1 / −2bank tidak dinilai
Laba YTD tumbuh / turun / rugi+1 / −1 / −2sama dengan baris Lapkeu RSI Buy

Tiap saham kini juga membawa baris Lapkeu:. Kandidat bersih (yang dicek bandarnya) = tanpa satu pun pengurang, termasuk ⚠️ laba turun. Uji 19 Sep: 8 saham sehat penuh 3 poin (MAIN, SCMA, HMSP, MYOR, MTDL, CPIN, MIDI, AVIA), MAIN teratas karena nilainya juga 3; ASSA turun karena laba Q2 −2%; tepat 12 kandidat bersih, semuanya berdata NeoBDM. Pesan jadi 5 potongan Telegram (dulu 3).

Jalan mingguan, menyapu seluruh emiten IDX — bukan hanya watchlist — supaya saham berfundamental bagus yang belum pernah masuk daftar ikut terlihat. Data close Jumat sudah final saat laporan dikirim.

SaringanAmbangCatatan
Posisi dalam rentang 52 minggu≤ 20%(harga − terendah 52w) ÷ (tertinggi 52w − terendah 52w). Sejak 4 Sep 2026 angka rentangnya ikut dicetak supaya terbaca sendiri: rentang 52w Rp1.530–2.490 · harga di 3% dari dasar
Laba bersihpositifAmbang yang sama persis dengan penjaga tanda CICIL — satu fungsi, lib/avgdown.layak_tambah
ROE> 5%
PBV< 3
DER≤ 2,5 (sumber daya 3,0)
Nilai transaksi harian≥ Rp1 Mrata-rata 10 hari — buang saham tidur
Kapitalisasi pasar≥ Rp300 M—
  • BUKAN sinyal beli. Tidak ada syarat pembalikan sama sekali di sini — beda dengan RSI Buy Alert. Banyak isinya masih dalam tren turun. Harga dekat titik terendah bisa berarti salah harga, bisa juga pasar sudah tahu sesuatu.
  • Diukur terhadap rentang, bukan jarak dari titik terendah. Saham berentang sempit bisa 8% di atas low tapi sebenarnya sedang di tengah-tengah.
  • Pendatang baru ditandai 🆕 dibanding minggu lalu (data/dekat_low_state.json), dan yang keluar dari daftar disebut di bawah. Daftar yang itu-itu saja tiap minggu akan berhenti dibaca.
  • Dividen dari riwayat 3 tahun (lib/dividen.py), bukan field dividends_yield_current TradingView — field itu kosong baik untuk berhenti sejak 2021 (BBYB) maupun belum pernah membagi (BUKA), dan keduanya beda arti. Barisnya selalu dicetak, tidak pernah hilang diam-diam.
  • Harga beli terakhir dicetak kalau sahamnya dipegang — per broker, dengan selisihnya terhadap harga sekarang, sama seperti RSI Buy Alert dan laporan repair. Itu acuan yang dipakai tanda CICIL, dan yang menentukan apakah menambah di sini benar-benar lebih murah daripada masuk terakhir kali.
  • Pemeriksaan sekali jalan — tidak ada uji tren laba beberapa tahun seperti screening kuartalan. Status dipegang / watchlist dicetak supaya jelas mana yang benar-benar nama baru.
  • Jalan pertama 1 Sep 2026: 26 saham lolos dari 1.200 emiten (60 gugur fundamental, 186 tidak likuid).

Saham baru terbit & di bawah nilai wajar

Sabtu 09:30

27 Sep 2026: tidak mengirim laporan sendiri — jadi info pendukung di RSI Buy

Kata Djoko: “titik masuknya sebetulnya berdasarkan RSI yang sedang berbalik arah naik dari bawah 50 … alert ini tidak perlu dilakukan terpisah, tapi sebagai tambahan info pada RSI Buy”. Screener tetap jalan tiap Sabtu 09:30 dengan --tanpa-kirim: menghitung penambahan lembar saham, memperbarui data/shares_cache.json, dan mengisi arsip peristiwa — tanpa satu pun kiriman Telegram.

Arsip diisi dari SELURUH penerbitan yang ketemu (lembar naik ≥10% dalam 24 bulan pada saham yang di bawah nilai wajar), bukan hanya yang lolos saringan umur 30 hari. Alasannya, di RSI Buy ini cuma info pendukung: penerbitan 3 bulan lalu pun tetap berguna asal sahamnya sedang bersinyal RSI. Saringan umur tetap ada di kode untuk isi laporan, kalau sewaktu-waktu dihidupkan lagi.

Yang muncul di RSI Buy: baris 🆕 Saham baru terbit <tanggal>: lembar +X% dalam 24 bln untuk kandidatnya, dan “saham baru terbit” ikut dihitung sebagai ⚡ penguat. Masa tampilnya 400 hari — uji 27 Sep: dari 11 penerbitan di arsip, yang masih tampil GMFI (264 hari) dan IMJS (291 hari); TOWR 426 hari ke atas sudah tidak.

Uji mode senyap 27 Sep: 9 penerbitan diarsipkan, 0 kiriman Telegram, berkas arsip berubah sebagaimana mestinya. Aturan isi laporan di bawah ini tetap berlaku kalau pengirimannya dihidupkan lagi.

Berangkat dari temuan BandarLab (@wdcandraa): dari 421 saham IDX yang pernah ambruk 70%+ (2017–2026, tanpa 2020), yang benar-benar merampungkan penerbitan saham baru rata-rata +41,5% setahun berikutnya (n=14), sedangkan yang cuma mengumumkan rencana rata-rata −24,2% (n=407). Screener ini memakai gagasan itu sebagai saringan awal, lalu menuntut harganya di bawah nilai wajar.

SaringanAmbangCatatan
Penambahan lembar saham≥ 10% / 24 bulanbersih, setelah stock split dibagi keluar
Diskon ke nilai wajar≥ 20%ambang yang sama dengan bandarmologi
Nilai transaksi harian≥ Rp1 Mrata-rata 10 hari
Kapitalisasi pasar≥ Rp300 M—
Fundamental—penanda saja ✅ sehat / ⚠️ lemah + sebabnya; tidak menggugurkan

Yang dilaporkan: KABAR baru, bukan kejadian baru (27 Sep 2026)

Kata Djoko: “kalau memang publik baru tahu dikasih laporan seminggu terakhir ya enggak apa apa, daripada enggak tau sama sekali”. Jadi patokannya kapan kabarnya sampai ke kita, bukan kapan kejadiannya. Sebuah saham dilaporkan kalau salah satu terpenuhi:

  1. Tanggal lonjakannya belum pernah ada di data kita jalan sebelumnya — berapa pun umur kejadian aslinya. Lonjakan 1 Januari yang baru masuk data 3 Maret tetap dilaporkan pada screening 7 Maret, bertanda ⏳ baru masuk data minggu ini.
  2. Atau lonjakannya sendiri ≤ 30 hari lalu — kejadian yang memang masih segar, walau sudah terlihat minggu lalu.

Yang tersaring bukan yang “tua”, melainkan yang sudah kita ketahui sejak jalan-jalan sebelumnya — kalau tidak, laporan Sabtu jadi daftar yang sama berulang. Penambahan lembar tetap diukur dalam jendela 24 bulan (perlu untuk koreksi stock split). Daftar diurut dari lonjakan terbaru, dan umurnya dicetak: lonjakan ±2026-09-12 · 15 hari lalu.

Kenapa tidak bisa “seminggu terakhir”: jumlah saham beredar di yfinance tidak diperbarui harian. Dari 101 saham di cache per 27 Sep 2026, tidak ada satu pun lonjakan dalam 90 hari terakhir — yang paling baru 264 hari lalu (GMFI), dan tanggal data terakhir tiap emiten berbeda-beda (ada yang masih 17 Nov 2025). Jendela seminggu akan selalu kosong.

Jaring pengaman data terlambat. Kalau lonjakan nyata terjadi 1 Januari tapi baru masuk data 3 Maret, saringan umur akan membuangnya (“sudah 66 hari”) padahal buat kita itu kejadian baru. Karena itu saham tetap lolos kalau tanggal lonjakannya belum pernah ada di cache jalan sebelumnya, ditandai ⏳ baru masuk data minggu ini.

Patokannya tanggal lonjakan di cache, bukan “baru masuk daftar”. Versi pertama sempat memakai arsip peristiwa (kapan saham pertama kali tercatat di laporan ini) dan langsung meloloskan WIFI, EXCL, FILM, GSMF dengan lonjakan 439–710 hari lalu — keempatnya baru masuk daftar karena harganya baru cukup murah, bukan karena datanya baru. Diuji: dengan cache asli 9 saham tersaring, laporan kosong; dengan cache dipalsukan (entri EXCL dihapus) EXCL lolos bertanda ⏳.

Laporan yang kosong sekarang berbunyi “Tidak ada penerbitan saham baru yang terdeteksi minggu ini” — memang diam kalau tidak ada kejadian.

Membaca baris lembar +25% · lonjakan ±2025-01-21

Baris ini soal jumlah saham beredar, bukan harga. Contoh JPFA (laporan 27 Sep 2026), angkanya dicek langsung ke data:

  • lembar +25% — jumlah saham beredar bertambah 25% dalam jendela 24 bulan terakhir: dari 9,40 miliar lembar (30 Sep 2024) menjadi 11,70 miliar (26 Ags 2026). Angka bersih, sesudah faktor stock split dikeluarkan (JPFA tidak split, jadi murni saham baru).
  • lonjakan ±2025-01-21 — tanggal lompatan terbesar-nya: sekali terbit +2,8 miliar lembar (+31,8% dari jumlah saat itu). Tanda ± karena itu tanggal data mencatat perubahan, bukan tanggal resmi aksi korporasinya — bisa meleset beberapa hari.

Periodenya bergerak, dan ujungnya bukan hari ini. Jendela 24 bulan dihitung mundur dari hari screener jalan, tapi titik akhirnya adalah data lembar saham terakhir yang tersedia di yfinance — untuk JPFA 26 Ags 2026, sebulan sebelum laporannya terbit. Jumlah saham beredar memang tidak diperbarui harian. Jadi bacanya: “dalam dua tahun terakhir sampai data terakhir”, bukan “sampai hari ini”. Naik-turun kecil di dalam jendela juga tidak terlihat — JPFA sempat turun ke 8,8 miliar lembar sebelum melonjak, jadi lompatan 31,8% itu lebih besar daripada kenaikan bersih 25%.

Dua hal yang perlu diingat saat membacanya:

  • Pemegang lama terdilusi. Lembar bertambah 25% berarti porsi kepemilikan mengecil dan laba per saham terbagi ke lebih banyak lembar. Sisi baiknya ada uang segar masuk ke perusahaan — itu justru inti tesisnya.
  • Jenis penerbitannya tidak bisa dibedakan. Rights issue, private placement, konversi waran, dan MESOP sama-sama terlihat sebagai “lembar bertambah”. Untuk tahu persisnya, cek keterbukaan informasi emitennya.

Cara tahu sahamnya benar-benar terbit

  • Bukan dari pengumuman — justru itu intinya: rencana dan realisasi dibedakan oleh apakah jumlah lembarnya benar-benar bertambah. Yang dibaca riwayat saham beredar, bukan keterbukaan informasi. Tidak perlu scraping IDX/KSEI.
  • Stock split wajib dibagi keluar. MSIN naik +430% lembar dalam 24 bulan, tapi 5× dari split Oktober 2024 — penerbitan sesungguhnya cuma ~6%. Tanpa koreksi ini setiap emiten yang split salah masuk daftar sebagai rights issue jumbo.
  • Rights issue, private placement, konversi waran, dan MESOP tidak terpisahkan — semuanya terlihat sama sebagai lembar bertambah. Untuk tujuan di sini (uang segar masuk, pemegang lama terdilusi) memang sekelas, tapi jangan dibaca harfiah sebagai “rights issue”.
  • Kalau sahamnya sudah dipegang, harga beli terakhir dan selisihnya terhadap harga sekarang ikut dicetak — per broker, bukan dirata-rata, karena dua broker bisa punya harga masuk yang jauh berbeda (TOWR: +15,9% di SB tapi −26,4% di Mirae).
  • Tanggalnya perkiraan (kapan tercatat di data), bukan tanggal efektif korporasi. Data lembar saham juga tidak selalu mutakhir — sebagian emiten datanya berhenti beberapa bulan lalu, jadi penerbitan yang sangat baru bisa telat terdeteksi.

Yang perlu diingat

  • Sisi “realisasi” di studi aslinya cuma 14 kejadian. Video itu sendiri menyebutnya petunjuk, bukan patokan — jangan diperlakukan sebagai aturan.
  • Nilai wajarnya bukan regresi PBV~ROE lintas universe. Regresi memberi “wajar menurut cara pasar menghargai risiko saat ini”, padahal saham yang baru menerbitkan saham baru justru sering sedang dihukum pasar — acuannya ikut turun bersama yang mau diukur. Dipakai lib/fv_tv.py, sama dengan bandarmologi dan RSI Alert.
  • Dilusi itu nyata: EPS dan nilai buku per lembar turun. Diskon ke nilai wajar di sini dihitung dari data setelah penerbitan, tapi tetap periksa untuk apa uangnya dipakai.

1 Okt 2026: screening fundamental jadi penjaga pintu

beli baru · avg down · avg up

Pemicunya pertanyaan Djoko soal BBHI: pemicu −10% terpenuhi, fundamental lolos, tapi harganya 104% di atas nilai wajar — kok malah disarankan avg down? Dari situ ketahuan tiga aturan beli berjalan dengan ukuran yang berbeda-beda, lalu dirapikan seluruhnya dalam satu hari.

Angka yang mendasari semuanya

Dihitung 1 Okt 2026 atas seluruh posisi, dibelah menurut lolos-tidaknya screening fundamental kuartalan:

PosisiModalHasil bersihRugi belum nyata
Lolos screening106Rp309,3 jt−4,9%−Rp32,6 jt
Tidak lolos116Rp296,0 jt−15,9%−Rp71,3 jt

Modal hampir sama besar (49% vs 51%), tapi 69% kerugian belum nyata ada di sisi yang tidak lolos, dengan kinerja tiga kali lebih buruk. Ini korelasi, bukan bukti sebab-akibat — tapi arahnya masuk akal: kriteria yang gugur umumnya laba, dividen, FCF, dan DER, bukan harga. PBV satu-satunya yang berbasis harga, dan harga yang jatuh justru mempermudah lolos PBV.

Kesimpulan Djoko: “kalau sudah terlanjur salah beli, saya tidak mau buru-buru cutloss, tapi kita lakukan program penyelamatan. Tapi untuk beli baru, mustinya kita harus lebih ketat dalam pilih saham.”

Tiga pintu beli, sekarang satu ukuran

JalurDuluSejak 1 Okt 2026
Beli baru (RSI Buy)cukup bukan overvalue; saran muncul untuk fair jugawajib lolos screening DAN undervalue
Avg downnilai wajar tidak ikut menentukanwajib undervalue (pagi itu sempat “tidak overvalue”, lalu dinaikkan)
Avg upRSI ≤40, screening tidak dilihatRSI ≤50, wajib lolos screening

Alasan avg up ikut diperketat: ia memasukkan uang baru ke posisi yang sudah untung, jadi sifatnya sama dengan beli baru, bukan penyelamatan posisi rugi. Yang di luar screening tetap boleh di-avg down kalau harganya turun — itu jalur penyelamatan — hanya tidak dikejar ke atas.

Yang tertahan tidak hilang diam-diam. Rencana punya dua blok info baru: ⏸️ AVG DOWN ditahan dan ⏸️ AVG UP ditahan, masing-masing menyebut sebabnya. RSI Buy mencetak ⛔ Bukan kandidat beli baru — belum lolos screening fundamental dan/atau belum undervalue.

Diperbarui 21 Okt 2026: kedua blok itu sekarang sudah dibuang dari Rencana. “AVG UP ditahan” dibuang 8 Okt, “AVG DOWN ditahan” dibuang 21 Okt atas permintaan Djoko: “kalau harga diatas nilai wajar kan saya memang tidak mau beli?” Blok itu ternyata juga memuat saham dengan diskon 0–15% dan yang nilai wajarnya belum bisa dihitung, meski judulnya hanya menyebut “di atas nilai wajar”. Aksi di balik blok tetap dihitung (dipakai pengingat tinjauan bisnis tahunan); hanya barisnya yang tidak lagi dikirim ke Telegram.

Ambang RSI avg up dilonggarkan ke 50

Pertanyaan Djoko: “avg up harus nunggu RSI mulai naik dan di bawah 40 juga?” Dulu iya, karena cabangnya menempel pada sinyal yang sama dengan entry. Logikanya beda: entry mencari saham yang jatuh lalu pulih, avg up untuk saham yang sedang naik dan masih murah. Dari 25 posisi Long yang lolos semua syarat avg up lainnya, yang RSI-nya ≤40 cuma 5; yang ≤50 ada 15 — termasuk MPMX (DY 16,7%), PSAB (19,6%), SPTO, UNIC, TUGU.

Teknisnya S.sinyal() mendapat parameter ambang dan reset: RSI_BELI_NAIK = 50 dengan RSI_RESET_NAIK = 60. Level reset wajib ikut naik — kalau tetap 50, kandidat ber-RSI 50 akan mereset episodenya sendiri dan sinyalnya tak pernah ada. Syarat “mulai naik” tetap, jadi ULTJ dengan RSI 77,8 tidak lolos. Entry dan avg down tetap ≤40.

Watchlist: dari hampir tak terpakai jadi penjaga dua arah

Pertanyaan Djoko: “kalau watchlist tidak dipakai buat kandidat RSI Buy, lalu apa gunanya?” Jawabannya memalukan: sesudah blok kandidat-beli-baru di Rencana dimatikan 30 Sep, watchlist.json tidak punya satu pun pemakai aktif. (Saya sempat menyebut bandarmologi harian sebagai pemakainya — itu salah, laporan tersebut dimatikan 21 Sep 2026 justru karena analisa bandar dipindah ke kandidat RSI Buy.)

Screening jadi bulanan, dan ambang dividennya >0%

Djoko: “kalau screening fundamental akan jadi kriteria RSI Buy, berarti mungkin memang perlu lebih sering direfresh, misalnya tiap bulan.” Jadwal 15 Apr + 28 Mei/Ags/Nov → tanggal 28 tiap bulan, 06:00. Waktu aturan baru dipasang, watchlist masih dari 22 Agustus dan jadwal berikutnya 28 November — saringan beli berdiri di atas data enam minggu.

Ambang min_avg_dividend_yield_pct diturunkan ≥1% → >0%, disamakan dengan RSI Buy. Djoko: “ada saham fundamental bagus yang dividen kecil tapi layak ditradingkan seperti MAPI.” Syarat dividen 3 tahun berturut tetap, jadi “>0%” otomatis terpenuhi oleh adanya dividen itu sendiri.

Dijalankan manual 1 Okt 10:12–10:19 (533 saham, ±7 menit): watchlist 126 → 133. Masuk 10 — CASS, HMSP, INKP, LPGI, MAPA, MAPI, PBSA, PDPP, SILO, TKIM; keluar 3 — GEMS, IFSH, MSJA. Sembilan anggota kini ber-yield di bawah 1%, buah ambang baru itu, termasuk MAPI 0,6% yang persis dicontohkan.

Dua koreksi atas kriteria yang sering disalahingat

  • Payout <70% itu penanda saja, bukan saringan. Saham dengan payout 85% tetap masuk watchlist, hanya diberi catatan.
  • DER ≤2,5 itu KALI, bukan persen. Energi/tambang ≤3,0x, dan sektor keuangan dilewati sama sekali — bank memang berutang, DER-nya tidak bermakna di situ.

Tangga avg down & tangga naik — berapa besar belinya tiap tahap

di RSI Buy & Rencana

Pertanyaan Djoko 29 Sep 2026: “anggaran saya untuk tiap saham maksimal 10 juta … berapa banyak beli di awal lalu berapa besar pembelian berikutnya?” Jawabannya sekarang ikut dicetak: lib/tangga.py, dipakai baris 🪜 di RSI Buy dan Rencana hari ini.

1bentuk tangga 1 : 1,5 : 2,5 : 5 satuanselalu 4 tahap; pengali antar tahap 1,5x → 1,67x → 2x. Tiap tahap dibeli saat harga turun 10% dari pembelian sebelumnya
21 satuan = maks(Rp1 juta, harga 1 lot)saham biasa → satuan Rp1 juta → tangga penuh Rp10 juta
3saham mahal: satuannya ikut harga lot, tidak dipaksa muat Rp10 jutarevisi 29 Sep 2026 — GGRM (1 lot Rp1,71 jt) tangga penuh Rp14,9 juta riil; ITMG/UNTR (1 lot ±Rp2,5 jt) Rp21,8 juta riil
4tahap ke berapa = dari kedalaman harga (floating loss terhadap harga rata-rata)revisi 30 Sep 2026 — 0% / −10% / −19% / −27,1% menandai tahap 1–4. Uang yang sudah masuk dihitung dari buying_value seluruh broker (anggaran per SAHAM, bukan per portfolio), tapi ia menentukan JATAH, bukan tahap
5jatah = target kumulatif tahap itu − uang yang sudah masukbukan nominal rung-nya; lihat catatan di bawah
6jatah dipotong sisa anggaran, dan dibulatkan ke bawah ke lot utuhkalau sisanya kurang dari 1 lot, itu dikatakan apa adanya

Kenapa 1 : 1,5 : 2,5 : 5, bukan rata atau 1:2:4:8

Hitungan 29 Sep 2026, harga beli pertama dinormalkan 1000, tangga harga jadi 1000 → 900 → 810 → 729 (anggaran Rp10 juta habis di tahap 4):

PolaAvg akhirImpas butuh naikUntung kalau balik ke harga awalUntung kalau naik 30% dari tahap 1 saja
Rata 1:1:1:1-15,2%+16,3%+1,79 jt+750 rb
1 : 1,5 : 2,5 : 5 (dipakai)-20,7%+8,8%+2,61 jt+300 rb
1:2:4:8-21,6%+7,5%+2,76 jt+200 rb
1:3:9:27-23,8%+4,6%+3,12 jt+75 rb

Revisi 29 Sep 2026: satuan ikut harga lot, bukan sebaliknya

Djoko: “untuk saham yang per lot-nya >1 juta, tidak perlu dibatasi 10 juta, disesuaikan aja dengan kebutuhannya … mungkin aja saya harus alokasikan total sampai 20 juta kalau memang diperlukan untuk mengikuti rule yang sudah kita buat”, menyusul “kalau memang idealnya butuh 15 juta, saya oke juga”.

Versi pertama memendekkan tangga jadi 3 atau 2 tahap supaya muat Rp10 juta. Akibatnya saham mahal punya aturan yang berbeda dari saham murah — padahal yang diinginkan justru aturan yang sama. Sekarang jumlah tahapnya selalu 4; yang menyesuaikan satuannya.

Contoh1 lotTahap 1Nominal penuhRiil sesudah dibulatkan ke lot
CSRA Rp690Rp69 rbRp1,0 jtRp10,0 jtRp9,9 jt
GGRM Rp17.125Rp1,71 jtRp1,7 jtRp17,1 jtRp14,9 jt
ITMG Rp25.050Rp2,51 jtRp2,5 jtRp25,1 jtRp21,8 jt

Pembulatan ke bawah ke lot utuh memangkas sendiri 12–13% dari nominalnya, jadi yang benar-benar keluar selalu lebih kecil dari nominal tangga. Tangga yang satuannya di atas Rp1 juta selalu menyebut totalnya di barisnya (“tangga penuh ±Rp25,1 jt (1 lot Rp2.505.000)”) — komitmen sebesar itu harus kelihatan sebelum tahap 1 dieksekusi, bukan jadi kejutan di tahap 4.

Pola yang makin agresif makin bagus kalau sahamnya benar-benar turun sampai tahap 4 — tapi saham yang lolos saringan (undervalue, fundamental bersih, RSI mulai berbalik) lebih sering tidak turun sejauh itu, dan di situ 1:3:9:27 cuma memberi Rp75 rb karena tahap pertamanya kelewat kecil. Pola yang dipilih mengambil hampir seluruh manfaat penurunan (impas +8,8% vs +7,5%) tanpa mengecilkan tahap pertama sampai tidak berarti.

Jatah mengejar KUMULATIF, bukan nominal rung (29 Sep 2026)

Pertanyaan Djoko waktu melihat baris CSRA: “ini maksudnya hari ini saya boleh beli senilai 1,5 juta ya?” Ternyata bukan, dan versi pertama memang salah hitung untuk kasus ini.

CSRA: tahap 1 jatahnya Rp1 juta, tapi yang benar-benar masuk Rp1,65 juta (20 lot, avg Rp827) — kelebihan Rp650 ribu. Kalau tahap 2 tetap dibeli sebesar rung penuh Rp1,5 juta, kumulatifnya jadi Rp3,15 juta padahal rancangannya Rp2,5 juta; uangnya menumpuk di harga yang lebih tinggi, persis yang ingin dihindari tangga ini. Yang benar: Rp846 ribu, supaya kumulatifnya pas Rp2,5 juta.

Jadi jatah sekarang selalu kumulatif[tahap] − sudah masuk, dan kalau angkanya beda dari rung-nya barisnya menyebutkan sebabnya supaya tidak terbaca seperti salah hitung: “digenapkan ke kumulatif tahap 2 (Rp2,5 jt), bukan Rp1,5 jt penuh”. Berlaku dua arah — kalau pembelian sebelumnya justru kurang dari jatahnya, tahap berikutnya ikut menutup kekurangannya.

Kumulatif tangga standar: 1 → 2,5 → 5 → 10 satuan.

Revisi 30 Sep 2026: tahap dari kedalaman harga, bukan dari besarnya uang

Dilaporkan Djoko: “TKIM floating loss saya cuma 4,9%, kok kelihatannya sudah mau avg down lagi? Apa aturannya lebih baik didasarkan pada floating loss saja?” Barisnya waktu itu berbunyi tahap 3/4 · jatah Rp2,7 jt.

Sebabnya: tahap disimpulkan dari uang yang sudah masuk. TKIM dibeli sekali — 3 lot @ Rp7.572 = Rp2,27 juta — dan angka itu sudah melewati 80% kumulatif tahap 2 (Rp2,5 juta), jadi terbaca seperti sudah menuruni dua anak tangga. Padahal harganya baru turun 4,9%.

Sekarang tahap ditentukan floating loss terhadap harga rata-rata: 0% → tahap 1, −10% → tahap 2, −19% → tahap 3, −27,1% → tahap 4. Kalau uang yang sudah masuk melewati kumulatif tahap itu, barisnya berhenti menawarkan jatah dan mengatakan apa adanya:

🪜 Tangga: di tahap 1/4 (posisi −4.9%) · sudah masuk Rp2,3 jt — di atas jatah tahap ini (Rp1,0 jt) · tahap 2 mulai di ±Rp6.815 (−10% dari harga rata-rata Rp7.572)

Dipilih patokan harga rata-rata, bukan pembelian pertama, karena yang menentukan layak-tidaknya menambah adalah seberapa murah harga sekarang dibanding yang sudah dibayar rata-rata — dan avg yang ikut turun sesudah avg down membuat ambang berikutnya otomatis menuntut penurunan yang nyata. Harga pembelian tertinggi juga tidak disimpan di data posisi, hanya avg, terakhir, dan terendah.

Ikut diperbaiki: harga tunggu dulu dihitung dari pembelian terakhir × 0,9 sementara tahapnya dari avg — dua patokan dalam satu baris. Untuk SCMA hasilnya “posisi −9,0% … tunggu turun ke Rp176” padahal harganya sudah Rp171. Sekarang keduanya memakai avg.

Tangga bukan izin beli — dua aturan yang berbeda

Kebingungan yang sama punya sebab kedua: baris tangga di RSI Buy terbaca seperti ajakan membeli hari ini. Ia bukan. Pembagian tugasnya:

PatokanMenjawab
Pemicu (lib/strategi)harga ≤10% di bawah pembelian terakhirboleh menambah atau belum — supaya tidak menumpuk beli di harga yang hampir sama
Tahap tangga (lib/tangga)floating loss terhadap harga rata-ratakalau menambah, sebesar apa

Diuji pada 191 posisi (30 Sep 2026): kedua patokan sepakat untuk 82%. Bedanya 32 saham yang floating loss-nya sudah ≤−10% tapi pembelian terakhirnya masih dekat harga sekarang (AMRT −30,3% vs −6,0%; TPIA −29,5% vs −6,8%; BIPI −26,2% vs +4,9%), dan 2 saham sebaliknya. Djoko memilih pemicu tetap dari pembelian terakhir: kalau diganti ke floating loss, ke-32 posisi itu langsung jadi kandidat avg down lagi padahal beberapa baru dibeli di bawah harga sekarang.

Supaya tidak terbaca salah lagi, baris tangga kini menyebut izinnya sendiri kalau pemicunya belum lewat: … belum boleh menambah: pemicunya ≤Rp387 (−10% dr beli terakhir).

30 Sep 2026: tangga jadi satu-satunya penentu besar pembelian

Dilaporkan Djoko dari baris AVG UP LSIP: “ini maksudnya bisa nambah 915rb lagi ya? soalnya saat ini posisi saya udah 3.1 an investednya”. Jawabannya ya — tapi ternyata angka itu dihitung dua rumus berbeda di satu blok yang sama:

  • baris atas memakai tranche(): Rp625 rb + Rp312,5 rb per penguat, dibatasi Rp1,25 jt
  • baris 🪜 di bawahnya memakai tangga: jatah Rp1,0 jt

Hari itu keduanya kebetulan jadi 6 lot karena pembulatan, tapi dua rumus pada satu saham cepat atau lambat berbeda angkanya. Sekarang lib/strategi._ukuran_tangga() jadi satu pintu: AVG DOWN dari tangga turun, AVG UP dari tangga naik, dan tranche() tidak dipakai lagi di pesan Rencana (laporan repair Senin punya skor sendiri, tidak tersentuh).

Akibatnya saran bisa hilang, dan itu memang disengaja. Kalau tangga menolak — dividen ≤5%, diskon <10%, belum +5% dari pembelian terakhir, sudah lewat batas 5 satuan, atau uang yang masuk sudah melewati kumulatif tahapnya — sarannya tidak diberikan sama sekali. AVG DOWN 30 Sep turun dari 4 jadi 3 saham karena satu kandidat tidak punya jatah.

Bug yang ikut ketemu: ukuran dihitung per broker, padahal anggaran per saham

Sesudah penyatuan, TOWR tercetak 176 lot (±Rp7,0 jt) di baris AVG DOWN tapi 11 lot (Rp447 rb) di baris tangganya. Sebabnya lib/strategi memakai buying_value posisi Mirae saja (Rp3 jt → tahap 4 → jatah Rp7 jt) sementara baris tangga menjumlahkan seluruh broker (Rp4,6 jt → jatah Rp447 rb). Anggaran tangga per SAHAM, jadi yang benar yang kedua: Rencana sekarang mengirim nilai_semua, qty_semua, dan last_semua per ticker.

Ikut dirapikan: rupiah di baris aksi kini lot × harga × 100 — yang benar-benar keluar — bukan jatah sebelum pembulatan. LSIP jatahnya Rp1,0 jt tapi 6 lot di Rp1.525 hanya Rp915 rb. Sesudah perbaikan: TOWR 11 lot / Rp437.800, LSIP 6 lot / Rp915.000, dan kedua baris sepakat.

Yang tangga ini TIDAK lakukan

  • Tidak memutuskan layak-tidaknya menambah. Syaratnya tetap yang lama: turun ≥10% dari pembelian terakhir (lib/strategi), fundamental belum memburuk, dividen masih jalan. Tangga hanya menjawab “kalau memang menambah, sebesar apa”.
  • Tidak dicetak untuk saham bertanda ❌ MAHAL — di sana jawabannya bukan besaran, tapi jangan.
  • Sisa anggaran bukan kewajiban. Turun 27% dari titik masuk biasanya bukan cuma soal harga; kalau labanya rusak, jatah tahap 4 lebih baik tidak keluar sama sekali.
  • Rp10 juta itu acuan rata-rata, bukan pagar keras (Djoko: “10 juta itu saya ambil sebagai rata-rata aja”). Untuk saham yang 1 lot-nya Rp1,5 juta, tahap pertama otomatis jadi Rp1,5 juta.

Tangga NAIK — menambah posisi yang sudah untung (29 Sep 2026)

Pertanyaan Djoko: “posisi ELSA kan sudah profit, berarti bukan averaging down lagi dong namanya, tapi averaging up? Kalau averaging up gimana strateginya?” Benar, dan itu cacat pemasangan pertama: baris 🪜 tercetak di blok AVG UP memakai anak tangga yang dikunci ke penurunan 10%. Kalau ukurannya ikut membesar di sana, uang paling besar mendarat di harga paling mahal — kebalikan dari maksudnya.

Tangga turun (avg down)Tangga naik (avg up)
Dipicuharga −10% dari pembelian terakhirharga di atas harga rata-rata, masih undervalue
Ukurannyamembesar 1 → 1,5 → 2,5 → 5mengecil mengikuti diskon
Berhenti kalauanggaran habis / fundamental rusakdiskon ke nilai wajar tinggal <10%

Yang menentukan aman-tidaknya menambah di atas harga rata-rata bukan untung-ruginya posisi, tapi seberapa jauh harga masih di bawah nilai wajar. ELSA 29 Sep: harga Rp680, wajar Rp1.024, avg Rp640 — menambah Rp2,5 juta sekalipun cuma menggeser avg ke Rp663, masih 65% dari nilai wajar.

1dividend yield harus >5%syarat Djoko: “kalau harga jadi kemahalan lalu koreksi dalam, setidaknya saya masih ada jaring pengaman dari dividen”. Saham undervalue berdividen kecil tetap boleh di-avg down, tapi tidak dikejar ke atas
2ukuran dari diskon: ≥30% → 1 satuan · 20–30% → 0,7 · 10–20% → 0,4di bawah 10% berhenti sama sekali
3jarak minimal +5% dari pembelian terakhirtanpa ini ia akan mencicil tiap hari selama sinyal RSI bertahan; kalau belum cukup, barisnya menulis TUNGGU
4selama harga di atas rata-rata, total di saham itu maksimal 5 satuanseparuh anggaran disimpan untuk kalau harganya balik turun
5ditahan kalau avg baru melewati 80% nilai wajarmarjin keamanan harga rata-rata tetap dijaga

Di RSI Buy pemilihannya otomatis: saham yang kamu pegang dengan harga di atas harga rata-rata dapat tangga naik, sisanya tangga turun. Uji 29 Sep: ELSA (+, diskon 34%, DV 6,66%) dapat jatah Rp1,0 juta; ITMG (+, DV 6,78%) ditolak karena diskonnya tinggal 6%; CSRA/GPRA/IPCC/PGAS yang masih di bawah avg tetap memakai tangga turun.

Bunyinya di laporan

🪜 Tangga: tahap 1/4 · jatah Rp1,0 jt (±126 lot @ Rp79) · kalau turun lagi: Rp1,5 jt @ ±Rp71 · Rp2,5 jt @ ±Rp64 · Rp5,0 jt @ ±Rp58
🪜 Tangga: tahap 3/4 · jatah Rp2,5 jt (±37 lot @ Rp675) · sudah masuk Rp3,4 jt dari Rp10,0 jt · kalau turun lagi: Rp5,0 jt @ ±Rp608
🪜 Tangga: tahap 1/4 · jatah Rp1,7 jt (±1 lot @ Rp17,125) · tangga penuh ±Rp17,1 jt (1 lot Rp1,712,500) · kalau turun lagi: Rp2,6 jt @ ±Rp15,412 · Rp4,3 jt @ ±Rp13,871 · Rp8,6 jt @ ±Rp12,484
🪜 Tangga: tahap 3/4 · jatah Rp6,3 jt (±2 lot @ Rp25,050) · sudah masuk Rp8,0 jt dari Rp25,1 jt · tangga penuh ±Rp25,1 jt (1 lot Rp2,505,000)
🪜 Tangga naik: diskon 34% → jatah Rp1,0 jt (±14 lot @ Rp680) · avg Rp578 → Rp598 (58% nilai wajar) · ukuran mengecil saat diskon menipis; berhenti di bawah 10%
🪜 Tangga naik: tidak disarankan — diskon tinggal 6% — di bawah 10% tidak dikejar ke atas

Uji 29 Sep 2026: Rencana mencetaknya di AVG DOWN, AVG UP (ELSA tahap 3/4) dan KANDIDAT BELI BARU (JKON tahap 1/4); RSI Buy mencetaknya untuk 9 dari 10 saham yang tampil — satu dilewati karena bertanda MAHAL. Diuji ulang sesudah revisi satuan: ITMG jadi tahap 3/4 (sebelumnya “semua 2 tahap sudah jalan”), GGRM tahap 1/4 dengan tahap pertama tepat 1 lot, dan Rencana tetap mencetaknya di AVG DOWN (CSRA tahap 2/4), AVG UP dan KANDIDAT BARU. Kalimat “semua tahap sudah jalan” sengaja dibedakan dari “anggaran habis”: versi pertama berbunyi “anggaran Rp10,0 jt sudah terpakai Rp8,0 jt” dan itu terbaca seperti uangnya sudah nol.

Rem jual & tangga jual — nilai wajar ikut menentukan kapan melepas

🎯 Rencana hari ini

Usul Djoko 29 Sep 2026: “selain RSI, mungkin harusnya jual kalau sudah mencapai fair value-nya, supaya hasilnya maksimal”. Dipasang dua arah, karena cacat aturan lama justru ada di arah sebaliknya.

Masalah yang lebih besar: kecepetan jual, bukan telat jual

Sebelum ini nilai wajar sama sekali tidak ikut menentukan penjualan. Aturannya cuma: sinyal RSI jual + kategori (Trading kalau untung, Spekulatif kalau minimal impas, Long kalau fundamentalnya rusak). Artinya saham bisa dilepas di untung tipis padahal masih 30% di bawah nilai wajar — sisanya diserahkan ke pembeli.

REM: kalau harga masih ≥15% di bawah nilai wajar, sinyal RSI jual tidak lagi jadi saran jual. Ia tetap dicetak sebagai info di blok “Sinyal jual DITAHAN” supaya keputusannya tetap kelihatan. Rem dicabut kalau fundamentalnya rusak, dan untuk Spekulatif juga kalau katalisnya sudah tidak ada (itu satu-satunya alasan saham itu dipegang).

Tangga jual

Di atas nilai wajar dilepas bertahap, bukan sekaligus. Nilai wajar itu taksiran — halaman ini mencatat dua kali ia pernah ngawur (konversi USD PTSN, ROE basi UNTR), jadi menaruh seluruh keputusan pada satu angka model itu rapuh. Porsinya dihitung dari sisa posisi, sehingga kalau sebagian sudah dilepas, aturan yang sama memberi angka yang lebih kecil.

KategoriRemMulai jualHabis
Tradingjangan jual kalau diskon masih ≥15%, kecuali fundamental rusak⅓ saat capai nilai wajar½ sisa di +10%, seluruhnya di +20% atau saat sinyal RSI jual
Spekulatifsama, tapi rem dicabut kalau katalisnya batal½ saat capai nilai wajarseluruhnya di +10%
Longtidak dijual di nilai wajar⅓ saat premium ≥15%seluruhnya di premium ≥25%, atau ⅓ kalau yield sudah <3%

Long dikecualikan karena posisi itu dipegang untuk dividennya (ELSA 6,5%, PGAS 8,8%): menjual di harga wajar berarti menukar penghasilan rutin dengan uang yang harus dicarikan rumah baru. Ambang yield <3% adalah cerminan aturan belinya sendiri.

Saran yang sama tidak diulang tiap pagi: kalau saham itu baru dijual dalam 7 hari terakhir (dari catatan_jual.json), tangga jualnya diam.

Yang untung jadi saran, yang rugi cuma info

Uji pertama 29 Sep 2026 menghasilkan 36 saran jual, dan 32 di antaranya posisi RUGI yang kebetulan juga di atas nilai wajar — BOLT −28% tapi premium 20%, IMPC −46,5% dengan premium 906%. Menyuruh melepas di situ berarti menyuruh merealisasi rugi, padahal yang diminta “jual kalau sudah mencapai nilai wajar supaya hasilnya maksimal”.

Jadi hasilnya dipisah: 💰 TANGGA JUAL hanya untuk posisi yang untung (29 Sep: 4 saham — PACK +108%, MEGA +14,6%, MCOL +2,5%, SAMF +0,6%), sementara yang rugi masuk daftar info 📉 “Di atas nilai wajar tapi posisi RUGI”, maksimal 10 baris, diurutkan dari premium terbesar. Melepasnya tetap keputusanmu — blok cut loss berpasangan yang mengurus itu.

Pindah jadi pesan sendiri tiap Kamis (15 Okt 2026)

Djoko: “yang di bawah ini tidak perlu diulang-ulang tiap hari, cukup mungkin seminggu sekali saja sebagai pengingat dan dikirim terpisah aja, jangan digabung dengan rencana harian.” Benar — isinya hampir tidak berubah dari hari ke hari (32 nama, yang berubah cuma angka persennya) dan tidak ada yang perlu dieksekusi, jadi tiap pagi ia cuma memperpanjang pesan Rencana.

  • Kamis, dikirim sebagai pesan Telegram terpisah, bukan bagian pesan Rencana. Senin sudah dipakai “kuat saat pasar lemah” dan Rabu “dasar 52 minggu”.
  • Urutannya: nominal rugi terkecil dulu, dan nominalnya ikut dicetak (15 Okt 2026, Djoko: “urutkan berdasarkan nilai nominal floating loss-nya, dari kecil ke besar”). Sebelumnya diurutkan dari premium terbesar — angka yang tidak mengatakan apa pun soal besar kerugiannya. JTPE rugi Rp27.810 dengan premium 19% ada di atas, TPIA rugi Rp4,2 juta dengan premium 3% di bawah.
  • Maksimal 40 baris (10 → 30 → 40; dinaikkan lagi karena dengan urutan kecil-ke-besar, yang terpotong justru rugi terbesar), sisanya disebut jumlahnya.
  • Kalau tidak ada isinya, tidak ada pesan.

Hitungannya tetap menumpang rencana_harian.py (susun_mahal_rugi()): posisi, nilai wajar, dan tangga jual sudah dihitung di situ. Menyalin seluruh alur pengambilan datanya ke skrip tersendiri berarti dua tempat yang bisa menyimpang. Uji hari apa pun: --mahal.

📉 DI ATAS NILAI WAJAR TAPI POSISI RUGI (31) — 15 Okt 2026

1. JTPE [Stockbit Long] rugi -Rp27.810 (-5,1%) · premium 19% di atas wajar
2. IFII [Stockbit Long] rugi -Rp66.984 (-12,2%) · premium 54% di atas wajar
…
31. TPIA [Stockbit Trading] rugi -Rp4,2 jt (-42,2%) · premium 3% di atas wajar

Kaki pesan sekarang selalu menyebut “Di atas nilai wajar: N posisi · tangga jual M saran”, supaya “tidak ada saran jual” bisa dibedakan dari “hitungannya tidak jalan”. Uji 29 Sep: 48 posisi di atas nilai wajar, 36 memenuhi ambang tangga, 4 di antaranya untung.

DIMATIKAN 12 Okt 2026. Djoko: “ini hanya sekadar info ya? kalau iya, mending enggak usah ditampilkan … supaya alertnya tidak kebanyakan.” Diperiksa dulu, dan hasilnya mendukung: dari 11 nama “layak diselamatkan”, hanya 4 yang lolos screening (BBRI, JPFA, PGEO, SMRA) — dan keempatnya memang sudah muncul sendiri di AVG DOWN Rencana begitu sinyal RSI datang. 7 sisanya tidak lolos screening, jadi aturan harian tidak akan pernah menyarankannya. Artinya laporan ini menyarankan hal yang aturan hariannya tolak; memasukkannya ke Rencana berarti melonggarkan aturan beli, bukan menambah keterangan.
Yang hilang: bagian “kandidat sumber kas” — 33 nama, khususnya 20 posisi hijau di luar watchlist yang kalau dilepas memberi kas Rp67,3 juta dengan untung Rp25,5 juta. Tidak ada laporan lain yang mengangkatnya. Sifatnya sesekali, jadi dijalankan manual saat butuh dana: sudo -u claude-scripts python3 program_penyelamatan.py --dry-run. Skripnya utuh.

🛟 Program penyelamatan

Senin 08:00

Permintaan Djoko 1 Okt 2026: posisi yang terlanjur salah beli tidak di-cut loss buru-buru, tapi diurus lewat program penyelamatan. Ternyata mesinnya sudah ada dan jalan tiap Senin — weekly_mirae_repair.py 07:30 (Mirae) dan 07:50 (Stockbit) dengan --tanpa-kirim — tapi sejak 18 Sep 2026 hasilnya hanya mengendap di data/<broker>_repair_latest.json dan tidak pernah dilihat siapa pun.

Jadi yang dibangun 1 Okt bukan mesinnya, hanya laporannya: program_penyelamatan.py, Senin 08:00, sesudah kedua repair selesai dan sebelum Rencana 08:30. Ia tidak menghitung apa pun sendiri.

BagianIsinya1 Okt
🛠️ Masih layak diselamatkanyang dinilai repair pantas ditambah (AVG DOWN NOW), dengan skor, keyakinan, modal, berapa persen kenaikan untuk impas, upside, dividen, status screening, dan jatah dari tangga15
⏸️ Tahan, jangan tambahWAIT / STOP AVG DOWN / HOLD — rugi terbesar dulu, lengkap dengan apakah dividennya menemani penantian dan alasan hard veto kalau ada136
💸 Kandidat sumber kasyang dinilai layak dilepas, plus posisi hijau tapi di luar screening — bisa dilepas tanpa rugi sepeser pun33
📊 Ringkasanmodal dan hasil, dipisah lolos vs di luar screening—

Info atau bisa dieksekusi? — baris 🎯 (1 Okt 2026)

Pertanyaan Djoko: “ini gimana eksekusinya? apakah ini hanya sekedar info atau ada yang bisa saya take action?” Jawabannya membuka lubang nyata: laporan ini memakai skor 100 poin milik mesin repair, sementara eksekusi diatur aturan harian (pemicu −10% dari pembelian terakhir + undervalue + fundamental lolos + sinyal RSI + jatah tangga). Dua penilaian yang bisa tidak sepakat — RAJA dinilai “AVG DOWN NOW · VERY HIGH” oleh repair padahal premium 80% dan PBV 3,6x, yang menurut aturan harian tidak boleh ditambah.

Sekarang tiap baris di bagian “layak diselamatkan” diuji ulang dengan harga live terhadap aturan harian, dan hasilnya ditulis apa adanya:

🎯 ✅ syarat harga, valuasi, dan fundamental terpenuhi — tinggal menunggu sinyal RSI, lalu muncul sendiri di AVG DOWN Rencana
🎯 ⛔ tunggu harga ≤Rp157 (−10% dr beli terakhir Rp174, sekarang -1.7%)
🎯 ⛔ fundamental: sedang rugi
🎯 ⛔ belum undervalue (premium 80%) · fundamental: PBV 3,6x

Aturan harian yang menang; repair cuma memberi urutan prioritas. Jadi pembagian tugasnya: laporan Senin menjawab “posisi mana yang pantas diberi uang lagi”, Rencana harian menjawab “hari ini bisa dieksekusi atau belum”, dan jatah rupiahnya diambil dari tangga yang sama supaya dua laporan tidak pernah menyebut angka berbeda.

Hasil uji 1 Okt atas 15 nama: 10 lolos syarat harga/valuasi/fundamental dan tinggal menunggu sinyal RSI (PANI, CTRA, JSMR, ICBP ×2, PNBN, WIFI, SMRA ×2, PNLF), 2 tertahan pemicu −10% (SCMA butuh ≤Rp157, BBTN ≤Rp990), dan 3 tertahan fundamental/valuasi (PTMP dan EXCL sedang rugi, RAJA premium 80% + PBV 3,6x).

Kiriman pertama: 1 Okt 2026 14:45

Dikirim manual atas permintaan Djoko sebelum jadwal Senin pertamanya. Memakai data repair 28 Sep (harga per 25 Sep) — umurnya disebut di kepala laporan.

BagianJumlahIsi menonjol
🛠️ Masih layak diselamatkan15SCMA −13,8% skor 91 VERY HIGH: impas butuh +16%, upside +36%, DY 12,3%, lolos screening, jatah tangga Rp1,4 jt (±82 lot) tahap 2/4
⏸️ Tahan, jangan tambah136DLTA −25,6% (DY 10,2% menemani) · AMRT −36,2% (impas +57%) · TPIA −26,2% (DY 0,6%)
💸 Kandidat sumber kas3313 dinilai layak dilepas + 17 posisi hijau di luar screening: kas Rp60,6 jt, malah untung Rp26,5 jt (TOTL +201% sendiri Rp28,8 jt)

Ringkasannya: 108 posisi lolos screening membawa modal Rp307,3 jt dengan hasil −2,9%, sementara 114 posisi di luar screening membawa Rp290,7 jt dengan hasil −13,5%. Enam posisi dari berkas repair dibuang karena sudah dijual sesudahnya (ADRO, AMIN, KDSI, MCOL, MEGA, PACK).

Dua jaring pengaman yang langsung terbukti perlu

  • Berkas repair bisa lebih tua dari transaksi terakhir. Uji pertama 1 Okt masih menawarkan PACK dan ADRO sebagai sumber kas — padahal keduanya dijual 30 Sep, sementara repair-nya dari 28 Sep. Sekarang posisi yang sudah tidak dipegang dibuang (1 Okt: 6 ticker — ADRO, AMIN, KDSI, MCOL, MEGA, PACK) dan yang jumlah lembarnya berubah diberi tanda.
  • Umur data disebut terang-terangan, dan kalau lewat 8 hari laporannya memperingatkan sendiri supaya repair dijalankan dulu.

Kalimat alasan dari repair juga diringkas sebelum dipotong: … menjawab WOULD_BUY_TODAY_IF_ZERO_POSITION: NO jadi “perlu ditimbang ulang dari nol → tidak akan dibeli lagi”. Itu inti pertanyaan penyelamatan: kalau posisi ini nol hari ini, apakah saya masih mau membelinya?

Portfolio repair / averaging down

Senin 09:00 & 09:15

Sejak 18 Sep 2026 repair TIDAK mengirim laporan — daftar layak dilepas pindah ke Rencana hari Senin

Keputusan Djoko: semua keputusan dalam satu pesan, supaya tidak ada alert yang tumpang tindih. Skrip repair tetap jalan tiap Senin 07:30 (Mirae) dan 07:50 (Stockbit) dengan --tanpa-kirim: menghitung skor dan status lalu menyimpan data/<broker>_repair_latest.json. Pesan 🎯 Rencana hari ini jam 08:00 hari Senin membaca berkas itu (lib/daftar_exit) dan menambah bagian 📋 Posisi layak dilepas: seluruh posisi berstatus EXIT dari kedua broker, urut dari rugi terbesar, dengan posisi & bobot, harga vs avg vs nilai wajar, alasan dalam bahasa sehari-hari, PER/PBV/ROE, dan dividen; 🆕 menandai yang baru masuk minggu itu.

Saran avg down dari repair (dulu ambang 8%) tidak pernah dikirim lagi — avg down hanya dari Rencana (10%). Kalau penilaian Senin gagal atau berkasnya bukan buatan hari itu, Rencana menulis “⚠️ Penilaian … belum diperbarui hari ini” alih-alih diam. Hari selain Senin bagian ini tidak muncul (--exit memaksanya tampil untuk uji).

Data kosong tidak lagi jadi “layak dilepas”. Dulu aturannya: rugi > 40% + veto apa pun → EXIT, termasuk veto karena data kosong saja. PANR, DADA, dan FWCT masuk daftar layak dilepas hanya karena yfinance tidak punya laporan keuangan emiten itu sama sekali (kuartalan maupun tahunan; TradingView punya) — PANR bahkan disarankan AVG DOWN oleh Rencana di hari yang sama. Sekarang veto data-saja → STOP AVG DOWN (tidak bisa dinilai). Balasan kosong dari sumber data juga dikenali sebagai kosong (dulu dianggap satu baris laporan sehingga “data lengkap” tetap benar). Uji Mirae 18 Sep: EXIT 9 → 6 (ARTO, DATA, RISE, BREN, COIN karena rugi besar & tidak lolos dinilai ulang; CBRE karena utang).

Cadangan TradingView (18 Sep 2026). Kalau yfinance tidak punya laporan keuangan sama sekali, repair mengambil fundamental dari TradingView untuk saham itu saja (satu panggilan): periode, pendapatan & pertumbuhannya, laba, arus kas operasi, FCF, kas, utang, utang bersih, ekuitas, margin. Kolomnya sengaja per kuartal (*_fq) supaya sepadan dengan laporan kuartalan yfinance; margin hanya ada versi TTM. Hanya kolom yang kosong yang diisi — angka yfinance yang ada tidak ditimpa. Sumbernya tercatat di data_sources (“cadangan: laporan yfinance kosong”).

Hasil uji 18 Sep: Mirae 3/3 terisi — PANR jadi AVG DOWN NOW (skor 87, sejalan dengan Rencana), FWCT & DADA tetap layak dilepas tapi kini karena rugi besar & tidak lolos dinilai ulang. Stockbit 9/12 terisi — NELY (pendapatan −41%, laba −96%, arus kas operasi negatif) dan PGJO (utang bersih 14× ekuitas) muncul sebagai layak dilepas, yang sebelumnya tidak terlihat sama sekali. Masih belum bisa dinilai: DOSS, ACRO, NAIK, KAQI — nilai wajarnya tidak bisa dihitung, masalah lain.

Catatan cara membaca hitungan “tidak bisa dinilai”: repair hanya mengambil laporan keuangan untuk posisi yang rugi. Posisi yang untung selalu berstatus STOP_DATA — itu disengaja (tidak ada avg down maupun EXIT untuk posisi untung), bukan lubang data. Per 14 Sep: Stockbit 76 STOP_DATA, hanya 14 yang rugi; Mirae 19, hanya 3 yang rugi.

Dua laporan tiap Senin: Mirae 09:00 lalu Stockbit 09:15, dari satu mesin yang sama (weekly_mirae_repair.py --broker MIRAE|SB). Membaca seluruh posisi di portfolio, memusatkan perhatian pada yang floating loss, lalu memutuskan lima kemungkinan: AVG DOWN NOW, WAIT / WATCH, HOLD / NO ACTION, STOP AVG DOWN, atau EXIT / PORTFOLIO REPAIR CANDIDATE.

Prinsip pokoknya

  • Rugi besar BUKAN alasan untuk menambah. Pertanyaannya selalu: “kalau saya punya nol lembar hari ini, apakah saya beli di harga ini?” Kalau tidak — jangan tambah.
  • Rugi lebih dari 40% memicu penilaian ulang penuh dari nol, bukan sekadar hitung ulang rata-rata.
  • Baca-saja. Tidak ada kemampuan mengirim order beli/jual di dalamnya, dan tidak akan ditambahkan.

Skor 100 poin

KomponenBobotIsi
Fundamental / tesis35kinerja inti operasional, bukan laba bersih judul — rugi kurs atau impairment sekali jalan tidak disamakan dengan penjualan yang runtuh
Valuasi / margin of safety25nilai wajar dari lib/fv_tv.py, sama dengan bandarmologi dan RSI Alert
Ukuran posisi15bobot sekarang dan sesudah tranche; dihitung per broker, bukan gabungan
Dividen / katalis10PENSION dinilai dari dividen, TRADING dari katalis turnaround
Timing RSI(14)10hanya waktu masuk — tidak pernah menentukan tesis
Kualitas data5kesegaran dan kelengkapan; data kritis hilang = veto
SkorKeputusanTranche
≥ 85AVG DOWN NOW keyakinan sangat tinggiRp1.250.000
80–84AVG DOWN NOW kuatRp875.000
75–79AVG DOWN NOW sedangRp625.000
65–74WAIT / WATCHRp0
50–64HOLD atau STOPRp0
< 50STOP atau EXITRp0

Syarat RSI untuk saham berdividen rendah (14 Sep 2026) — DIGANTIKAN 15 Sep 2026

Catatan riwayat. Sejak 15 Sep 2026 syarat ini digantikan sinyal beli strategi yang berlaku untuk semua posisi. Uraian di bawah disimpan untuk menjelaskan kenapa aturannya berkembang begini.

Kalau rata-rata dividend yield di bawah 3% per tahun dalam 3 tahun terakhir, AVG DOWN NOW baru boleh keluar setelah RSI menyentuh 35 atau di bawahnya, lalu naik minimal sehari. Revisi hari yang sama: ambang pertama 30, diturunkan kelonggarannya ke 35 atas permintaan Djoko. Saham seperti ini tidak membayar untuk ditunggu — tanpa dividen yang berarti, satu-satunya alasan menambah adalah harga yang benar-benar sudah di dasar. Keputusan Djoko.

1DY = (dividen 36 bulan ÷ N tahun) ÷ harga rata-rata 36 bulan < 3%N = lama data harga yang ada, 1–3 tahun
MAKA WAJIB, pada salah satu hari yang diperiksa
2min(RSI, RSI kemarin) ≤ 35sempat menyentuh 35 atau di bawahnya — RSI tepat 35 sudah memenuhi
DAN
3RSI > RSI kemarin + 0,05hari itu naik
→RSI Buy harian: hari terakhir sajalaporan Senin: tiap hari dari 5 sesi terakhir (Senin–Jumat pekan lalu)
  • Tidak mengubah skor sama sekali — dipasang di ujung, hanya menahan waktu menambah. Yang tertahan turun jadi WAIT / WATCH dengan kode WAIT_RSI_DIVIDEN_RENDAH dan tranche Rp0.
  • Tidak hilang diam-diam. WAIT tidak dicetak di laporan, jadi yang tertahan dapat satu baris sendiri: ⏳ Ditahan syarat RSI (dividen <3%/th): BLOG [MIRAE] RSI 39→44 -27,4%, …. Uji 14 Sep, Mirae: PNBN 2,4%, SMRA 1,7%, GEMA 2,0% tertahan; SPTO 12,2%, DLTA 10,2%, CITA 9,3%, PGEO 4,7%, BLOG 4,3% tetap AVG DOWN. Stockbit: EMTK, WIFI, CAMP, PNBN, IRRA, PTMP, AISA, IGAR, WIRG tertahan.
  • Pembaginya lama data yang benar-benar ada, bukan selalu 3 tahun. BLOG baru melantai Juli 2025 dan baru sekali membagi (Rp21, Juni 2026). Versi pertama membagi dengan 3 tahun, jadi dua tahun sebelum emitennya ada di bursa ikut terhitung “tanpa dividen” dan DY-nya jatuh ke 1,7% — BLOG sempat tertahan karena itu. Dibagi ±1,2 tahun hasilnya 4,3%. Pembagi minimal 1 tahun supaya emiten yang baru beberapa bulan tidak mengembang. Data yang pendek disebut terang di laporan: 4,3% (data baru 1,2 th).
  • Dipasang juga di RSI Buy Alert harian (14 Sep 2026), pada tanda CICIL. Saham dividen rendah yang sudah turun ≥5% dari beli terakhir tidak lagi diberi 🟢 CICIL sebelum RSI ≤35 lalu naik — angka penurunannya tetap dicetak, ajakan menambahnya diganti ⏳ dividen 2,4%/th (<3%): CICIL tunggu RSI ≤35 lalu naik — RSI 53 → 47, belum pernah menyentuh 35. Satu modul untuk dua laporan, lib/syarat_rsi_dividen.py, jadi keduanya tidak pernah memberi jawaban berbeda. Hanya dihitung untuk saham yang tampil dan sedang bertanda CICIL.
  • DY-nya dihitung sendiri, bukan rata-rata baris “DV 3 th”. Baris itu hanya memuat tahun yang ada dividennya, jadi emiten yang membagi 6% sekali lalu berhenti dua tahun terbaca “rata2 6%”. Di sini tahun tanpa dividen terhitung nol, dan tahun berjalan tidak terpotong setengah jalan. Karena itu angkanya bisa beda dari baris DV 3 th di laporan yang sama.
  • Berdasarkan angka dividen, bukan grup portfolio. PNBN ada di grup Main tapi DY-nya 2,5%, jadi ikut tertahan. Kalau data dividen gagal diambil, baru label strategi yang dipakai: TRADING dianggap dividen rendah. Tidak tahu tidak boleh dianggap dividen tinggi lalu diloloskan tanpa syarat.
  • Dasar dua hari, bukan RSI hari ini saja. Saham yang memantul dari 28 ke 31 sedang berbalik paling meyakinkan — pelajaran yang sama dengan RSI Buy Alert, yang dulu kehilangan pantulan 32 → 41 karena menguji RSI hari ini.

Laporan Senin memeriksa seminggu, bukan penutupan Jumat saja (14 Sep 2026, Djoko). Versi pertama menuntut syaratnya terpenuhi tepat di penutupan Jumat, jadi RSI yang turun ke 35 lalu naik hari Selasa dan sudah di atas 35 lagi pada Jumat tidak pernah terbaca — uji jadwal alert support dulu menemukan jadwal seminggu sekali melewatkan 45% episode. Sekarang AVG DOWN muncul kalau syaratnya sempat terpenuhi di salah satu dari 5 sesi terakhir, dan tanggalnya dicetak: ⏳ dividen 1,7%/th (<3%) · syarat RSI terpenuhi 07 Sep (RSI 23,0 → 25,1). Yang tertahan menyebut kenapa: terendah seminggu RSI 54 pada 11 Sep atau sempat RSI 25,5 pada 11 Sep tapi belum naik.

  • RSI harian dihitung sendiri dari bar yfinance (rumus Wilder, sama dengan TradingView), karena TradingView hanya memberi RSI hari ini dan dua hari sebelumnya. Dicocokkan 14 Sep pada 13 saham: selisih terbesar 0,6 poin RSI. Bar hari ini dibuang — laporan jalan 09:00 saat bursa baru buka.
  • Sempat terpenuhi tidak berarti masih di sekitar 35. Saham yang memantul Selasa bisa sudah di RSI 40-an saat laporan dibaca; tanggal di barisnya ada supaya itu terlihat.
  • Data harian gagal diambil → jatuh ke pemeriksaan RSI hari terakhir dari TradingView, dan hal itu disebut di barisnya.
  • RSI Buy Alert harian tetap memeriksa hari terakhir saja — ia jalan tiap hari, jadi tidak ada hari yang terlewat.

Syarat yang sama juga dipasang di RSI Buy Alert harian (lihat di atas). Laporan Senin tetap perlu: hanya di sini ada skor 100 poin, besar tranche dan jumlah lot per broker, hard veto, dan pemeriksaan EXIT untuk semua posisi rugi — RSI Buy Alert cuma menyinggung saham yang kebetulan sedang bersinyal RSI.

Hard veto — membatalkan skor setinggi apa pun

Tesis rusak, kemerosotan fundamental parah, risiko solvabilitas / leverage berbahaya, dilusi atau aksi korporasi yang belum dipahami, tanda bahaya akuntansi atau tata kelola, posisi sudah terlalu terkonsentrasi, dan data fundamental penting tidak tersedia. Kode alasannya dicetak: STOP_THESIS_BROKEN, STOP_BALANCE_SHEET, STOP_FUNDAMENTAL, STOP_VALUATION, STOP_DATA, EXIT_THESIS_BROKEN, EXIT_OPPORTUNITY_COST.

Yang BUKAN veto: RSI tinggi, harga baru naik, dividend yield di bawah 5% untuk saham TRADING, dan satu kuartal lemah selama laba intinya masih sehat. Semua itu hanya memperkecil tranche.

Yang mudah salah ingat

  • Penahan tranche baru memakai pembelian NYATA, bukan riwayat saran. Versi awal (1 Sep 2026) menandai sebuah tranche sudah terjadi begitu laporan pernah menyarankannya, lalu membungkam saham itu 35 hari — satu kali uji coba mengunci seluruh portfolio dan laporan 2 Sep menghasilkan 0 AVG DOWN NOW, dengan CEKA 94/100 dan WINE 93/100 ikut tertahan. Sekarang acuannya last_buy_price, yang hanya berubah kalau transaksi benar-benar dicatat: tranche baru menunggu harga 8% di bawah pembelian terakhir.
  • PENSION vs TRADING diturunkan dari grup portfolio (2 Sep 2026): Main → PENSION, DIV<3% dan NO-DIV → TRADING, sisanya dari rata-rata dividend yield 3 tahun dengan ambang 3%. Filenya statis di data/mirae_strategy.json dan data/sb_strategy.json, tidak pernah ditimpa otomatis — koreksi manual dipersilakan. Waspadai emiten yang pernah membagi dividen jumbo sekali bayar: ADRO terbaca 45,2% dan masuk PENSION.
  • Laporan Telegram hanya mencetak 🟢 AVG DOWN NOW dan ⚪ HOLD (2 Sep 2026). Yang tidak dicetak: IMPORTANT WAIT DETAILS, STOP / EXIT DETAILS, BEFORE VS AFTER ENGINE CHANGE, serta daftar 🟡 WAIT, 🔴 STOP, dan ⚫ EXIT — pesannya jadi terlalu panjang, dan STOP/EXIT jarang langsung ditindaklanjuti (EXIT menuntut pertimbangan pajak, likuiditas, dan rencana pribadi yang di luar jangkauan mesin). Penilaiannya tidak berubah: seluruh aksi tetap dihitung penuh tiap Senin dan tersimpan di data/<broker>_repair_latest.json lengkap dengan skor, kode alasan, dan jawaban WOULD_BUY_TODAY_IF_ZERO_POSITION — ditanyakan manual saat dibutuhkan.
  • Pengecualian: satu baris kalau ada saham BARU jatuh ke EXIT — ⚫ 2 saham BARU masuk EXIT: FWCT −44,0%, DADA −63,5%. Hanya yang berubah status dibanding laporan sebelumnya, bukan seluruh isi EXIT, jadi nama lama seperti RISE tidak muncul berulang tiap minggu. Di minggu tanpa perubahan, barisnya tidak ada sama sekali. Pembandingnya laporan tersimpan terakhir, bukan “Senin lalu”.
  • Posisi di bawah 1 lot dilewati — ambang yang sama dengan RSI Sell sejak 3 Sep 2026. PANI di Mirae tinggal 28 lembar — tidak bisa dijual di pasar reguler dan bukan posisi yang sengaja dibangun, biasanya pecahan corporate action. Disaring di mesin, bukan dengan menolkan quantity di file portfolio: lembarnya benar-benar masih ada, dan file yang sama dibaca RSI Alert, tanda CICIL, dan screener mingguan.
  • Bobot posisi dihitung per broker, sesuai keputusan 2 Sep 2026 (memperbaiki portfolio tiap broker terpisah). Konsekuensinya: saham yang muncul di kedua laporan — PANI misalnya — kalau ditambah di dua-duanya, konsentrasi gabungannya naik lebih cepat daripada yang terbaca di masing-masing laporan.
  • Nilai wajar ekstrem perlu diperiksa, bukan dipercaya. PNBN pernah keluar dengan FV Rp2.231 vs harga Rp895 (+149%) dan ADMF FV Rp19.161 vs Rp8.725. Angka setinggi itu muncul saat PBV jauh di bawah rata-rata sektor — bisa berarti murah, bisa berarti sektornya sedang dihargai murah beramai-ramai.
  • Tanda portfolio di kedua laporan (14 Sep 2026) — tiap baris saham menyebut portfolionya: [MIRAE], [MIRAE · juga di Main] di laporan Mirae; [Main], [DIV<3%], [NO-DIV], [Main · juga di MIRAE] di laporan Stockbit. Membalik keputusan 2 Sep 2026, yang membiarkan laporan Mirae tanpa tanda karena judulnya sudah menyebut broker: pesan Telegram dibaca per baris sambil men-scroll, judulnya sudah tidak terlihat, dan BLOG (hanya di Mirae) tidak bisa dibedakan dari saham grup Main. “juga di …” hanya nama portfolionya — sengaja tanpa harga rata-rata atau untung/rugi dari broker lain: yang merah di satu broker bisa sudah hijau di broker lain, dan angka tiap broker tetap dibaca di laporannya sendiri. Status dipegang dibaca dari posisi nyata, sub-grup Stockbit dari sell_watch_universe.json; posisi Stockbit yang belum masuk grup mana pun ditandai [SB].
  • DV 3 tahun dicetak di tiap kandidat, dari lib/dividen.py. Gunanya membedakan asal 10 poin Dividend/Catalyst: PANI pernah dapat 10/10 dengan DV 0,0% — seluruhnya dari katalis turnaround, bukan dividen.

Kuat saat pasar lemah

Senin 07:15

7 Okt 2026. Djoko: “kadang meski market lagi turun terus, tapi ada saham yang malah naik terus. bagaimana saya bisa mendeteksi supaya tidak ketinggalan?”

Yang membuat ketinggalan ternyata bukan ketiadaan screener, melainkan gerbang RSI itu sendiri. RSI Buy menuntut RSI <50 dan mulai berbalik naik — itu dirancang menangkap saham yang sedang jatuh lalu memantul, jadi secara konstruksi ia tidak pernah melihat saham yang tidak pernah jatuh. Buktinya: dari 18 saham yang lolos screening dan menguat saat IHSG −7,9%, nol yang lolos gerbang beli harian.

Jendela sepekan, dengan penjaga sebulan

12 Okt 2026. Mula-mula memakai jendela sebulan. Djoko: “bandingkan per minggu aja deh … karena saya berencana avg up per minggu, kalau udah sebulan takutnya kelamaan, udah ketinggalan jauh.”

Diukur dulu sebelum diubah, dan hasilnya memang menentukan: dari 10 besar mingguan dan 10 besar bulanan, hanya 3 nama yang sama. Tapi sepekan saja berisik — saham bisa unggul 8% dalam seminggu karena satu hari bagus lalu balik lagi. Jadi dipakai dua syarat:

SyaratKeterangan
Unggul ≥5% dari IHSG sepekan, dan harganya naik peringkatnya dari sini
Tidak kalah dari IHSG sebulan penjaga; ringan — 16 lolos syarat mingguan, 13 juga lolos penjaga
Lolos screening fundamental + likuid ≥Rp1 M/hari tanpa ini daftarnya dipenuhi gorengan
Diskon ≥0% ke nilai wajar sama dengan NAIK_DISKON_MIN, ambang tangga avg up

Ukurannya kekuatan relatif, bukan “naik”. Di pasar yang turun 8%, saham yang turun 3% itu kuat. Kalau syaratnya harus naik, daftarnya kosong persis saat pasar jatuh. Jendela 3 hari pernah dipertimbangkan dan ditolak: 7 Okt IHSG +1,84% dalam 3 hari tapi −7,94% dalam 20 hari, jadi jendela sependek itu menyebut pasar sedang naik padahal ia jatuh.

Maksimal 10 baris, sisanya disebut jumlahnya. Saham dengan RSI ≥70 tetap ditampilkan tapi ditandai ⛔ avg up menolak, karena itu ambang RSI_NAIK_MAKS.

Hanya berbunyi saat IHSG sepekan TURUN

12 Okt 2026. Djoko: “kalau seminggu terakhir ihsg naik, berarti alert ini tidak muncul atau cukup notifikasi.” Benar — saham yang kuat waktu pasarnya ikut naik tidak membuktikan apa-apa.

Kalau IHSG sepekan naik, yang dikirim satu baris saja:

IHSG sepekan +1,5% — pasar sedang NAIK, jadi laporan ini
tidak berlaku minggu ini.

Dipilih kabar singkat, bukan diam total, supaya bisa dibedakan dari jadwal yang gagal jalan.

Hanya posisi yang RUGI, dipecah per kaki broker

12 Okt 2026. Djoko: “laporkan hanya yang posisi saya sedang floating loss, dan pisahkan antara yang di mirae dan stockbit — misalnya TOWR ini saya cek di Stockbit kan udah floating profit, jadi cukup tampilkan posisi yang di mirae aja.”

Angka gabungan memang menyesatkan: TOWR digabung terbaca rugi 6,6% padahal kaki Stockbit-nya sudah untung, dan yang bisa di-avg down cuma kaki Mirae. Jadi satu baris = satu KAKI yang rugi, bukan satu saham. Saham yang rugi di dua grup muncul dua kali dengan angkanya masing-masing; yang untung di semua kaki tidak ditampilkan sama sekali.

Urutannya dari rugi rupiah terbesar, karena itu yang mau didahulukan untuk avg down. Tiap baris juga memuat upside ke nilai wajar, dihitung terhadap harga sekarang — berbeda dari “diskon” yang dihitung terhadap nilai wajar. Dua-duanya benar tapi artinya beda, jadi yang ditulis cuma satu supaya tidak tertukar.

Format barisnya

Bernomor seperti RSI Buy, dengan baris kosong antar saham, dan titik berwarna untuk brokernya:

1. ASII 🔵 Stockbit Long · rugi −11,2% (−Rp981.920)
   sepekan +4,3% — unggul 6,0% dari IHSG · wajar Rp7.403 — upside +52%
   RSI 56 · DV 8,1% · sebulan +0,0% · nilai transaksi Rp214,4 M/hari

2. PGEO 🟠 Mirae · rugi −26,9% (−Rp980.505)
   sepekan +4,2% — unggul 6,0% dari IHSG · wajar Rp1.073 — upside +9%
   RSI 44 · DV 5,0% · sebulan −2,5% · nilai transaksi Rp9,0 M/hari

🔵 Stockbit · 🟠 Mirae · ⚪ broker lain.

Kenapa titik, bukan tulisan berwarna. Telegram tidak mendukung warna teks. Diuji langsung ke API-nya 12 Okt 2026: <font color> ditolak dengan “Unsupported start tag”, dan <span style> ditolak dengan “must have class tg-spoiler”. Tag yang diterima hanya tebal, miring, garis bawah, coret, kode, tautan, dan spoiler. Jadi warnanya dibawa emoji.

Uji 12 Okt: 13 nama lolos syarat kekuatan, menyisakan 9 kaki yang sedang rugi.

Informasi, bukan saran beli. Yang benar-benar boleh ditambah muncul di blok AVG UP pesan Rencana, lengkap dengan jatah lotnya.

Dasar 52 minggu

Rabu 08:20

8 Okt 2026. Djoko melihat grafik TLKM sedang di dasar dan bertanya kenapa tidak ada alert apa pun. Ternyata memang tidak ada laporan yang memuatnya.

Lubangnya terbentuk dari perubahan 7 Okt. Universe RSI Buy dipersempit jadi watchlist saja, dan ia memang sudah membuang saham yang dipegang. Ditambah syarat sinyal RSI dan undervalue, saham watchlist yang sedang di dasar 52 minggu bisa tidak muncul di mana pun. TLKM kena semuanya sekaligus: dipegang (jadi hilang dari RSI Buy), sinyal RSI-nya lewat 5 Okt, dan harganya di atas nilai wajar (jadi avg down menolak).

Apa yang dilaporkan

TingkatSyarat
Menyentuh dasar baru harga penutupan ≤ dasar 52 minggu
Dekat dasar harga ≤ 6% di atas dasar

Ambangnya mula-mula 3%, dinaikkan jadi 6% pada hari yang sama atas permintaan Djoko. Pemicunya TLKM: harganya 5,5% di atas dasar sehingga lolos dari 3%, padahal posisinya cuma 6,7% dari bawah rentang 52 minggu dan di grafik terlihat menyentuh dasar.

Isinya watchlist DAN semua posisi

Semesta 235 saham: 133 watchlist ditambah 102 posisi yang dipegang di luar watchlist. Bagian kedua itu yang paling berguna, dan sekaligus yang paling tidak terlihat di laporan lain. Uji 8 Okt: 21 posisi di luar watchlist sedang dalam 6% dari dasar, modal Rp92,5 juta, semuanya merah dalam — RISE −90%, RMKE −62%, IMPC −50%, EMTK −34%, BBHI −32%.

Tiap baris menyebut grup portfolio-nya, dan satu saham bisa ada di beberapa grup sekaligus:

• MYOR (Stockbit Long + Stockbit Trading, −18.3%) Rp1.380 · dasar 52 mg Rp1.355 (+1,8%)
• BBHI (Stockbit Trading, −32.1%) Rp760 · dasar 52 mg Rp750 (+1,3%)
   ⚠️ tidak masuk kriteria watchlist · RSI 36 · DV 1,7%

Nama grupnya diambil dari fungsi yang sama dengan Rencana, jadi “Stockbit Long” di dua laporan berarti hal yang sama. Saham yang tidak lolos screening diberi tanda ⚠️.

Rabu saja sejak 12 Okt 2026. Djoko: “kirim hari rabu pagi aja” — dulu tiap hari bursa. Tidak ada yang hilang: state menyimpan nama yang sudah dikabari, bukan tanggalnya, jadi saham yang menyentuh dasar hari Kamis tetap muncul di kiriman Rabu berikutnya. Yang berubah cuma kecepatan kabarnya. Rabu dipilih supaya tidak menumpuk dengan Senin, yang sudah berisi “kuat saat pasar lemah” 07:15 dan dua penilaian repair 07:30 & 07:50.

Urutan dan nomor (21 Okt 2026)

Djoko: “tolong dibuat urutannya dari yang ada di portfolio saya, yang masuk watchlist dan kasih nomor supaya lebih enak lihatnya.” Sebelumnya laporan dibagi menurut tingkat (dasar baru / dekat dasar) dan saham yang dipegang bercampur dengan yang tidak. Sekarang dibagi menurut kepemilikan, dengan nomor bersambung dari 1:

📉 DASAR 52 MINGGU — 21 Okt 2026
18 saham: 10 di portfolio, 8 watchlist

Di portfolio (10)
1. PANR (Mirae, −35.4%) Rp346 · dasar 52 mg Rp338 (+2.4%)
2. BOLT (Mirae, −31.3%) Rp735 · dasar 52 mg Rp715 (+2.8%)
…
Watchlist, belum dipegang (8)
11. MKPI Rp20.425 · dasar 52 mg Rp20.050 (+1.9%)

Supaya tidak berisik

State di data/low52_state.json mencatat nama yang sudah dikabari. Nama yang sama dikirim lagi hanya kalau dasarnya turun minimal 2%, atau sesudah harganya keluar dari zona 6% lalu masuk lagi. State hanya disimpan kalau kiriman benar-benar berhasil — kalau Telegram menolak, besok dicoba lagi.

Bukan sinyal beli

Tidak ada syarat pembalikan sama sekali di laporan ini, berbeda dari RSI Buy. Harga di dasar bisa berarti salah harga, bisa juga berarti pasar sudah tahu sesuatu. Keputusan beli tetap lewat Rencana dan RSI Buy.

Bukan menghidupkan screener lama

screen_dekat_low.py dimatikan 27 Sep 2026 karena tumpang tindih dengan RSI Buy, dan skrip itu tetap mati. Yang baru ini berbeda: hanya watchlist dan posisi (bukan seluruh IDX), tanpa analisa bandar (yang dulu membuat laporan itu berat dan sering gagal), dan justru memasukkan saham yang dipegang — alasan matinya yang lama sudah tidak berlaku.

Ikut diperbaiki hari itu: batas tampil 15 nama per bagian dulu memotong daftar tanpa keterangan, jadi 21 dari 36 nama hilang sementara laporannya terlihat utuh. Sekarang ada baris “… dan N lagi, tidak ditampilkan”.

Sesudah dieksekusi

berlaku di Rencana & RSI Buy

7 Okt 2026. Djoko: “kalau saya sudah lakukan eksekusi, harusnya enggak usah muncul lagi alertnya kecuali setelah memenuhi syarat berikutnya” — dan menolak patokan hari: “batasannya bukan soal hari, tapi apakah sudah saya eksekusi atau belum”.

Sisi beli: sudah begitu, dan datanya lengkap

Diperiksa 7 Okt: seluruh 191 posisi aktif punya harga beli terakhir tercatat, nol yang kosong. Gerbangnya:

JalurBaru boleh muncul lagi kalau
AVG DOWNharga ≥10% di bawah pembelian terakhir (CICIL_TURUN)
AVG UPharga ≥5% di atas pembelian terakhir (NAIK_JARAK)
Jatah tanggakumulatif tahap − uang yang sudah masuk, jadi tiap pembelian mengecilkan jatah berikutnya
BELI BARU (RSI Buy)hilang sendiri begitu sahamnya dipegang — universe RSI Buy membuang posisi

Sisi jual: patokannya penjualan, bukan kalender

Dua tambalan dibuang berturut-turut sebelum ketemu bentuk yang benar, dan urutannya layak dicatat karena dua-duanya terdengar masuk akal waktu dipasang:

Penjualan dianggap basi bukan karena umurnya, tapi karena jumlah lembar. Catatan penjualan sudah menyimpan sisa lembar:

KeadaanArtinya
lembar sekarang ≤ sisa saat jual belum beli lagi → penjualan masih berlaku, saran tetap diam
lembar sekarang > sisa saat jual sudah beli lagi → penjualan basi, saran boleh muncul

Dibandingkan per kaki broker, karena satu ticker bisa dipegang di Stockbit dan Mirae sekaligus dan penjualannya tercatat per broker. Kaki tidak ketemu → dipakai total, memilih menampilkan saran daripada membungkamnya. Field note di berkas posisi sempat dipertimbangkan sebagai tanggal pembelian terakhir, tapi formatnya tujuh macam (“reset from broker statement 31Jul2026”, “update beli 2026-10-02”, “beli <tgl> (posisi baru)”, …) — terlalu rapuh untuk jadi gerbang keputusan.

Contoh yang menguji aturannya di hari yang sama

MARK dijual 3 dari 9 lot pada 6 Okt @ Rp1.205, waktu itu premiumnya 23,1% — anak tangga 1/3. Pada 7 Okt harganya Rp1.225, premium 25,1%, melewati ambang 25% sehingga anak tangganya naik ke seluruh sisa. Jadi MARK muncul lagi — bukan pengulangan, melainkan syarat berikutnya terpenuhi, dengan saran yang berbeda: lepas 6 lot sisanya (±Rp741 rb).

Nilai wajar pada hari penjualan tidak tersimpan, jadi premium saat jual dihitung memakai nilai wajar hari ini. Hampiran yang disengaja: yang dibandingkan anak tangganya, bukan angka premiumnya.

Dua perbaikan kecil yang lahir dari pertanyaan lain

Label sektor & nilai wajar

penjaga jalan 28 tiap bulan, 07:30

2 Okt 2026. Nilai wajar sebuah saham dihitung dengan kelipatan laba menurut sektornya. Jadi kalau sektornya salah, nilai wajarnya salah — dan yang berbahaya, salahnya tidak kelihatan: angkanya tetap keluar rapi dengan persentase diskon di sebelahnya.

Ketemu dari CITA. TradingView melabeli CITA — Cita Mineral Investindo, penambang bauksit — sebagai Consumer Durables / Home Furnishings. Akibatnya ia dinilai dengan PER konsumer 15x: nilai wajar Rp4.596, muncul di laporan sebagai “diskon 27%, undervalue”, dan flag itulah yang meloloskannya ke blok AVG UP. Dengan sektor yang benar (basic materials, PER 8x) nilai wajarnya Rp2.772 — di harga Rp3.350 CITA justru 21% di atas wajar.

Tiga lapis pencegahan

Kuncinya: ada dua sumber label yang saling bebas. Screening bulanan memakai sektor dari yfinance, laporan harian memakai sektor dari TradingView. Dua sumber yang tidak sepakat bukan masalah — itu sinyal. Yang berbahaya adalah satu sumber salah tanpa pembanding.

LapisIsi
1. Keputusan manusia data/sektor_keputusan.json dibaca paling dulu, mendahului pemetaan TradingView mana pun. Tiap emiten punya sebab tertulis. Tidak ada skrip yang menulisi berkas ini.
2. Konservatif saat ragu Kalau dua sumber tidak sepakat dan belum ada keputusan, dipakai keranjang yang lebih rendah dari dua kandidat itu. Asimetrinya disengaja: label yang salah tidak boleh bisa menciptakan diskon. Kehilangan peluang masih bisa diperbaiki, beli kemahalan tidak.
3. Dilaporkan tiap bulan cek_sektor.py membandingkan kedua sumber untuk watchlist dan posisi yang dipegang, menulis data/sektor_konflik.json, lalu melaporkan yang belum diputuskan lewat Telegram.

Urutan konservatif dari paling ketat ke paling longgar, mengikuti avg_per/avg_pbv di config: property → basic materials → energy → default → industrials → financials → infrastructure → telecom → consumer → healthcare → technology. Lapis 2 hanya memilih di antara dua kandidat yang ada, bukan mencari keranjang termurah di seluruh daftar.

Dua aturan memutuskan

  1. Bisnisnya menghasilkan uang dari apa — bukan nama sektor di layar. Nama perusahaannya diperiksa dulu; tiga dugaan awal batal karenanya. PGJO ternyata Bahtera Bumi Raya (pelayaran, bukan perangkat lunak), ACRO manufaktur garmen, KMTR pengolahan karet alam dan bukan komponen otomotif seperti kata yfinance.
  2. Kalau benar-benar ambigu, ambil yang lebih konservatif. CPIN, JPFA, dan MAIN masuk basic materials karena labanya ikut siklus harga jagung dan ayam, walau ketiganya punya merek konsumen.

Perlu dicatat: keranjang ini keranjang valuasi, bukan taksonomi industri. default dipakai untuk usaha yang tidak cocok di mana pun — SCMA dan CNMA misalnya, bukan karena datanya hilang, tapi karena televisi free-to-air dan jaringan sinema tidak pantas dinilai dengan kelipatan konsumer.

Hasilnya

72 konflik ketemu dari watchlist ditambah posisi yang dipegang, dan semuanya sudah diputuskan. Dampak ke nilai wajar: 52 tidak berubah, 10 turun, 8 naik.

Turun (diskon palsu hilang)Naik
SRSN−42%TBIG+103%
CITA · UNIC−40%CMRY+50%
MKTR−34%KMTR · PNLF+25%
BEST−30%EMTK+23%
ASGR · CNMA−27%PGAS+22%
ASII−24%BALI+20%
SCMA−18%TOWR+9%
WIRG−6%

CITA langsung keluar sendiri dari blok AVG UP — itu tujuan utamanya. PGAS perlu diperhatikan: perpindahannya dari energy ke infrastructure (transmisi gas dengan tarif diatur, bukan produsen hulu) membuatnya jadi diskon 31%, jadi ia bisa muncul sebagai kandidat beli yang sebelumnya tidak. Itu satu-satunya tempat perubahan ini menciptakan diskon, bukan menghapusnya. TBIG +103% kelihatan ekstrem tapi tidak berakibat: Rp908 masih di bawah harganya Rp1.430.

Tinjauan bisnis tahunan

Label yang benar hari ini bisa basi. Tiap kali sebuah saham muncul sebagai avg down, avg up, atau kandidat beli RSI, kemunculannya dicatat di data/tinjauan_bisnis.json. Kalau tinjauannya sudah lewat 365 hari dan ia masih muncul sebagai aksi dalam 120 hari terakhir, ia masuk laporan tanggal 28 untuk diperiksa manual: bisnisnya masih seperti yang kita kira atau tidak. Saham yang tidak pernah muncul tidak pernah mengisi daftar tugas — bebannya dibatasi kenyataan, bukan panjang daftar.

Jejak kemunculan dan tanggal tinjauan sengaja ditaruh di dua berkas berbeda. Jejak ditulis skrip, tanggal tinjauan hanya manusia. Kalau satu berkas, tanggalnya akan ikut terbarui sendiri setiap saham muncul, dan pengingatnya tidak akan pernah berbunyi.

Cadangan PBV — diberesi hari yang sama

Membetulkan sektor membuka lubang yang lebih dalam. Nilai wajar punya cadangan terakhir: kalau metode sektornya buntu — EPS negatif atau tidak terbaca — nilainya dihitung PBV wajar × nilai buku. Akibatnya diskon besar muncul justru pada emiten yang paling tidak layak diberi diskon. Tiga perbaikan:

MasalahYang berlaku sekarang
Emiten rugi dinilai di atas nilai buku. KMTR EPS −4 dinilai 1,5× buku → “diskon 37%”. Tanpa laba, penggandanya dibatasi 1,0× nilai buku. Garis ini bisa dijelaskan, bukan selera: tanpa laba yang tersisa hanya ekuitasnya sendiri, tanpa premi. KMTR jadi diskon 2%.
Induk keuangan. PNIN “diskon 92%”, PNLF “87%” — dan membatasi ke 1,0× pun tidak menolong (PNIN jadi 88%), karena masalahnya bukan penggandanya melainkan diskon holding. Untuk kasus begini jawaban yang benar adalah diam: tidak ada nilai wajar, bukan nilai wajar yang salah. Daftarnya di sektor_keputusan.json → tanpa_nilai_wajar, diputuskan manusia. Laporan menulis “tidak dinilai” beserta sebabnya, dan emiten itu tidak bisa lolos syarat undervalue.
SOTP gagal diam-diam. EMTK punya entri sotp.json tapi perhitungannya gagal (data anak usaha tidak lengkap), lalu jatuh ke PER/PBV konsolidasi tanpa sepatah pun. Baru ketahuan kebetulan. Menaruh emiten di sotp.json itu pernyataan bahwa hanya SOTP yang masuk akal untuknya. Jadi SOTP gagal → tidak ada nilai wajar, dengan catatan sebabnya, bukan jatuh ke metode yang sudah dinyatakan menyesatkan.

Dampaknya terukur dan terbatas: 3 emiten kehilangan nilai wajar (PNIN, PNLF, EMTK) dan 14 nilai wajar turun — semuanya turun, tidak ada yang naik. Yang paling berarti: ABDA, ANJT, ASDM, FWCT, dan KMTR masing-masing −33%; GEMA, NELY, PSSI, WEGE, PSAT, PTMP masing-masing −17%.

Satu hal yang sudah aman sebelum ini dan tidak perlu diubah: rem jual tidak menahan emiten yang labanya negatif. rem_jual() langsung melepas remnya kalau fund_jelek — dan fund_jelek sudah bernilai benar ketika labanya ≤0. Jadi sisa diskon pada emiten rugi yang masih diperdagangkan jauh di bawah buku tidak pernah bisa mengunci posisimu.

PER TTM dibanding industrinya

semua alert

Menjawab pertanyaan yang tidak bisa dijawab angka PER sendirian: 5,9x itu murah atau mahal? Bank di PER 6x normal; consumer staples di PER 6x biasanya sedang dihukum pasar. Muncul menempel pada baris PER TTM di keenam alert — lib/per_industri.py.

→PER TTM 4.6x (industri 11.7x, 23 emiten → 61% lebih murah)
→PER TTM 173.1x (industri 52.6x, 5 emiten → 229% lebih mahal)
→PER TTM 9.6x (sektor 7.8x, 5 emiten → 23% lebih mahal)
AturanNilaiAlasan
Pembandingmedianbukan rata-rata: satu emiten PER 800x menyeret rata-rata seluruh industri, dan itu sering terjadi di IDX saat laba mendekati nol
Urutanindustri → sektorindustri lebih dekat (Major Banks, 15 emiten); sektor lebih luas (Finance, 58 emiten) dan hanya dipakai kalau industrinya kurang
Sampel minimum5 emitendi bawah itu tidak ada pembanding sama sekali — median dari tiga emiten bukan patokan
PER dibuang≤ 0 atau > 200rugi tidak punya arti sebagai kelipatan laba; di atas 200 presisi semu
Emiten dibuangmcap < Rp300 Mharga tidak mencerminkan penilaian pasar
Ambang kata±20%di antaranya disebut “setara”, supaya beda tipis tidak terdengar berarti

PER BUKAN saringan

Tidak ada satu pun alert yang meloloskan atau menggugurkan saham berdasarkan PER — angka ini murni bahan pertimbangan manual sebelum memutuskan beli. Saringan tetap seperti sebelumnya: laba positif, ROE, PBV, DER, likuiditas, dan diskon ke nilai wajar. Jangan menjadikannya filter tanpa diminta.

  • Tingkat pembanding selalu disebut (“industri” atau “sektor”) berikut jumlah emitennya, jadi kekuatan pembandingnya bisa dinilai sendiri. Tabelnya di-cache harian di data/per_industri.json.
  • Diam kalau tidak layak. Industri tidak dikenali, sampel kurang, atau PER tidak berarti → tanda kurungnya tidak muncul, bukan diisi angka seadanya.
  • Bukan sinyal beli. PER di bawah median bisa berarti salah harga, bisa juga berarti pasar sudah menghargai risiko yang belum terlihat di laporan keuangan. BREN muncul sebagai kandidat AVG DOWN dengan PER 173x — 229% di atas median industrinya yang sendiri sudah mahal.

Konsolidasi sempit + lonjakan volume

Sabtu 10:00

Tidak mengirim laporan sendiri lagi (27 Sep 2026)

Sejak 27 Sep 2026 screener ini jalan dengan --tanpa-kirim: tetap menghitung pada jamnya dan mengisi arsip peristiwa, tapi hasilnya hanya muncul sebagai baris 📦 pada kandidat RSI Buy harian, lengkap dengan tanggal kejadiannya. Aturan di bawah ini tetap berlaku — yang berubah cuma cara menyampaikannya.

Meniru pola DEWA September 2025: harga mendatar berminggu-minggu dengan volume biasa saja, lalu volume mendadak berlipat dan harga menembus batas atas rentangnya. Gagasannya, akumulasi yang selesai biasanya meninggalkan jejak volume sebelum harganya bergerak.

1jendela = 30 hari perdagangan, berakhir 3 hari lalujeda 3 hari wajib — kalau hari lonjakan ikut dihitung, rentangnya melebar sendiri dan polanya tak pernah terdeteksi
2(tertinggi − terendah) / median ≤ 18%sempit
3|ujung ke ujung| ≤ 10%datar — menyingkirkan yang menurun teratur, yang rentangnya bisa sempit tapi bukan konsolidasi
4volume salah satu dari 3 hari terakhir ≥ 2,5× rata-rata jendelalonjakan
5harga ≥ tertinggi jendelamenembus
DAN fundamental sehat + likuid

Akumulasi atau distribusi?

Volume besar sendirian tidak punya arah — distribusi (pemilik lama keluar ke tangan pembeli baru) juga ramai, dan harganya justru jatuh sesudahnya. Dua lapisan dipakai untuk membedakannya:

LapisanUkuranSifat
Harga-volume
selalu tersedia
Posisi penutupan saat lonjakan: (close − low) ÷ (high − low), ditimbang volumegratis, tanpa kuota — jalan meski NeoBDM mati
Arah OBV selama jendela konsolidasi
NeoBDM
kalau tersedia
Flow bandar per sahamsatu-satunya yang menjawab siapa yang membeli; dipanggil hanya untuk yang lolos pola (maks 8), kuota terbatas
LabelSyarat
🟢 condong akumulasitutup ≥ 65% rentang harian saat lonjakan, dan OBV tidak menurun
⚪ campurdi antaranya
🔴 condong distribusitutup ≤ 40%, atau tutup < 50% dengan OBV menurun — dibuang dari daftar (3 Sep 2026), tidak sekadar ditandai

Diuji mundur pada DEWA

Definisi ini menyala 5 kali dalam 445 hari perdagangan — empat di antaranya 22–25 September 2025, persis di titik yang dimaksud. Hasil sesudahnya: +32,8% dalam 20 hari dan +126,9% dalam 60 hari dari sinyal 22 September.

Satu kejadian yang dipilih justru karena berhasil bukan bukti. Tidak ada uji berapa banyak pola serupa di saham lain yang gagal, jadi angka di atas menunjukkan definisinya menangkap pola yang dimaksud — bukan bahwa polanya menguntungkan.

Yang perlu diingat

  • Mencari hal yang berlawanan dengan RSI Buy Alert. Screener ini menangkap saham yang sudah menembus, jadi RSI-nya wajar tinggi (PTBA 80, LSIP 76). RSI Buy Alert mencari titik balik dari dasar. Keduanya disengaja berbeda.
  • Fundamental sehat tetap syarat keras — laba positif, ROE > 5%, PBV < 3, DER wajar, likuid. Dari 843 emiten, 193 gugur fundamental dan 506 tidak likuid sebelum polanya diperiksa.
  • Jumlah yang dibuang tetap disebut di kaki pesan berikut kodenya. Kalau suatu Sabtu yang dibuang jauh lebih banyak daripada yang tampil, itu sendiri kabar tentang keadaan pasar — banyak saham menembus dengan penutupan lemah biasanya bukan tanda pasar yang sehat.
  • Contoh jalan pertama: BGTG volume 11,3× — paling mencolok, tapi tutup di 35% rentang harian dan PER 92% di atas industri. Volume terbesar bukan sinyal terkuat.

Keterangan tetap yang tidak lagi dikirim

3 Sep 2026

Tiga blok ini dulu tercetak di kaki tiap alert Telegram. Isinya tidak pernah berubah, jadi mengirimnya tiap hari hanya memperpanjang pesan — sekarang tinggal di sini.

IstilahArti
DVDividend yield sekarang (harga hari ini)
DV 3 thDividen tahun itu ÷ harga rata-rata tahun itu. Sumber yfinance, sudah disesuaikan pemecahan saham. Maksimal 3 tahun dan tidak lebih tua dari 3 tahun lalu
*Tahun berjalan — belum final
[Long]Portfolio Stockbit “Long” (dulu Main, lalu Hold; ganti nama 16 Sep 2026) — ditahan jangka panjang, termasuk bluechip berdividen kecil
[Trading]Portfolio Stockbit “Trading” (dulu DIV<3%) — dividen > 0 (sejak 15 Sep 2026)
[Spekulatif]Portfolio Stockbit “Spekulatif” (dulu NO-DIV, ganti nama 15 Sep 2026) — fundamental belum menarik, dipegang karena harapan katalis
[MIRAE]Portfolio Mirae
tanpa tandaDi luar keempat grup / tidak dipegang
  • Sumber harga, RSI, dan fundamental: TradingView — sumber yang sama dengan MCP, jadi angkanya konsisten dengan yang muncul kalau ditanya manual.
  • Nilai wajar = median dari metode yang datanya memungkinkan (target analis, PER, PBV, Graham, ROE-PBV) menurut sektornya — lib/fv_tv.py.
  • Posisi dihitung dari harga rata-rata beli di avgdown_watch.json (Stockbit) dan data/avgdown_mirae.json (Mirae).
  • Yang masih dikirim di kaki pesan: baris “Tanpa data (n): …” karena isinya berubah tiap hari dan menunjukkan saham mana yang tidak bisa dinilai, serta penutup “Sinyal berbasis aturan, bukan saran investasi.”
  • Emiten tanpa harga dibedakan: suspend vs delisting — daftarnya di data/status_khusus.json, satu berkas dibaca kedua RSI alert.
    Delisting tidak akan pernah punya harga lagi; kalau posisinya sudah nol, dikeluarkan dari universe supaya berhenti muncul tiap hari (FINN).
    Suspend hanya dihentikan sementara — posisinya masih sah dan harganya bisa muncul lagi, jadi tetap dilaporkan dengan keterangan: Tanpa data (1): ABBA (suspend). Tanpa keterangan itu, barisnya terbaca seperti kegagalan mengambil data (ABBA: 19.100 lembar, modal Rp994.537).

Laporan MINGGUAN dimatikan 12 Okt 2026. Djoko: “sudah tereport tiap mendekat titik terendah.” Yang tersisa gold_low_alert.py, tiap hari 10:00, berbunyi saat harga mendekati titik terendah 30 hari.
Kalau nanti dihidupkan lagi, samakan dulu sumber harganya. Laporan mingguan memakai BUYBACK (tipe “beli” di API Pegadaian) sementara alert harian sudah dipindah ke HARGA BELI (tipe “jual”) pada 7 Okt 2026 — dua harga yang selisihnya 4%. Djoko yang menyadari bedanya.
Konsekuensi: kalau harga emas naik terus berbulan-bulan, tidak ada laporan apa pun, karena alert harian hanya berbunyi di dekat titik terendah.

Laporan emas mingguan

Sabtu 18:00

Satu-satunya laporan di luar saham. Mengambil harga emas langsung dari API Pegadaian (bukan berkas riwayat), menggambar grafik 30 hari, lalu memberi rekomendasi BELI atau TAHAN. Jalan dari /root/idx_screener/gold_weekly_report.py — di luar direktori paper-trade, dengan venv dan .env-nya sendiri.

→deviasi = (buyback hari ini − rata-rata buyback 30 hari) ÷ rata-rata × 100
DeviasiRekomendasiArtinya
≤ −1%✅ BELIBuyback di bawah rata-rata 30 hari — diskon
−1% … 0%🟡 BELI (hati-hati)Sedikit di bawah rata-rata, lumayan untuk masuk
0% … +2%⏸️ TAHANDi atas rata-rata — tunggu koreksi
> +2%⏸️ TAHANAgak mahal
  • Yang dipakai harga BUYBACK, bukan harga jual. Itu harga yang benar-benar kamu terima kalau menjual kembali — memakai harga beli akan membuat setiap titik terlihat lebih untung daripada kenyataannya.
  • Istilah API Pegadaian terbalik dari sudut pandang kita: hargaJual = harga saat kita membeli, hargaBeli = buyback saat kita menjual. Tertukar sekali saja, seluruh rekomendasi terbalik.
  • Spread jual–buyback ikut dicetak. Itu biaya masuk-keluar yang harus tertutup lebih dulu sebelum kenaikan harga jadi keuntungan nyata.
  • Bot terpisah. Memakai @screener_saham1_bot lewat TELEGRAM_TOKEN_GOLD; kalau variabel itu kosong, jatuh ke bot lama supaya laporan tetap terkirim.
  • Docstring di dalam script masih menulis “Sabtu jam 21:00” — sisa versi lama. Yang berlaku adalah crontab: 0 18 * * 6, yaitu Sabtu 18:00 WIB.

Alert adhoc: titik terendah 30 hari

Laporan mingguan hanya melihat ke belakang — titik terendah sebulan baru ketahuan Sabtu, sering setelah harganya naik lagi. gold_low_alert.py jalan tiap hari 10:00 WIB dan hanya bersuara kalau ada yang menembus.

KeadaanTindakan
Buyback < terendah 30 hari🟢 TERENDAH BARU 30 HARI — kirim
Dalam 0,5% di atas terendah🟡 MENDEKATI — kirim, tapi tidak diulang untuk harga yang sama
Lebih dari itudiam
  • Dasar dihitung dari hari-hari SEBELUM hari ini. Kalau harga hari ini ikut dihitung, ia selalu ≥ terendah dan alertnya tidak akan pernah menyala — bug yang tidak menimbulkan error, hanya diam selamanya.
  • Penurunan beruntun tetap dikabari tiap hari, dengan keterangan “hari ke-n berturut-turut mencetak dasar baru”. Membatasinya sekali per penurunan justru melewatkan hari termurahnya.
  • Ambang 🟡 sengaja ketat (0,5%). Dilonggarkan ke 2%, alertnya sering bunyi dan berhenti terasa penting.
  • Memakai fetch_live_prices dan fetch_live_chart_data dari laporan mingguan — satu sumber data dan satu kredensial, tidak ada dua versi yang bisa menyimpang.
  • Alertnya membawa grafik (8 Sep 2026) — dikirim sebagai foto dengan pesannya jadi caption, jadi satu kiriman, bukan dua. Grafiknya bukan grafik laporan mingguan: yang ditonjolkan garis dasar 30 hari yang sedang ditembus dan posisi harga hari ini terhadap garis itu, bukan rentang tinggi–rendah. Harga hari ini memang tidak ada di deret chart Pegadaian — alertnya membandingkan harga live terhadap chart historis — jadi titiknya ditambahkan sendiri di ujung, disambung garis dari titik terakhir.
  • Kalau grafiknya gagal dibuat, teksnya tetap dikirim. Alert yang hilang gara-gara gambar jauh lebih merugikan daripada alert tanpa gambar. Berkas PNG-nya dihapus setelah terkirim.

Bukan sinyal jual

Aturannya hanya mengenal BELI dan TAHAN — tidak ada logika yang menyarankan melepas. Emas di sini diperlakukan sebagai tabungan yang dicicil saat harganya sedang di bawah rata-rata, bukan posisi yang ditradingkan.

Kandidat aksi korporasi

Sabtu 10:30

Tidak mengirim laporan sendiri lagi (27 Sep 2026)

Sejak 27 Sep 2026 screener ini jalan dengan --tanpa-kirim: tetap menghitung pada jamnya dan mengisi arsip peristiwa, tapi hasilnya hanya muncul sebagai baris 🏗️ pada kandidat RSI Buy harian, lengkap dengan tanggal kejadiannya. Aturan di bawah ini tetap berlaku — yang berubah cuma cara menyampaikannya. Catatan: screener ini sendiri masih gagal mengambil data karena IDX memblokir VPS sejak 14 Sep 2026.

Meniru pola yang dipaparkan Samuel Tjan (TikTok, 5 Sep 2026): saham cangkang yang menunjukkan tanda akan di-backdoor listing / diakuisisi, atau emiten yang melakukan rights issue jumbo. Satu-satunya screener yang membaca keterbukaan informasi IDX, bukan data harga saja.

Kebalikan dari semua screener lain

Screener lain menuntut fundamental sehat dan likuid. Yang ini justru mencari emiten rugi, kecil, dan tidak likuid — universe-nya dibuka lebar dan avgdown.layak_tambah sengaja TIDAK dipakai; kalau dipakai, tidak akan ada yang lolos.

Contoh di video dipilih setelah naik ratusan persen (DOOH, PPGL, NATO, IRSX). Tidak ada hitungan berapa banyak emiten cangkang yang berganti direksi lalu tidak terjadi apa-apa — dan itu jauh lebih banyak. Ini bahan penelusuran, bukan sinyal.

Tanda dari judul pengumumanKata kunciBobot
Perubahan pengendalipengambilalihan · akuisisi · pengendali baru+3
Rights issueHMETD · penambahan modal+2
Ganti pengurusperubahan pengurus · direksi/komisaris+2
Ganti auditorakuntan publik+1
Transaksiafiliasi · material · benturan kepentingan—
Profil cangkangAmbang
Kapitalisasi pasarRp10 M – Rp500 M
“mcap kecil”≤ Rp500 M
“harga hancur”≥ 50% di bawah puncak 52w
“rugi”laba bersih ≤ 0
“sepi”nilai transaksi < Rp500 jt/hari

Minimal satu ciri harus ada; ciri dihitung sebagai tanda, bukan saringan keras, supaya emiten dengan pengumuman kuat tetap terlihat. Batas Rp500 M diturunkan dari Rp2 T (5 Sep 2026) — pada batas lama TCID (Rp1,05 T) ikut lolos padahal jelas bukan cangkang; kandidat menyusut dari 19 ke 8.

Rapor fundamental bertanda warna (12 Sep 2026)

Sama seperti Orang dalam membeli, tiap kandidat — termasuk yang masuk lewat ganti pengurus — diberi rapor fundamental bertanda 🔴 ⚪ 🟢 dari lib/rapor_fundamental.py. Angkanya tidak dipakai menyaring apa pun; screener ini memang mencari emiten rugi. Warnanya hanya supaya cangkang yang ekuitasnya sudah tergerus tidak terbaca sama dengan emiten kecil yang masih sehat — SDPC 🔴 DER 2,86x dan BIPP 🔴 ROE −6,7% berdiri di daftar yang sama dengan NELY 🟢 PBV 0,57x. Emiten cangkang justru paling sering kosong di TradingView, jadi di sinilah cadangan yfinance paling banyak terpakai.

Membaca lampiran PDF

Tiga hal penentu tidak ada di judul: tujuan rights issue, ada tidaknya pembeli siaga, dan nilai transaksi. Lampiran kandidat karena itu diunduh, diekstrak teksnya, lalu dihapus segera — maksimal 2 dokumen per emiten, lewati yang >25 MB.

  • pdftotext, bukan pustaka Python. RAM VPS ini 961 MB dengan ~590 MB terpakai; pdfplumber/PyMuPDF memuat seluruh dokumen ke memori, pdftotext berjalan sebagai proses terpisah yang langsung selesai.
  • Sesi pengunduh harus “dipanaskan” dengan mengunjungi halaman IDX lebih dulu untuk mendapat cookie Cloudflare. Tanpa itu sebagian unduhan ditolak 403, dan gejalanya cuma “tidak ada temuan” — bukan error.
  • Kata kunci harus mengikuti bahasa dokumen, bukan istilah baku. WINR sempat lolos tanpa temuan padahal dokumennya berbunyi “penandatanganan addendum terhadap Kesepakatan Akuisisi Saham PT Laxo Global Akses” — informasi terpenting hari itu. Setelah pola diperluas (akuisisi, target/pihak, porsi saham), temuan naik dari 4 jadi 8 baris.
  • Dugaan “dokumen IDX banyak yang hasil pindaian” ternyata salah. Diuji 5 Sep 2026: semua PDF yang terunduh berisi teks (2.300–7.500 karakter) karena dihasilkan sistem e-reporting. OCR/Gemini belum diperlukan; kalau nanti benar ketemu scan, urutannya Tesseract lokal (gratis, dokumen tidak keluar VPS) → OpenAI vision (kunci sudah ada) → Gemini (perlu kunci baru).
  • Kutipan diambil dari sekitar kata kunci, jadi kadang terpotong di tengah kalimat. Cukup untuk memutuskan apakah dokumennya layak dibuka — bukan pengganti membacanya.

Orang dalam membeli

Sabtu 11:00

Tidak mengirim laporan sendiri lagi (27 Sep 2026)

Sejak 27 Sep 2026 screener ini jalan dengan --tanpa-kirim: tetap menghitung pada jamnya dan mengisi arsip peristiwa, tapi hasilnya hanya muncul sebagai baris 👤 pada kandidat RSI Buy harian, lengkap dengan tanggal kejadiannya. Aturan di bawah ini tetap berlaku — yang berubah cuma cara menyampaikannya.

Direksi, komisaris, dan pemegang ≥5% wajib melaporkan perubahan kepemilikan ke IDX lewat KSEI. Alert ini menyaring yang arahnya BELI dan nilainya cukup besar.

Alasannya, dari video Samuel Tjan / Pak Boy (5 Sep 2026): pemilik menjual bisa karena banyak hal — ambil untung, menaikkan free float, kebutuhan pribadi. Membeli dari kantong sendiri hanya punya satu alasan: menurut mereka harganya terlalu murah. Dan merekalah yang paling tahu isi perusahaannya.

UnsurIsi
SumberAPI IDX, keyword="Perubahan Kepemilikan Saham" dengan emitenType="*"
Jendela8 hari
Ambang “cukup besar”nilai ≥ Rp500 jt atau ≥ 0,5% saham beredar
Batas unduhan60 PDF per jalan
  • Arah transaksi hanya bisa diketahui dari isi PDF. Judul laporan identik untuk beli dan jual — 298 dari 300 berjudul sama persis. Yang dibandingkan: jumlah saham sebelum vs sesudah transaksi. Pembacanya di lib/idx_kepemilikan.py, dipakai bersama Layer 8 bandarmologi supaya arah tidak pernah ditafsirkan dua cara.
  • Menyaring judul dari daftar umum tidak bekerja. Dengan emitenType="s" laporan jenis ini tidak muncul sama sekali — pencarian harus lewat parameter keyword.
  • Nama pelapor kadang perusahaan efek, bukan orang. NSSS (25,15% hak suara) dan FILM (8,37%) sama-sama tercatat atas nama SAMUEL SEKURITAS INDONESIA dengan jabatan “Direksi” — begitu isi formulirnya, bukan salah baca. Ditandai ⚠️ atas nama perusahaan efek (kustodian/nominee?) karena artinya berbeda dari direksi perorangan.
  • Pembelian kecil rutin disaring keluar — program saham karyawan atau penyesuaian portfolio tidak menandakan keyakinan apa pun.
  • Mingguan, bukan harian (6 Sep 2026): menarik ~50 PDF sekaligus sekali sepekan lebih ringan daripada tiap hari, dan jendela 8 hari menutup seluruh pekan meski jalannya tertunda. State menyimpan URL yang sudah dibaca supaya tidak dikirim dua kali.

Rapor fundamental bertanda warna (12 Sep 2026)

Laporan ini menjawab “ada apa di emiten ini”, bukan “perusahaannya sehat atau tidak”. Dua hal yang berbeda: orang dalam menambah kepemilikan di emiten yang ROE-nya minus tidak boleh terbaca sama dengan pembelian di emiten yang labanya bertumbuh. Tiap kandidat karena itu diberi rapor — rasio bertanda 🔴 ⚪ 🟢, PER vs industri, riwayat dividend yield 3 tahun, dan status laporan keuangan terbaru. Ambang dan warnanya ditetapkan di satu tempat, lib/rapor_fundamental.py — rinciannya di “Tanda di laporan”.

Contoh nyata 12 Sep: GULA (PT Aman Agrindo) sebelumnya tercetak tanpa satu pun rasio, karena TradingView mengosongkan seluruh kolom fundamentalnya. Sekarang terbaca 🔴 ROE −3,5% 🔴 PBV 6,31x 🟢 DER 0,52x 🔴 rugi Rp5,1 M 🔴 belum pernah membagi dividen. Komisarisnya tetap membeli 20 juta lembar (1,87% saham beredar) — faktanya tidak berubah, tapi sekarang terlihat ini perusahaan macam apa.

Jejak broker — arsip yang dibangun maju

Menjawab “insider ini pakai broker apa?”. Tiap ada pembelian orang dalam, broker net-buy teratas periode itu diarsipkan ke data/jejak_broker.json. Broker yang berulang kali muncul di emiten yang sama ditandai 🔁.

Batasnya besar — jangan diperlakukan sebagai kesimpulan

  • Transaksi besar tidak lewat pasar reguler. Diuji 6 Sep 2026: insider TCID membeli 267.330.074 lembar (2,67 juta lot), sementara broker net-buy teratas di pasar reguler hanya 76 lot. Selisih empat digit — transaksi sebesar itu jalan lewat crossing atau pasar negosiasi, dan tidak akan pernah tertangkap dengan mencocokkan volume broker.
  • Harus dibangun maju. Broker summary NeoBDM hanya menyimpan beberapa hari terakhir; tanggal laporan insider di masa lalu sudah tidak punya data brokernya. Arsip ini tidak bisa direkonstruksi mundur.
  • Broker besar melayani ribuan nasabah. Kalau owner memakai BK atau XL, transaksinya tenggelam. Yang menarik justru broker kecil yang tiba-tiba dominan.
  • Tidak ada cara memverifikasi. Kalau arsip menyimpulkan “owner X pakai broker Y”, tidak ada sumber untuk membuktikannya benar atau salah — dan kesimpulan yang tak bisa diuji cenderung dipercaya begitu saja.

Pembelian orang dalam bukan jaminan

Contoh dari jalan pertama: TCID tercatat “diskon 81%” terhadap nilai wajar tapi ROE −0,7%; NSSS dibeli 308 juta lembar padahal PER-nya 266% di atas median industri. Orang dalam paling tahu isi perusahaannya, tapi mereka juga bisa salah — dan sebagian pembelian punya motif lain: konsolidasi kendali, memenuhi komitmen, atau menyerap pelepasan pihak lain.

Laporan keuangan kuartalan

Sabtu 12:00

Tidak mengirim laporan sendiri lagi (27 Sep 2026)

Sejak 27 Sep 2026 screener ini jalan dengan --tanpa-kirim: tetap menghitung pada jamnya dan mengisi arsip peristiwa, tapi hasilnya hanya muncul sebagai baris 📊 pada kandidat RSI Buy harian, lengkap dengan tanggal kejadiannya. Aturan di bawah ini tetap berlaku — yang berubah cuma cara menyampaikannya. Halaman arsip /lapkeu tetap diperbarui seperti biasa.

Tiap minggu memeriksa apakah ada emiten yang merilis laporan keuangan baru, lalu mengabarkan yang keuangannya membaik dibanding periode yang sama tahun lalu — berbalik dari rugi jadi untung, atau laba YTD-nya tumbuh. Alertnya pendek; rincian tiap saham dan seluruh temuan lama menumpuk di halaman arsipnya.

1ada laporan baru: periode fiskal maju dibanding jalan sebelumnya
2hitung laba YTD dan YTD periode sama tahun lalu
3aberbalik untung: YTD kini ≥ 0, YTD tahun lalu < 0
3blaba tumbuh: keduanya positif, tumbuh ≥ 50%, laba YTD ≥ Rp25 M
membaik: DAN lolos saringan mutu emiten
4aberbalik rugi: YTD kini < 0, YTD tahun lalu > 0
4blaba turun: keduanya positif, turun ≥ 30%
memburuk: HANYA saham yang dipegang

Pemicunya laporan baru, bukan angkanya

Kalau yang dipicu “siapa yang labanya tumbuh”, hasilnya 58 emiten tiap minggu dan isinya itu-itu saja — angka yang sama dilaporkan ulang sampai kuartal berikutnya keluar. Yang dipantau majunya periode fiskal tiap emiten; ada laporan baru masuk, baru dinilai membaik atau tidak.

Konsekuensinya: di minggu tanpa rilis, daftar ini kosong. Laporan kuartalan datang bergelombang empat kali setahun — batas IDX-nya akhir April, Juli/Agustus, Oktober, dan Maret. Kosong bukan tanda alertnya rusak.

earnings_release_date sengaja tidak dipakai sebagai penanda rilis: untuk emiten IDX banyak yang kosong, dan sebagian salah jauh — PTPP tertulis 31 Jul 2023 padahal kuartalnya berakhir 30 Jun 2026.

YTD dihitung sendiri

net_income_fq itu laba satu kuartal, bukan kumulatif, dan TradingView tidak menyediakan field YTD (net_income_ytd selalu kosong). Jadi YTD disusun dari net_income_fq_h — deret laba per kuartal, indeks 0 = terbaru:

→YTD kini = jumlah indeks 0 … n−1
→YTD tahun lalu = jumlah indeks 4 … 4+n−1
→n = nomor kuartal, dari bulan berakhirnya periode (Mar=1, Jun=2, Sep=3, Des=4)

Pendapatan YTD dihitung dengan cara yang sama dari total_revenue_fq_h.

Saringan mutu — menahan saham tak jelas

SyaratAmbangAlasan
Kapitalisasi pasar≥ Rp1 T—
Nilai transaksi harian≥ Rp1 Mrata-rata 10 hari
Harga≥ Rp50buang saham gocap
Rekam jejak≥ 12 kuartalemiten yang baru IPO setahun-dua belum punya sejarah untuk dinilai “membaik”, dan di situ sebagian besar saham tak jelas berkumpul
Harga / penjualan≤ 20×menahan emiten yang harganya besar tanpa penjualan berarti — MINA 295×
DER≤ 4—
Free float≥ 10%hanya untuk emiten di bawah Rp10 T

Ambang float sengaja bersyarat ukuran. Versi pertama memakai float ≥15% tanpa syarat dan itu membuang HMSP (Sampoerna) karena floatnya 8% — padahal itu cuma akibat Philip Morris memegang 92%, bukan tanda gorengan. Ikut terbuang KRAS, ULTJ, dan UCID. Free float baru berarti kalau digabung ukuran kecil.

Dari 843 emiten, 214 lolos saringan mutu ini.

Penanda, bukan saringan

  • 🔴 Pendapatan YTD turun sementara laba naik. Ini pembeda yang paling menentukan: laba naik tanpa jualan naik sering bukan pemulihan operasional melainkan untung sekali jalan — jual aset, restrukturisasi utang, selisih kurs. GGRM 6 Sep 2026 keluar dengan laba YTD naik 25× tapi pendapatan −7%.
  • ⚠️ Harga sudah naik >100% setahun. Kabar baiknya mungkin sudah di harga. Ditandai saja, tidak menggugurkan — TINS +311% dan GGRM +132% keduanya kenaikan yang berdasar.
  • Persentase dari basis nyaris nol dinyatakan sebagai kelipatan. AMMN sempat keluar dengan “pendapatan +39125%” — benar secara aritmetika, tapi tidak memberi tahu apa pun. Di atas 1.000% ditulis “naik 392×”.
  • Universe tidak disaring laba. Saham yang sedang rugi tidak akan pernah lolos syarat “laba positif” — padahal justru itu yang dicari. Yang disaring mutu perusahaannya, bukan labanya.

Alert mengabarkan yang baru, halaman menyimpan yang lama

Telegram bagus untuk memberi tahu, buruk untuk menyimpan catatan: pesan lama tenggelam di riwayat chat, dan ruangnya tidak cukup untuk menjelaskan tiap saham. Jadi tugasnya dibagi:

TempatIsi
Alert Telegramringkas — jumlah emiten yang merilis, berapa yang membaik, dan maksimal 8 nama per kategori. Sisanya cukup disebut jumlahnya.
/lapkeumenumpuk — tiap jalan ditambahkan sebagai bagian bertanggal di paling atas, temuan lama tetap ada. Tiap saham dapat kartu sendiri berikut penjelasannya.

Penjelasan per saham disusun dari angkanya sendiri, bukan dikarang: apa yang berubah, apakah ditopang penjualan atau cuma pos sekali jalan, seberapa berat utangnya, dan apakah harganya sudah lari. Tidak ada kalimat yang tidak bisa ditelusuri ke angka di kartu yang sama — tidak ada model bahasa yang ikut menulis di situ.

Arsipnya di data/lapkeu_arsip.json, halamannya ditulis ulang seluruhnya tiap jalan (lib/lapkeu_arsip.py), jadi menjalankan ulang di tanggal yang sama menimpa, bukan menggandakan.

Sisi memburuk: hanya yang dipegang, dan bukan sinyal jual

Cakupannya sengaja dibatasi ke posisi yang dimiliki. Kabar buruk tentang emiten yang tidak dipegang tidak menuntut keputusan apa pun. Sebaliknya, saham yang dipegang tetap dipantau walau tidak lolos saringan mutu — justru posisi seperti itu yang perlu diawasi. Karena itu universenya 299 emiten, bukan 214.

Yang lebih penting: laba memburuk bukan alasan menjual. Diuji atas 4.969 pengamatan dari 215 emiten (2020–2026), diukur terhadap median pasar di bulan masuk yang sama, dengan asumsi laporannya baru bisa dipakai 60 hari setelah kuartal berakhir:

KelasnMedian 12 bln vs pasar% kalahkan pasar
berbalik untung339+6,3%55%
laba tumbuh ≥50%1.042+2,4%53%
laba datar2.207−2,0%47%
laba turun ≥30%717+4,6%55%
berbalik rugi296−2,5%46%
  • Emiten yang labanya turun ≥30% justru mengalahkan pasar, dan positif di setiap tahun yang diuji: 2020 +6%, 2021 0%, 2022 +4%, 2023 +3%, 2024 +7%, 2025 +9%.
  • Untuk siklikal jauh lebih tajam: +14,1% dan 66% dari 211 kejadian. Laba anjlok di tambang, energi, dan kimia biasanya menandai dasar siklus, bukan kerusakan — menjual di situ berarti menjual tepat sebelum pemulihan. Kartu emiten siklikal diberi label tersendiri supaya tidak salah dibaca.
  • Yang agak berdiri sendiri hanya berbalik rugi di non-siklikal (median −4,3%, 44%). Itu pun alasan meninjau ulang, bukan menjual otomatis.
  • Tidak ada keunggulan di horizon 3 bulan (+0,4% dan 51% untuk kelompok terbaik — setara koin). Apa pun edge-nya butuh sekitar setahun untuk muncul, jadi ini bukan pemicu trading.
  • Bias yang tidak bisa dihilangkan: universe uji = emiten yang hari ini masih bermutu, jadi perusahaan yang benar-benar ambruk dan terlempar dari daftar tidak ikut terhitung. Bias itu mengangkat semua angka, terutama kelompok kabar buruk — hasil sesungguhnya untuk “berbalik rugi” kemungkinan lebih jelek dari −2,5%.
  • Sektor keuangan dan perusahaan investasi diberi peringatan sendiri. SRTG keluar dengan “pendapatan naik 130%, yang tergerus margin” — benar menurut angkanya, tapi menyesatkan: laba Saratoga didominasi penilaian ulang portofolio, bukan kegiatan operasional.

Membaik bukan berarti murah

Alert ini menjawab “keuangannya membaik atau tidak”, bukan “harganya pantas atau tidak”. Tidak ada uji valuasi sama sekali di sini — nilai wajar, diskon, dan titik masuk tetap dinilai terpisah. Satu kuartal membaik juga belum tentu tren; laba sekali jalan bisa membalikkannya kuartal berikutnya.

Tanda CICIL

Buy Alert + Bandarmologi

DIMATIKAN 18 Sep 2026 — aturan di bawah ini arsip

Keputusan Djoko: prinsip CICIL sama dengan AVG DOWN di 🎯 Rencana hari ini, tapi ambangnya beda (CICIL 5%, Rencana 10% dari pembelian terakhir) — dua laporan bisa memberi saran beli yang berlawanan. Sekarang tanda 🟢 CICIL, ⏳ CICIL tunggu sinyal beli, dan ⛔ jangan tambah tidak dicetak lagi di RSI Buy maupun bandarmologi.

Yang tetap dicetak (konteks, bukan saran): jarak harga ke pembelian terakhir, ke cicilan termurah, dan bobot di portfolio — contoh -42.2% dr beli terakhir (Rp716) · 0.6% portfolio. Sejak sore 18 Sep harga beli terakhirnya ikut dicetak, dan posisi di lebih dari satu portfolio diberi label yang jelas: dr beli terakhir: Long +0.0% (Rp605) · Trading -18.5% (Rp742) · 1.6% portfolio — dulu tercetak Long +0.0% · Trading -18.5% tanpa label dan terbaca seperti untung/rugi. Caranya: avgdown.hitung(..., saran=False). Versi grup teman tetap membuang baris ini.

Menempel pada saham yang sudah muncul di laporan — bukan daftar tersendiri.

→harga ≤ 95% × beli terakhirsatu-satunya pemicu

Tiap baris juga membawa dua angka pendamping: berapa persen harga masih di atas cicilan termurah, dan berapa persen saham itu terhadap seluruh portfolio.

Kenapa pemicunya cuma satu

Aturan lama berbunyi “5% di bawah beli terakhir atau di bawah beli terendah”. Itu menyesatkan: harga terendah selalu ≤ harga terakhir, jadi ambang keduanya selalu lebih rendah dan tidak pernah tercapai lebih dulu. Syarat kedua tidak pernah menambah satu sinyal pun.

Contoh PANS — beli terakhir Rp1.565, terendah Rp1.515. Ambangnya Rp1.486 dan Rp1.439; yang bekerja selalu Rp1.486. Harga terendah kini dipakai sebagai konteks: menjawab apakah cicilan berikutnya benar-benar lebih murah dari yang terbaik.

Penjaga: fundamental rusak = berhenti menambah

Tanda CICIL ditahan kalau fundamentalnya sedang rusak — angkanya tetap dicetak, tapi dengan ⛔ jangan tambah beserta sebabnya. Tanpa penjaga ini sistem paling rajin menyuruh menambah tepat pada saham yang labanya sedang rontok, karena saham itulah yang paling sering turun 5%.

Syarat menambahAmbang
Laba bersih (TTM)> 0
ROE> 5%
PBV< 3
DER — umum / sumber daya / keuangan≤ 2,5 · ≤ 3,0 · bebas
Minimal ada satu angka fundamentalwajib

Dividen sengaja bukan syarat — perusahaan yang baru pulih sering belum membagi dividen lagi. Riwayat dividen tiga tahunnya tetap dicetak di laporan sebagai bahan pertimbangan manual.

Kenapa dihitung harian, bukan dari watchlist

Versi pertama penjaga ini memakai keanggotaan watchlist kuartalan. Masalahnya watchlist hanya diperbarui tiap tiga bulan, sehingga saham yang sudah pulih baru diakui berbulan-bulan kemudian — bertabrakan dengan strategi turnaround.

Lebih halus lagi: dua kriteria screening sebenarnya peka harga (PBV dan dividend yield dihitung terhadap harga saat screening), jadi saham bisa gugur hanya karena waktu itu harganya sedang tinggi — lalu setelah harganya turun, justru saat kamu ingin mencicil, dia sebenarnya sudah lolos.

Diukur 31 Ags 2026: dari 78 holding yang lewat ambang −5%, penjaga watchlist meloloskan 18, penjaga harian meloloskan 44. Yang ditahan: 15 karena PBV ≥ 3, 10 karena ROE ≤ 5%, 5 sedang rugi, dan 4 tanpa data fundamental sama sekali.

  • Saham berdividen rendah punya syarat tambahan (14 Sep 2026): DY rata-rata 3 tahun <3%/th → CICIL baru muncul setelah RSI ≤35 lalu naik. Rinciannya di Portfolio repair. Berlaku di RSI Buy Alert; tanda CICIL di bandarmologi belum memakainya.
  • Acuannya pembelian terakhir, bukan harga rata-rata. Rata-rata bergerak tiap menambah posisi, jadi dia mengukur seluruh riwayat — bukan apakah harga sudah cukup turun sejak masuk terakhir.
  • Dipisah per broker — SB Stockbit, MIRAE Mirae. Contoh nyata: AMRT masih +0,4% di Stockbit tapi sudah −5,0% di Mirae. Dirata-rata, sinyal itu hilang.
  • Porsi portfolio dicetak karena tanda ini tidak punya rem alami: tiap pembelian menurunkan acuan, sehingga saham yang terus jatuh akan terus memanggil.
  • Kenapa menempel, bukan berdiri sendiri: 78 dari 220 holding sudah turun >5%. Sebagai daftar mandiri itu puluhan baris tiap hari — bukan sinyal lagi.

Saham overvalue yang kamu pegang

23 Okt 2026

Djoko: “tolong list saham yang overvalue saya, diurutkan dari yang paling atas yang paling overvalue dengan analisa narasi yang agak lengkap, lalu tulis di url aturan alert saham.” Yang dimaksud: saham yang kamu pegang dan berlabel 🔴 overvalue, yaitu harga ≥ 15% di atas nilai wajar versi sistem. Dari 181 saham yang dipegang (sedikitnya 1 lot) ada 15, diurutkan dari premium terbesar. Harga memakai penutupan 22 Okt 2026 (dihitung 23 Okt pagi, sebelum bursa buka).

Konteks pasar. Seluruh 15 saham ini sedang rugi, dan sebagian besar penurunannya baru terjadi bulan ini. IHSG ditutup anjlok 11,57% pada 16 Okt 2026 ke level 5.185 (terdalam sejak 1998 menurut RCTI+; terendah 6 tahun menurut Investortrust) setelah MSCI membuka konsultasi penurunan status pasar Indonesia, disertai penjualan bersih besar-besaran investor asing, rupiah yang melemah, dan jatuhnya saham konglomerasi. Pembukaan Senin 19 Okt turun lagi sekitar 4%. Jadi sebagian besar “premium” di bawah sudah menyusut karena harga turun, bukan karena nilai wajar naik.
Sumber: IHSG ditutup anjlok 11,57% (Investortrust) · Terdalam sejak 1998 (RCTI+) · Dampak jika MSCI turunkan status (PojokSatu) · IHSG sentuh 4.900 di pembukaan (KabarBursa)

Cara membaca angkanya

Apa kata aturan sistem untuk saham-saham ini

Ringkasan

#SahamPortfolioHargaNilai wajarPremiumUpside ke wajarPosisi
1CBREMiraeRp670Rp227.808%−100%−39,4%
2BRENMiraeRp2.320Rp233896%−90%−57,5%
3RISEMirae + Stockbit SpekulatifRp540Rp90499%−83%−91,1%
4IMPCStockbit TradingRp830Rp141490%−83%−68,6%
5PANIStockbit TradingRp4.420Rp1.000342%−77%−37,2%
6CDIAStockbit TradingRp424Rp115270%−73%−49,7%
7BIPIStockbit SpekulatifRp93Rp32188%−65%−46,4%
8RMKEStockbit TradingRp306Rp117162%−62%−65,0%
9BUAHMiraeRp452Rp24485%−46%−39,3%
10BBHIStockbit TradingRp580Rp39049%−33%−48,2%
11SMBRStockbit TradingRp128Rp9140%−29%−32,9%
12BRPTMiraeRp1.440Rp1.06535%−26%−37,7%
13RAJAStockbit TradingRp478Rp36631%−23%−54,4%
14DATAMiraeRp1.100Rp94716%−14%−77,4%
15BOLTMiraeRp745Rp64416%−14%−30,4%

1. CBRE — premium 27.808% (nilai wajar tidak bermakna)

Rp670 · wajar Rp2 · upside ke wajar −100% · posisi −39,4% · Mirae
ROE – · PBV 279,08x · PER – · DER 89,36x · dividen 0,0%
Transportation / Marine Shipping · metode nilai wajar: PBV 1.0x (tanpa laba)

Bisnis dan kinerja. Cakra Buana Resources Energi menjalankan bisnis armada kapal untuk sektor energi, dan sedang masuk ke offshore (kapal pipe laying dan lifting vessel, dibiayai kredit Maybank US$45 juta). Pendapatan semester I 2026 Rp88,96 miliar, lebih dari tiga kali lipat setahun sebelumnya (Rp29,08 miliar), tetapi perusahaan masih rugi bersih karena beban operasional dan bunga naik. Rugi 2025 sekitar Rp70 miliar; manajemen menargetkan pendapatan 2026 naik 30%.

Kenapa terbaca mahal. Nilai wajar Rp2 muncul dari rumus PBV 1x tanpa laba, sementara ekuitasnya nyaris habis (PBV 279x, DER 89x). Jangan dibaca sebagai “harga seharusnya Rp2”. Yang bisa dibaca dari angka ini hanya satu: perusahaan rugi dan sangat berutang, sehingga metode berbasis laba tidak bisa dipakai.

Ke depan dan yang dipantau. Ada rencana rights issue sampai Rp1,91 triliun pada harga pelaksanaan Rp100–150 per saham (kabar Desember 2025; status pelaksanaannya belum kuverifikasi), untuk membayar utang, modal kerja, dan menambah armada. Harga itu jauh di bawah harga pasar sekarang, jadi kalau terlaksana, dilusi bagi yang tidak menebus bisa besar. Yang dipantau: laporan kuartal III, jadwal dan harga rights issue, dan apakah rugi bersih menyempit.

Sumber: Rugi CBRE membengkak (KabarBursa) · Pendapatan semester I 2026 (BCA Sekuritas) · Rencana rights issue (RCTI+) · Target pendapatan +30% (Bisnis)

2. BREN — premium 896% (bertumbuh, valuasi sangat tinggi)

Rp2.320 · wajar Rp233 · upside ke wajar −90% · posisi −57,5% · Mirae
ROE 23,8% · PBV 24,96x · PER 119,5x · DER 3,03x · dividen 0,2%
Utilities / Electric Utilities · metode nilai wajar: PER

Bisnis dan kinerja. Barito Renewables Energy (grup Prajogo Pangestu) memproduksi listrik dari panas bumi dan angin. Laba bersih kuartal I 2026 sekitar US$43 juta (Rp728,98 miliar), naik 25,6% dari setahun sebelumnya, dengan pendapatan naik 9,8%. Pada sembilan bulan 2025 laba pemilik induk US$106,55 juta, naik 23,8%.

Kenapa terbaca mahal. PER sekitar 120x dan PBV sekitar 25x; rumus yang memakai PER sektor menarik nilai wajar ke Rp233. Pasar membayar pertumbuhan dan status “energi hijau milik grup besar” yang tidak tertangkap rumus. Harga sudah turun dari Rp10.725 (tertinggi 52 minggu) ke Rp2.320, termasuk 25% dalam sebulan terakhir.

Ke depan dan yang dipantau. Manajemen yakin kinerja positif berlanjut sepanjang 2026 lewat tambahan kapasitas panas bumi dan angin. Prajogo Pangestu menambah 6,8 juta saham pada Juni 2026 di kisaran Rp3.740–3.880, di atas harga sekarang. Yang dipantau: laporan kuartal III (biasanya akhir Oktober), utang (DER 3,0x), dan kepekaan terhadap isu MSCI. Bacaanku: saham grup dengan free float tipis biasanya paling peka terhadap isu konsentrasi kepemilikan; ini bukan kabar dari sumber.

Sumber: Laba kuartal I 2026 (Bisnis) · Prajogo membeli 6,8 juta saham (Bisnis) · Laba kuartal III 2025 (Bisnis)

3. RISE — premium 499% (laba naik tajam, harga jatuh paling dalam)

Rp540 · wajar Rp90 · upside ke wajar −83% · posisi −91,1% · Mirae + Stockbit Spekulatif
ROE 7,2% · PBV 3,13x · PER 49,3x · DER 0,24x · dividen 0,0%
Finance / Real Estate Development · metode nilai wajar: median property: PBV 104 · PER 77

Bisnis dan kinerja. Jaya Sukses Makmur Sentosa mengembangkan properti dan hospitality (Tanrise, VASA). Laba pemilik induk kuartal I 2026 naik 496% menjadi Rp97,2 miliar (pendapatan Rp173,1 miliar, naik 36%). Semester I: pendapatan Rp287 miliar (naik 34%) dan laba Rp123,5 miliar (naik 273%), ditopang penyelesaian proyek seperti Solaris Villa Bali dan Malang. Pendapatan 2025 Rp410,72 miliar.

Kenapa terbaca mahal. PER sekitar 49x dan PBV 3,1x; median valuasi properti memberi Rp90. Harga Rp540 adalah sekitar 95% di bawah tertinggi 52 minggu dan turun 37% dalam sebulan, jadi sebagian besar premium sudah hilang lewat penurunan harga, bukan lewat naiknya nilai wajar.

Ke depan dan yang dipantau. Proyek semester II: Tanrise Industrial Park Palembang, VASA Ubud (investasi sekitar Rp1 triliun, dibangun sejak 17 Juli 2026, selesai sekitar 30 bulan), dan Tanrise Bandung. Perusahaan juga membagikan saham bonus 25:12 pada Februari 2026. Bacaanku: laba pengembang cenderung naik-turun mengikuti penyelesaian proyek, dan proyek senilai Rp1 triliun besar dibanding ukuran pendapatannya, jadi yang perlu dilihat adalah arus kas dan pendanaannya.

Sumber: Laba kuartal I naik 496% (KabarBursa) · Ekspansi semester II 2026 (BCA Sekuritas) · Investasi VASA Ubud Rp1 triliun (KabarBursa) · Fokus kawasan terintegrasi (BCA Sekuritas)

4. IMPC — premium 490% (laba naik, harga turun hampir separuh dalam sebulan)

Rp830 · wajar Rp141 · upside ke wajar −83% · posisi −68,6% · Stockbit Trading
ROE 28,8% · PBV 14,38x · PER 59,0x · DER 0,34x · dividen 0,0%
Producer Manufacturing / Miscellaneous Manufacturing · metode nilai wajar: PER

Bisnis dan kinerja. Impack Pratama Industri membuat material bangunan (antara lain atap Alderon); ekspor sekitar 33% pendapatan. Semester I 2026 pendapatan Rp2,47 triliun (naik 29,7%) dan laba Rp446,5 miliar (naik 51%). Target 2026: pendapatan Rp5,1 triliun dan laba di atas Rp700 miliar, yang dinilai analis ambisius tetapi masih realistis. Pabrik baru di Batang, Jawa Tengah, disebut kunci pertumbuhan, dan ada buyback hingga Rp500 miliar.

Kenapa terbaca mahal. PER sekitar 59x dan PBV 14x; rumus PER sektor memberi Rp141. Harga turun sekitar 49% dalam sebulan dan sekitar 80% dari tertinggi 52 minggu (Rp4.170), tetapi masih jauh di atas nilai wajar versi rumus.

Ke depan dan yang dipantau. Risiko yang disebut: konflik AS–Israel–Iran menekan rantai pasok, menaikkan biaya logistik dan harga bahan baku, dan membatasi pasokan polimer. Permintaan material bangunan, baik ritel maupun proyek, disebut manajemen masih berkembang. Yang dipantau: margin kuartal III dan apakah target Rp5,1 triliun tetap dipertahankan.

Sumber: Target pendapatan Rp5,1 triliun (Bisnis) · Target dinilai ambisius tapi realistis (Kontan) · Koreksi saham IMPC (Kontan) · Pendapatan kuartal I 2026 (BCA Sekuritas)

5. PANI — premium 342% (metode valuasinya sendiri sangat berserakan)

Rp4.420 · wajar Rp1.000 · upside ke wajar −77% · posisi −37,2% · Stockbit Trading
ROE 10,0% · PBV 2,76x · PER 31,0x · DER 0,02x · dividen 0,1%
Consumer Non-Durables / Food: Meat/Fish/Dairy · metode nilai wajar: median property: target 19,200 · PER 1,000 · PBV 961

Bisnis dan kinerja. Pantai Indah Kapuk Dua mengembangkan kawasan PIK2. Marketing sales kuartal I 2026 Rp987 miliar (naik 112%); semester I Rp1,9 triliun (naik 66%), atau 45% dari target setahun Rp4,3 triliun yang sama dengan realisasi 2025. Pendorongnya segmen residensial dan kavling komersial; katalis kawasan: NICE (convention) dan Tol Kataraja.

Kenapa terbaca mahal. PER sekitar 31x, PBV 2,8x, ROE 10%. Metode di dalam rumus saling berjauhan: PBV Rp961, PER Rp1.000, tetapi target analis Rp19.200; median yang dipakai sistem jatuh di Rp1.000. Artinya premium 342% sangat bergantung pada metode mana yang dipercaya. Harga Rp4.420 adalah sekitar 72% di bawah tertinggi 52 minggu.

Ke depan dan yang dipantau. Untuk mengejar target, semester II perlu sekitar Rp2,4 triliun (hitungan sederhanaku dari angka sumber). Manajemen menyebut tantangan berupa kenaikan harga BBM, konsumen yang makin selektif, dan geopolitik. Yang dipantau juga: rights issue besar yang direncanakan sejak 2025 (sampai sekitar Rp19 triliun untuk menaikkan kepemilikan di CBDK; jadwal dan harga direvisi Desember 2025, status terkininya belum kuverifikasi).

Sumber: Marketing sales semester I 2026 (RCTI+) · Marketing sales kuartal I 2026 (Bisnis) · Target Rp4,3 triliun (Bisnis) · Rights issue Rp15.000 per saham (Bisnis, Okt 2025)

6. CDIA — premium 270% (pendapatan naik, laba turun tajam)

Rp424 · wajar Rp115 · upside ke wajar −73% · posisi −49,7% · Stockbit Trading
ROE – · PBV 2,85x · PER 44,4x · DER 0,74x · dividen 1,6%
Utilities / Electric Utilities · metode nilai wajar: PER

Bisnis dan kinerja. Chandra Daya Investasi bergerak di infrastruktur energi dan logistik. Pendapatan 2025 naik 44,8%. Semester I 2026 pendapatan naik sekitar 22% tetapi laba bersih turun sekitar 74% (kuartal I: turun 68,6% ke US$9,5 juta, antara lain karena beban umum dan administrasi naik). Pendapatan logistik tumbuh 48,9% pada kuartal I; kapal kimia Novah dan Boreas mulai beroperasi. Per 30 Juni 2026 kas dan surat berharga US$658,7 juta, utang terhadap kapitalisasi 41%.

Kenapa terbaca mahal. PER sekitar 44x, sehingga nilai wajar versi PER hanya Rp115. Pasar sudah bereaksi: saham turun hampir 3% ke Rp650 pada 29 Juli 2026 meski laporan semester I dinilai baik, dan kini Rp424, sekitar 80% di bawah tertinggi 52 minggu.

Ke depan dan yang dipantau. Kekuatan neracanya cukup besar dibanding ukuran harga sahamnya, dan sumber menyebut kapasitas surya bertambah pada 2026. Pertanyaannya apakah beban administrasi stabil dan laba kembali tumbuh di kuartal III. Angka laba berbeda antar-sumber, jadi rujukannya laporan keuangan resmi.

Sumber: Laba kuartal I turun 68,6% (Investortrust) · Pendapatan 2025 naik 44,8% (Kontan) · Semester I 2026: laba turun 74% (Kontan) · Kinerja baik, saham tidak (KabarBursa)

7. BIPI — premium 188% (bisnis utamanya sedang dilepas)

Rp93 · wajar Rp32 · upside ke wajar −65% · posisi −46,4% · Stockbit Spekulatif
ROE 3,3% · PBV 0,70x · PER 23,0x · DER 1,07x · dividen 0,0%
Energy Minerals / Coal · metode nilai wajar: PER

Bisnis dan kinerja. Astrindo Nusantara Infrastruktur adalah emiten batu bara yang beralih ke energi (mini LNG di Wunut, Sidoarjo; kerja sama pasokan gas dengan ENRG; energi baru terbarukan). Kuartal I 2026 rugi kecil (US$73.637) karena penjualan batu bara turun 43,29%; semester I berbalik laba US$4,44 juta walau pendapatan turun 33,22%, berkat beban pokok yang turun. Bakrie Capital membeli 212,86 juta saham di Rp180 pada 25 Mei 2026.

Kenapa terbaca mahal. ROE hanya 3,3% dan PER sekitar 23x, tetapi PBV 0,70x. Rumus PER memberi Rp32, jauh di bawah Rp93; sebaliknya terhadap nilai buku harganya masih di bawah 1x. Dua pembacaan itu sama-sama sah, dan keduanya menunjukkan laba yang kecil.

Ke depan dan yang dipantau. Rencana pelepasan anak usaha batu bara SBG (sekitar Rp1,78 triliun) setara 84,19% pendapatan dan 39,15% aset, sehingga memerlukan persetujuan RUPSLB. Artinya sumber pendapatan terbesar akan berganti, sementara LNG dan energi terbarukan masih bergantung pada pendanaan dan eksekusi, dan analis menilai penerbitan saham baru mungkin. Yang dipantau: hasil RUPSLB, harga pelepasan, dan rencana pendanaan. Harga sekarang di bawah harga beli Bakrie Capital (Rp180).

Sumber: Semester I 2026 berbalik laba (IDNFinancials) · Kuartal I berbalik rugi (IDNFinancials) · Rencana lepas entitas batu bara (Kontan) · Transformasi ke LNG dan EBT (Kontan)

8. RMKE — premium 162% (target besar, harga sudah dibelah dan turun)

Rp306 · wajar Rp117 · upside ke wajar −62% · posisi −65,0% · Stockbit Trading
ROE 17,1% · PBV 3,45x · PER 21,0x · DER 0,55x · dividen 2,0%
Distribution Services / Wholesale Distributors · metode nilai wajar: PER

Bisnis dan kinerja. RMK Energy adalah perusahaan logistik batu bara di Sumatera Selatan (jalan hauling khusus, jasa angkutan, penjualan batu bara). Target 2026: volume jasa batu bara di atas 12 juta ton (dari sekitar 8 juta ton), pendapatan sekitar Rp4,1 triliun, laba sekitar Rp800 miliar, dan 2–3 pelanggan baru. Perusahaan menjalankan buyback sampai Rp200 miliar (2 Februari–1 Mei 2026) dan membagi dividen Rp130,9 miliar (Rp30 per saham).

Kenapa terbaca mahal. PER sekitar 21x, PBV 3,45x, ROE 17%; rumus PER memberi Rp117. Harga Rp306 adalah harga setelah stock split 1:5 (berlaku 17 Juli 2026), jadi target analis Rp10.000–12.000 dari Januari adalah harga sebelum split dan sudah usang. Saham sudah turun 53,6% sejak awal tahun per 21 Mei, lalu turun lagi 24% dalam sebulan terakhir.

Ke depan dan yang dipantau. Rencana larangan angkutan batu bara lewat jalan umum menguntungkan jalan hauling khusus, dan ada potensi kontrak besar terkait tambang Bukit Asam. Risiko yang disebut: ketergantungan pada sedikit pelanggan, waktu kontrak baru, dan penerapan larangan truk batu bara. Yang dipantau: realisasi volume semester II terhadap target 12 juta ton.

Sumber: Target pendapatan Rp4,1 triliun (Investortrust) · Visibilitas pendapatan menguat (BCA Sekuritas) · Buyback Rp200 miliar (Bisnis) · Harga teoritis stock split (KabarBursa)

9. BUAH — premium 85% (bisnis stabil, pertumbuhan melambat)

Rp452 · wajar Rp244 · upside ke wajar −46% · posisi −39,3% · Mirae
ROE 26,1% · PBV 4,62x · PER 17,9x · DER 0,01x · dividen 5,6%
Distribution Services / Food Distributors · metode nilai wajar: median industrials: PER 252 · Graham 236

Bisnis dan kinerja. Segar Kumala Indonesia mendistribusikan buah impor dan ayam beku. Pendapatan 2025 Rp3,27 triliun (naik 47,7%) dan laba Rp50,4 miliar (naik sekitar 42%). Rapat pemegang saham 26 Mei 2026 menyetujui dividen total Rp50 miliar dan menaikkan batas payout hingga 150%.

Kenapa terbaca mahal. ROE 26%, PBV 4,6x, PER 17,9x, dividen 5,6%. Median PER dan Graham memberi Rp244. Target pendapatan 2026 hanya naik sekitar 4%, jauh melambat dari 2025, dan margin bersihnya tipis (sekitar 1,5% dari pendapatan, hitunganku dari angka sumber), jadi pasar kurang punya alasan membayar valuasi tinggi. Harga paling stabil di daftar ini (turun 8,5% dalam sebulan).

Ke depan dan yang dipantau. Rencana 2026: cabang baru di Sulawesi Utara dan Sumatra, cold storage bertambah sekitar 500 ton, belanja modal sekitar Rp12 miliar. Risiko yang disebut manajemen: harga BBM yang bergejolak dan daya beli yang lemah.

Sumber: Kinerja 2025 dan cold storage (Kontan) · Target pendapatan +4% 2026 (Kontan) · Dividen Rp50 miliar dan payout 150% (KabarBursa)

10. BBHI — premium 49% (bank digital bertumbuh, ROE masih rendah)

Rp580 · wajar Rp390 · upside ke wajar −33% · posisi −48,2% · Stockbit Trading
ROE 7,9% · PBV 1,71x · PER 21,6x · DER 0,22x · dividen 2,3%
Finance / Regional Banks · metode nilai wajar: median financials: PBV 510 · ROE-PBV 270

Bisnis dan kinerja. Allo Bank adalah bank digital. Laba bersih kuartal II 2026 Rp130 miliar (naik 14%), pendapatan operasional Rp533 miliar (naik 21%); pendapatan bunga bersih naik 10% dan pendapatan berbasis komisi naik 71%. Semester I laba Rp234 miliar. Kredit tumbuh 28% menjadi Rp9,547 triliun, NPL gross 1,73% (net 0,73%), dana pihak ketiga Rp5,826 triliun.

Kenapa terbaca mahal. ROE 7,9% dengan PBV 1,7x; nilai wajar Rp390 dari metode PBV dan ROE–PBV. Pasar membayar pertumbuhan, sementara imbal hasil modalnya masih rendah. Harga turun 34% dalam sebulan dan mendekati terendah setahun.

Ke depan dan yang dipantau. Manajemen berharap momentum berlanjut sampai akhir 2026 lewat dana murah (CASA), segmen ritel digital, dan efisiensi. Ada buyback maksimal Rp300 miliar (3 September–2 Desember 2026), setelah buyback Rp200 miliar (1 Juli–1 September). Permodalan sangat tebal (CAR sekitar 66%, menjadi sekitar 63,6% setelah buyback); kredit lebih besar dari dana pihak ketiga, dan selisihnya dibiayai modal sendiri (hitunganku dari angka sumber). Yang dipantau: kemampuan menaikkan ROE.

Sumber: Laba kuartal II 2026 (detikFinance) · Buyback Rp300 miliar (KabarBursa) · Optimistis tumbuh sampai akhir 2026 (Kontan)

11. SMBR — premium 40% (murah terhadap nilai buku, laba kecil)

Rp128 · wajar Rp91 · upside ke wajar −29% · posisi −32,9% · Stockbit Trading
ROE 3,4% · PBV 0,37x · PER 11,2x · DER 0,12x · dividen 2,8%
Non-Energy Minerals / Construction Materials · metode nilai wajar: PER

Bisnis dan kinerja. Semen Baturaja berstatus Persero sejak 15 Januari 2026, dengan pangsa pasar sekitar 34% di Sumatra bagian selatan. Pendapatan 2025 Rp2,36 triliun (naik 12,9%), laba Rp171,92 miliar. Target 2026: volume penjualan naik 12,6%, pendapatan naik 13,6%, laba naik sekitar 57%. Dividen Rp3,46 per saham.

Kenapa terbaca mahal. ROE 3,4% dan PER sekitar 11x membuat nilai wajar versi PER Rp91, di bawah harga Rp128. Sebaliknya PBV hanya 0,37x, artinya harga jauh di bawah nilai buku. Premium 40% di sini adalah selisih kecil dalam rupiah (Rp37 per saham) dan lebih mencerminkan laba yang tipis daripada harga yang tinggi.

Ke depan dan yang dipantau. Industri semen menghadapi kelebihan kapasitas dan persaingan harga (Kontan, Mei 2026), sehingga target laba naik 57% perlu dilihat realisasinya. Laporan kuartalan 2026 tidak muncul dalam pencarianku, jadi realisasi target belum bisa kupastikan. Yang dipantau: laporan kuartal III dan harga jual semen di Sumatra.

Sumber: Target dobel digit 2026 (Kontan) · Laba 2025 naik 33% (IDX Channel) · Permintaan pasar Sumatra (Kontan)

12. BRPT — premium 35% (holding utang tinggi, bertumpu pada kilang dan listrik hijau)

Rp1.440 · wajar Rp1.065 · upside ke wajar −26% · posisi −37,7% · Mirae
ROE 6,1% · PBV 3,10x · PER 55,5x · DER 3,52x · dividen 0,1%
Non-Energy Minerals / Forest Products · metode nilai wajar: median basic_materials: target 1,923 · PER 208

Bisnis dan kinerja. Barito Pacific adalah induk dari Chandra Asri (petrokimia, kilang Aster Singapura yang diakuisisi April 2025, dan jaringan ritel bahan bakar Esso) dan Barito Renewables Energy. Laba kuartal I 2026 melonjak berkat kilang Singapura; kapasitas produksi tahunan grup sekitar 20 juta ton. Analis (Kiwoom, KISI) menilai prospek hingga akhir 2026 positif.

Kenapa terbaca mahal. PER sekitar 55x, PBV 3,1x, ROE 6,1%, DER 3,5x. Median target analis (Rp1.923) dan PER sektor (Rp208) memberi Rp1.065, jadi metodenya sendiri berjauhan. Harga Rp1.440 sekitar 63% di bawah tertinggi 52 minggu.

Ke depan dan yang dipantau. Kinerjanya bertumpu pada dua anak usaha, kilang Aster dan BREN. Yang dipantau: beban utang (DER 3,5x), margin kilang, dan kinerja BREN yang ikut menentukan. Bacaanku: seperti BREN, grup ini peka terhadap isu MSCI; ini bukan kabar dari sumber.

Sumber: Masih cerah 2026 (Kontan) · Tak lagi bergantung pada petrokimia (Kontan) · Sinergi BREN dan TPIA (Kontan)

13. RAJA — premium 31% (infrastruktur gas, harga turun dalam)

Rp478 · wajar Rp366 · upside ke wajar −23% · posisi −54,4% · Stockbit Trading
ROE 19,0% · PBV 2,57x · PER 15,4x · DER 1,36x · dividen 2,8%
Utilities / Gas Distributors · metode nilai wajar: median infrastructure: PER 372 · Graham 360

Bisnis dan kinerja. Rukun Raharja bergerak di infrastruktur gas terintegrasi (kompresor gas Sengkang, investasi di Cepu, dan kontribusi Grup Hafar). Pendapatan 2025 US$266,7 juta dan laba US$27,2 juta; empat bulan pertama 2026 penjualan US$78,6 juta dan laba US$13,1 juta. Pefindo mempertahankan peringkat idA+ dengan prospek stabil untuk Juli 2026–Juli 2027.

Kenapa terbaca mahal. ROE 19%, PER 15x, PBV 2,6x; median PER dan Graham memberi Rp366 (premium 31%). Harga turun 35% dalam sebulan ke dekat terendah 52 minggu. Target analis Desember 2025 (Rp6.800–7.900) sudah tidak bisa dibandingkan dengan harga sekarang; penyebabnya belum kuverifikasi.

Ke depan dan yang dipantau. Katalis 2027 yang disebut analis: proyek floating LNG, rencana akuisisi perusahaan pelayaran, dan pipa BBM di Kalimantan Timur. Risiko: harga minyak lebih rendah dari perkiraan, proyek tertunda, dan perubahan peraturan. Yang dipantau: kemajuan tiap proyek, karena dampaknya ke laba bergantung pada masing-masing.

Sumber: Peringkat idA+ stabil (Kontan) · Ekspansi anak usaha 2026 (Investortrust) · Prospek RAJA (Kontan)

14. DATA — premium 16% (premium kecil, pengendali baru)

Rp1.100 · wajar Rp947 · upside ke wajar −14% · posisi −77,4% · Mirae
ROE 36,0% · PBV 3,65x · PER 12,0x · DER 1,14x · dividen 0,0%
Communications / Major Telecommunications · metode nilai wajar: median telecom: PER 1,104 · Graham 790

Bisnis dan kinerja. Remala Abadi adalah penyedia layanan internet rumah (home connect) dengan jalur serat antarkota. Pada 13 Juli 2026 Protelindo (anak usaha TOWR, grup Djarum) membeli 40% saham dari iForte dan 11% dari perorangan, sehingga memiliki 51% dan menjadi pengendali. Pendapatan 2025 Rp430,34 miliar (naik dari Rp348,19 miliar) dengan laba kotor Rp319,56 miliar; laba sebelum pajak sedikit turun menjadi Rp139,21 miliar dari Rp145,22 miliar.

Kenapa terbaca mahal. ROE 36%, PER 12x, PBV 3,65x. Premium hanya 16%, yang paling dekat ke nilai wajar di daftar ini. Yang besar adalah penurunan harganya: dari sekitar Rp3.600–3.800 (Februari 2026) ke Rp1.100, atau turun sekitar 70%.

Ke depan dan yang dipantau. Rencana ekspansi sebelumnya menargetkan 500 ribu home connect dengan kebutuhan investasi Rp200–250 miliar; pendapatan 2025 ternyata hanya naik sekitar 24%, jauh dari target dua kali lipat. Pengendali baru dengan jaringan menara dan serat optik bisa mempercepat ekspansi (penilaian analis di sumber). Yang perlu dicek: apakah ada kewajiban penawaran tender atas perubahan pengendali; ini umumnya berlaku untuk perubahan pengendali, tetapi statusnya belum kuverifikasi, jadi cek keterbukaan informasi BEI.

Sumber: Grup Djarum kendalikan 51% (IDNFinancials) · Saham DATA sideways usai akuisisi (Kontan) · Target pendapatan dan rekomendasi (Kontan)

15. BOLT — premium 16% (premium tipis, dividen tinggi, bergantung siklus otomotif)

Rp745 · wajar Rp644 · upside ke wajar −14% · posisi −30,4% · Mirae
ROE 17,2% · PBV 2,07x · PER 12,5x · DER 0,43x · dividen 6,7%
Producer Manufacturing / Auto Parts: OEM · metode nilai wajar: median industrials: Graham 694 · PER 594

Bisnis dan kinerja. Garuda Metalindo membuat baut dan komponen pengikat untuk otomotif (pemasok OEM) dan mulai masuk ke industri umum dan alat berat. Pendapatan 2025 Rp1,67 triliun dan laba Rp142,38 miliar. Target 2026: pendapatan naik 5–10% dan laba naik sekitar 12–15%. Laba kuartal I 2026 Rp37 miliar, ekspor kuartal I naik 14,2%, dan dividen Rp50 per saham.

Kenapa terbaca mahal. ROE 17%, PER 12,5x, PBV 2,1x, dividen 6,7%. Premium 16% berada tepat di batas label overvalue (15%), jadi sedikit penurunan nilai wajar atau kenaikan harga cukup untuk membuatnya berlabel fair. Harga Rp745 hanya turun 10% dalam sebulan, lebih ringan dibanding rata-rata daftar ini.

Ke depan dan yang dipantau. Produksi kendaraan 2026 diperkirakan lebih tinggi dari 2025 dan biasanya naik di semester II, yang menjadi katalis. Risikonya siklus industri otomotif: pada kuartal III 2024 penjualan turun 2,65% dan laba turun 37,35%.

Sumber: Target 2026: pendapatan +5–10% (Kontan) · Mengejar target akhir 2026 (Kontan) · Dividen Rp50 per saham (KabarBursa)

Dihitung 23 Okt 2026 dengan jalur yang sama dengan RSI Buy dan Rencana (harga TradingView, nilai wajar rsi_alert.nilai_wajar, label overvalue = premium ≥ 15%). Skrip: daftar_overvalue.py (hanya membaca). Halaman ini tidak diperbarui otomatis; angkanya potret 23 Okt 2026.

🔭 Prospek bisnis di saran beli

mulai 23 Okt 2026

Di bawah tiap saham yang disarankan dibeli ada satu baris 🔭 Prospek: dua kalimat tentang arah bisnis atau industrinya, dengan tanggal riset di ujungnya. Muncul di Rencana (AVG DOWN, AVG UP, BELI LAGI, BELI BARU, keputusan manual) dan RSI Buy. Di blok jual tidak ada.

HalAturannya
Siapa yang menulisClaude, lewat riset web, bukan skrip. Skrip hanya membaca hasilnya dari data/prospek_saham.json.
IsiMaksimal 450 karakter, teks biasa. Tiap narasi menyimpan tanggal riset dan tautan sumbernya.
Kapan dianggap basiLebih dari 21 hari. Narasi basi tidak ditampilkan sama sekali (lebih baik tidak ada baris daripada angka lama).
Siapa yang dirisetSaham yang tampil sebagai saran beli dalam 14 hari terakhir (dicatat di data/prospek_tampil.json, hanya saat laporan benar-benar terkirim, bukan dry-run). Isi awalnya 32 saham.
Efek ke urutanTidak ada. Baris prospek tidak ikut dihitung di skor tanda dan tidak mengubah urutan saham.

Rutinitas mingguan. Saham yang belum punya narasi atau narasinya sudah basi dicari dengan python3 lib/prospek.py perlu, lalu Claude meriset dan menyimpan dengan python3 lib/prospek.py simpan KODE "teks" URL... (jalankan sebagai claude-scripts). lihat menampilkan semua narasi yang tersimpan.

Batasan. Narasi ini ringkasan berita dan laporan yang ketemu lewat pencarian, bukan analisa lengkap, dan tidak menilai harga wajar. Sebagian sumber lama atau dibuat sebelum IHSG jatuh 11,57% pada 16 Okt 2026, jadi target harga analis di dalamnya perlu dibaca dengan hati-hati. Kalau sumber tidak memuat sesuatu, narasi menulisnya apa adanya (misalnya “belum kuverifikasi”).

🔄 Perpindahan undervalue ↔ overvalue

mulai 23 Okt 2026

Djoko, 23 Okt 2026: “nanti kalau ada saham yang awalnya undervalue tapi mendadak jadi overvalue atau sebaliknya, akibat laporan keuangan yang berubah, bisa tolong kamu kasih saya alert dan catat di url alert saham?”

HalAturannya
KapanTiap tanggal 28 jam 08:45, sesudah screening kuartalan (06:00) dan sesudah Rencana serta RSI Buy menyegarkan status valuasi. Skripnya cek_perubahan_valuasi.py.
Yang diperiksaSaham yang dipegang atau ada di watchlist (sekitar 200 saham). Universe lain tidak ikut, supaya tidak ramai.
Yang dilaporkanHanya perpindahan langsung 🟢undervalue ↔ 🔴overvalue. Perpindahan ke atau dari ⚪fair tidak dilaporkan. Ambang labelnya tetap ±15% (aturan status valuasi).
Dibandingkan denganPotret pemeriksaan sebelumnya (data/snapshot_valuasi.json): label, nilai wajar, harga, dan periode laporan tiap saham. Potret pertama diambil 23 Okt 2026, jadi pemeriksaan 28 Okt membandingkan dengan 23 Okt (5 hari), lalu seterusnya sebulan sekali.
SebabTiap perpindahan diberi satu dari empat sebab, memakai aturan yang sama dengan baris “sejak laporan masuk” di Rencana: laporan keuangan (periode laporan berganti dan nilai wajar bergeser paling sedikit 2x lebih besar dari harga), revisi analis (nilai wajar bergeser tanpa laporan baru), harga saja, atau keduanya.
HasilPesan Telegram (“PERUBAHAN VALUASI”, bagian “Perubahan Valuasi”) dan catatan di tabel bawah. Kalau tidak ada yang berpindah, pesan tetap terkirim dengan satu kalimat itu, supaya diam tidak ambigu dengan skrip yang gagal jalan.

Batasan. Laporan kuartal III baru wajib terbit akhir Oktober sampai pertengahan November, jadi pemeriksaan 28 Okt baru menangkap emiten yang melapor lebih awal. Sisanya tertangkap 28 Nov. Selama itu, perpindahan harian tetap muncul sebagai baris ⚡ di RSI Buy dan Rencana. Kalau Rencana atau RSI Buy tidak jalan pada hari kerja terakhir sebelum tanggal 28, pesan membawa peringatan bahwa status valuasi mungkin basi.

Catatan pemeriksaan

Memuat catatan…

Tanda di laporan

TandaArtiAmbang
🟢 undervalueHarga di bawah nilai wajardiskon ≥ 15%
⚪ fairSekitar nilai wajardi antaranya
🔴 overvalueHarga di atas nilai wajarpremium ≥ 15%
⚫ belum dinilaiSemua metode valuasi buntu—
[Long] [MIRAE]Broker / kelompok portfolio — muncul di ketiga laporan, dari satu file yang samabisa lebih dari satu
tanpa tandaDi bandarmologi: belum dipegang di broker mana pun. Di RSI Alert: di luar keempat grup—
DV 3 thDividen per tahun ÷ harga rata-rata tahun itumaks 3 tahun, tidak lebih tua dari 3 tahun lalu
🟢 pada DVRata-rata 3 tahun ≥ 5%≥ 5%
🔴 tidak ada dividenBelum pernah membagi, atau pernah lalu berhenti (termasuk riwayat yang berhenti beberapa tahun lalu). “Data tidak tersedia” TIDAK diberi merah — tidak tahu berbeda dari tidak ada, dan menandainya akan menuduh emiten yang datanya kebetulan gagal diambil—

Letak tanda (21 Okt 2026). Djoko: “mustinya kamu konsisten untuk semua alert. kalau mau di depan ya di depan semua, jangan kadang ada yang di depan kadang di belakang.” Aturannya sekarang: bulat status selalu di depan baris, di Rencana, RSI Buy, dan laporan dasar 52 minggu.

Rapor fundamental di alert keterbukaan informasi (12 Sep 2026)

Dipakai Orang dalam membeli dan Kandidat aksi korporasi. Ambangnya sengaja dijajarkan ke config.json → screening, bukan angka baru — supaya satu saham tidak pernah disebut sehat di satu laporan dan buruk di laporan lain.

Rasio🔴 buruk⚪ wajar🟢 bagus
ROE< 0%0 – 15%≥ 15%
PBV> 3x, atau ekuitas negatif1 – 3x< 1x
DER> 2,5x (energi/tambang > 3,0x)1 – 2,5x< 1x
Labarugiuntung— pertumbuhannya dinilai baris Lapkeu
Dividenbelum pernah, atau sudah berhentiada, rata-rata < 5%rata-rata 3 th ≥ 5%
  • Sektor keuangan: DER tidak dinilai sama sekali — utang adalah bahan bakunya, bukan beban. Dicetak DER – (keuangan).
  • Merah hanya ada di sini, tidak di laporan RSI. lib/tanda.py sengaja cuma punya hijau: laporan RSI sudah punya penanda merahnya sendiri (overvalue, ⛔ jangan tambah, condong distribusi) dan merah baru akan bertabrakan. Laporan keterbukaan informasi tidak punya penanda itu — di situ merah justru yang paling penting.
  • Kosong di TradingView → diambil dari yfinance, dan sumbernya disebut di baris terakhir rapor. Yang tidak ada di kedua sumber ditulis n/a beserta catatan, bukan dihilangkan: baris yang hilang tidak bisa dibedakan dari data yang gagal diambil.
  • PBV dan PER cadangan dihitung lewat lib/fundamentals.get_fundamentals(), bukan priceToBook yfinance langsung — di situlah koreksi mata uang untuk emiten pelapor USD berada. Tanpa itu PBV ITMG/ADRO terbaca ratusan kali terlalu besar (PTSN pernah 12.416x).
  • EPS yfinance disaring dulu. Dibuang kalau ROE implisit (EPS ÷ BVPS) di luar ±100%, atau beda tanda dengan ROE yang dilaporkan. WINR tercatat EPS 907,8 padahal harganya Rp28 dan nilai bukunya 70,5 — PER-nya jadi 0,0x dan tercetak “100% lebih murah dari industri”.
  • Nilai laba selalu dari yfinance, walau kolom TradingView terisi: net_income TradingView tidak sejalan dengan riwayat kuartalan yang dipakai baris Lapkeu. NELY sempat tercetak “laba positif Rp39,8 M” tepat di bawah “Q2 2026: berbalik rugi”. Satu laporan tidak boleh menyebut dua arah untuk emiten yang sama.
  • Besaran laba hanya dicetak kalau laporannya rupiah. Emiten pelapor USD (ADRO, ITMG) cukup disebut “laba positif” — “laba Rp448 jt” untuk laba USD448 juta jauh lebih menyesatkan daripada tidak menyebut angkanya. Tandanya tetap benar, karena yang dipakai hanya positif atau negatif.

📑 Kesegaran laporan keuangan & siapa yang dinilai

tanggal 28 jam 07:10

19 Okt 2026. Djoko: “untuk ngecek value saham yang secara teknikal masuk rekomendasi buy atau sell, itu harganya pakai bahan lapkeu terakhir juga. gimana cara kamu make sure bahannya dari laporan keuangan terakhir, mungkin kamu harus cek per bulan untuk hal ini.”

Yang terjadi sebelum ini: tidak ada yang memastikan

Nilai wajar dihitung tiap pagi dari EPS dan nilai buku yang diambil TradingView dari laporan kuartalan terakhir tiap emiten (fiscal_period_end_fq). Tidak ada yang memeriksa apakah periode itu memang yang terbaru. Rencana hanya mencetak “Lapkeu: Q2 2026” di bawah tiap saham, tanpa menandai kalau periodenya tertinggal.

Uji pertama 19 Okt 2026 langsung menemukan yang nyata: dari 230 saham (watchlist + dipegang), 221 sudah Q2 2026, tetapi PGAS (Stockbit Long) dan LPGI masih di Q1 2026, dan 6 saham tanpa data periode sama sekali (ABBA, ACRO, DOSS, KAQI, NAIK, PLIN). Nilai wajar PGAS yang dipakai tangga jual dan avg up datang dari laba satu kuartal lebih lama dari saham lainnya.

Dua pemeriksaan, karena masing-masing punya titik buta

PemeriksaanCara kerjaTitik butanya
Tertinggal dari mayoritas Periode yang paling banyak dipakai di universe dianggap terkini; saham dengan periode lebih tua ditandai. Tidak bergantung kalender. Kalau semua tertinggal, tidak melihat apa-apa.
Tertinggal dari kalender Periode mayoritas dibandingkan dengan laporan yang seharusnya sudah terbit menurut batas OJK. Satu emiten yang telat lapor dari jadwal tidak terlihat; kalender juga baru “menuntut” periode baru 14 hari sesudah batas.

Batas yang dipakai (akhir bulan, ditambah 14 hari karena TradingView memproses beberapa hari sesudah rilis resmi): Q1 → 30 Apr, Q2 → 31 Agu (semester, dengan tinjauan terbatas), Q3 → 31 Okt, Q4 → 31 Mar tahun berikutnya (tahunan, diaudit). Diuji di 13 tanggal; contoh: 13 Nov 2026 masih menuntut Q2, 15 Nov menuntut Q3.

Hanya menandai, tidak memblokir. Saham yang datanya tertinggal tetap bisa dinilai manual, dan memblokir akan menghilangkan saran jual untuk posisi yang justru perlu diperhatikan. Pesannya dikirim tiap tanggal 28 jam 07:10, sesudah screening 06:00; kalau semuanya segar, satu kalimat saja supaya bisa dibedakan dari jadwal yang gagal jalan.

🔴 Tertinggal dari mayoritas (2) — periksa manual sebelum menjual atau menambah:
1. PGAS · masih Q1 2026 · dipegang Stockbit Long · watchlist
2. LPGI · masih Q1 2026 · watchlist

Siapa yang dinilai untuk tiap aksi

Pertanyaan Djoko yang kedua: apakah saham yang sudah keluar dari watchlist, tetapi masih dipegang, tetap dinilai? Jawabannya tergantung aksinya. Diperiksa dari kode (lib/strategi.py) dan dari keluaran Rencana 19 Okt 2026:

AksiHarus lolos watchlist?Syarat lain
🔴 Jual semua, 💰 tangga jual, cut loss berpasangan Tidak Semua posisi yang dipegang. Terbukti: SBMA “tidak masuk kriteria watchlist” tetap muncul sebagai jual semua.
🟢 Avg down Tidak Lolos pemeriksaan fundamental langsung (laba >0, ROE, PBV, DER) dan undervalue ≥15%. Itu pemeriksaan terpisah dari watchlist.
🟢 Avg up Ya Hanya Long, di atas rata-rata beli, RSI <70, kuat melawan pasar, dan lolos watchlist. Saham yang gugur dari watchlist tidak akan pernah disarankan avg up, sekalipun masih dipegang.
🆕 Beli baru Ya (cuma watchlist) Bukan saham yang dipegang; dikerjakan RSI Buy.

Jadi yang sisi jualnya diperhatikan lengkap, sisi avg up-nya tidak. Itu sudah begitu sejak aturan 1 Okt 2026 (avg up wajib lolos screening) dan sengaja: avg up adalah menambah di atas harga rata-rata, risikonya lebih besar dari avg down. Kalau suatu saat mau dilonggarkan untuk saham yang gugur dari watchlist, itu keputusan terpisah.

Keputusan Djoko 19 Okt 2026: dua aturan ini disetujui

Sesudah meninjau dua temuan di atas, Djoko menetapkan keduanya tetap berlaku:

  1. Bahan nilai wajar = laporan keuangan terakhir yang dimuat TradingView, dibaca ulang tiap pagi sebelum saran beli atau jual dibuat. Tidak ada pengambilan data tambahan di luar TradingView. Alasannya: “harusnya tradingview cukup update.” Pemeriksaan bulanan tanggal 28 di atas yang menjaga asumsi itu — kalau ada saham yang tertinggal atau seluruh data tertinggal dari jadwal OJK, kelihatan di sana.
  2. Saham yang gugur dari watchlist tidak pernah disarankan avg up, sekalipun masih dipegang. Sisi jual dan avg down tetap berlaku untuk semua posisi. Alasannya: “ini cara yang sehat.”

Jangan diubah tanpa diminta. Kalau salah satunya dipertanyakan lagi, rujukannya keputusan ini, bukan kebiasaan sistem.

Sumber data screening & kapan saham yang gugur bisa masuk lagi

tanggal 28 jam 06:00

19 Okt 2026. Djoko bertanya apakah analisa watchlist bulanan juga memakai TradingView, lalu kapan saham yang gugur bisa masuk lagi, lalu kenapa dulu yfinance yang dipilih.

Dua sumber untuk dua tugas

TugasSumberIsinya
Screening watchlist, sebulan sekaliYahoo Finance (yfinance) laba tahunan 4 tahun, riwayat dividen, yield rata-rata, ROE, PBV, FCF, DER
Nilai wajar, RSI, saran beli/jual, tiap pagiTradingView EPS, nilai buku, target analis, ROE, PBV, DER, laba kuartalan

Daftar saham yang diuji: seluruh IDX (get_idx_tickers), bukan cuma watchlist lama. Tidak ada daftar hitam, jadi saham yang gugur bulan ini diuji lagi dari nol bulan depan.

Seberapa jauh kedua sumber berbeda

Dibandingkan 19 Okt 2026 pada 133 saham di watchlist (angka Yahoo saat screening 1 Okt lawan angka TradingView hari itu):

Sebagian selisih itu beda waktu ukur (sekitar 2,5 minggu), bukan beda sumber. Pemeriksaan kesegaran lapkeu tanggal 28 hanya memeriksa TradingView, bukan Yahoo.

Kenapa dulu yfinance

Alasannya tidak tercatat. Catatan sesi dan komentar kode tidak menyebut kenapa yfinance yang dipilih; lib/fundamentals.py sudah memakainya sejak berkas itu ada (18 Agu 2026). Jangan dibaca sebagai keputusan yang sudah dipertimbangkan. Yang bisa dipastikan hanya apa yang masing-masing sumber mampu, di bawah.

Apakah TradingView sanggup menggantikan Yahoo untuk screening

Diuji 19 Okt 2026 dengan memanggil tiap kolom pada BBRI, ASII, dan PGAS. Hati-hati membacanya: pustaka screener TradingView tidak memberi error untuk nama kolom yang tidak ada; ia mengembalikan None. Jadi “ada” hanya berlaku kalau nilainya terisi.

Bahan screeningKolom TradingViewHasil uji
Laba tahunan berturut-turutnet_income_fy_hada (riwayat tahunan)
Dividen berturut-turutdps_common_stock_prim_issue_fy_hada (dividen per saham per tahun fiskal)
FCFfree_cash_flow_fy, _ttmada
ROE, PBV, DERsudah dipakai harianada
Yield dividen rata-rata 3 tahunkolom riwayat yield, harga historistidak ada (semua None)

Jadi hampir semua bahan ada, tetapi rata-rata yield 3 tahun tidak bisa direproduksi dari TradingView: itu butuh harga historis, dan screener hanya memberi nilai terkini. Dividen per tahun fiskal juga tidak persis sama dengan dividen per tahun kalender ex-date yang dipakai Yahoo, jadi kasus batas seperti “dividen 2025 dan 2026 saja” bisa dihitung lain.

Pertimbangan (tahap 1 dikerjakan 20 Okt 2026; tahap 2 belum diputuskan)

A. Tetap Yahoo, TradingView sebagai pembanding dan cadangan (saran). Kelemahan yang nyata bukan beda angka, melainkan data Yahoo yang gagal terbaca: dari 97 saham dipegang di luar watchlist, 7 lolos semua saringan kalau diuji hari ini (AMRT, ASDM, CITA, CLPI, RAJA, TAPG, WINE) tetapi tidak masuk watchlist 1 Okt. Pola cadangan ke TradingView sudah dipakai di repair Senin sejak 18 Sep 2026. Tahap pertama cukup melaporkan selisih tanpa mengubah isi watchlist; cadangannya baru dipasang kalau hasilnya bersih.

B. Pindah penuh ke TradingView. Satu sumber dan satu definisi dengan analisa harian, tapi yield 3 tahun hilang, ambang perlu dikalibrasi ulang, dan keanggotaan watchlist akan bergeser tanpa bisa diperkirakan.

Alasan gugur di bawah baris peringatan Rencana (20 Okt 2026)

Djoko: “kalau ada notifikasi ‘tidak masuk kriteria watchlist (screening 1 Okt 2026)’ bisa tolong ditambahkan tidak masuknya dari sisi apa? apakah roe nya kekecilan atau gimana supaya saya bisa punya judgment.”

Sekarang baris peringatan itu diikuti satu baris alasan, lengkap dengan angka dan ambangnya:

⚠️ tidak masuk kriteria watchlist (screening 1 Okt 2026)
   ↳ ROE 3.0% (perlu >5%) · riwayat laba tidak terbaca di Yahoo (laporan tahunan kosong)

Contoh lain dari Rencana yang sama: ROE -13.3% (perlu >5%), FCF negatif (Rp-253 M), PBV 7.83x (perlu <3x), dividen belum 3 tahun berturut (2021, 2023, 2025, 2026 — ada tahun yang bolong). Dengan angka itu terbaca apakah gagalnya tipis (ROE 4,9%) atau jauh (ROE −13%).

Kenapa baru sekarang. Fungsi alasannya (_sebab_screening) ditulis 2 Okt, tetapi hanya dipanggil dari blok “AVG UP ditahan” yang dibuang 8 Okt atas permintaan Djoko. Sejak itu fungsinya tidak punya pemanggil, dan baris di bawah tiap saham memang tidak pernah memuat alasan: ia hanya bilang ‘tidak masuk’, tanpa ‘karena apa’.

Satuan FCF ikut diperbaiki. Emiten pelapor dolar (ADRO, ADMR) tertulis “FCF negatif (Rp-0 M)” padahal FCF-nya −US$207 juta dan −US$485 juta: nilainya dibagi miliar dan diberi awalan Rp. Kini satuan mengikuti mata uang laporan (format_uang() di lib/fundamentals.py): “FCF negatif (−US$207 jt)”. Cache alasan bulan ini dibersihkan untuk 40 saham yang memuat FCF supaya dihitung ulang. Pesan saat screening 28 Okt ikut memakai fungsi yang sama.

Tahap 1 dikerjakan: pembanding sumber (20 Okt 2026)

Djoko: “kerjakan tahap pertama sebelum 28 Okt.” Skrip bandingkan_sumber_screening.py jalan tanggal 28 jam 07:20, sesudah screening 06:00. Ia menunggu sampai watchlist.json diperbarui dan quarterly_screen tidak lagi jalan (maksimal 80 menit); kalau screening ternyata tidak selesai, yang terkirim adalah peringatan itu.

Hanya melaporkan. Skrip ini tidak menulis watchlist.json maupun berkas screening mana pun, jadi tidak bisa mengubah isi watchlist. Satu-satunya tulisan tidak langsung: kalau berkas sebab gugur screening belum ada, alasan gugur dihitung lewat lib/sebab_gugur yang menyimpan cache bulanannya di data/sebab_gugur.json.

Saringan yang sama dengan screen_stock dihitung dari kolom TradingView (ROE, PBV, FCF tahun fiskal terakhir, DER sesuai sektor, laba tahunan, dividen per saham per tahun fiskal). Pesannya memisahkan angka (ROE, PBV, FCF, DER; kedua sumber membaca laporan yang sama, jadi beda di sini patut dicurigai) dari riwayat (laba dan dividen; definisinya memang beda).

Hasil uji pertama, pada watchlist 1 Okt

UkuranHasil
Anggota watchlist (Yahoo)133; kalau TradingView yang dipakai, 156
Keanggotaansama 119 · hanya Yahoo 13 · hanya TradingView 37
Angka pada 132 anggotaselisih ROE median 0,1 poin, PBV 0,07x, DER 0,00x; ditolak TradingView: ROE 0, PBV 0, DER 0, FCF 1 (SMRA)
Dari 37 “hanya TradingView”32 karena data Yahoo gagal terbaca, 4 beda angka (BJTM dan JSMR: FCF Yahoo negatif, TradingView positif; GPRA: ROE 4,7% lawan 5,1%; DMAS), 1 beda riwayat (TEBE)

Dua temuan yang tidak diduga

1. Banyak saham hilang dari watchlist karena Yahoo tidak membaca laporan labanya. Diukur langsung: untuk 16 saham (AMIN, BELL, BOBA, CBPE, CRAB, EAST, GHON, GLVA, INCI, KDSI, KMDS, KOCI, KUAS, LAJU, LPIN, JATI) laporan tahunan dari Yahoo kosong, sedangkan TradingView punya 6 sampai 20 tahun laba yang positif. Di screening sungguhan ini tercatat “data” (riwayat laba tidak terbaca), dan saham yang datanya tidak pernah terbaca tidak akan masuk berapa pun lamanya menunggu.

2. Aturan “laba positif 5 tahun” sebenarnya hanya memeriksa 4 tahun. Yahoo mengembalikan tepat 4 laporan tahunan (BBRI, TLKM, ASII, dan lima anggota di bawah ini semuanya n=4). BEST, BWPT, CARS, JECC, dan JKON punya tahun rugi di tahun ke-5 dari belakang, dan lolos hanya karena tahun itu tidak terlihat. Mereka masih lolos 4 tahun terakhir, tetapi bukan 5 seperti yang tertulis di kriteria.

Diputuskan 20 Okt 2026: 4 tahun cukup. Djoko: “kalau mau dibuat 4 tahun aja juga cukup.” min_profit_years di config.json diubah 5 → 4, jadi aturan yang tertulis sama dengan yang selama ini sebenarnya dijalankan. Isi watchlist tidak berubah: hasil screen_stock pada 12 saham (termasuk BEST, BWPT, CARS, JECC, JKON) identik sebelum dan sesudah; yang berubah hanya teks pesan (“laba belum 4 tahun berturut”). Tabel kriteria di halaman ini, halaman Watchlist Screening, dan komentar quarterly_screen.py ikut disamakan.

Angka perbandingan di tabel di atas memakai ambang 4 tahun. Dengan ambang 5 tahun hasilnya TradingView 149, sama 117, hanya Yahoo 15, hanya TradingView 32. Sesudah ambang diturunkan, 13 anggota “hanya Yahoo” semuanya soal dividen (tahun kalender lawan tahun fiskal), bukan laba.

Efek samping yang ikut dibetulkan. Pesan alasan gugur di baris Rencana menulis “laba belum 5 tahun berturut” untuk laporan yang kosong, seolah sahamnya pernah rugi. SBMA dan FWCT ternyata kasus ini juga. Sekarang tiga keadaan dibedakan: riwayat laba tidak terbaca di Yahoo (kosong), riwayat laba baru N tahun (emiten baru), dan laba belum 4 tahun berturut (ada tahun rugi). 42 entri cache yang berisi teks lama dibuang supaya dihitung ulang.

Yang diputuskan nanti (tahap 2), belum dikerjakan

Cadangan TradingView mengubah isi watchlist, jadi keputusannya ada pada Djoko. Pesan bulanan ini yang menunjukkan apakah polanya konsisten dari bulan ke bulan.

Kapan saham yang gugur bisa masuk lagi

Alasan gugur 97 saham yang dipegang di luar watchlist (satu saham bisa gagal di lebih dari satu saringan; 50 hanya gagal satu, 47 lebih dari satu):

Alasan gugurJumlah (hanya ini)Kapan mungkin masuk lagi
Lolos semua kalau diuji hari ini (data gagal terbaca)728 Okt
PBV ≥316 (9)kapan saja, mengikuti harga
ROE ≤5% atau DER tinggi27 (3)sesudah laporan Q3 masuk; kebanyakan baru lolos di 28 Nov
FCF negatif40 (18)arus kas yang dibaca tahunan, jadi baru berubah sesudah laporan tahunan 2026 (screening April–Mei 2027)
Dividen belum 3 tahun berturut43 (7)tahun depan, kalau membayar dividen lagi (perkiraan)
Laba belum 4 tahun berturut31 (6)bertahun-tahun

Kejanggalan tampilan: emiten pelapor dolar (ADRO, ADMR) tertulis “FCF negatif (Rp-0 M)”. Tandanya benar, satuannya salah di pesan.

📒 Catatan valuasi tiap kali beli

otomatis saat transaksi dicatat

19 Okt 2026. Djoko: “mungkin tiap saya beli kamu bisa bantu kasih catatan ya, supaya enggak lupa. saya cuman takutnya dulu saya beli dalam kondisi overvalue, tapi karena mendadak laporan keuangannya turun, lalu jadi mendadak overvalue, apakah mungkin terjadi seperti itu?”

Jawabannya: mungkin, tapi itu bukan sebab utamanya

Nilai wajar dihitung dari laba (PER, Graham, target analis). Kalau labanya turun, nilai wajarnya turun, dan harga yang sama berpindah dari diskon ke premium tanpa harganya bergerak. SBMA contohnya: laba Q2 2026 turun −71%, nilai wajarnya jadi Rp61. Kalau labanya masih seperti sebelumnya, nilai wajarnya di kisaran Rp200-an dan harga Rp126 akan terbaca diskon, bukan premium 105%.

Tapi 18 posisi yang harganya di atas nilai wajar dan sedang rugi diperiksa satu-satu hari itu, dan hasilnya tidak mendukung dugaan itu sebagai sebab utama:

Kondisi labaJumlahSiapa
Laba bertumbuh12BOLT, BUAH, KEJU, BBHI, BIPI, PANI, RAJA, IMPC, DATA, RISE, BREN, RMKE
Laba turun5ASLC, BRPT, CDIA, SMBR, SBMA
Masih rugi1CBRE

Untuk 12 dari 18, fundamentalnya tidak jatuh. Harganya memang sudah jauh di atas nilai wajar, dan karena posisinya juga rugi, berarti belinya di valuasi yang lebih tinggi lagi dari harga sekarang.

Menyikapinya: yang membedakan besar premiumnya

Premium kecil, bisnis sehat → menunggu masuk akal. Premium 5–36% bisa tertutup kalau labanya pulih atau tumbuh beberapa kuartal: KEJU 5%, ASLC 11%, BRPT 14%, BOLT 16%, DATA 16%, RAJA 34%, SMBR 36%. Naik turunnya laba memang wajar.

Premium ratusan persen → menunggu tidak menyelesaikan. Premium >300% berarti harga sekarang sekitar 4× nilai wajar, jadi labanya harus naik sekitar empat kali hanya untuk membuat harga hari ini jadi wajar: RISE, BREN, PANI, IMPC, CBRE, lalu CDIA 253%, BIPI 188%, RMKE 136%. Perhatikan RISE dan BREN labanya bertumbuh — jadi bukan bisnisnya yang salah, harga belinya yang salah.

Yang direkam, dan kenapa harus saat beli

Keadaan waktu beli tidak bisa direkonstruksi belakangan: nilai wajar dihitung dari laporan keuangan hari ini, jadi begitu labanya berubah, potret lamanya hilang. Karena itu direkam saat transaksinya dicatat, ke data/catatan_beli.jsonl — berkas sendiri, bukan ditempel ke avgdown_watch.json yang juga ditulis GPT.

Isinya per transaksi beli: tanggal, broker/portfolio, lembar, harga, harga rata-rata sebelum dan sesudah, lalu nilai wajar + metodenya, diskon/premium, RSI, status laporan keuangan, dan lolos screening atau tidak.

Dua langkah, sengaja

  1. webupload/portfolio_ops.apply_buy_* menulis fakta transaksinya, valuasinya dibiarkan kosong. Dipasang di situ karena satu tempat itu dilewati kedua jalur: halaman upload PDF dan email poller yang auto-apply. Tidak ada beli yang lolos tanpa catatan, dan tidak ada skrip pencatatan yang perlu disentuh dua kali.
  2. rencana_harian.py tiap pagi mengisi valuasi entri yang masih kosong. Di situ nilai wajar, diskon, RSI, dan status lapkeu sudah dihitung untuk semua posisi, jadi tidak ada panggilan TradingView tambahan.

Kenapa tidak langsung dihitung di langkah 1: apply_buy_* jalan di dalam permintaan web dan di email poller, dan keduanya tidak boleh menunggu seluruh alur pengambilan data pasar. Lambatnya maksimal satu hari bursa, jauh lebih kecil daripada risiko membuat pencatatan transaksi bergantung pada TradingView. Pemanggilannya juga dibungkus try/except: pencatatan portfolio tidak boleh gagal karena catatan tambahan ini.

Diperluas 20 Okt 2026: catatan ini kini juga merekam jual, dan tampil di blok jual semua, tangga jual, kandidat beli baru, dan beli lagi — bukan hanya avg down dan avg up. Lihat Catat alasan tiap transaksi.

Dipakai di blok AVG DOWN & AVG UP

Pilihan Djoko: sebelum menambah, perlu kelihatan posisi ini dulu dibeli di diskon berapa — itu yang menentukan apakah avg down-nya memperbaiki atau memperburuk.

📒 Waktu beli 19 Okt 2026: diskon 38% (wajar Rp4.000) → sekarang diskon 20%
   nilai wajarnya sendiri turun 22% (Rp4.000 → Rp3.125)

Baris kedua cuma muncul kalau nilai wajarnya sendiri bergeser ≥10%, dan itulah pembeda yang dicari: nilai wajarnya yang turun (laba memburuk) atau harganya yang naik (diskonnya habis dimakan pasar).

Dicocokkan pakai ticker saja, bukan ticker+grup, dan yang diambil entri paling awal. Nama grup waktu beli adalah nama portfolio mentah (“Long”, “Mirae”) sementara laporan memakai nama tampilan (“Stockbit Long”), jadi memaksakan pasangan keduanya akan gagal diam-diam. Yang ditanya juga “kenapa dulu saya beli ini”, bukan kenapa beli di broker tertentu.

Arsipnya mulai dari nol 19 Okt 2026. Posisi yang sudah ada tidak punya catatan dan tidak bisa dibuatkan, karena valuasi lamanya memang sudah hilang. Transaksi yang dicatat mundur (misalnya baseline statement Mirae 31 Jul) ditandai “catatan dibuat N hari sesudah transaksinya” kalau selisihnya lebih dari 3 hari, supaya tidak dibaca sebagai potret saat beli.

📝 Catat alasan tiap transaksi

tiap jam :20, 07–23

20 Okt 2026. Djoko: “kemarin kan saya ada mau catat alasan saya beli atau jual suatu saham. tapi gimana saya mau kasih komennya? apakah kamu bisa kirim link via telegram tiap saya beli (berdasarkan laporan dari stockbit/mirae tiap malam) … itu bisa saya isi sewaktu waktu (mungkin keesokan harinya).”

Ini melengkapi catatan valuasi tiap kali beli (19 Okt): yang itu merekam keadaan saat transaksi, yang ini menampung alasan yang hanya kamu yang tahu.

Alurnya

  1. Transaksi masuk lewat email poller (Trade Confirmation Stockbit/Mirae) atau halaman upload PDF. Keduanya memanggil apply_buy_* / apply_sell_*, dan di situ transaksi beli maupun jual dicatat dengan ID acak.
  2. Rencana pagi mengisi valuasi saat transaksi (nilai wajar, diskon/premium, RSI, status lapkeu).
  3. kirim_tautan_alasan.py jalan tiap jam pada menit ke-20, jam 07–23 setiap hari (lima menit sesudah poller). Kalau ada transaksi baru, ia mengirim satu pesan Telegram dengan satu tautan per keputusan. Kalau tidak ada, tidak mengirim apa pun.
  4. Kamu ketuk tautannya, tulis alasan, simpan. Boleh kapan saja, dan boleh diubah lagi lewat tautan yang sama.
📝 Catat alasan transaksi
Ketuk untuk menulis kenapa. Boleh diisi nanti, dan bisa diubah lagi lewat tautan yang sama.

1. 🟢 BELI BBCA · 1 lot @Rp4.820 · Stockbit Long
   Tulis alasan

2. 🔴 JUAL SBMA · 169 lot @Rp126 · untung Rp199.927 · Stockbit Trading
   Tulis alasan

Pengingat 24 jam (20 Okt 2026)

Djoko: “kalau dalam waktu 24 jam ada saham yang belum saya isi alasan beli atau jual nya, saya diingatkan lagi.”

Kegagalan Telegram tidak menandai apa pun, jadi pesan yang gagal dicoba lagi jam berikutnya. Gagal kirim tautan baru tidak menahan pengingat, dan sebaliknya.

Halaman form

Di mana alasanmu muncul

Blok RencanaYang dicetak
🔴 Jual semua, 💰 tangga jual, 🟢 avg down, 🟢 avg up valuasi waktu beli lawan sekarang, plus alasanmu waktu beli
🆕 Kandidat beli baru, 🔁 beli lagi alasanmu waktu terakhir menjual saham itu
📒 Waktu beli 10 Okt 2026: diskon 38% (wajar Rp4.000) → sekarang premium 12%
   nilai wajarnya sendiri turun 20% (Rp4.000 → Rp3.200)
📝 Alasanmu beli 10 Okt 2026: Murah, dividen besar, dan ikut saran Rencana

Alasan beli diambil dari pembelian paling awal yang punya catatan (pertanyaannya “kenapa dulu saya beli ini”), alasan jual dari penjualan paling baru. Teks dipotong 200 huruf di Rencana; isi lengkapnya tetap ada di halaman form.

Keamanan tautan

Kenapa pengirimnya skrip terpisah, bukan di dalam poller

Pengirim hanya membaca catatan yang ditulis pencatat transaksi. Dengan begitu kegagalan Telegram tidak pernah mengganggu pencatatan portfolio, kedua jalur tercakup tanpa menyentuh email poller atau halaman upload, dan tautan yang gagal terkirim dicoba lagi jam berikutnya. tautan_terkirim baru ditandai sesudah Telegram menerima pesannya.

Berkas catatan ditulis empat proses berbeda (pencatat transaksi, Rencana, pengirim, halaman form). Penulisan ulang seluruh berkas yang berpapasan dengan penambahan baris bisa menghilangkan baris yang baru ditambah, maka semua penulisan dilindungi flock. Diuji: 200 penambahan berpapasan dengan penulisan ulang berulang-ulang, hilang 0 baris.

Batasnya. Catatan mulai 19 Okt 2026 (transaksi pertama yang tercatat: BBCA). Posisi yang sudah dipegang sebelumnya tidak punya catatan dan tidak bisa dibuatkan tautan. Transaksi yang dicatat jauh sesudah tanggalnya (mis. baseline) dan yang lebih tua dari 3 hari tidak dikirimi tautan. Kalau email poller gagal menyimpan portfolio karena berkasnya diubah pihak lain, catatan transaksinya tetap ada, sehingga tautan bisa muncul untuk transaksi yang belum masuk portfolio; transaksinya sendiri sudah terjadi di broker.

Diuji 20 Okt 2026: modul pada salinan data nyata (termasuk entri BBCA berformat lama yang diberi ID), rute Flask dengan test client, alur ujung ke ujung lewat alamat publik (GET, POST, header, ID palsu), pengirim dengan pesan sungguhan untuk BBCA, dan Rencana utuh --dry-run tanpa error.

Pengingat jatuh tempo langganan

tiap hari 09:05

Dua langganan yang kalau mati membuat alert ikut berhenti, diperiksa pengingat_tagihan.py tiap pagi, termasuk Sabtu dan Minggu — jatuh tempo tidak libur.

LanggananCara dibacaKapan diingatkan
VPS Rumahweb paket S, Rp60.000/bln tanggal tetap: tiap tanggal 16 H−1 (tanggal 15)
NeoBDM tanggalnya tidak tetap (tiap perpanjangan +30 hari), jadi sisa harinya dibaca langsung dari beranda NeoBDM sisa 3 hari dan sisa 1 hari

Dari 1 hari jadi 3 dan 1 (16 Okt 2026)

Sebelumnya NeoBDM hanya diingatkan kalau sisa ≤1 hari. Pada 16 Okt 2026 sisanya tinggal 4 hari dan tidak ada kabar apa pun — ketahuan cuma karena API-nya kebetulan dipanggil waktu membangun laporan bandar mengumpulkan. Satu hari terlalu tipis kalau pembayarannya butuh waktu. Djoko: “buat sisa 3 hari dan 1 hari deh.”

Dua titik, bukan “sisa ≤3”. Kalau syaratnya “kurang dari atau sama dengan 3”, pesan yang sama datang tiga hari berturut-turut untuk satu jatuh tempo. Sisa 2 sengaja dilewati. Kalau titik 3 kelewat karena cron gagal, titik 1 masih menangkap; kalau dua-duanya kelewat, cabang “SUDAH HABIS” berbunyi tiap hari sesudahnya.

📊 Langganan NeoBDM habis 3 HARI LAGI — Selasa 17 Nov 2026
Kalau habis, laporan 🏦 bandar mengumpulkan (Selasa) dan analisa
bandar di RSI Buy berhenti.
Perpanjang di https://neobdm.tech/subscription/

Status 16 Okt 2026 sesudah Djoko memperpanjang: sisa 35 hari, jatuh tempo berikutnya ± 20 November 2026. Diuji hari itu juga: pada sisa 35 skripnya diam (“bukan titik pengingat (3, 1)”), dan dengan --paksa pesannya keluar benar.

Yang mudah salah ingat

Stockbit dicatat per portfolio, bukan per saham (14 Sep 2026, direvisi 15 Sep)

Tiga portfolio Stockbit, masing-masing dengan harga rata-rata sendiri: Long (dulu Main lalu Hold, 122 posisi), Trading (dulu DIV<3%, dividen >0, 28 posisi), Spekulatif (dulu NO-DIV, 20 posisi) — angka per 15 Sep sore, dicocokkan dengan screenshot Stockbit. buying_price = avg di aplikasi Stockbit, sudah termasuk fee beli (keputusan Djoko 15 Sep), supaya untung/rugi di alert sama dengan yang terlihat di aplikasi. BBCA di Long dan BBCA di Trading adalah dua posisi — tidak pernah digabung atau dirata-rata di alert mana pun: CICIL, untung/rugi, saran jual, trailing profit, dan laporan repair semuanya dihitung per portfolio.

  • Kunci posisi = saham + portfolio. Tiap entri di avgdown_watch.json punya field portfolio. Sebelumnya semua script membaca posisi per saham, jadi entri kedua untuk saham yang sama akan menimpa yang pertama diam-diam, tanpa error.
  • Alat cek wajib sesudah menulis: cek_portfolio.py menolak entri tanpa portfolio dan pasangan saham+portfolio yang ganda. Berlaku untuk Claude dan GPT (Kesepakatan Format butir 6 di NOTES.md). catat_jual.py kini mewajibkan --portfolio untuk Stockbit.
  • Mirae tetap satu entri per saham di berkas posisinya (tanpa field portfolio); pembagian Long/Trading/Spekulatif-nya dicatat terpisah di data/mirae_portfolio.json.
  • Grup di sell_watch_universe.json tetap ada sebagai daftar pantau (boleh memuat saham yang tidak dipegang). Untuk posisi yang dipegang, yang berlaku field portfolio di entrinya.
  • Puncak profit trailing tidak hilang: kunci lama SB:BBRI dipindah otomatis ke SB/Long:BBRI saat pertama dibaca.
  • Diuji dengan simulasi BBCA di Long (avg Rp6.986) dan Trading (avg Rp6.000): kedua posisi terbaca terpisah di semua pembaca, dan saran jualnya berbeda — Long jual separo, Trading jual semua.

Nilai wajar sudah satu sumber (31 Ags 2026)

Ketiga laporan kini memakai lib/fv_tv.py: median dari metode yang datanya memungkinkan (target analis, PER, PBV, Graham, ROE-PBV) menurut sektor, dihitung ulang tiap pagi.

Sebelumnya bandarmologi memakai nilai wajar watchlist yang berumur sampai tiga bulan, sehingga saham yang sama bisa disebut diskon 25% di satu laporan dan fair di laporan lain — AALI contohnya. Nilai wajar watchlist tetap dihitung saat screening, tapi tidak lagi dipakai untuk seleksi harian.

Karena versi harian tidak memotong margin of safety, ambang diskon bandarmologi dinaikkan 5% → 20% sebagai gantinya.

Laporan pagi memakai harga penutupan kemarin

Ketiganya jalan sebelum bursa buka. Jadi laporan Senin pagi memakai close Jumat — pergerakan Jumat baru terlihat Senin, bukan Sabtu.

Portfolio disimpan terpisah per broker

avgdown_watch.json hanya Stockbit; Mirae di data/avgdown_mirae.json. Digabung, penjualan di satu broker akan memotong posisi broker lain — salah tanpa gejala apa pun di laporan.

Ambang 0,05 poin RSI itu bukan hiasan

Saham tidak likuid sering menutup di harga sama dua hari berturut sehingga RSI-nya identik. Perbandingan mentah membaca selisih sekelas 1e-14 sebagai “naik”. SIDO pernah lolos persis karena ini.