The ATAS developer API lets you add your own code to the platform in several places. Every kind of extension is an ordinary .NET class library that references the platform assemblies (ATAS.Indicators.dll and, depending on the kind, ATAS.Strategies.dll, OFT.Rendering.dll, ATAS.DataFeedsCore.dll) with <Private>false</Private>. The same DLL runs in the classic ATAS and in ATAS X, as long as it does not use WPF types (see «Developing indicators for ATAS X»).
| Extension | What it is | Base type / marker | Article |
|---|---|---|---|
| Chart indicator | Calculates and draws on a chart from bars, trades and the order book | Indicator | Development of a user indicator and the following articles |
| Strategy | An indicator that also trades | ChartStrategy | Strategies |
| Heatmap indicator | Draws on top of the Heatmap module from trades, profiles and MBO data | HeatmapIndicator<TSettings>, [HeatmapIndicator] | Heatmap indicators |
| SmartDOM column | A column of the SmartDOM that draws its cells | SmartDomColumn, [SmartDomColumn] | SmartDOM columns |
| Watchlist column | A column of the Watchlist: one value per instrument | WatchlistColumn, [WatchlistColumn] | Watchlist columns |
| Custom module | A panel (ATAS) / widget (ATAS X) whose whole area your code draws | PlatformModule, [PlatformModule] | Custom modules |
| Connector | A data feed: instruments, trades, order book of an external source | BaseConnector<…> + BaseConnectorSettings<…> | Connectors |
Heatmap indicators, columns and modules are identified by a stable id in the attribute (<vendor>.<name>, the vendor atas is reserved): the platform saves them in workspaces and templates under that id, so you can rename classes and namespaces freely, and a workspace keeps them — with their settings — while the DLL is missing.
A single assembly may contain any number of chart indicators, heatmap indicators, SmartDOM columns, Watchlist columns and custom modules: the platform scans every loaded assembly for all of these kinds, so related tools (for example an indicator, the matching SmartDOM column and a dashboard module) can share code and ship as one file.
Connectors are the exception: they are loaded from a different folder, once at start-up, and cannot be unloaded while the platform runs. Ship a connector as a separate DLL that contains nothing else.
| Kind | Folder (classic ATAS / ATAS X) | Reload |
|---|---|---|
| Chart indicators, heatmap indicators, SmartDOM and Watchlist columns, custom modules | Extensions or Indicators in AppData%\ATAS / in AppData%\ATAS X | without a restart, see «Reloading a library» below |
| Strategies | AppData%\ATAS\Strategies (see «Strategies») | see «Strategies» |
| Connectors | AppData%\ATAS\CustomConnectors / AppData%\ATAS X\CustomConnectors | at start-up only: replacing the DLL needs a restart |
The Extensions and Indicators folders are equal: the platform creates both, reads both with one loader, and a DLL works the same in either of them. Indicators is the historical name; Extensions is there for libraries that are not (only) chart indicators. On macOS the folders are ~/Library/Application Support/ATAS/Extensions and ~/Library/Application Support/ATAS/Indicators (and ~/Library/Application Support/ATAS/CustomConnectors for connectors). Keep one copy of an assembly: when the same assembly is in both folders, the platform loads the copy with the higher assembly version and reports the other one as skipped.
Indicators, strategies and everything else in these folders can also be distributed through the marketplace (see below); the marketplace and the Add custom indicator button of the indicators window install a DLL into the Indicators folder.
The platform watches both folders, so a new or replaced DLL is loaded while the platform runs:
extensions_reload and reads the result with extensions_get_state, in both platforms.Open charts take their indicators again from the new build, and open custom modules, columns and heatmap indicators are created again from it and keep their settings.
A reload is reported per file, in the message shown to the user, in the platform log and in extensions_get_state:
The same report is written to the log when the platform starts.
Some parts of the developer API can be restricted by the user's tariff: market-by-order data, options data, heatmap indicators, SmartDOM and Watchlist columns, custom modules and connectors from your own assemblies. The restrictions apply to third-party code only and are checked while the platform runs, so they can change after the user logs on with another account; a restricted extension stays listed (the user sees the tariff banner when trying to use it) and keeps its saved settings. What your code observes in each case is described in Developer API and tariffs — design your extensions to keep working, with less data, when a part of the API is unavailable.
You can give other ATAS users access to your DLL through the Personal Area: upload it, choose who gets access and for how long, and turn access off at any time — the steps are described in Indicators and strategies distribution. The platform installs such a DLL into the Indicators folder, so the heatmap indicators, columns and modules it contains are delivered together with its indicators. Access is checked per class through the [FeatureId] attribute (namespace OFT.Attributes) for chart indicators, strategies, heatmap indicators, SmartDOM and Watchlist columns and custom modules: a marked class is offered only to accounts that have the feature, and a saved instance of it in the layout of an account without the feature stays inert («Not available») and is not created. Heatmap indicators are an exception to the last point: when the platform loads a DLL, it runs the static constructor of every heatmap indicator class and creates one instance of it to read its descriptor, whatever the account — keep their constructors free of side effects. Selling through the ATAS marketplace follows the same path; contact ATAS for the current terms.
Connectors cannot be distributed this way: the Personal Area and the marketplace install DLLs into the Indicators folder, while connectors are loaded only from the CustomConnectors folder. A connector DLL is put into that folder by the user (see Connectors).
[Display].