diff --git a/CMakeLists.txt b/CMakeLists.txt index ae838bc..bfbdcd3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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() diff --git a/core/src/main.cpp b/core/src/main.cpp index d04dfb7..c4640c6 100644 --- a/core/src/main.cpp +++ b/core/src/main.cpp @@ -20,6 +20,8 @@ #include #include #include +#include +#include #include "events.hpp" #include "data_handler.hpp" @@ -40,16 +42,31 @@ static std::vector 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(); + if (cfg["results_dir"]) results_dir = cfg["results_dir"].as(); + } 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; } diff --git a/flake.nix b/flake.nix index d7e3503..976177b 100644 --- a/flake.nix +++ b/flake.nix @@ -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"