Initial backtesting engine

This commit is contained in:
porcelaincode
2026-01-28 06:30:03 +05:30
commit f6c60d7b8b
53 changed files with 13632 additions and 0 deletions
+91
View File
@@ -0,0 +1,91 @@
//! Error types for RaptorBT.
use thiserror::Error;
/// Result type alias for RaptorBT operations.
pub type Result<T> = std::result::Result<T, RaptorError>;
/// Error types for the backtesting engine.
#[derive(Error, Debug)]
pub enum RaptorError {
/// Data length mismatch between arrays.
#[error("Data length mismatch: expected {expected}, got {actual}")]
LengthMismatch { expected: usize, actual: usize },
/// Invalid parameter value.
#[error("Invalid parameter: {message}")]
InvalidParameter { message: String },
/// Insufficient data for calculation.
#[error("Insufficient data: need at least {required} elements, got {available}")]
InsufficientData { required: usize, available: usize },
/// Invalid configuration.
#[error("Invalid configuration: {message}")]
InvalidConfig { message: String },
/// Division by zero error.
#[error("Division by zero in {context}")]
DivisionByZero { context: String },
/// Empty data error.
#[error("Empty data provided for {context}")]
EmptyData { context: String },
/// Invalid index access.
#[error("Index {index} out of bounds for length {length}")]
IndexOutOfBounds { index: usize, length: usize },
/// Python conversion error.
#[error("Python conversion error: {message}")]
PythonError { message: String },
}
impl RaptorError {
/// Create a length mismatch error.
pub fn length_mismatch(expected: usize, actual: usize) -> Self {
Self::LengthMismatch { expected, actual }
}
/// Create an invalid parameter error.
pub fn invalid_parameter(message: impl Into<String>) -> Self {
Self::InvalidParameter {
message: message.into(),
}
}
/// Create an insufficient data error.
pub fn insufficient_data(required: usize, available: usize) -> Self {
Self::InsufficientData {
required,
available,
}
}
/// Create an invalid config error.
pub fn invalid_config(message: impl Into<String>) -> Self {
Self::InvalidConfig {
message: message.into(),
}
}
/// Create a division by zero error.
pub fn division_by_zero(context: impl Into<String>) -> Self {
Self::DivisionByZero {
context: context.into(),
}
}
/// Create an empty data error.
pub fn empty_data(context: impl Into<String>) -> Self {
Self::EmptyData {
context: context.into(),
}
}
}
impl From<RaptorError> for pyo3::PyErr {
fn from(err: RaptorError) -> pyo3::PyErr {
pyo3::exceptions::PyValueError::new_err(err.to_string())
}
}