91f6f67257
The first language stecker on the C ABI hub: a .NET binding exposing all 514 indicators as idiomatic `IDisposable` classes, generated from `wickra.h`. ## What's here - **`bindings/csharp/`** — the `Wickra` .NET 8 package. `[LibraryImport]` source-generated P/Invoke (`NativeMethods.g.cs`) plus idiomatic wrappers (`Indicators.g.cs`), both generated from the committed `bindings/c/include/wickra.h`. The binding owns no indicator maths — it only marshals types across the C ABI. - **Marshalling, verified end-to-end against the native library.** Opaque handles cross as `nint` kept alive per call via a `SafeHandle`; `bool` as `[MarshalAs(U1)]` (Rust `bool` is one byte); a self-correcting `DllImportResolver` validates the loaded library actually exports the Wickra ABI. Tests cover one representative per FFI archetype (scalar, candle, pairwise, multi-output, bars, profile, values-profile, order-book / array-input) plus exact Sma reference values. - **NuGet packaging** — `dotnet pack` produces `Wickra.<version>.nupkg`; the release pipeline stages prebuilt native libraries under `runtimes/<rid>/native/` for six target triples (win/linux/osx × x64/arm64). - **`examples/csharp/`** — nine examples mirroring `examples/c/`: streaming, backtest, multi_timeframe, parallel_assets, three strategies, and fetch_btcusdt + live_binance. - **CI** — a `csharp` job on the three OSes builds the C ABI, tests the binding, and runs the offline examples. **Release** — a gated `csharp-publish` job packs and pushes to NuGet (gated on `NUGET_API_KEY`, independent of the GitHub-release job so a C# hiccup never blocks the C/C++ asset release). - **Docs consistency wave** — README, CONTRIBUTING, CHANGELOG, examples/README, the issue / PR templates, `sync-about.yml`, and `.gitattributes`. The native Python / Node / WASM bindings and the C ABI are untouched; this is additive. Publishing to NuGet stays gated behind the release tag and the secret.
Wickra examples — C# / .NET
Runnable .NET examples for the Wickra .NET binding.
Each example is a small console project that references the Wickra project and
resolves the native library automatically (from target/release during local
development, or the NuGet runtimes/ layout when packaged).
Build the native library first, then run any example:
cargo build -p wickra-c --release
dotnet run --project examples/csharp/streaming
| Example | What it does | Run |
|---|---|---|
streaming |
Feed a synthetic price series through SMA / EMA / RSI / MACD tick by tick. | dotnet run --project examples/csharp/streaming |
backtest |
Compute a basket of indicators over an OHLCV series and print a summary. | dotnet run --project examples/csharp/backtest -- <ohlcv.csv> |
multi_timeframe |
Resample a 1-minute series into 5m / 15m and print an indicator per timeframe. | dotnet run --project examples/csharp/multi_timeframe |
parallel_assets |
SMA(20) batch over a panel of assets, serial vs Parallel.For, with speedup. |
dotnet run -c Release --project examples/csharp/parallel_assets -- 200 5000 |
strategy_rsi_mean_reversion |
RSI(14) mean-reversion with a PnL / Sharpe / max-DD summary. | dotnet run -c Release --project examples/csharp/strategy_rsi_mean_reversion |
strategy_macd_adx |
MACD crossover entries gated by ADX(14) > 20. | dotnet run -c Release --project examples/csharp/strategy_macd_adx |
strategy_bollinger_squeeze |
Bollinger-squeeze breakout with an ATR(14) trailing stop. | dotnet run -c Release --project examples/csharp/strategy_bollinger_squeeze |
fetch_btcusdt |
Download real BTCUSDT klines from the Binance REST API into a CSV. | dotnet run --project examples/csharp/fetch_btcusdt |
live_binance |
Stream live Binance klines through EMA(20) over a WebSocket. | dotnet run --project examples/csharp/live_binance |
fetch_btcusdt and live_binance require network access; the rest run offline
on deterministic synthetic data. Shared helpers (synthetic data, CSV loader,
equity summary) live in _common/.