FeaturesConverterPricingCompareBlogDocsAccount
DemoJoin early access
Blog·Agent·Sep 8, 2026·8 min read

What the porting agent does, and where it fails

ISMIndicatorSmith Engineering · Sep 8, 2026 · 8 min read
0 of 306bars differ · and 2 lines it could not do

v1.14.2 ships an agent. Not a chat box that explains what you could do — a porting engineer you hand the migration to. You state one instruction, it works the queue on its own, and it ends by telling you what it could not convert, by name. This post is the honest version: what it actually does, the numbers from a real run, and the four places it fails.

What you hand over

One sentence, stated once, from the radar icon on the rail:

The standing instructionPort my Pine library — convert each script, prove it, and tell me honestly what you could not do.

From that point it runs on the workspace clock without further input. One script per cycle: convert it, then run the conversion beside the Pine reference over the same bars and count every difference above floating-point tolerance. Each cycle writes one log entry with what it did, why, and the number it produced.

It also states its price before it starts, which is the part we care most about:

What it costs youI will not guess at a construct I do not support. Where there is no equivalent you get a marked line and a dropped decoration rather than a silent approximation — so some files come back with something missing, by design.

A real run, in full

The four sample scripts that ship with the demo, BTCUSD 1D, on the visible window. This is the log, not a summary of it:

ScriptCleanNotedUnsupportedBars differ
rsi_divergence.pine13120 of 306
vwap_bands.pine8200 of 320
htf_trend_filter.pine9100 of 270
ema_cross.pine14000 of 320
Queue finished44420 in total

And the sentence it finished with:

Queue finishedrsi_divergence.pine uses label.new(), which has no equivalent here — I marked the line and dropped the caption rather than substitute something that looks similar. 2 files carried a note where the wording changed but the behaviour did not.

Why the proof is the product

Any tool can emit Python that looks like your Pine. The question is whether it produces the same numbers, and the only answer that means anything is a count. The Equivalence tab runs both implementations over the same bars:

Fig. 1 · RSI 14 · Pine reference vs the conversion vs a hand port306 bars · BTCUSD 1D
Top: the Pine reference (blue) and the converted Python (green, dashed) sit on top of each other; a hand port of the same script (red) does not. Bottom: difference from the reference, per bar.
ImplementationBarsDifferMax ΔSignalsOff
Pine reference3066
IndicatorSmith conversion3060060
Hand port using an EMA instead of Wilder smoothing30630621.9393

The third row is the whole argument for automating this. Pine's ta.rsi smooths with ta.rma (Wilder, alpha = 1/N). Porting it with a plain EMA (alpha = 2/(N+1)) looks right and reads wrong: the level is off by up to 21.93 RSI points, overbought and oversold cross on different bars, the script fires 9 signals instead of 6 with 3 of them on the wrong bar, and it leaves 13 bars with no value at all where Pine has one. Nobody catches that by eye.

Where it fails

Four honest limits. We would rather you read them here than discover them in a month.

1. It will not invent a construct it does not have

label.new() has no equivalent object in the engine yet. The agent marks the line with a ✕ in the gutter on both sides and drops the caption. The triangle still plots and the values are unaffected, but the "Bull" text is gone. That is a deliberate refusal: a lookalike substitution would convert cleanly and quietly change what your chart says.

2. The proof covers values, not costs or fills

Equivalence answers one question: does the converted indicator produce the same series and fire on the same bars? It says nothing about whether the strategy makes money. The verdict panel says so itself — "Costs and fills are not part of this comparison — that is the backtest below." A conversion with 0 differing bars can still be a bad rule.

3. It proves on the window you are looking at

The count is over the visible bars — 306, 320 or 270 in the run above, depending on the warm-up each script needs. Pan or zoom to a different stretch of history and press Re-run, because a conversion that agrees on one regime is not thereby proved everywhere.

4. Some things do not travel at all

Saved drawings and alerts from your old platform do not import. Nothing converts them, so you re-arm them here once. The agent says this in the first thirty seconds rather than letting you find out later.

It also says when nothing happened

The second standing instruction is a watch across three symbols. Most of its cycles produce no signal, and it logs those too — with the number that fell short, so you can judge the threshold instead of trusting it:

Checked BTCUSD, ETHUSD, SPX at bar 521 — said nothing
  SPX crossed up and separated to 0.37 × ATR, but RSI is 76.0 — on
  the wrong side of 50 for that direction, so the cross and the
  momentum disagree and I stayed quiet
  SPX RSI 76.0

Checked BTCUSD, ETHUSD, SPX at bar 520 — said nothing
  no cross on any of the three 3 bars back. ETHUSD is the nearest to
  one, with its two EMAs 0.10 × ATR apart — they have to meet before
  there is anything for me to say
  nearest ETHUSD 0.10 × ATR apart

An agent that always finds something is a salesman. This one is quiet most of the time, and the cost line says so before you turn it on: "A rule strict enough to be worth reading is quiet most of the time. You will see far more 'nothing to report' than signals."

What it will not do at all

It does not place orders, does not read your provider keys, and does not give advice. Ask it to size with a leverage multiple and it answers before anything else: "No. I do not size with leverage multiples and I will not model one. Sizing here is quarter Kelly (0.25) on the measured edge, capped at 7.5 % of equity per asset, with fees at 4 bps, slippage at 20 bps and a −20 % drawdown halt. That is the ceiling, not a starting point I negotiate up from." Ask for a t-statistic from four trades and it refuses that too, because a number from that few is a decimal place pretending to be evidence.

How to stop it

Four buttons in the same panel as the log, one click each: Pause freezes the clock and the log exactly where they are, Resume continues from the next cycle, Undo last reverses the most recent change it made in your workspace and marks that entry as undone, and Stop ends the instruction entirely. Nothing runs on your behalf that you cannot see and reverse. The agent docs have the full reference.

Try itEvery number in this post is printed by the demo. Open it, answer "I have Pine scripts to port", and the same run happens in front of you — including the two lines it cannot do.
ISM
IndicatorSmith Engineering

The team that builds the engine, the converter and the docs. We write about what we learn from release notes, support questions and our own migrations. Corrections: editor@indicatorsmith.com.

Educational model output on illustrative sample data. Trading involves risk. Backtests are hypothetical results and do not predict future results. Nothing in this post is financial advice.