mirror of
https://github.com/mihakralj/QuanTAlib.git
synced 2026-08-01 19:27:44 +00:00
a7b7207801
- Updated mathematical foundations and performance profiles where necessary to maintain clarity and coherence.
127 lines
3.6 KiB
Markdown
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.
|