WU Trading Library 0.2.0
A backtesting and trading strategy library
Loading...
Searching...
No Matches
runners.h
Go to the documentation of this file.
1#ifndef WU_RUNNER_H
2#define WU_RUNNER_H
3
4#include "portfolios.h"
5#include "strategies.h"
6#include "readers.h"
7
8/**
9 * WU_Runner is a backtest runner that processes data from multiple readers,
10 * updates a strategy, and executes trades in a portfolio.
11 *
12 * Key features:
13 * - Supports both single-input and multi-input strategies
14 * - Validates reader count matches strategy input requirements
15 * - Validates and converts data types automatically (e.g., Candle → Single)
16 * - Synchronizes data from multiple readers sequentially (lockstep)
17 * - No fixed limits on number of inputs (heap-allocated)
18 *
19 * Usage:
20 * // Single-input strategy (e.g., crossover on SPY)
21 * WU_Reader readers[] = {spy_reader};
22 * WU_Runner runner = wu_runner_new(portfolio, strategy, readers);
23 *
24 * // Multi-input strategy (e.g., pairs trading on SPY/QQQ)
25 * WU_Reader readers[] = {spy_reader, qqq_reader};
26 * WU_Runner runner = wu_runner_new(portfolio, strategy, readers);
27 *
28 * wu_runner_exec(runner, verbose);
29 * wu_runner_free(runner);
30 */
31
32typedef struct WU_Runner_ {
33 WU_Portfolio portfolio;
34 WU_Strategy strategy;
35 WU_Reader* readers;
37 void (*run)(struct WU_Runner_* runner, bool verbose);
38}* WU_Runner;
39
40#define wu_runner_exec(runner, verbose) ((runner)->run((runner), (verbose)))
41
42/**
43 * Creates a new runner with multiple readers.
44 *
45 * @param portfolio The portfolio to execute trades in
46 * @param strategy The strategy to generate signals
47 * @param readers Array of readers (one per strategy input)
48 * @return New runner instance, or NULL on validation failure
49 *
50 * Validation performed:
51 * - Number of readers determined from strategy->num_inputs
52 * - Each reader's data type must be compatible with strategy's input_types
53 *
54 * Memory is dynamically allocated based on strategy input requirements.
55 */
56WU_Runner wu_runner_new(
57 WU_Portfolio portfolio,
58 WU_Strategy strategy,
59 WU_Reader readers[]
60);
61
62/**
63 * Convenience function for single-input strategies.
64 * Equivalent to wu_runner_new(portfolio, strategy, &reader, 1).
65 */
66static inline WU_Runner wu_runner_new_single(
67 WU_Portfolio portfolio,
68 WU_Strategy strategy,
69 WU_Reader reader
70) {
71 return wu_runner_new(portfolio, strategy, &reader);
72}
73
74void wu_runner_free(WU_Runner runner);
75
76#endif // WU_RUNNER_H
void wu_runner_free(WU_Runner runner)
Definition runner.c:137
static WU_Runner wu_runner_new_single(WU_Portfolio portfolio, WU_Strategy strategy, WU_Reader reader)
Convenience function for single-input strategies.
Definition runners.h:66
WU_Runner wu_runner_new(WU_Portfolio portfolio, WU_Strategy strategy, WU_Reader readers[])
Creates a new runner with multiple readers.
Definition runner.c:95
WU_Runner is a backtest runner that processes data from multiple readers, updates a strategy,...
Definition runners.h:32
int num_readers
Definition runners.h:36
void(* run)(struct WU_Runner_ *runner, bool verbose)
Definition runners.h:37
WU_Portfolio portfolio
Definition runners.h:33
WU_Strategy strategy
Definition runners.h:34
WU_Reader * readers
Definition runners.h:35