ArbBot .NET
DRY-RUNC# port of cross-exchange arbitrage. .NET 8 Worker service, TAKER_TAKER inventory-neutral strategy across Bybit + Binance. Parity benchmarked against Python baseline.
Key Numbers
At a Glance
.NET 8
Runtime
Benchmarked
Parity
Bybit + Binance
Exchanges
systemd
Deployment
Overview
About This Project
A ground-up C# port of the cross-exchange arbitrage system, built on .NET 8 as a Worker service. The project demonstrates cross-language system translation -- taking a battle-tested Node.js production bot and reimplementing it in a strongly-typed, high-performance runtime while maintaining exact behavioral parity.
The system implements a TAKER_TAKER strategy across Bybit and Binance, with full WebSocket feed handling, order lifecycle management, and state persistence. Every component was parity-benchmarked against the Python/Node.js baseline to ensure identical behavior under the same market conditions.
Deployment uses systemd for process management with YAML-driven configuration, JSONL structured logging, and an observability layer that enables detailed post-trade analysis and debugging.
Features
What It Does
Cross-Language System Port
Complete reimplementation from Node.js/Python to C# .NET 8, preserving exact behavioral parity while leveraging strong typing and .NET's performance characteristics.
Observability Layer
Structured logging, metrics emission, and trace correlation enable detailed post-trade analysis and debugging across the full order lifecycle.
YAML Configuration
Declarative configuration for exchange credentials, strategy parameters, risk limits, and deployment settings with environment-specific overrides.
Parity Reporting
Automated comparison framework validates that the .NET implementation produces identical decisions to the baseline system under recorded market scenarios.
Architecture
How It Works
Challenges
What Made This Hard
Achieving exact behavioral parity across two fundamentally different language runtimes required meticulous attention to floating-point arithmetic, async timing behavior, and WebSocket reconnection semantics. The .NET ecosystem's different approach to async/await compared to Node.js event loops meant rethinking concurrency patterns while preserving the same logical execution order.
Stack