SharpTrader is a trading platform built for traders, not brokers, and it is open to the people who write code for them. Write your own strategies in C# inside the platform, plug your external software into its execution engine through the EasyFIX API, or drop our GPU-accelerated candlestick charting library into your own .NET terminal.
| C#native strategy language, compiled inside SharpTrader | 50+FIX API connectors to brokers, plus major crypto exchanges | 22indicators in BjfChart, cross-checked against reference math | 2targets in one DLL: net48 for legacy apps, net8.0-windows for new ones |
Each option solves a different problem. Pick the one that matches where your code lives.
Inside the platform
Coding module: C# bot APIWrite a strategy as a C# class, compile it inside SharpTrader and run it against any connected broker or exchange. Ticks, positions, orders and indicators are all one call away. |
Outside the platform
EasyFIX APIKeep your own engine, in any language, and let SharpTrader be the gateway: it streams quotes to you and routes your orders through its broker and exchange connectors. |
In your own terminal
BjfChart charting libraryA single DLL that gives your .NET application professional candlestick charts, indicators, drawing tools, a trading panel and an order book, with live tick feed. |
The coding module turns SharpTrader into a development environment for automated strategies. A bot is a C# class that inherits from the platform’s base Bot class and reacts to events: initialization, every incoming tick, position opened, position closed and order status updates. The platform compiles it, shows your inputs in the interface, and runs it on live or demo accounts side by side with the built-in arbitrage, news and impulse strategies.
| Area | What you can do |
|---|---|
| Market data | Bid, ask, spread and point value per symbol and per session, through the ticker object. A session is one connected broker or exchange account, so a single bot can watch and trade several counterparties at once by session index. |
| Orders and positions | sendOrder for market execution, modifyPositionByID for stop-loss and take-profit, closePositionByID, lookups by ID or by comment, and live lists of opened, closed and pending orders. |
| Position details | Each position carries open and close prices and times, volume, side, session, profit, comment, stop-loss, take-profit, and the measured slippage and execution time for both legs. That last part is what lets a bot adapt to how a broker actually fills you. |
| Indicators | Built-in indicator functions such as EMA and MACD on any timeframe, continuously extended with platform updates. |
| Inputs and logging | Public properties marked with [PropertyInfo] appear as editable inputs in the interface; writeLog writes to the platform log; stopBot halts the strategy from code. |
| Account state | Balance and equity per session for risk rules and position sizing. |
// Illustrative skeleton. Names follow the SharpTrader coding library reference. using SharpTraderBot; public class SpreadGuardBot : Bot { [PropertyInfo(0.10, "Lot size")] public double Lots { get; set; } [PropertyInfo(20, "Max spread, points")] public int MaxSpreadPoints { get; set; } string _inFlight; // one order in flight per tick public virtual void OnInit() { writeLog("SpreadGuardBot started"); } public virtual void OnTick(NewTickEventArgs args) { int session = 0; // session index = broker account string symbol = args.tick.symbol; double point = ticker.getPointValue(session, symbol); double spread = (ticker.getAsk(session, symbol) - ticker.getBid(session, symbol)) / point; if (spread > MaxSpreadPoints || _inFlight != null) return; _inFlight = sendOrder(session, symbol, Lots, OrderSide.BUY, OrderType.MARKET, 0, "spread-guard"); } }
foreach loops instead of Where, Select or Any. Prices from the API are in broker points; multiply by the point value before comparing with your own thresholds. And keep one order in flight per tick, guarded by the returned client order ID, unless you enjoy debugging duplicate fills.Full class, method and event reference: SharpTrader coding library documentation. The coding module is an add-on to SharpTrader Pro; see the SharpTrader Pro page for the current bundle.
Not everything belongs inside the platform. If you already run a signal engine, a risk manager, a custom front end or a research pipeline, EasyFIX lets it talk to SharpTrader over a simplified FIX protocol. SharpTrader becomes your execution gateway: it holds the connections to brokers and exchanges, you send orders and receive quotes and fills from your own code, in whatever language you prefer.
What EasyFIX carries
|
Typical integrations
|
EasyFIX is a modified FIX dialect: it keeps the message model developers already know while dropping the ceremony that a retail-to-gateway link does not need. The specification, sample sessions and a test connection are available to SharpTrader Pro and Lite users on request. Write to support@bjftradinggroup.com with a short description of what you plan to connect.
In 2026 we rebuilt charting in SharpTrader from scratch, and the engine behind it is available to developers as a standalone library. BjfChart is a GPU-accelerated candlestick charting control for WinForms built on SkiaSharp. It renders tens of thousands of bars at 60 frames per second, and it ships as a single BjfChart.dll that targets both net48 and net8.0-windows, so it drops into legacy .NET Framework terminals and new .NET 8 applications alike.
Video: SharpTrader Charting, new charting library and manual trading walkthrough
Eight timeframes, indicators, Fibonacci and trend tools, an order ticket with draggable stop-loss and take-profit lines, and multi-broker charts, shown live inside SharpTrader. Open on YouTube
Chart engine
|
Trading layer
|
| Group | Included |
|---|---|
| Overlay indicators | SMA, EMA, WMA, VWAP, Bollinger Bands, Keltner Channels, Donchian Channels, Envelope, Parabolic SAR. |
| Sub-panel indicators | RSI, MACD with histogram, Stochastic, ATR, CCI, ADX / DMI, Momentum, Rate of Change, Williams %R, Awesome Oscillator, Standard Deviation, On-Balance Volume, Money Flow Index. |
| Accuracy | Indicator math is cross-checked against independent reference implementations: SMA, EMA, Bollinger, RSI, ATR, Stochastic and CCI match to 1e-9; MACD, ADX, DI, Williams %R, MFI and OBV are validated for correctness and range. |
| Drawing tools | Trend line, ray, extended line, horizontal line and ray, vertical line, arrow, parallel channel, rectangle, ellipse, Fibonacci retracement, Fibonacci extension, and a measure tool showing price delta, percent change and bar count. All anchored in data space, so they stay pinned through zoom and pan. |
| Extensibility | Implement IIndicator (or subclass IndicatorBase), return one or more series aligned to the candle list, choose overlay or sub-panel, line, histogram or dots, and register it to appear in the right-click menu and in saved layouts. |
using BjfChart;
using BjfChart.Indicators;
using BjfChart.Models;
var chart = new ChartControl { Dock = DockStyle.Fill };
form.Controls.Add(chart);
chart.SetData(myCandles); // IEnumerable<Candle>
chart.AddIndicator("ema");
chart.AddIndicator("bb");
chart.AddIndicator("macd"); // draws in its own sub-panel
chart.AddIndicator(new RsiIndicator(21)); // or by type, with custom parameters
chart.CandleInterval = TimeSpan.FromMinutes(15); // enables auto-bucketing
chart.FeedTick(DateTime.UtcNow, price, volume); // rolls a new candle at each boundary
chart.StartDrawing(DrawingKind.FibRetracement); // next drag draws a fib retracement
chart.SaveLayout(@"C:\layouts\eurusd.json");
// Trading panel wired to your execution layer
var panel = new TradingPanel { Dock = DockStyle.Right, Symbol = "EURUSD" };
panel.AttachChart(chart); // draws entry / SL / TP lines on the chart
panel.OrderSubmitted += (s, req) => myExecutionEngine.Send(req);
panel.PositionModified += (s, pos) => broker.Modify(pos); // after a drag of SL or TP
Everything in the code is also reachable from the right-click menu on the chart: add or remove indicators, pick a drawing tool, manage overlays, switch theme, save or load a layout. The library requires Windows and the .NET SDK 8.0 or later to build; NuGet restores SkiaSharp automatically. A runnable demo application with simulated live ticks is included.
All developer questions go to the same team that builds the platform. For bot API and EasyFIX questions, include your SharpTrader version and account type; for BjfChart, include your .NET target and data feed.
| Emailsupport@bjftradinggroup.comBest for code samples, specs and licensing | Phone+1 (905) 599-5507Monday to Friday, 9:00 to 18:00 Eastern Time (Toronto) | Telegramt.me/bjftradinggroupQuick questions and follow-ups |
BJF Trading Group Inc., 3397 Mistwell Crescent, Oakville, ON, L6L 0A2, Canada. General inquiries: contact page.
New articles, research papers, and product releases, delivered when we publish them.
A bot for a specific broker quirk, an external engine that needs an execution gateway, or a terminal that needs charts by Friday. One email with the details, one reply with the next step.
BJF Trading Group Inc. develops software tools for experienced traders and developers. We are not a broker, financial institution or investment advisor, and we do not execute trades or manage funds. Code samples on this page are illustrative and may differ from the current library reference; always check the documentation for your platform version. Trading in forex, CFDs and cryptocurrencies carries a high risk of loss and is not suitable for all investors. Nothing on this page is financial advice or a promise of profit.