Automation: Webhooks, Bots, dan Screeners
Advanced · 4 jam
Prasyarat:
- Modul 8: Alerts System (cara bikin alert + webhook URL di tab Notifications)
- Modul 9-10: Pine Script dasar (indicator(), plot(), ta.ema(), ta.crossover, kondisi boolean)
- Paham TradingView plan tier (webhook & Pine Screener cuma jalan di paid plan)
- Punya akun Telegram + bisa instalasi Python 3 di laptop atau punya akun Cloudflare
- Tahu cara bedain bar close vs intrabar (repainting basics)
Tujuan Pembelajaran
- Menggambar arsitektur end-to-end automation: TradingView alert -> receiver (Flask/FastAPI/Cloudflare Worker/n8n) -> fan-out ke Telegram/Discord/broker API
- Membangun webhook receiver yang memvalidasi request lewat IP allowlist TradingView dan shared secret key di payload JSON
- Memformat pesan Telegram & Discord dengan Markdown plus memakai placeholder TradingView ({{ticker}}, {{close}}, dll)
- Memakai Pine Screener untuk scan watchlist dengan indikator favorit sendiri, paham syarat (paid tier, script di Favorites, evaluasi bar-close)
- Mendesain plot flag boolean/numerik (plot(condition ? 1 : 0)) supaya bisa difilter di Pine Screener
- Menjelaskan opsi eksekusi order IDX: Samuel Sekuritas (native di TV), Gotrade, vs pola umum charting di TV + eksekusi di Stockbit/Ajaib/IPOT
- Membandingkan jalur fan-out IDX (notifikasi) dengan auto-trade crypto end-to-end ke exchange API publik (Binance/Bybit/OKX), yang justru lebih terbuka daripada broker IDX
- Membagi workflow mobile (alert/monitoring) vs desktop (Pine editing/backtest/screener)
- Deploy webhook bridge BBCA dari Modul 8 ke Telegram channel dengan validasi IP + secret, dan bikin Pine Screener indikator untuk flag saham IDX (BBCA close di atas EMA(50)) sekaligus pair crypto (
BINANCE:BTCUSDTclose di atas EMA(50))
1. Kenapa Automation? Dari Alert ke Aksi Otomatis
Gambaran besar dulu
Oke, sampai Modul 8 lo udah bisa bikin alert. Tapi alert TradingView default cuma kasih notifikasi: bunyi ting, pop-up, atau email. Masalahnya:
- Lo lagi tidur jam 2 pagi, BBCA breakout, lo telat lihat.
- Lo punya 30 watchlist, gak mungkin melototin satu-satu.
- Lo pengen sinyal langsung masuk grup Telegram tim lo, bukan cuma ke HP lo sendiri.
- Lo pengen suatu hari sinyal langsung jadi order ke broker (auto-trading).
Di sinilah webhook masuk. Anggap webhook itu kayak nelpon otomatis: pas alert lo trigger, TradingView nelpon ke server lo, ngasih tau "woi, BBCA udah breakout nih, ini datanya". Terus server lo yang nentuin mau diapain data itu: dikirim ke Telegram, ke Discord, atau diteruskan ke broker.
Arsitektur end-to-end (hapalin gambaran ini)
Ini tulang punggung seluruh modul. Semua yang kita bahas nanti adalah bagian dari rantai ini:
- [1] TradingView cuma bisa POST ke SATU URL per alert. Dia gak tau apa-apa soal Telegram. Tugasnya cuma: trigger -> kirim JSON ke URL lo.
- [2] Receiver itu otak operasi. Dia nerima POST, ngecek apakah ini beneran dari TradingView (validasi), terus mutusin mau ngapain.
- [3] Fan-out artinya satu sinyal masuk, bisa disebar ke banyak tujuan sekaligus. Telegram channel A, Discord server B, dan broker C, semua dari satu trigger.
Kenapa butuh receiver di tengah? Kenapa gak langsung TV -> Telegram?
Pertanyaan bagus. Jawabannya: TradingView gak bisa langsung ngomong sama Telegram Bot API. Format pesannya beda, butuh token rahasia, butuh logika "kalau action=buy kirim pesan A, kalau sell kirim B". TradingView cuma kirim JSON mentah. Lo butuh penerjemah di tengah. Itu si receiver.
Selain itu, receiver = tempat lo naro keamanan. Webhook URL itu kayak alamat rumah yang gak dikunci. Siapa aja yang tau URL-nya bisa POST ke situ dan pura-pura jadi TradingView. Receiver yang ngecek: bener gak ini dari TradingView? (bahas tuntas di Bagian 3).
Catatan plan tier (penting!)
Webhook itu fitur berbayar. Akun Free TradingView GAK BISA pakai webhook sama sekali. Lo minimal harus di Essential ke atas. Sama kayak Pine Screener nanti, itu juga paid. Jadi kalau lo masih Free, automation ini belum kebuka, upgrade dulu.
Latihan
- Gambar ulang arsitektur 3-tahap (TV -> Receiver -> Fan-out) di kertas pakai contoh kasus lo sendiri. Tentuin: alert apa yang lo mau, receiver-nya pakai apa, mau fan-out ke mana aja.
- Cek plan TradingView lo sekarang (Settings -> Account). Catat: lo udah bisa webhook belum? Kalau belum, plan mana yang paling pas buat kebutuhan lo (lihat tabel plan di Modul 1/14).
Pro Tips
- Mulai dari Telegram dulu sebagai tujuan fan-out. Paling gampang, gratis, dan instan. Discord & broker API belakangan.
- Webhook = HTTP POST satu arah dari TV ke lo. TV gak nungguin balasan, gak peduli error lo. Jadi kalau receiver lo down, sinyal hilang gitu aja. Bukan retry.
- Satu alert TradingView = satu URL. Mau fan-out ke banyak tempat? Logika fan-out ada di receiver lo, bukan di TradingView.
2. Membangun Receiver: Flask, FastAPI, Cloudflare Worker, atau n8n?
Pilih senjata lo
Receiver itu program kecil yang nungguin POST dari TradingView. Ada 4 jalur populer, masing-masing punya trade-off:
| Opsi | Bahasa | Hosting | Cocok buat |
|---|---|---|---|
| Flask | Python | VPS / laptop | Belajar, paham detail, kontrol penuh |
| FastAPI | Python | VPS / laptop | Sama kayak Flask tapi lebih modern, async, auto-docs |
| Cloudflare Worker | JavaScript | Serverless (gratis) | Gak mau ngurus server, 100% uptime, gratis tier |
| n8n | No-code | Self-host / cloud | Gak bisa/gak mau coding sama sekali |
Untuk kursus ini gue pakai Flask sebagai contoh utama, karena paling jelas buat belajar konsepnya. Tapi gue kasih juga versi Cloudflare Worker karena itu pilihan paling praktis buat orang yang gak punya VPS.
Versi Flask (Python)
Ini receiver paling sederhana yang bisa jalan:
from flask import Flask, request, abort
app = Flask(__name__)
@app.route("/webhook", methods=["POST"])
def webhook():
data = request.get_json() # ambil JSON dari TradingView
print("Sinyal masuk:", data) # buat ngetes dulu
return "ok", 200 # balas ke TV biar dia tau diterima
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000)Penjelasan baris per baris:
@app.route("/webhook", methods=["POST"])-> bikin alamathttp://server-lo:5000/webhook. Cuma terima method POST (TradingView selalu POST).request.get_json()-> baca isi body yang dikirim TV. Kalau lo set message-nya berupa JSON di alert, ini langsung jadi dictionary Python.return "ok", 200-> balas HTTP 200. TradingView gak peduli isinya, tapi sopan aja balas sukses.host="0.0.0.0"-> dengerin dari semua IP, bukan cuma localhost (biar bisa diakses dari luar).
Versi Cloudflare Worker (gak perlu server)
Kalau lo gak punya VPS dan males ngurus, Cloudflare Worker itu juara. Gratis sampai 100rb request/hari, jalan di edge, gak pernah tidur:
export default {
async fetch(request) {
if (request.method !== "POST") {
return new Response("method not allowed", { status: 405 });
}
const data = await request.json();
console.log("Sinyal masuk:", JSON.stringify(data));
return new Response("ok", { status: 200 });
},
};Logikanya persis sama: cek POST, baca JSON, balas ok. Bedanya ini JavaScript dan di-deploy lewat dashboard Cloudflare atau wrangler CLI. URL lo nanti jadi semacam https://nama-worker.akun-lo.workers.dev.
Cara nguji receiver SEBELUM colok ke TradingView
Jangan langsung colok ke TV. Tes dulu pakai curl dari terminal, simulasiin POST-nya:
curl -X POST http://localhost:5000/webhook \
-H "Content-Type: application/json" \
-d '{"ticker":"BBCA","close":10500}'Kalau di terminal Flask muncul Sinyal masuk: {'ticker': 'BBCA', 'close': 10500}, berarti receiver lo hidup. Baru lanjut.
Masalah klasik: localhost gak bisa diakses TradingView
Laptop lo di belakang router/NAT, jadi TradingView (yang di internet) gak bisa nemu localhost. Dua solusi:
- ngrok (buat testing):
ngrok http 5000ngasih lo URL publik sementara yang nyambung ke laptop lo. Pas banget buat development. - VPS / Cloudflare Worker (buat produksi): server yang emang punya IP publik 24/7.
Untuk latihan, ngrok paling cepet. Untuk beneran dipakai harian, jangan andelin laptop, taro di VPS atau Cloudflare.
Latihan
- Jalanin receiver Flask (atau Worker) di lokal, terus tembak pakai curl dengan payload
{"ticker":"TLKM","close":3200}. Pastiin data muncul di log. - Pasang ngrok, dapetin URL publik, terus tembak curl ke URL publik itu (bukan localhost). Konfirmasi data tetap masuk. Ini bukti receiver lo bisa diakses dari internet.
Pro Tips
- Mulai dengan receiver yang cuma
printdata. Jangan langsung bikin yang kompleks. Pastiin data masuk dulu, baru tambahin logika. - Cloudflare Worker = pilihan terbaik buat retail yang gak mau ribet server. Gratis, gak pernah down, gak perlu maintain Linux.
- ngrok URL berubah tiap restart (di free tier). Jangan lupa update Webhook URL di alert TradingView tiap kali lo restart ngrok.
3. Keamanan: IP Allowlist + Shared Secret Key
Kenapa ini bagian terpenting di modul
Webhook URL lo itu gak ada autentikasinya secara default. Bayangin pintu rumah tanpa kunci. Siapa aja yang tau (atau nebak) URL lo bisa kirim sinyal palsu. Kalau receiver lo nyambung ke broker dan auto-trade, ini bisa jadi bencana: orang iseng kirim {"action":"sell_all"} dan portofolio lo lenyap.
Dua lapis pertahanan standar: IP allowlist dan shared secret key. Pakai dua-duanya.
Lapis 1: IP Allowlist (siapa yang boleh ngetok)
TradingView ngirim webhook dari sekumpulan IP yang tetap dan dipublikasiin. Cuma ada 4:
52.89.214.238
34.212.75.30
54.218.53.128
52.32.178.7Logikanya: kalau request datang dari IP yang BUKAN salah satu dari 4 ini, langsung tolak. Karena pasti bukan TradingView.
ALLOWED_IPS = {
"52.89.214.238",
"34.212.75.30",
"54.218.53.128",
"52.32.178.7",
}
@app.route("/webhook", methods=["POST"])
def webhook():
# IP asli, hati-hati kalau di belakang proxy (lihat catatan)
src_ip = request.headers.get("X-Forwarded-For", request.remote_addr)
src_ip = src_ip.split(",")[0].strip() # ambil IP pertama kalau ada beberapa
if src_ip not in ALLOWED_IPS:
abort(403) # Forbidden, tendang
...Catatan penting soal proxy: kalau lo pakai ngrok, Cloudflare, atau reverse proxy (nginx), IP yang lo lihat di request.remote_addr itu IP proxy, bukan IP TradingView. IP asli ada di header X-Forwarded-For. Makanya kode di atas ngecek header itu dulu. Kalau lo salah ambil, validasi lo bakal selalu nolak (atau lebih parah, selalu nerima).
Lapis 2: Shared Secret Key (kata sandi rahasia di payload)
IP allowlist bagus, tapi gak cukup sendirian (IP bisa di-spoof, dan kalau lo di belakang shared proxy, IP-nya jadi gak jelas). Lapis kedua: tanam secret key di dalam JSON payload yang cuma lo dan TradingView tau.
Di pesan alert TradingView, lo tulis JSON kayak gini:
{
"sec_key": "rahasia-banget-123-jangan-ditebak",
"ticker": "{{ticker}}",
"action": "buy",
"close": "{{close}}"
}Terus di receiver, lo cek apakah sec_key-nya cocok:
import os
SECRET = os.environ["WEBHOOK_SECRET"] # JANGAN hardcode! taro di env var
@app.route("/webhook", methods=["POST"])
def webhook():
src_ip = request.headers.get("X-Forwarded-For", request.remote_addr)
src_ip = src_ip.split(",")[0].strip()
if src_ip not in ALLOWED_IPS:
abort(403)
data = request.get_json(silent=True)
if not data or data.get("sec_key") != SECRET:
abort(401) # Unauthorized, secret salah
# sampai sini = beneran dari TradingView DAN tau secret. aman.
print("Sinyal valid:", data)
return "ok", 200Penjelasan:
os.environ["WEBHOOK_SECRET"]-> secret diambil dari environment variable, BUKAN ditulis langsung di kode. Kalau lo hardcode terus push ke GitHub, secret lo bocor ke seluruh dunia. Ini kesalahan nomor satu pemula.data.get("sec_key") != SECRET-> kalau secret di payload gak cocok, tendang dengan 401.get_json(silent=True)-> kalau body bukan JSON valid, balikin None (gak error), terus kita tolak.
Urutan validasi yang bener
- Cek method POST.
- Cek IP ada di allowlist.
- Cek body bisa di-parse jadi JSON.
- Cek
sec_keycocok. - Baru proses sinyalnya.
Kalau salah satu gagal, langsung tolak, jangan lanjut. Ini namanya defensif di boundary I/O: gak percaya apapun yang masuk dari luar sampai terbukti valid.
Pro tip: secret jangan asal
Jangan pakai 123456 atau bbca. Generate yang panjang dan acak:
python3 -c "import secrets; print(secrets.token_urlsafe(32))"Kopi hasilnya ke env var receiver DAN ke JSON alert TradingView. Dua-duanya harus sama persis.
Latihan
- Tambahin validasi IP + secret ke receiver lo. Tes dengan curl: (a) tanpa secret -> harus 401, (b) dengan secret salah -> harus 401, (c) dengan secret bener -> harus 200. Catat ketiga hasilnya.
- Generate secret acak pakai perintah
secrets.token_urlsafe(32). Pasang di env var. Pastiin receiver baca dari env, bukan dari string di kode. - Skenario: temen lo nemu webhook URL lo dan POST sinyal palsu dari laptopnya. Jelasin lapis mana (IP atau secret) yang bakal nahan dia, dan kenapa.
Pro Tips
- Selalu pakai DUA lapis: IP allowlist + secret key. Salah satu doang gampang ditembus.
- Secret key TIDAK PERNAH di-hardcode di kode. Taro di environment variable. Kalau bocor ke Git, ganti secret-nya saat itu juga.
- Kalau lo pakai Cloudflare Worker, taro secret di 'Environment Variables / Secrets' di dashboard Worker, bukan di kode Worker.
- Inget header X-Forwarded-For pas di belakang proxy/ngrok. Salah baca IP = validasi lo bohong.
4. Fan-out: Format Pesan Telegram & Discord dengan Markdown
Dari data mentah ke pesan cantik
Sampai sini receiver lo udah nerima sinyal valid. Sekarang tahap fan-out: kirim ke tujuan. Kita fokus Telegram (paling populer di Indonesia) dan Discord.
Setup Telegram Bot (sekali aja)
- Buka Telegram, cari @BotFather.
- Ketik
/newbot, ikutin instruksi, kasih nama bot lo. - BotFather kasih token kayak
123456:ABC-DEF1234ghIkl-zyx57W2v.... Simpan baik-baik, ini kunci bot lo. - Bikin channel/grup, masukin bot lo sebagai admin.
- Cari chat_id channel lo. Cara gampang: tambahin bot @username_to_id_bot ke channel, atau kirim pesan ke channel terus buka
https://api.telegram.org/bot<TOKEN>/getUpdatesdi browser, carichat.id. Channel biasanya minus, contoh-1001234567890.
Kirim ke Telegram dari receiver
Telegram Bot API itu cuma HTTP request. Dari Python:
import requests
TG_TOKEN = os.environ["TG_TOKEN"]
TG_CHAT_ID = os.environ["TG_CHAT_ID"]
def kirim_telegram(teks):
url = f"https://api.telegram.org/bot{TG_TOKEN}/sendMessage"
payload = {
"chat_id": TG_CHAT_ID,
"text": teks,
"parse_mode": "Markdown", # aktifin format Markdown
}
r = requests.post(url, json=payload, timeout=10)
r.raise_for_status() # kalau gagal, lempar error (jangan diam-diam gagal)parse_mode: Markdown-> bikin*tebal*,_miring_, dan`kode`jadi format beneran.raise_for_status()-> kalau Telegram nolak (token salah, chat_id salah), kita TAU langsung, bukan gagal diam-diam.
Format pesan pakai Markdown
Ini yang bikin pesan lo enak dibaca, bukan cuma tembok teks:
def format_pesan(data):
return (
f"🚨 *SINYAL {data['action'].upper()}*\n"
f"—————————\n"
f"📊 Saham: *{data['ticker']}*\n"
f"💰 Harga: `{data['close']}`\n"
f"⏰ Waktu: {data.get('time', '-')}"
)Markdown Telegram yang sering dipakai:
| Tulis | Hasil |
|---|---|
*BBCA* | BBCA (tebal) |
_breakout_ | breakout (miring) |
`10500` | 10500 (monospace) |
[teks](url) | link |
Placeholder TradingView ({{...}})
Di JSON alert, lo gak nulis harga manual. TradingView punya placeholder yang otomatis diisi pas alert trigger:
{{ticker}}-> kode saham, mis. BBCA{{exchange}}-> bursa, mis. IDX{{close}}-> harga close saat trigger{{time}}-> waktu trigger{{plot_0}}-> nilai plot pertama (berguna buat strategi){{strategy.order.action}}-> buy/sell (dari strategy)
Jadi JSON alert lo:
{
"sec_key": "rahasia-lo",
"ticker": "{{ticker}}",
"action": "buy",
"close": "{{close}}",
"time": "{{time}}"
}Pas BBCA trigger, TradingView otomatis ganti {{ticker}} jadi BBCA dan {{close}} jadi harga aktual sebelum dikirim ke receiver lo.
Kirim ke Discord (bonus)
Discord lebih gampang, gak perlu bot, cukup Discord webhook URL (Server Settings -> Integrations -> Webhooks -> New Webhook -> Copy URL):
def kirim_discord(teks):
url = os.environ["DISCORD_WEBHOOK_URL"]
# Discord pakai 'content', Markdown jalan otomatis
requests.post(url, json={"content": teks}, timeout=10)Discord Markdown: **tebal** (dua bintang, beda sama Telegram yang satu bintang), *miring*, ```block```.
Fan-out beneran: satu sinyal, banyak tujuan
# di dalam handler webhook, setelah validasi:
pesan = format_pesan(data)
kirim_telegram(pesan)
kirim_discord(pesan) # kirim ke dua-duanya sekaligusIni esensi fan-out: satu trigger TradingView, disebar ke banyak channel.
Reference project buat dicontek
Gak usah mulai dari nol kalau gak mau. Dua project open-source matang:
fabston/TradingView-Webhook-Bot-> Flask, multi-channel (Telegram, Discord, Twitter, dll), struktur rapi.cyberapper/tradingview-webhook-bot-> Flask juga, fokus fan-out multi-channel.
Baca kodenya, contek pola validasi & fan-out-nya. Tapi pahami dulu konsepnya dari section ini biar lo gak asal copy-paste.
Latihan
- Bikin bot Telegram lewat @BotFather, dapetin token & chat_id, terus kirim pesan 'halo dari bot' ke channel lo lewat script Python. Sukses dulu di sini sebelum lanjut.
- Format pesan sinyal BBCA pakai Markdown: judul tebal, harga monospace, ada emoji. Kirim ke channel, screenshot hasilnya.
- Tambahin fan-out ke Discord. Kirim satu pesan yang sama ke Telegram DAN Discord dalam satu kali trigger curl. Konfirmasi muncul di dua-duanya.
Pro Tips
- Telegram pakai SATU bintang buat tebal (tebal), Discord pakai DUA (tebal). Sering ketuker. Hati-hati.
- Selalu pakai timeout di requests.post (mis. timeout=10). Tanpa timeout, kalau Telegram lemot receiver lo bisa nyangkut selamanya.
- Token bot Telegram & Discord webhook URL itu RAHASIA. Taro di env var. Yang pegang token bot lo bisa kirim apa aja atas nama lo.
- Tes fungsi kirim_telegram() sendirian dulu (panggil manual dengan teks dummy) sebelum gabungin ke webhook. Pisahin masalah.
5. Pine Screener: Scan Watchlist dengan Indikator Favorit Sendiri
Beda Pine Screener vs Stock Screener biasa
Di Modul 7 lo kenal Stock Screener bawaan: filter berdasarkan RSI, market cap, P/E, dll yang udah disediain TradingView. Itu bagus, tapi terbatas pada filter yang mereka kasih.
Pine Screener beda level: lo scan watchlist pakai indikator Pine buatan lo sendiri. Logika apapun yang bisa lo tulis di Pine, bisa jadi filter. Mau scan "saham yang close di atas EMA(50) DAN RSI di bawah 60 DAN volume 2x rata-rata"? Bisa, kalau lo tulis kondisinya di Pine.
Dan ini gak terbatas saham IDX: indikator + watchlist + screener yang sama jalan persis di crypto. Lo bisa bikin watchlist "Crypto Majors" isi BINANCE:BTCUSDT, ETHUSDT, BINANCE:SOLUSDT, terus scan "BTCUSDT close di atas EMA(50)" pakai indikator yang sama. Karena crypto buka 24/7, screener Daily-nya update tiap hari tanpa nunggu jam bursa.
Syarat pakai Pine Screener (catat semua)
- Paid tier. Sama kayak webhook, ini fitur berbayar. Free gak bisa.
- Script harus di Favorites. Pine Screener cuma bisa pakai indikator yang udah lo bintangin (Favorites). Indikator yang cuma ada di chart tapi belum di-favorite, gak muncul di Screener.
- Scan per watchlist. Lo pilih watchlist mana yang mau di-scan. Jadi rapiin watchlist IDX lo dulu.
- Indikator, bukan strategy. Pine Screener jalan di
indicator(), bukanstrategy().
Gotcha terpenting: evaluasi BAR-CLOSE saja
Ini yang sering bikin orang bingung. Pine Screener cuma evaluasi pada bar yang udah tutup, dan dia lihat bar TERAKHIR.
Artinya:
- Kalau lo scan di timeframe Daily, screener update sekali sehari (pas candle harian tutup). Bukan real-time.
- Nilai yang dipakai = nilai di bar terakhir yang udah confirmed.
- Jangan harap screener nge-flag intrabar (di tengah candle berjalan). Gak gitu cara kerjanya.
Konsekuensi desain: indikator lo harus ngeluarin nilai final per bar yang jelas, bukan sesuatu yang berubah-ubah dalam candle.
Cara kerja: plot sebagai output yang difilter
Pine Screener gak baca pikiran lo. Dia cuma bisa baca output plot() dari indikator lo. Jadi kondisi yang lo mau filter HARUS lo plot().
Di panel Pine Screener, lo nanti bisa set filter macam: "tampilkan saham di mana Plot 0 lebih besar dari 0". Makanya kita desain plot sebagai flag.
Alur kerja lengkap (langkah demi langkah)
- Tulis indikator di Pine Editor (desktop) yang nge-
plot()kondisi lo. - Add to chart, pastiin gak ada error.
- Favorite indikator itu (klik bintang di nama indikator, atau Save lalu favorite).
- Buka Pine Screener: di bottom panel atau lewat menu Products -> Pine Screener (
tradingview.com/pine-screener/). - Pilih watchlist IDX lo.
- Pilih indikator favorit lo dari dropdown.
- Set timeframe (mis. Daily).
- Set filter pada plot output (mis. Plot "flag" > 0).
- Klik Scan. Hasilnya: daftar saham yang memenuhi kondisi lo.
Pro tip: MTF dan rasio juga bisa
Karena ini Pine penuh, lo bisa pakai request.security() buat ambil data timeframe lain di dalam indikator screener lo. Contoh: "close harian di atas EMA(50) mingguan". Tapi hati-hati repainting (inget Modul Pine lanjutan): pakai bar confirmed, jangan lookahead.
Latihan
- List 3 kondisi screening yang lo pengen buat saham IDX (mis. close > EMA50, RSI < 40, volume spike). Tentuin mana yang bisa di-plot sebagai flag.
- Buka Pine Screener dan eksplor UI-nya. Catat: di mana lo pilih watchlist, di mana pilih indikator, di mana set filter plot. Belum perlu scan beneran, cukup kenalan dulu.
- Jelasin dengan kata-kata lo sendiri: kenapa kondisi screening harus di-plot(), dan kenapa screener cuma evaluasi di bar close.
Pro Tips
- Pine Screener cuma baca output plot(). Kalau kondisi lo gak di-plot, screener gak bisa filter. Plot dulu, baru bisa difilter.
- Screener update di bar close. Di Daily = sekali sehari. Jangan nungguin update real-time, itu bukan tugas screener.
- Selalu Favorite indikator lo. Lupa favorite = indikator gak muncul di dropdown Pine Screener. Ini error nomor satu.
- Pine Screener cuma terima indicator(), bukan strategy(). Kalau script lo strategy, ubah jadi indicator dulu.
6. Mendesain Plot Flag: plot(condition ? 1 : 0) untuk Screener
Konsep flag plot
Kunci bikin indikator yang bisa difilter di Pine Screener: ubah kondisi boolean jadi angka yang bisa difilter. Trik standarnya:
plot(kondisi ? 1 : 0)Artinya: kalau kondisi true, plot angka 1; kalau false, plot 0. Di Pine Screener, lo tinggal filter "Plot > 0" buat dapet semua saham yang kondisinya true.
Kenapa gak langsung plot(kondisi)? Karena plot() butuh angka (series float/int), bukan boolean langsung dengan cara yang enak difilter. Operator ternary ? 1 : 0 nerjemahin boolean jadi numerik yang rapi: 1 = ya, 0 = tidak. Bersih, gampang difilter.
Contoh lengkap: flag close di atas EMA(50)
Ini indikator inti yang lo butuhin buat latihan akhir. Tulis di Pine Editor:
//@version=5
indicator("Screener: Close > EMA50", overlay=true)
// 1. hitung EMA 50 dari harga close
ema50 = ta.ema(close, 50)
// 2. definisikan kondisi: harga close di atas EMA50?
diAtasEMA = close > ema50
// 3. plot EMA biar kelihatan di chart (opsional, buat visual)
plot(ema50, "EMA 50", color=color.orange, linewidth=2)
// 4. INI YANG PENTING: flag numerik buat Pine Screener
plot(diAtasEMA ? 1 : 0, "Flag Diatas EMA50", display=display.data_window)
// 5. bonus: warnai background biar gampang lihat di chart
bgcolor(diAtasEMA ? color.new(color.green, 90) : na)Penjelasan baris per baris:
//@version=5-> wajib, deklarasi versi Pine.indicator("...", overlay=true)-> ini INDICATOR (bukan strategy, syarat screener).overlay=truebiar EMA digambar di atas candle.ema50 = ta.ema(close, 50)-> hitung EMA periode 50. Namespaceta.(Pine v5).diAtasEMA = close > ema50-> kondisi boolean. true kalau close lagi di atas EMA50.plot(ema50, ...)-> gambar garis EMA, cuma buat enak dilihat. Ini bukan flag.plot(diAtasEMA ? 1 : 0, "Flag Diatas EMA50", ...)-> ini flag-nya. Nilainya 1 atau 0. Inilah yang difilter di Pine Screener.display=display.data_window-> biar plot flag-nya gak ngotorin chart (gak digambar sebagai garis di chart, tapi tetap kebaca screener & di Data Window).bgcolor(...)-> kasih warna hijau transparan pas kondisi true, biar lo bisa verifikasi visual di chart.
Verifikasi sebelum dipakai screener
Selalu cek dulu di chart sebelum percaya:
- Add indikator ini ke chart BBCA.
- Lihat: pas candle di atas garis EMA50 oranye, background harus hijau.
- Buka Data Window (kanan, ikon info), cek nilai "Flag Diatas EMA50": harus 1 pas di atas, 0 pas di bawah.
- Kalau cocok, baru favorite dan pakai di screener. Kalau enggak, ada bug.
Ini prinsip yang sama kayak di engineering: jangan klaim jalan sebelum lo lihat sendiri jalan.
Variasi: flag dengan banyak kondisi
Logika apapun bisa jadi flag. Contoh gabungan close > EMA50 DAN RSI < 60:
//@version=5
indicator("Screener: EMA50 + RSI", overlay=true)
ema50 = ta.ema(close, 50)
rsi = ta.rsi(close, 14)
kondisi = close > ema50 and rsi < 60
plot(kondisi ? 1 : 0, "Flag", display=display.data_window)Prinsipnya sama: rangkai kondisi boolean serumit apapun, akhiri dengan plot(kondisi ? 1 : 0).
Flag numerik (bukan cuma 1/0)
Kadang lo mau filter berdasarkan nilai, bukan ya/tidak. Misal jarak harga ke EMA dalam persen:
jarakPersen = (close - ema50) / ema50 * 100
plot(jarakPersen, "Jarak ke EMA50 (%)", display=display.data_window)Di screener lo bisa filter "Plot > 2" buat saham yang harganya 2%+ di atas EMA50. Lebih fleksibel daripada flag 1/0.
Latihan
- Tulis indikator 'Close > EMA50' lengkap di Pine Editor, add ke chart BBCA, verifikasi di Data Window bahwa flag = 1 pas close di atas EMA50.
- Modifikasi jadi flag gabungan: close > EMA50 DAN close > EMA200 (golden alignment). Verifikasi di chart BMRI atau ASII.
- Bikin versi numerik yang nge-plot jarak persen close ke EMA50. Cek nilainya di Data Window masuk akal (positif di atas, negatif di bawah).
Pro Tips
- plot(kondisi ? 1 : 0) itu pola wajib buat flag boolean di Pine Screener. Hapalin.
- Pakai display=display.data_window biar flag gak bikin chart berantakan tapi tetap kebaca screener.
- Selalu verifikasi flag di Data Window + bgcolor SEBELUM scan. Flag yang salah = hasil screener yang salah.
- Buat filter berdasarkan derajat (bukan ya/tidak), plot nilai numerik mentah (mis. jarak persen ke EMA), bukan cuma 1/0.
7. Eksekusi Order IDX: Samuel Sekuritas, Gotrade, dan Realita Retail
Bedain dua hal: charting vs eksekusi
Ini poin yang bikin banyak trader Indonesia bingung. Ada dua hal beda:
- Charting data IDX -> nampilin grafik BBCA, BBRI, dll di TradingView. Ini tersedia buat semua orang (data delay 15 menit gratis, real-time bayar add-on IDX). Modul-modul sebelumnya semua soal ini.
- Eksekusi order IDX -> beneran beli/jual saham IDX langsung dari TradingView. Ini terbatas.
Kebanyakan retail Indonesia: chart di TradingView, tapi eksekusi di app broker lain (Stockbit, Ajaib, IPOT, dll). Jadi alur normalnya: analisa di TV -> pindah ke app broker buat klik beli. Webhook auto-trade ke broker IDX itu jarang banget kebuka.
Opsi native: Samuel Sekuritas (SSI)
Yang paling menonjol: Samuel Sekuritas punya integrasi yang bikin lo bisa trading saham IDX langsung di platform TradingView. Ini jalur native IDX yang paling jelas. Kalau lo serius mau eksekusi IDX dari dalam TradingView, ini opsi utama yang ada sekarang.
Dengan integrasi broker macam ini, tombol Trade dan Trading Panel di TradingView jadi nyambung ke akun broker beneran, bukan cuma paper trading.
Gotrade
Gotrade ada di daftar partner broker TradingView (Indonesia-facing, fokusnya fractional saham US). Berguna kalau lo trading saham AS, tapi untuk fokus IDX murni, Samuel Sekuritas lebih relevan.
Realita: kebanyakan broker IDX belum terintegrasi
Jujur aja: meskipun permintaan tinggi, banyak broker IDX (Stockbit, Ajaib, IPOT, Mirae, dll) belum punya integrasi eksekusi langsung di TradingView atau dukungan akun IDR penuh. Jadi pola realistis buat mayoritas trader IDX:
Webhook auto-trade end-to-end ke broker IDX (TV -> receiver -> broker API) belum praktis buat kebanyakan broker lokal karena API publik terbatas. Jangan janjiin ke diri sendiri lo bisa full auto-trade IDX dulu, kecuali lewat jalur yang emang nyediain (mis. Samuel Sekuritas).
Buat course ini: posisikan webhook lo realistis
Karena eksekusi IDX terbatas, fan-out paling realistis buat trader IDX adalah notifikasi (Telegram/Discord), bukan auto-trade. Webhook bridge lo paling berguna buat:
- Kirim sinyal ke grup Telegram tim/komunitas lo.
- Logging sinyal ke spreadsheet/database.
- Reminder buat eksekusi manual di broker.
Auto-trade ke broker API itu konsep yang sama persis (fan-out tujuan ketiga), tapi cuma kebuka kalau broker lo nyediain API. Untuk IDX masih sempit; tapi buat crypto justru paling kebuka — lihat sub-bagian berikutnya.
Auto-trade crypto via webhook (fan-out tujuan ketiga yang RIIL)
Di sinilah crypto unggul telak dari IDX. Exchange crypto besar (Binance, Bybit, OKX) punya REST + WebSocket API publik yang siapa aja bisa pakai: bikin API key di akun lo, kasih izin trading, langsung bisa kirim order dari kode. Gak perlu nunggu broker buka integrasi. Jadi rantai fan-out ketiga lo beneran sampai eksekusi:
Pola kodenya identik dengan fan-out Telegram — cuma ganti tujuannya jadi order API. Contoh ngirim market buy ke Binance lewat library ccxt (di dalam handler webhook, setelah validasi IP + secret):
import ccxt
exchange = ccxt.binance({
"apiKey": os.environ["BINANCE_KEY"],
"secret": os.environ["BINANCE_SECRET"],
})
def auto_buy(symbol, qty):
# market order; di crypto qty boleh pecahan koin, gak ada lot kayak IDX
return exchange.create_market_buy_order(symbol, qty)Jadi buat pair likuid kayak BINANCE:BTCUSDT atau ETHUSDT, lo bisa bikin pipeline end-to-end: alert TradingView -> receiver (validasi) -> order ke Binance/Bybit/OKX, tanpa nyentuh app exchange manual. Inilah use-case unggulan automation yang gak kebuka di IDX.
Webhook auto-trade itu paling masuk akal di crypto, bukan IDX. Pasar buka 24/7 (sinyal jam 3 pagi tetap dieksekusi), exchange punya API publik (gak perlu nunggu broker), dan sizing-nya pecahan koin (gak kejebak aturan lot 100 saham). Tetap pasang risk guard di receiver: cek action, batasi qty, dan jangan pernah auto-trade tanpa secret key yang valid. Ini bukan saran investasi — auto-trade salah kode bisa nguras saldo dalam hitungan detik.
Latihan
- Petakan workflow eksekusi lo sendiri sekarang: lo chart di mana, eksekusi di mana? Identifikasi titik 'pindah manual'-nya.
- Cek apakah broker IDX yang lo pakai punya integrasi TradingView atau API publik. Catat temuannya. Realistis: kebanyakan belum.
- Jelasin kenapa untuk trader IDX, fan-out webhook ke Telegram (notifikasi) lebih masuk akal daripada auto-trade ke broker, saat ini.
Pro Tips
- Charting IDX = tersedia luas. Eksekusi IDX dari TradingView = terbatas. Jangan ketuker dua konsep ini.
- Untuk fokus IDX retail: chart di TV, eksekusi manual di Stockbit/Ajaib/IPOT. Itu normal dan gak ada yang salah.
- Samuel Sekuritas = jalur native eksekusi IDX di TradingView yang paling jelas saat ini. Cek detail & syaratnya langsung ke SSI.
- Untuk webhook bridge IDX lo, posisikan tujuannya sebagai NOTIFIKASI (Telegram), bukan auto-trade. Itu yang realistis & paling berguna.
8. Mobile vs Desktop: Bagi Tugas dengan Benar
Aturan emasnya
Gampang diinget:
- Desktop = bikin & uji (Pine Editor, backtest/Strategy Tester, Pine Screener, setup alert/webhook, multi-chart).
- Mobile = pantau & respon (terima alert, lihat chart cepat, eksekusi manual sederhana).
Jangan lawan arus ini. Lo gak akan bisa nulis Pine atau backtest serius di HP. Dan lo gak akan duduk di depan laptop 24 jam buat nungguin alert.
Yang CUMA bisa di desktop
- Pine Editor: nulis & edit indikator/strategy. Gak ada di mobile.
- Strategy Tester / backtest: lihat equity curve, profit factor, drawdown. Desktop only.
- Pine Screener: setup & scan. Desktop.
- Setup webhook & alert kompleks: nulis JSON payload, masukin secret, set Webhook URL. Jauh lebih enak (dan beberapa cuma bisa) di desktop.
- Multi-chart layout, Volume Profile config, DOM: desktop.
Yang nyaman di mobile
- Terima push notification alert: ini killer feature mobile.
- Lihat chart, gambar garis sederhana.
- Manage watchlist.
- Order entry dasar (kalau broker terintegrasi).
Insight penting: alert itu server-side
Alert TradingView jalan di server TradingView, bukan di device lo. Artinya:
- Alert tetap trigger walau laptop lo mati dan app mobile lo ketutup.
- Webhook tetap kekirim ke receiver lo walau lo lagi gak buka TradingView sama sekali.
- Mobile push cuma channel notifikasi, bukan syarat alert jalan.
Ini penting buat automation: lo set alert + webhook di desktop sekali, terus matiin laptop. Server TradingView tetap jalan, receiver lo (di VPS/Cloudflare) tetap nerima, Telegram lo tetap dapet sinyal. Lo cukup pantau Telegram dari HP. Inilah kenapa receiver di Cloudflare/VPS (bukan di laptop) itu penting buat produksi.
Workflow ideal end-to-end
Desktop buat kerja berat sekali-sekali, mobile buat hidup sehari-hari. Server jadi jembatan yang gak pernah tidur.
Latihan
- Buat daftar tugas automation lo, lalu kategorikan: mana yang HARUS di desktop, mana yang cukup di mobile.
- Jelasin kenapa naro receiver di laptop pribadi itu ide buruk buat produksi, dikaitkan dengan fakta alert jalan server-side.
Pro Tips
- Setup webhook/alert/screener SELALU di desktop. Mobile cuma buat pantau hasilnya.
- Alert jalan server-side, jadi taro receiver di server yang nyala 24/7 (Cloudflare/VPS), bukan laptop yang sering ketutup.
- Mobile push = channel notifikasi, bukan syarat alert. Alert tetap trigger walau HP & laptop mati.
9. EXERCISE BESAR: Webhook Bridge BBCA + Pine Screener EMA50
Dua tugas, satu modul
Ini latihan puncak yang nyatuin semua. Ada dua bagian terpisah:
BAGIAN A: Webhook bridge BBCA -> Telegram
Tujuan: terima alert BBCA dari Modul 8, validasi IP + secret, forward pesan terformat ke Telegram channel.
Langkah:
- Siapkan receiver (Flask atau Cloudflare Worker) dengan validasi lengkap:
import os
import requests
from flask import Flask, request, abort
app = Flask(__name__)
ALLOWED_IPS = {
"52.89.214.238", "34.212.75.30",
"54.218.53.128", "52.32.178.7",
}
SECRET = os.environ["WEBHOOK_SECRET"]
TG_TOKEN = os.environ["TG_TOKEN"]
TG_CHAT_ID = os.environ["TG_CHAT_ID"]
def kirim_telegram(teks):
url = f"https://api.telegram.org/bot{TG_TOKEN}/sendMessage"
r = requests.post(url, json={
"chat_id": TG_CHAT_ID, "text": teks, "parse_mode": "Markdown",
}, timeout=10)
r.raise_for_status()
def format_pesan(d):
return (
f"🚨 *SINYAL BBCA*\n"
f"—————————\n"
f"📊 Saham: *{d.get('ticker','?')}*\n"
f"💰 Harga: `{d.get('close','?')}`\n"
f"⏰ {d.get('time','-')}"
)
@app.route("/webhook", methods=["POST"])
def webhook():
# 1. validasi IP
ip = request.headers.get("X-Forwarded-For", request.remote_addr)
ip = ip.split(",")[0].strip()
if ip not in ALLOWED_IPS:
abort(403)
# 2. validasi secret
d = request.get_json(silent=True)
if not d or d.get("sec_key") != SECRET:
abort(401)
# 3. fan-out
kirim_telegram(format_pesan(d))
return "ok", 200
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000)- Set env var sebelum jalanin:
export WEBHOOK_SECRET="$(python3 -c 'import secrets;print(secrets.token_urlsafe(32))')"
export TG_TOKEN="token-dari-botfather"
export TG_CHAT_ID="-100xxxxxxxxxx"
echo "Secret lo: $WEBHOOK_SECRET" # catat, butuh buat alert TV-
Expose ke internet:
ngrok http 5000(testing) atau deploy ke Cloudflare/VPS (produksi). Dapetin URL publik. -
Tes lokal dulu pakai curl sebelum colok TV:
curl -X POST https://url-lo/webhook \
-H "Content-Type: application/json" \
-d '{"sec_key":"SECRET-LO","ticker":"BBCA","close":10500,"time":"2026-06-15"}'Kalau Telegram lo dapet pesan -> bridge jalan. Tes juga tanpa secret (harus 401).
-
Colok ke alert BBCA Modul 8 di TradingView:
- Buka alert BBCA lo (atau bikin baru, bell icon / Alt+A).
- Tab Notifications -> centang Webhook URL -> tempel URL publik lo +
/webhook. - Tab Message -> isi JSON:
{"sec_key":"SECRET-LO","ticker":"{{ticker}}","close":"{{close}}","time":"{{time}}"} - Save.
-
Verifikasi end-to-end: tunggu alert trigger (atau test trigger), pastiin pesan BBCA muncul di Telegram dengan format rapi.
BAGIAN B: Pine Screener flag close > EMA50
Tujuan: scan saham IDX yang close di atas EMA(50).
Langkah:
- Tulis indikator di Pine Editor (desktop):
//@version=5
indicator("IDX Screener: Close > EMA50", overlay=true)
ema50 = ta.ema(close, 50)
diAtas = close > ema50
plot(ema50, "EMA50", color=color.orange, linewidth=2)
plot(diAtas ? 1 : 0, "Flag", display=display.data_window)
bgcolor(diAtas ? color.new(color.green, 90) : na)-
Add to chart BBCA, verifikasi: background hijau pas di atas EMA50, Data Window "Flag" = 1.
-
Favorite indikatornya (Save -> klik bintang).
-
Siapkan watchlist IDX berisi saham yang mau di-scan (BBCA, BBRI, TLKM, ASII, UNVR, BMRI, dll). Buat varian crypto, bikin watchlist kedua "Crypto Majors" isi
BINANCE:BTCUSDT,ETHUSDT,BINANCE:SOLUSDT— indikator yang sama jalan tanpa diubah. -
Buka Pine Screener -> pilih watchlist IDX (atau watchlist Crypto Majors) -> pilih indikator favorit "IDX Screener: Close > EMA50" -> timeframe Daily.
-
Set filter: Flag > 0.
-
Scan. Hasil: daftar saham IDX (atau pair crypto kayak
BINANCE:BTCUSDT) yang close-nya di atas EMA50. Verifikasi 1-2 hasil manual dengan buka chart-nya.
Kriteria selesai (jangan klaim beres sebelum semua ini kecek)
- curl tanpa secret -> ditolak 401
- curl dengan secret bener -> Telegram dapet pesan terformat
- Alert TradingView trigger -> pesan BBCA sampai ke Telegram
- Indikator EMA50: Data Window flag = 1 pas close di atas EMA50 (terverifikasi visual)
- Pine Screener nampilin daftar saham IDX yang lolos filter Flag > 0
Latihan
- Selesaikan Bagian A penuh sampai alert BBCA sungguhan muncul di Telegram. Screenshot pesan Telegram-nya.
- Selesaikan Bagian B sampai Pine Screener nampilin minimal 1 saham IDX yang close > EMA50. Screenshot hasil scan-nya.
- Tantangan: tambahin fan-out Discord ke Bagian A, jadi sinyal BBCA masuk Telegram DAN Discord sekaligus.
- Tantangan: upgrade indikator Bagian B jadi 'close > EMA50 DAN volume > rata-rata 20 hari', lalu scan ulang. Bandingin jumlah hasilnya dengan versi EMA50-saja.
- Tantangan crypto: jalanin Bagian B di watchlist Crypto Majors (
BINANCE:BTCUSDT,ETHUSDT) pakai indikator yang sama. Catat bedanya — di crypto screener Daily update tiap hari tanpa nunggu jam bursa. - Tantangan crypto (lanjutan): ganti tujuan fan-out Bagian A jadi order ke exchange testnet (Binance/Bybit) lewat
ccxt, BUKAN broker live. Pasang guardqtykecil + ceksec_key. Ini bikin pipeline auto-trade crypto end-to-end yang gak kebuka di IDX.
Pro Tips
- Tes tiap bagian terisolasi dulu: (1) kirim_telegram sendiri, (2) receiver+validasi pakai curl, (3) baru colok TV. Jangan gabung semua sekaligus terus bingung mana yang rusak.
- Secret di env var receiver HARUS sama persis dengan sec_key di JSON alert TradingView. Beda satu karakter = 401 terus.
- Buat Bagian B, jangan lupa Favorite indikator. Lupa favorite = gak muncul di Pine Screener, dijamin lo bakal kejebak ini.
- Verifikasi end-to-end beneran (trigger alert sungguhan), bukan cuma curl. Curl sukses gak menjamin TradingView ngirim format yang lo harap.
Kuis
- A. Karena Telegram memblokir IP TradingView
- B. Karena TradingView cuma bisa POST JSON mentah ke satu URL dan gak ngerti format/token Telegram, jadi butuh penerjemah + tempat validasi
- C. Karena receiver bikin sinyal lebih cepat
- D. Karena Telegram butuh bayar kalau langsung dari TradingView
Answer
Karena TradingView cuma bisa POST JSON mentah ke satu URL dan gak ngerti format/token Telegram, jadi butuh penerjemah + tempat validasi
TradingView cuma melakukan HTTP POST JSON ke satu URL. Dia gak tau soal Telegram Bot API, token, atau chat_id. Receiver berperan sebagai penerjemah (format pesan) sekaligus tempat menaruh validasi keamanan (IP allowlist + secret) dan logika fan-out ke banyak tujuan.
- A. Password chart + 2FA akun
- B. IP allowlist (4 IP TradingView) + shared secret key di payload JSON, karena IP saja bisa ambigu di belakang proxy dan webhook URL tanpa autentikasi
- C. HTTPS + nama bot rahasia
- D. Captcha + rate limit
Answer
IP allowlist (4 IP TradingView) + shared secret key di payload JSON, karena IP saja bisa ambigu di belakang proxy dan webhook URL tanpa autentikasi
Webhook URL tidak terautentikasi secara default. IP allowlist (52.89.214.238, 34.212.75.30, 54.218.53.128, 52.32.178.7) menyaring asal request, tapi di belakang proxy/ngrok IP bisa jadi IP proxy. Shared secret key (sec_key) di payload jadi lapis kedua yang dicek server-side. Dua-duanya dipakai karena masing-masing menutup celah yang lain.
- A. plot(close) karena screener baca harga langsung
- B. plot(condition ? 1 : 0) karena Pine Screener memfilter berdasarkan output numerik plot(), bukan boolean mentah
- C. alert(condition) karena screener baca alert
- D. strategy.entry(condition) karena screener jalan di strategy
Answer
plot(condition ? 1 : 0) karena Pine Screener memfilter berdasarkan output numerik plot(), bukan boolean mentah
Pine Screener hanya bisa membaca output plot() dan memfilternya secara numerik. Pola plot(condition ? 1 : 0) mengubah boolean jadi angka 1 (true) atau 0 (false), sehingga bisa difilter dengan kriteria seperti 'Plot > 0'. Selain itu Pine Screener butuh indicator(), bukan strategy().
- A. Setiap tick real-time, jadi update tiap detik
- B. Hanya pada bar yang sudah tutup (bar-close), pada bar terakhir, sehingga di Daily hanya update sekali sehari saat candle harian tutup
- C. Hanya saat market buka
- D. Setiap kali kita refresh halaman
Answer
Hanya pada bar yang sudah tutup (bar-close), pada bar terakhir, sehingga di Daily hanya update sekali sehari saat candle harian tutup
Pine Screener evaluasi hanya pada bar close dan melihat bar terakhir yang confirmed. Di timeframe Daily, ini berarti update sekali sehari saat candle harian tutup, bukan real-time. Karena itu desain plot harus mengeluarkan nilai final per bar, bukan nilai yang berubah-ubah intrabar.
- A. Semua broker IDX (Stockbit, Ajaib, IPOT) bisa auto-trade lewat webhook TradingView
- B. Charting data IDX tersedia luas, tapi eksekusi order IDX dari TradingView terbatas; Samuel Sekuritas adalah jalur native yang jelas, dan kebanyakan retail tetap eksekusi manual di app broker
- C. Eksekusi IDX hanya bisa lewat Gotrade
- D. TradingView tidak bisa menampilkan data IDX sama sekali
Answer
Charting data IDX tersedia luas, tapi eksekusi order IDX dari TradingView terbatas; Samuel Sekuritas adalah jalur native yang jelas, dan kebanyakan retail tetap eksekusi manual di app broker
Bedakan charting (tersedia: data IDX delay gratis, real-time add-on) dari eksekusi (terbatas). Samuel Sekuritas menyediakan eksekusi IDX native di TradingView. Mayoritas retail IDX tetap chart di TV lalu eksekusi manual di Stockbit/Ajaib/IPOT karena API broker lokal terbatas, jadi fan-out yang realistis adalah notifikasi (Telegram), bukan auto-trade.