2025-12-18 13:51:06 -08:00
# Integration Guides
QuanTAlib is designed to be platform-agnostic. It can be integrated into any .NET environment.
## Quantower
Quantower allows custom indicators via C#.
2025-12-21 14:37:44 -08:00
1. **Reference the DLL** :
2025-12-18 13:51:06 -08:00
- Build QuanTAlib or download the NuGet package.
- In your Quantower indicator project, add a reference to `QuanTAlib.dll` .
2025-12-21 14:37:44 -08:00
2. **Wrapper Class** :
2025-12-18 13:51:06 -08:00
- Create a class that inherits from `Indicator` .
- Instantiate the QuanTAlib indicator in `OnInit` .
- Call `Update` in `OnUpdate` .
```csharp
using Quantower.API.Indicators ;
using QuanTAlib ;
public class MySmaIndicator : Indicator
{
private Sma _sma ;
[InputParameter("Period", 10, 1000, 1, 0)]
public int Period = 14 ;
public override void OnInit ()
{
_sma = new Sma ( Period );
AddLineSeries ( "SMA" , Color . Yellow , LineStyle . Solid , 2 );
}
public override void OnUpdate ( UpdateArgs args )
{
// Get price from Quantower
double price = ClosePrice ;
// Update QuanTAlib
2025-12-21 14:37:44 -08:00
// Note: Quantower handles bar updates, so a check is performed to determine whether this is a new bar or an update
2025-12-18 13:51:06 -08:00
bool isNew = args . Reason == UpdateReason . NewBar ;
var result = _sma . Update ( new TValue ( DateTime . UtcNow , price ), isNew );
// Set value to Quantower series
SetValue ( result . Value );
}
}
```
## NinjaTrader 8
NinjaTrader 8 uses .NET Framework 4.8, but can interop with .NET Standard libraries.
2025-12-21 14:37:44 -08:00
1. **Copy DLL** : Place `QuanTAlib.dll` in `Documents\NinjaTrader 8\bin\Custom` .
2. **Add Reference** : In NinjaScript Editor, right-click > References > Add `QuanTAlib.dll` .
2025-12-18 13:51:06 -08:00
```csharp
protected override void OnStateChange ()
{
if ( State == State . SetDefaults )
{
Name = "QuanTAlib SMA" ;
// ...
}
else if ( State == State . DataLoaded )
{
_sma = new QuanTAlib . Sma ( Period );
}
}
protected override void OnBarUpdate ()
{
// NinjaTrader calls OnBarUpdate for every tick (if Calculate = OnEachTick)
// or once per bar (if Calculate = OnBarClose)
bool isNew = IsFirstTickOfBar ; // Logic depends on Calculate mode
var result = _sma . Update ( new TValue ( Time [ 0 ], Close [ 0 ]), isNew );
Value [ 0 ] = result . Value ;
}
```
## QuantConnect (LEAN)
LEAN supports custom libraries.
2025-12-21 14:37:44 -08:00
1. **NuGet** : Add `QuanTAlib` to your `config.json` or project file.
2. **Usage** : Use inside `OnData` .
2025-12-18 13:51:06 -08:00
```csharp
public class MyAlgorithm : QCAlgorithm
{
private Sma _mySma ;
public override void Initialize ()
{
_mySma = new Sma ( 14 );
}
public override void OnData ( Slice data )
{
if ( data . Bars . ContainsKey ( "SPY" ))
{
var bar = data . Bars [ "SPY" ];
var result = _mySma . Update ( new TValue ( bar . EndTime , ( double ) bar . Close ));
if ( _mySma . IsHot )
{
Plot ( "Indicators" , "SMA" , result . Value );
}
}
}
}
```
## Custom Platform Integration
For proprietary trading engines, the **Streaming Mode** is usually the best fit.
### Key Considerations
2025-12-21 14:37:44 -08:00
1. **Time Handling** : QuanTAlib uses `DateTime.UtcNow` . Ensure your platform provides UTC timestamps or convert them.
2. **Double Precision** : All calculations use `double` . If your platform uses `decimal` , cast to `double` for input and back to `decimal` for output.
3. **State Management** : Persist the indicator instance for the lifetime of the symbol/strategy. Do not recreate the indicator on every tick.
4. **Concurrency** : `Update` is not thread-safe for the same instance. If processing multiple symbols in parallel, use separate indicator instances for each symbol.