Custom Chart Trader Panel for Prop Firms — Daily Loss Lock, Account Rotation & News Lock [Vendor]

Long-time lurker, first post. I’m a NinjaTrader vendor and wanted to share
some of the harder SDK problems I solved while building Nexus Chart Trader,
in case it’s useful to anyone building similar tools.

Problem 1: Daily loss limits that survive NT restarts
The obvious approach (storing limits in instance variables) breaks the moment
a trader restarts NinjaTrader to reset their own limits. I solved this by
persisting locks to the Windows Registry with a static object lock to prevent
race conditions across multiple chart instances. SessionIterator detects new
trading sessions and clears them automatically no manual reset needed.

Problem 2: Duplicate brackets from multiple chart instances
When two NCT charts on the same instrument both receive ExecutionUpdate for
the same fill, they race and can submit duplicate SL/TP brackets. Fixed with
a ConcurrentDictionary owner-claim gate the first instance claims the
(account, instrument) key, the second skips. The claim releases after
reconciliation so the next fill works cleanly.

Problem 3: Per-frame SharpDX brush allocations
The button panel is a full SharpDX Direct2D overlay on OnRender(). Naive
brush creation per frame caused GC pressure. Solved with a pooled
Dictionary<uint, SolidColorBrush> keyed on ARGB brushes are reused
across frames and only disposed on chart close.

Problem 4: Forex Factory news calendar without hammering the API
News lock pulls from the FF XML feed and caches locally. On each load it
checks file age if under 61 minutes it reads from disk, otherwise
re-fetches. Prevents rate limiting while keeping the calendar fresh.

The panel also handles streamer mode (account name redaction), account
rotation with a cross-instance skip list, and a mobile WebUI over local
network. Happy to discuss any of the implementation details.

3 Likes

Everyone becoming vendors and “coders” nowadays. :joy:

Fair Point. Though if you’ve got notes on a better approach to the duplicate bracket race condition or the SharpDX GC issue, I’m genuinely interested. Took a few painful debugging sessions to land on those solutions.

And agreed, competition is generally a positive thing. It pushes products to become more refined over time and deliver better value for people who dont have time or knowldege to code.

1 Like

It is another form of trading. Selling stuff to willing buyers. In a lot of ways easier and more durable than trading the ES

1 Like

I have no desire to go solve those issues. Just ask an LLM. :joy: I don’t have any issue with competition and I’m not selling anything. What gets annoying is when someone joins and immediately starts pushing their product. That said, NT doesn’t seem to care about this forum so go for it.

1 Like

There are other perks to being a NinjaTrader vendor as well. You can share your creations with other traders, customize the trading environment to fit your workflow, and get access to beta releases to test upcoming features early. I also like that they’re working on support for multiple playback accounts, which should be a great addition for testing and development workflows.

1 Like

Long-time lurker, first post. I’m a NinjaTrader vendor and wanted to share
some of the harder SDK problems I solved while building Nexus Chart Trader,
in case it’s useful to anyone building similar tools.

Problem 1: Daily loss limits that survive NT restarts
The obvious approach (storing limits in instance variables) breaks the moment
a trader restarts NinjaTrader to reset their own limits. I solved this by
persisting locks to the Windows Registry with a static object lock to prevent
race conditions across multiple chart instances. SessionIterator detects new
trading sessions and clears them automatically — no manual reset needed.

Problem 2: Duplicate brackets from multiple chart instances
When two NCT charts on the same instrument both receive ExecutionUpdate for
the same fill, they race and can submit duplicate SL/TP brackets. Fixed with
a ConcurrentDictionary owner-claim gate — the first instance claims the
(account, instrument) key, the second skips. The claim releases after
reconciliation so the next fill works cleanly.

Problem 3: Per-frame SharpDX brush allocations
The button panel is a full SharpDX Direct2D overlay on OnRender(). Naive
brush creation per frame caused GC pressure. Solved with a pooled
Dictionary<uint, SolidColorBrush> keyed on ARGB — brushes are reused
across frames and only disposed on chart close.

Problem 4: Forex Factory news calendar without hammering the API
News lock pulls from the FF XML feed and caches locally. On each load it
checks file age — if under 61 minutes it reads from disk, otherwise
re-fetches. Prevents rate limiting while keeping the calendar fresh.

The panel also handles streamer mode (account name redaction), account
rotation with a cross-instance skip list, and a mobile WebUI over local
network. Happy to discuss any of the implementation details.

Product page: https://www.nexusindicator.com/chart-trader