yml-cpp
This commit is contained in:
+2
-6
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user