PyneCore v6.9.3 released — dependent request.security() expressions are now synchronized…

Features

  • A security expression reading another security call’s result now sees the peer’s value for the correct bar — scripts like request.security(sym, "M", ta.sma(monthlyRsi, n)) no longer diverge. One pairing rule everywhere: the peer’s last bar whose scheduled close is at or before the consumer’s as-of time, taken from the trading schedule rather than timeframe arithmetic.
  • ticker.heikinashi() contexts warm the Heikin Ashi recurrence from a mapped --security feed, so the context’s first open is the carried value instead of a cold start.

Fixes

  • strategy.opentrades.profit_percent() and the other open-trade returns are refreshed in backtests and before every live broker tick instead of staying at 0 (#83, duplicate #82).
  • Past the retained closed-trade limit, strategy.closedtrades keeps counting globally and the accessors address the intended trade (#84).
  • request.earnings(), request.dividends() and request.splits() return na on a crypto chart instead of raising.
  • Broker: a plugin-declined close_leg is routed through the one-way fan instead of propagating as a raw reject; spent entry anchors and orphaned exit legs are handled on restart; duplicate reversal closes are prevented.
  • Live mode drops out-of-order closed candles arriving behind a forming bar, so a late close can no longer move the strategy clock backwards.
  • timestamp() treats na components as zero instead of raising.
  • Shared memory block names no longer collide between concurrent runs of the same script.

Behaviour changes

  • An early close the schedule does not know about (holiday or half-day) makes the D/W/M bar visible one chart bar later, matching live mode.
  • A lower-timeframe bar straddling the chart bar boundary is delivered on the next chart bar instead of leaking a close from after it.

Full release notes: https://github.com/PyneSys/pynecore/releases/tag/v6.9.3