Skip to content

v6.10.12

Latest

Choose a tag to compare

@wallneradam wallneradam released this 24 Oct 07:15
· 7 commits to main since this release

Pine Compatibility

  • Typed na everywhere a value goes. A typeless na now becomes the na of the type it goes into: the numeric na (NaN) for a float or int variable, parameter, return, ternary arm, arithmetic operand or numeric container element; the empty string for a string; the na of the class for a UDT or drawing; and the na of the container for an array, a map or a matrix. A variable that starts as na and is assigned later takes the na of the type its assignments join to, tuples per position. Values that only hold an na (a defaulted parameter, a variable) are converted at run time. Overload dispatch therefore no longer picks the first candidate for an na argument.
  • History before the first bar has the right na too. expr[n] on a series without a static element type reads the na of the stored type (NaN, empty string, the bool na of the running mode, or the na of the class) instead of a typeless na.
  • ta.change of a bool answers the bool na while fewer than length bars of history exist, as measured on TradingView: false in v6, na in v5.
  • Numbers passed to a lib function's bool parameter (ta.valuewhen's and ta.barssince's condition, for example) are converted by Pine's tolerant float-to-bool rule, the same one bool() and if use: na and values within 1e-10 of zero are false.
  • Overload selection: calls with keyword arguments are resolved to an implementation statically, a position holding an object is decided by its class, and call sites inside an overload implementation get their own instance data, so a generic helper called from one no longer falls back to value dispatch (which failed on empty containers).
  • Library methods by name: a library method called on a string, number, bool or na receiver reaches the exported method instead of a Python builtin attribute of the same name (str.replace, str.format, ...). An na receiver looks the method up by its declared type, and a method no export answers on an na receiver returns na instead of raising "No such method".
  • Security reads without a value on a bar return the na of what the matching write publishes, so a numeric request.security result is the float na. A series of containers (PersistentSeries[list[float]]) now has history (prices[1]).
  • Matrices:
    • A matrix keeps the na of its element type: added rows and columns are padded with it, and copies, transposes, submatrices and arithmetic results carry it.
    • matrix.eigenvalues() and matrix.eigenvectors() compute the real decomposition instead of returning a placeholder.
    • matrix.inv() uses LU with partial pivoting, and matrix.pinv() falls back to the SVD pseudoinverse on rank-deficient matrices. These three match TradingView bit for bit on the measured matrices.
    • matrix.pow(m, 0) returns the identity.
  • str.tostring with a mask prints every shortest decimal digit when the mask has enough places, instead of capping the fraction at 16 digits. Folded constants embedded at 16 decimals round a 17th-decimal tie on the double's exact value, as TradingView does.
  • for row in <matrix> types the loop variable as an array of the matrix's element type.
  • syminfo tick grid: minmove and pricescale are derived exactly for any decimal tick (5.0 -> (5, 1), 0.03 -> (3, 100)), so instruments whose tick is not an integer reciprocal (Bybit options) no longer fail in the CCXT provider. The OHLCV tick analyzer uses the same helper, so pricescale is no longer 0 for ticks above 1.

Edge Profile

  • Edge profile 2026.10.1: a read of open or input that no lib import or local binding covers resolves to the Python builtin, and the gate now reports it as edge-builtin, matching the PyneIDE checker.
  • The layout records a persistent's declared scalar type (var_elem) on its var slot for static consumers; the emitted layout is unchanged.

Live Trading (Broker)

  • Closes recovered after an outage are booked as the bot's own exit instead of an unexplained external flatten. While a plugin reports an unresolved fill recovery for a held entry, the engine holds the external flatten or reduction verdict for up to 300 s beyond the fill-report grace.
  • An entry whose order type changes (a resting limit turned market, say) is cancelled and dispatched afresh instead of amended. A venue refusing an entry amend no longer halts the run: the order is cancelled and re-dispatched on a later sync.
  • Net-fee market fills: an entry booked net of a base-coin fee counts as done once the venue reports its terminal fill, so the engine no longer keeps waiting for it on every stop.
  • Operator resume rebuilds the whole-row TP/SL exits the previous process armed from their journal rows, so the bot re-asserts them on the venue. Trailing exits are left as the venue shows them.
  • Native fail-safe timers run on the wall clock instead of the bar-open time, so with calc_on_every_tick a fail-safe acknowledged at a bar's close is no longer escalated to DEGRADED on the next bar's first tick.
  • A complete FIFO close that leaves only float residue no longer warns of an over-close. Closing-fill dust, and the reversal, flat-book and held-back exit skips, log at INFO instead of WARNING.

Broker Plugin API

  • New optional BrokerPlugin.fill_recovery_pending(entry_ids) port. The default answers from the disappearance tracker's journal; a plugin without it holds nothing.
  • position_dust_threshold in the spot inventory protocol is now a property, so it can follow the venue's least sellable quantity.

Documentation

  • Pyne is described as a domain-specific language with Python syntax, with PyneCore as its runtime, and a new overview page covers Pyne code.
  • The edge profile is documented as a restricted subset that PyneIDE checks; PYNE_EDGE_STRICT=1 enables runtime rejection.
  • The FAQ answers on na handling, division by zero, plotting and external libraries match the current behavior.
  • Validation figures refreshed to the 2026-10-24 Pyne in the Wild snapshot.