9df217d868
Downstream-consumer corpus for the #295 library surface: a standalone workspace (path-deps, no aura-cli in the link graph — cargo tree verified) exercising the four cycle axes as a World program would, public interface only: a DefaultMemberRunner member run over real GER40, a hand-authored campaign document through aura_campaign::execute, the IC + registry deflation dispatch as library calls, and load_family/reproduce round-trips. Run transcripts committed beside the sources. Findings routed separately: the family-id mismatch between the registry enumeration and the reproduce keying (list-then-reproduce dead-ends) to debug; the reproduce-API friction (no report on the simple path; DataSource/pip re-specification the manifest already holds, wrong pip silently DIVERGED) to a follow-up. Four working confirmations, chief among them the cycle's acceptance claim: all four axes compiled first-try from the public docs alone. refs #295
59 lines
2.3 KiB
Rust
59 lines
2.3 KiB
Rust
//! Axis 1 — a single member backtest driven through `DefaultMemberRunner`, the
|
|
//! shipped `aura_campaign::MemberRunner` implementor, over a shipped example
|
|
//! blueprint (r_sma) and real GER40 archive data. No `aura` binary involved;
|
|
//! this program links the library crates only (see Cargo.toml).
|
|
use std::collections::BTreeMap;
|
|
|
|
use aura_campaign::{CellSpec, MemberRunner};
|
|
use aura_ingest::default_data_server;
|
|
use aura_runner::{DefaultMemberRunner, Env};
|
|
|
|
const SYMBOL: &str = "GER40";
|
|
// September 2024, inclusive epoch-ms — the window the shipped ger40 examples use.
|
|
const WINDOW_MS: (i64, i64) = (1_725_148_800_000, 1_727_740_799_999);
|
|
|
|
fn main() {
|
|
let server = default_data_server();
|
|
if !server.has_symbol(SYMBOL) {
|
|
println!("skip: no local {SYMBOL} archive — nothing to demonstrate.");
|
|
return;
|
|
}
|
|
|
|
let blueprint_json = std::fs::read_to_string(concat!(
|
|
env!("CARGO_MANIFEST_DIR"),
|
|
"/../../crates/aura-cli/examples/r_sma.json"
|
|
))
|
|
.expect("shipped example blueprint r_sma.json");
|
|
|
|
let env = Env::std();
|
|
let runner = DefaultMemberRunner::new(&env, server, BTreeMap::new(), Vec::new());
|
|
|
|
let cell = CellSpec {
|
|
strategy_ordinal: 0,
|
|
strategy_id: aura_research::content_id_of(&blueprint_json),
|
|
blueprint_json,
|
|
axes: BTreeMap::new(),
|
|
instrument: SYMBOL.to_string(),
|
|
window_ms: WINDOW_MS,
|
|
regime: None,
|
|
regime_ordinal: 0,
|
|
};
|
|
|
|
println!("running member: strategy_id={} instrument={SYMBOL}", cell.strategy_id);
|
|
match runner.run_member(&cell, &[], WINDOW_MS) {
|
|
Ok(report) => {
|
|
let m = &report.metrics;
|
|
println!("member ran OK. metrics:");
|
|
println!(" total_pips={:.2} max_drawdown={:.4} bias_sign_flips={}", m.total_pips, m.max_drawdown, m.bias_sign_flips);
|
|
match &m.r {
|
|
Some(r) => println!(
|
|
" R: n_trades={} expectancy_r={:.4} win_rate={:.3} sqn={:.3} sqn_normalized={:.3} net_expectancy_r={:.4}",
|
|
r.n_trades, r.expectancy_r, r.win_rate, r.sqn, r.sqn_normalized, r.net_expectancy_r
|
|
),
|
|
None => println!(" R: (none)"),
|
|
}
|
|
}
|
|
Err(fault) => println!("member fault (data-dependent): {fault:?}"),
|
|
}
|
|
}
|