Files
QuanTAlib/docs/integration.md
T
Miha Kralj a7b7207801 Refactor documentation to remove "Zero-Allocation Design" sections across various trend indicators and implement a PowerShell script for automated cleanup
- Updated mathematical foundations and performance profiles where necessary to maintain clarity and coherence.
2025-12-21 14:37:44 -08:00

127 lines
3.6 KiB
Markdown

# Integration Guides
QuanTAlib is designed to be platform-agnostic. It can be integrated into any .NET environment.
## Quantower
Quantower allows custom indicators via C#.
1. **Reference the DLL**:
- Build QuanTAlib or download the NuGet package.
- In your Quantower indicator project, add a reference to `QuanTAlib.dll`.
2. **Wrapper Class**:
- 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
// Note: Quantower handles bar updates, so a check is performed to determine whether this is a new bar or an update
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.
1. **Copy DLL**: Place `QuanTAlib.dll` in `Documents\NinjaTrader 8\bin\Custom`.
2. **Add Reference**: In NinjaScript Editor, right-click > References > Add `QuanTAlib.dll`.
```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.
1. **NuGet**: Add `QuanTAlib` to your `config.json` or project file.
2. **Usage**: Use inside `OnData`.
```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
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.