This commit is contained in:
2026-03-31 15:46:31 +02:00
parent d2549c7ab9
commit 6a563bf6fd
3 changed files with 34 additions and 31 deletions
+2 -6
View File
@@ -1,20 +1,16 @@
cmake_minimum_required(VERSION 3.16)
project(backtest CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
endif()
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -march=native -DNDEBUG")
set(CMAKE_CXX_FLAGS_DEBUG "-g -Wall -Wextra -Wpedantic -fsanitize=address,undefined")
include_directories(core/include)
add_executable(backtest core/src/main.cpp)
find_package(yaml-cpp REQUIRED)
target_link_libraries(backtest PRIVATE yaml-cpp)
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 9)
target_link_libraries(backtest stdc++fs)
endif()
+27 -12
View File
@@ -20,6 +20,8 @@
#include <queue>
#include <sstream>
#include <filesystem>
#include <cstdlib>
#include <yaml-cpp/yaml.h>
#include "events.hpp"
#include "data_handler.hpp"
@@ -40,16 +42,31 @@ static std::vector<std::string> split(const std::string& s, char delim) {
return out;
}
static std::string config_path() {
const char* xdg = std::getenv("XDG_CONFIG_HOME");
std::string base = xdg ? xdg : (std::string(std::getenv("HOME")) + "/.config");
return base + "/backtest/config.yml";
}
// ── Main ──────────────────────────────────────────────────────────────────────
int main(int argc, char* argv[]) {
// defaults
std::string data_dir = "data";
std::string sym_str = "AAPL";
int fast = 20;
int slow = 50;
double capital = 100'000.0;
std::string data_dir = "data";
std::string results_dir = "results";
std::string sym_str = "AAPL";
int fast = 20;
int slow = 50;
double capital = 100'000.0;
// ── Load config ───────────────────────────────────────────────────────────
try {
YAML::Node cfg = YAML::LoadFile(config_path());
if (cfg["data_dir"]) data_dir = cfg["data_dir"].as<std::string>();
if (cfg["results_dir"]) results_dir = cfg["results_dir"].as<std::string>();
} catch (...) {}
// CLI overrides
if (argc > 1) data_dir = argv[1];
if (argc > 2) sym_str = argv[2];
if (argc > 3) fast = std::stoi(argv[3]);
@@ -104,14 +121,12 @@ int main(int argc, char* argv[]) {
auto report = compute_performance(eq, capital);
print_report(report);
// Export for Python visualizer
std::filesystem::create_directories("results");
export_equity_csv(eq, "results/equity.csv");
export_trades_csv(strategy.trade_log(), "results/trades.csv");
export_perf_csv (report, "results/performance.csv");
std::filesystem::create_directories(results_dir);
export_equity_csv(eq, results_dir + "/equity.csv");
export_trades_csv(strategy.trade_log(), results_dir + "/trades.csv");
export_perf_csv (report, results_dir + "/performance.csv");
std::printf("\nResults exported to results/\n");
std::printf("Run: python visualize.py\n");
std::printf("\nResults exported to %s/\n", results_dir.c_str());
return 0;
}
+5 -13
View File
@@ -11,7 +11,6 @@
pyproject-build-systems.inputs.pyproject-nix.follows = "pyproject-nix";
pyproject-build-systems.inputs.nixpkgs.follows = "nixpkgs";
};
outputs = {
self,
nixpkgs,
@@ -24,17 +23,14 @@
pkgs = nixpkgs.legacyPackages.${system};
lib = nixpkgs.lib;
python = pkgs.python312;
workspace = uv2nix.lib.workspace.loadWorkspace {workspaceRoot = ./.;};
overlay = workspace.mkPyprojectOverlay {sourcePreference = "wheel";};
pythonSet = (pkgs.callPackage pyproject-nix.build.packages {inherit python;}).overrideScope (
lib.composeManyExtensions [
pyproject-build-systems.overlays.default
overlay
]
);
venv = pythonSet.mkVirtualEnv "backtest-env" workspace.deps.default;
in {
packages.default = pkgs.stdenv.mkDerivation {
@@ -42,20 +38,16 @@
version = "0.1.0";
src = ./.;
dontConfigure = true;
nativeBuildInputs = [ pkgs.cmake pkgs.gcc ];
buildInputs = [ venv ];
nativeBuildInputs = [pkgs.cmake pkgs.gcc];
buildInputs = [venv pkgs.yaml-cpp];
buildPhase = ''
cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j4
cmake -B build -S . -DCMAKE_BUILD_TYPE=Release
cmake --build build -j4
'';
installPhase = ''
mkdir -p $out/bin $out/lib
cp -r . $out/lib/
cp build/backtest $out/bin/backtest-cpp # le binaire C++
cp build/backtest $out/bin/backtest-cpp
cat > $out/bin/backtest << EOF
#!/bin/sh
export PATH="${venv}/bin:\$PATH"