Actual code.
Your indicators.
JavaScript, in VS Code, inside the terminal. The same orderflow the chart is already drawing.
TradingView is a toy. ATAS is a job.
You want your own signal on the book, not another RSI. On TradingView you get a walled DSL and none of the data that matters. On ATAS you install Windows, wait, and still cannot ship a script to someone else without a ritual.
MMT scripts in JavaScript. If you can read a function, you can read this. If you use Cursor, you can write it. We picked JS so an AI can eat the docs and spit out a working indicator, not a new language you have to memorize.
The editor is VS Code, embedded in the terminal. Private by default. Publish to the suite when it is actually good.
The data other script engines do not give you.
Candles, yes. Also the book, footprint volume, bucketed volume delta, CVD, open interest, funding, liquidations. Aggregate every source except raw candles across the venues you already watch. You are not writing a moving average on close. You are writing on the tape.
Write it once. Put it on a chart in one click.
Scripts stay private until you publish. Open-source ones clone into your account. No pastebin. The indicator suite is where official tools and community scripts live: search, favorite, add. The same place you already browse on /indicators.
Alerts that leave the chart.
When your logic fires, it can hit Discord, Telegram, Slack, or a generic webhook. One trigger per bar. That is the whole point of writing it down.
Enough talk. Here is the shape.
SMA Crossover
Full reference is in the docs. Paste that into Cursor if you want it written for you.
//@version=2 indicator("SMA Crossover", true) const fastLen = input.int("Fast Length", 9, { min: 1 }) const slowLen = input.int("Slow Length", 21, { min: 1 }) const candles = subscribe(data.OHLCV) function onBar(index) { const fast = ta.sma(candles.close(), fastLen) const slow = ta.sma(candles.close(), slowLen) const a = plot("Fast SMA", fast, { color: color.blue, width: 2 }) const b = plot("Slow SMA", slow, { color: color.red, width: 2 }) fill(a, b, { color: color.transp(color.blue, 85) }) }
Tick-resolution scripts and the backtester sit on Ultra. The engine above is live on Free and Pro.