#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct Strategy {
#[prost(string, tag = "1")]
pub name: ::prost::alloc::string::String,
#[prost(string, tag = "2")]
pub label: ::prost::alloc::string::String,
#[prost(string, tag = "3")]
pub interval: ::prost::alloc::string::String,
#[prost(string, tag = "4")]
pub premise: ::prost::alloc::string::String,
#[prost(bool, tag = "5")]
pub ranks_a_set: bool,
#[prost(uint32, tag = "6")]
pub backtests: u32,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct Strategies {
#[prost(message, repeated, tag = "1")]
pub strategies: ::prost::alloc::vec::Vec<Strategy>,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct FindingSummary {
#[prost(string, tag = "1")]
pub id: ::prost::alloc::string::String,
#[prost(string, tag = "2")]
pub kind: ::prost::alloc::string::String,
#[prost(string, tag = "3")]
pub subject: ::prost::alloc::string::String,
#[prost(string, tag = "4")]
pub verdict: ::prost::alloc::string::String,
#[prost(string, tag = "5")]
pub recorded_at: ::prost::alloc::string::String,
#[prost(string, tag = "6")]
pub author: ::prost::alloc::string::String,
#[prost(string, tag = "7")]
pub strategy: ::prost::alloc::string::String,
#[prost(string, tag = "8")]
pub code_commit: ::prost::alloc::string::String,
#[prost(string, tag = "9")]
pub ruleset_hash: ::prost::alloc::string::String,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct Findings {
#[prost(message, repeated, tag = "1")]
pub findings: ::prost::alloc::vec::Vec<FindingSummary>,
#[prost(uint32, tag = "2")]
pub unreadable: u32,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct FindingId {
#[prost(string, tag = "1")]
pub id: ::prost::alloc::string::String,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct FindingIds {
#[prost(string, repeated, tag = "1")]
pub ids: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct Advice {
#[prost(string, tag = "1")]
pub severity: ::prost::alloc::string::String,
#[prost(string, tag = "2")]
pub finding: ::prost::alloc::string::String,
#[prost(string, tag = "3")]
pub action: ::prost::alloc::string::String,
#[prost(string, tag = "4")]
pub evidence: ::prost::alloc::string::String,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct Finding {
#[prost(message, optional, tag = "1")]
pub summary: ::core::option::Option<FindingSummary>,
#[prost(string, tag = "2")]
pub read_this_first: ::prost::alloc::string::String,
#[prost(string, repeated, tag = "3")]
pub reasons: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
#[prost(message, repeated, tag = "4")]
pub advice: ::prost::alloc::vec::Vec<Advice>,
#[prost(string, tag = "5")]
pub detail_json: ::prost::alloc::string::String,
#[prost(message, repeated, tag = "6")]
pub attachments: ::prost::alloc::vec::Vec<Attachment>,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct Attachment {
#[prost(string, tag = "1")]
pub name: ::prost::alloc::string::String,
#[prost(string, tag = "2")]
pub media_type: ::prost::alloc::string::String,
#[prost(string, tag = "3")]
pub hash: ::prost::alloc::string::String,
#[prost(uint64, tag = "4")]
pub bytes: u64,
#[prost(string, tag = "5")]
pub added_at: ::prost::alloc::string::String,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct AttachRequest {
#[prost(string, tag = "1")]
pub finding_id: ::prost::alloc::string::String,
#[prost(string, tag = "2")]
pub name: ::prost::alloc::string::String,
#[prost(string, tag = "3")]
pub media_type: ::prost::alloc::string::String,
#[prost(bytes = "vec", tag = "4")]
pub data: ::prost::alloc::vec::Vec<u8>,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct Attachments {
#[prost(message, repeated, tag = "1")]
pub attachments: ::prost::alloc::vec::Vec<Attachment>,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct AttachmentRef {
#[prost(string, tag = "1")]
pub finding_id: ::prost::alloc::string::String,
#[prost(string, tag = "2")]
pub hash: ::prost::alloc::string::String,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct RunRequest {
#[prost(string, tag = "1")]
pub instrument: ::prost::alloc::string::String,
#[prost(string, tag = "2")]
pub strategy: ::prost::alloc::string::String,
#[prost(string, tag = "3")]
pub author: ::prost::alloc::string::String,
#[prost(string, tag = "4")]
pub origin: ::prost::alloc::string::String,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct BarsRequest {
#[prost(string, tag = "1")]
pub instrument: ::prost::alloc::string::String,
#[prost(string, optional, tag = "2")]
pub interval: ::core::option::Option<::prost::alloc::string::String>,
#[prost(string, optional, tag = "3")]
pub from: ::core::option::Option<::prost::alloc::string::String>,
#[prost(string, optional, tag = "4")]
pub to: ::core::option::Option<::prost::alloc::string::String>,
#[prost(uint32, optional, tag = "5")]
pub last: ::core::option::Option<u32>,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct IndicatorRequest {
#[prost(message, optional, tag = "1")]
pub bars: ::core::option::Option<BarsRequest>,
#[prost(string, tag = "2")]
pub indicator: ::prost::alloc::string::String,
#[prost(map = "string, double", tag = "3")]
pub params: ::std::collections::HashMap<::prost::alloc::string::String, f64>,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct RankRequest {
#[prost(string, optional, tag = "1")]
pub rule: ::core::option::Option<::prost::alloc::string::String>,
#[prost(string, optional, tag = "2")]
pub instrument: ::core::option::Option<::prost::alloc::string::String>,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct ReviewRequest {
#[prost(string, optional, tag = "1")]
pub day: ::core::option::Option<::prost::alloc::string::String>,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct StudyRequest {
#[prost(string, tag = "1")]
pub instrument: ::prost::alloc::string::String,
#[prost(string, optional, tag = "2")]
pub strategy: ::core::option::Option<::prost::alloc::string::String>,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct BookRequest {
#[prost(string, repeated, tag = "1")]
pub instruments: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
#[prost(string, optional, tag = "2")]
pub strategy: ::core::option::Option<::prost::alloc::string::String>,
#[prost(uint32, optional, tag = "3")]
pub max_concurrent_positions: ::core::option::Option<u32>,
#[prost(uint32, optional, tag = "4")]
pub max_per_sector: ::core::option::Option<u32>,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct PanelRequest {
#[prost(string, tag = "1")]
pub universe: ::prost::alloc::string::String,
#[prost(string, optional, tag = "2")]
pub strategy: ::core::option::Option<::prost::alloc::string::String>,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct SharedExperiment {
#[prost(string, tag = "1")]
pub text: ::prost::alloc::string::String,
#[prost(string, tag = "2")]
pub instrument: ::prost::alloc::string::String,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct Point {
#[prost(string, tag = "1")]
pub at: ::prost::alloc::string::String,
#[prost(double, tag = "2")]
pub equity: f64,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct LedgerTrade {
#[prost(string, tag = "1")]
pub instrument: ::prost::alloc::string::String,
#[prost(string, tag = "2")]
pub opened: ::prost::alloc::string::String,
#[prost(string, tag = "3")]
pub closed: ::prost::alloc::string::String,
#[prost(string, tag = "4")]
pub direction: ::prost::alloc::string::String,
#[prost(double, tag = "5")]
pub quantity: f64,
#[prost(double, tag = "6")]
pub entry: f64,
#[prost(double, optional, tag = "7")]
pub exit: ::core::option::Option<f64>,
#[prost(double, tag = "8")]
pub pnl: f64,
#[prost(double, tag = "9")]
pub commission: f64,
#[prost(string, tag = "10")]
pub exit_reason: ::prost::alloc::string::String,
#[prost(string, optional, tag = "11")]
pub rule: ::core::option::Option<::prost::alloc::string::String>,
#[prost(double, optional, tag = "12")]
pub signal: ::core::option::Option<f64>,
#[prost(string, optional, tag = "13")]
pub regime: ::core::option::Option<::prost::alloc::string::String>,
#[prost(double, optional, tag = "14")]
pub asked: ::core::option::Option<f64>,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct ReportRequest {
#[prost(string, tag = "1")]
pub author: ::prost::alloc::string::String,
#[prost(string, tag = "2")]
pub origin: ::prost::alloc::string::String,
#[prost(string, tag = "3")]
pub hypothesis_id: ::prost::alloc::string::String,
#[prost(string, tag = "4")]
pub claim: ::prost::alloc::string::String,
#[prost(string, tag = "5")]
pub instrument: ::prost::alloc::string::String,
#[prost(string, tag = "6")]
pub from: ::prost::alloc::string::String,
#[prost(string, tag = "7")]
pub to: ::prost::alloc::string::String,
#[prost(string, tag = "8")]
pub interval: ::prost::alloc::string::String,
#[prost(string, tag = "9")]
pub dataset_id: ::prost::alloc::string::String,
#[prost(string, tag = "10")]
pub dataset_version: ::prost::alloc::string::String,
#[prost(string, tag = "11")]
pub adjustment: ::prost::alloc::string::String,
#[prost(string, tag = "12")]
pub strategy: ::prost::alloc::string::String,
#[prost(map = "string, double", tag = "13")]
pub params: ::std::collections::HashMap<::prost::alloc::string::String, f64>,
#[prost(double, tag = "14")]
pub commission_bps: f64,
#[prost(double, tag = "15")]
pub slippage_bps: f64,
#[prost(double, tag = "16")]
pub per_fill: f64,
#[prost(double, optional, tag = "17")]
pub stop_atr_multiple: ::core::option::Option<f64>,
#[prost(double, tag = "18")]
pub starting_cash: f64,
#[prost(string, tag = "19")]
pub engine: ::prost::alloc::string::String,
#[prost(message, repeated, tag = "20")]
pub strategy_curve: ::prost::alloc::vec::Vec<Point>,
#[prost(message, repeated, tag = "21")]
pub ledger: ::prost::alloc::vec::Vec<LedgerTrade>,
#[prost(message, repeated, tag = "22")]
pub benchmark_curve: ::prost::alloc::vec::Vec<Point>,
#[prost(uint32, optional, tag = "23")]
pub trials: ::core::option::Option<u32>,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct ReportFigure {
#[prost(string, tag = "1")]
pub finding_id: ::prost::alloc::string::String,
#[prost(string, optional, tag = "2")]
pub figure: ::core::option::Option<::prost::alloc::string::String>,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct TradeExport {
#[prost(string, tag = "1")]
pub name: ::prost::alloc::string::String,
#[prost(message, repeated, tag = "2")]
pub rows: ::prost::alloc::vec::Vec<TradeRow>,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct TradeRow {
#[prost(string, tag = "1")]
pub instrument: ::prost::alloc::string::String,
#[prost(string, tag = "2")]
pub opened: ::prost::alloc::string::String,
#[prost(string, tag = "3")]
pub closed: ::prost::alloc::string::String,
#[prost(string, tag = "4")]
pub direction: ::prost::alloc::string::String,
#[prost(double, tag = "5")]
pub quantity: f64,
#[prost(double, tag = "6")]
pub entry: f64,
#[prost(double, optional, tag = "7")]
pub exit: ::core::option::Option<f64>,
#[prost(double, tag = "8")]
pub pnl: f64,
#[prost(double, tag = "9")]
pub commission: f64,
#[prost(double, optional, tag = "10")]
pub held_days: ::core::option::Option<f64>,
#[prost(string, tag = "11")]
pub exit_reason: ::prost::alloc::string::String,
#[prost(string, optional, tag = "12")]
pub rule: ::core::option::Option<::prost::alloc::string::String>,
#[prost(double, optional, tag = "13")]
pub signal: ::core::option::Option<f64>,
#[prost(string, optional, tag = "14")]
pub regime: ::core::option::Option<::prost::alloc::string::String>,
#[prost(double, optional, tag = "15")]
pub asked: ::core::option::Option<f64>,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct Param {
#[prost(string, tag = "1")]
pub name: ::prost::alloc::string::String,
#[prost(double, repeated, tag = "2")]
pub values: ::prost::alloc::vec::Vec<f64>,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct Fixed {
#[prost(string, tag = "1")]
pub name: ::prost::alloc::string::String,
#[prost(double, tag = "2")]
pub value: f64,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct Ruleset {
#[prost(string, tag = "1")]
pub path: ::prost::alloc::string::String,
#[prost(string, tag = "2")]
pub name: ::prost::alloc::string::String,
#[prost(string, tag = "3")]
pub label: ::prost::alloc::string::String,
#[prost(string, tag = "4")]
pub rule: ::prost::alloc::string::String,
#[prost(string, tag = "5")]
pub interval: ::prost::alloc::string::String,
#[prost(uint32, tag = "6")]
pub searches: u32,
#[prost(string, optional, tag = "7")]
pub problem: ::core::option::Option<::prost::alloc::string::String>,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct Rulesets {
#[prost(message, repeated, tag = "1")]
pub rulesets: ::prost::alloc::vec::Vec<Ruleset>,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct RuleFile {
#[prost(string, tag = "1")]
pub path: ::prost::alloc::string::String,
#[prost(string, tag = "2")]
pub name: ::prost::alloc::string::String,
#[prost(string, tag = "3")]
pub label: ::prost::alloc::string::String,
#[prost(string, tag = "4")]
pub premise: ::prost::alloc::string::String,
#[prost(string, tag = "5")]
pub interval: ::prost::alloc::string::String,
#[prost(string, repeated, tag = "6")]
pub indicators: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
#[prost(message, repeated, tag = "7")]
pub params: ::prost::alloc::vec::Vec<Fixed>,
#[prost(string, tag = "8")]
pub entry: ::prost::alloc::string::String,
#[prost(string, tag = "9")]
pub exit: ::prost::alloc::string::String,
#[prost(string, tag = "10")]
pub version: ::prost::alloc::string::String,
#[prost(string, optional, tag = "11")]
pub problem: ::core::option::Option<::prost::alloc::string::String>,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct RuleFiles {
#[prost(message, repeated, tag = "1")]
pub rules: ::prost::alloc::vec::Vec<RuleFile>,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct PineScript {
#[prost(string, tag = "1")]
pub text: ::prost::alloc::string::String,
#[prost(string, optional, tag = "2")]
pub interval: ::core::option::Option<::prost::alloc::string::String>,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct PineTranslation {
#[prost(string, tag = "1")]
pub rule: ::prost::alloc::string::String,
#[prost(string, repeated, tag = "2")]
pub ignored: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
#[prost(string, tag = "3")]
pub name: ::prost::alloc::string::String,
#[prost(string, tag = "4")]
pub entry: ::prost::alloc::string::String,
#[prost(string, tag = "5")]
pub exit: ::prost::alloc::string::String,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct RuleText {
#[prost(string, tag = "1")]
pub json: ::prost::alloc::string::String,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct RulesetPath {
#[prost(string, tag = "1")]
pub path: ::prost::alloc::string::String,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct RulesetForm {
#[prost(string, tag = "1")]
pub name: ::prost::alloc::string::String,
#[prost(string, tag = "2")]
pub rule: ::prost::alloc::string::String,
#[prost(string, tag = "3")]
pub label: ::prost::alloc::string::String,
#[prost(string, tag = "4")]
pub premise: ::prost::alloc::string::String,
#[prost(message, repeated, tag = "5")]
pub params: ::prost::alloc::vec::Vec<Param>,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct Rule {
#[prost(string, tag = "1")]
pub name: ::prost::alloc::string::String,
#[prost(string, tag = "2")]
pub label: ::prost::alloc::string::String,
#[prost(string, tag = "3")]
pub premise: ::prost::alloc::string::String,
#[prost(string, tag = "4")]
pub interval: ::prost::alloc::string::String,
#[prost(message, repeated, tag = "5")]
pub fixed: ::prost::alloc::vec::Vec<Fixed>,
#[prost(message, repeated, tag = "6")]
pub axes: ::prost::alloc::vec::Vec<Param>,
#[prost(bool, tag = "7")]
pub ranks_a_set: bool,
#[prost(bool, tag = "8")]
pub trades_options: bool,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct Rules {
#[prost(message, repeated, tag = "1")]
pub rules: ::prost::alloc::vec::Vec<Rule>,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct RiskModel {
#[prost(string, tag = "1")]
pub path: ::prost::alloc::string::String,
#[prost(bool, tag = "2")]
pub exists: bool,
#[prost(string, tag = "3")]
pub model_json: ::prost::alloc::string::String,
#[prost(string, optional, tag = "4")]
pub error: ::core::option::Option<::prost::alloc::string::String>,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, Copy, PartialEq, ::prost::Message)]
pub struct AfterTaxView {
#[prost(double, tag = "1")]
pub strategy_return: f64,
#[prost(double, tag = "2")]
pub benchmark_return: f64,
#[prost(double, tag = "3")]
pub excess: f64,
#[prost(double, tag = "4")]
pub strategy_tax: f64,
#[prost(double, tag = "5")]
pub benchmark_tax: f64,
#[prost(double, tag = "6")]
pub short_term_rate: f64,
#[prost(double, tag = "7")]
pub long_term_rate: f64,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, Copy, PartialEq, ::prost::Message)]
pub struct BookView {
#[prost(message, optional, tag = "1")]
pub metrics: ::core::option::Option<MetricsView>,
#[prost(double, tag = "2")]
pub diversification: f64,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct BreadthView {
#[prost(string, repeated, tag = "1")]
pub instruments: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
#[prost(message, repeated, tag = "2")]
pub correlations: ::prost::alloc::vec::Vec<CorrelationRow>,
#[prost(double, optional, tag = "3")]
pub mean_correlation: ::core::option::Option<f64>,
#[prost(double, optional, tag = "4")]
pub effective: ::core::option::Option<f64>,
#[prost(double, optional, tag = "5")]
pub overstatement: ::core::option::Option<f64>,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct ComparisonRowView {
#[prost(string, tag = "1")]
pub id: ::prost::alloc::string::String,
#[prost(string, tag = "2")]
pub subject: ::prost::alloc::string::String,
#[prost(string, tag = "3")]
pub kind: ::prost::alloc::string::String,
#[prost(string, tag = "4")]
pub strategy_name: ::prost::alloc::string::String,
#[prost(string, tag = "5")]
pub verdict: ::prost::alloc::string::String,
#[prost(string, tag = "6")]
pub recorded_at: ::prost::alloc::string::String,
#[prost(double, tag = "7")]
pub total_return: f64,
#[prost(double, tag = "8")]
pub excess_return: f64,
#[prost(double, optional, tag = "9")]
pub sharpe: ::core::option::Option<f64>,
#[prost(double, tag = "10")]
pub max_drawdown: f64,
#[prost(uint32, tag = "11")]
pub trades: u32,
#[prost(double, optional, tag = "12")]
pub win_rate: ::core::option::Option<f64>,
#[prost(double, optional, tag = "13")]
pub profit_factor: ::core::option::Option<f64>,
#[prost(bool, optional, tag = "14")]
pub stale: ::core::option::Option<bool>,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct ComparisonView {
#[prost(message, repeated, tag = "1")]
pub rows: ::prost::alloc::vec::Vec<ComparisonRowView>,
#[prost(message, repeated, tag = "2")]
pub curves: ::prost::alloc::vec::Vec<NamedCurveView>,
#[prost(double, optional, tag = "3")]
pub best_sharpe: ::core::option::Option<f64>,
#[prost(double, optional, tag = "4")]
pub expected_best_under_null: ::core::option::Option<f64>,
#[prost(bool, tag = "5")]
pub survived_deflation: bool,
#[prost(string, repeated, tag = "6")]
pub notes: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct CorrelationRow {
#[prost(message, repeated, tag = "1")]
pub cells: ::prost::alloc::vec::Vec<OptionalDouble>,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, Copy, PartialEq, ::prost::Message)]
pub struct CurvePoint {
#[prost(int64, tag = "1")]
pub time: i64,
#[prost(double, tag = "2")]
pub value: f64,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct DivergenceView {
#[prost(string, tag = "1")]
pub what: ::prost::alloc::string::String,
#[prost(uint32, optional, tag = "2")]
pub at: ::core::option::Option<u32>,
#[prost(string, optional, tag = "3")]
pub when: ::core::option::Option<::prost::alloc::string::String>,
#[prost(double, tag = "4")]
pub recorded: f64,
#[prost(double, tag = "5")]
pub replayed: f64,
#[prost(double, tag = "6")]
pub relative: f64,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, Copy, PartialEq, ::prost::Message)]
pub struct DividendGapView {
#[prost(uint32, tag = "1")]
pub events: u32,
#[prost(double, tag = "2")]
pub strategy_income: f64,
#[prost(double, tag = "3")]
pub benchmark_income: f64,
#[prost(double, tag = "4")]
pub overstatement: f64,
#[prost(double, optional, tag = "5")]
pub corrected_excess: ::core::option::Option<f64>,
#[prost(bool, tag = "6")]
pub complete: bool,
#[prost(uint32, tag = "7")]
pub covered: u32,
#[prost(uint32, tag = "8")]
pub instruments: u32,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct FoldView {
#[prost(string, tag = "1")]
pub chose_on: ::prost::alloc::string::String,
#[prost(string, tag = "2")]
pub judged_on: ::prost::alloc::string::String,
#[prost(message, repeated, tag = "3")]
pub params: ::prost::alloc::vec::Vec<NamedNumber>,
#[prost(double, tag = "4")]
pub strategy_return: f64,
#[prost(double, tag = "5")]
pub benchmark_return: f64,
#[prost(uint32, tag = "6")]
pub trades: u32,
#[prost(bool, tag = "7")]
pub survived_deflation: bool,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct HistoryEntryView {
#[prost(string, tag = "1")]
pub id: ::prost::alloc::string::String,
#[prost(string, tag = "2")]
pub kind: ::prost::alloc::string::String,
#[prost(string, tag = "3")]
pub subject: ::prost::alloc::string::String,
#[prost(string, tag = "4")]
pub verdict: ::prost::alloc::string::String,
#[prost(string, tag = "5")]
pub recorded_at: ::prost::alloc::string::String,
#[prost(bool, optional, tag = "6")]
pub stale: ::core::option::Option<bool>,
#[prost(string, optional, tag = "7")]
pub agent: ::core::option::Option<::prost::alloc::string::String>,
#[prost(string, optional, tag = "8")]
pub origin: ::core::option::Option<::prost::alloc::string::String>,
#[prost(uint32, optional, tag = "9")]
pub trials: ::core::option::Option<u32>,
#[prost(uint32, tag = "10")]
pub attachments: u32,
#[prost(string, tag = "11")]
pub code_commit: ::prost::alloc::string::String,
#[prost(string, tag = "12")]
pub ruleset_hash: ::prost::alloc::string::String,
#[prost(string, tag = "13")]
pub stale_reason: ::prost::alloc::string::String,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct HistoryView {
#[prost(message, repeated, tag = "1")]
pub entries: ::prost::alloc::vec::Vec<HistoryEntryView>,
#[prost(message, repeated, tag = "2")]
pub unreadable: ::prost::alloc::vec::Vec<UnreadableView>,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct MemberView {
#[prost(string, tag = "1")]
pub instrument: ::prost::alloc::string::String,
#[prost(uint32, tag = "2")]
pub trades: u32,
#[prost(double, tag = "3")]
pub pnl: f64,
#[prost(double, optional, tag = "4")]
pub share: ::core::option::Option<f64>,
#[prost(bool, tag = "5")]
pub silent: bool,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, Copy, PartialEq, ::prost::Message)]
pub struct MetricsView {
#[prost(double, tag = "1")]
pub total_return: f64,
#[prost(double, tag = "2")]
pub cagr: f64,
#[prost(double, tag = "3")]
pub max_drawdown: f64,
#[prost(double, tag = "4")]
pub volatility: f64,
#[prost(double, optional, tag = "5")]
pub sharpe: ::core::option::Option<f64>,
#[prost(double, optional, tag = "6")]
pub sortino: ::core::option::Option<f64>,
#[prost(double, optional, tag = "7")]
pub calmar: ::core::option::Option<f64>,
#[prost(double, optional, tag = "8")]
pub psr: ::core::option::Option<f64>,
#[prost(uint32, tag = "9")]
pub trades: u32,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, Copy, PartialEq, ::prost::Message)]
pub struct MonthlyReturnView {
#[prost(int32, tag = "1")]
pub year: i32,
#[prost(uint32, tag = "2")]
pub month: u32,
#[prost(double, tag = "3")]
pub value: f64,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct NamedCurveView {
#[prost(string, tag = "1")]
pub name: ::prost::alloc::string::String,
#[prost(message, repeated, tag = "2")]
pub points: ::prost::alloc::vec::Vec<CurvePoint>,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct NamedNumber {
#[prost(string, tag = "1")]
pub name: ::prost::alloc::string::String,
#[prost(double, tag = "2")]
pub value: f64,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, Copy, PartialEq, ::prost::Message)]
pub struct OptionalDouble {
#[prost(double, optional, tag = "1")]
pub value: ::core::option::Option<f64>,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct OutcomeView {
#[prost(string, tag = "1")]
pub instrument: ::prost::alloc::string::String,
#[prost(double, tag = "2")]
pub strategy_return: f64,
#[prost(double, tag = "3")]
pub benchmark_return: f64,
#[prost(double, tag = "4")]
pub excess_return: f64,
#[prost(double, tag = "5")]
pub max_drawdown: f64,
#[prost(uint32, tag = "6")]
pub trades: u32,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct PanelView {
#[prost(string, tag = "1")]
pub id: ::prost::alloc::string::String,
#[prost(string, tag = "2")]
pub verdict: ::prost::alloc::string::String,
#[prost(string, repeated, tag = "3")]
pub reasons: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
#[prost(message, repeated, tag = "4")]
pub recommendations: ::prost::alloc::vec::Vec<RecommendationView>,
#[prost(uint32, tag = "5")]
pub instruments: u32,
#[prost(uint32, tag = "6")]
pub total_trades: u32,
#[prost(double, tag = "7")]
pub mean_excess_return: f64,
#[prost(uint32, tag = "8")]
pub beat_benchmark: u32,
#[prost(double, tag = "9")]
pub mean_max_drawdown: f64,
#[prost(message, optional, tag = "10")]
pub breadth: ::core::option::Option<BreadthView>,
#[prost(message, optional, tag = "11")]
pub book: ::core::option::Option<BookView>,
#[prost(double, tag = "12")]
pub worst_max_drawdown: f64,
#[prost(uint32, tag = "13")]
pub trials: u32,
#[prost(double, tag = "14")]
pub best_sharpe: f64,
#[prost(double, optional, tag = "15")]
pub expected_best_under_null: ::core::option::Option<f64>,
#[prost(bool, tag = "16")]
pub survived_deflation: bool,
#[prost(string, tag = "17")]
pub in_sample: ::prost::alloc::string::String,
#[prost(string, tag = "18")]
pub out_of_sample: ::prost::alloc::string::String,
#[prost(message, repeated, tag = "19")]
pub selected_params: ::prost::alloc::vec::Vec<NamedNumber>,
#[prost(message, repeated, tag = "20")]
pub per_instrument: ::prost::alloc::vec::Vec<OutcomeView>,
#[prost(string, repeated, tag = "21")]
pub failures: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
#[prost(string, tag = "22")]
pub dataset_version: ::prost::alloc::string::String,
#[prost(string, tag = "23")]
pub strategy_name: ::prost::alloc::string::String,
#[prost(double, tag = "24")]
pub starting_cash: f64,
#[prost(double, tag = "25")]
pub commission_bps: f64,
#[prost(double, tag = "26")]
pub slippage_bps: f64,
#[prost(string, tag = "27")]
pub engine: ::prost::alloc::string::String,
#[prost(string, tag = "28")]
pub universe: ::prost::alloc::string::String,
#[prost(string, repeated, tag = "29")]
pub notes: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct RecommendationView {
#[prost(string, tag = "1")]
pub severity: ::prost::alloc::string::String,
#[prost(string, tag = "2")]
pub finding: ::prost::alloc::string::String,
#[prost(string, tag = "3")]
pub action: ::prost::alloc::string::String,
#[prost(string, tag = "4")]
pub evidence: ::prost::alloc::string::String,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct RecordView {
#[prost(oneof = "record_view::Of", tags = "1, 2, 3, 4")]
pub of: ::core::option::Option<record_view::Of>,
}
pub mod record_view {
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, ::prost::Oneof)]
pub enum Of {
#[prost(message, tag = "1")]
Study(super::StudyView),
#[prost(message, tag = "2")]
Panel(super::PanelView),
#[prost(message, tag = "3")]
Walkforward(super::WalkForwardView),
#[prost(message, tag = "4")]
Reported(super::ReportedView),
}
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct ReplayView {
#[prost(string, tag = "1")]
pub outcome: ::prost::alloc::string::String,
#[prost(bool, tag = "2")]
pub holds: bool,
#[prost(string, tag = "3")]
pub detail: ::prost::alloc::string::String,
#[prost(message, optional, tag = "4")]
pub divergence: ::core::option::Option<DivergenceView>,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct ReportedView {
#[prost(string, tag = "1")]
pub id: ::prost::alloc::string::String,
#[prost(string, tag = "2")]
pub hypothesis: ::prost::alloc::string::String,
#[prost(string, tag = "3")]
pub claim: ::prost::alloc::string::String,
#[prost(string, tag = "4")]
pub instrument: ::prost::alloc::string::String,
#[prost(string, tag = "5")]
pub engine: ::prost::alloc::string::String,
#[prost(string, tag = "6")]
pub from: ::prost::alloc::string::String,
#[prost(string, tag = "7")]
pub to: ::prost::alloc::string::String,
#[prost(string, tag = "8")]
pub interval: ::prost::alloc::string::String,
#[prost(string, tag = "9")]
pub dataset: ::prost::alloc::string::String,
#[prost(string, tag = "10")]
pub strategy: ::prost::alloc::string::String,
#[prost(string, tag = "11")]
pub verdict: ::prost::alloc::string::String,
#[prost(string, repeated, tag = "12")]
pub reasons: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
#[prost(uint32, tag = "13")]
pub trades: u32,
#[prost(uint32, optional, tag = "14")]
pub trials: ::core::option::Option<u32>,
#[prost(double, optional, tag = "15")]
pub total_return: ::core::option::Option<f64>,
#[prost(double, optional, tag = "16")]
pub excess_return: ::core::option::Option<f64>,
#[prost(double, optional, tag = "17")]
pub sharpe: ::core::option::Option<f64>,
#[prost(double, optional, tag = "18")]
pub max_drawdown: ::core::option::Option<f64>,
#[prost(string, tag = "19")]
pub recorded_at: ::prost::alloc::string::String,
#[prost(string, tag = "20")]
pub author: ::prost::alloc::string::String,
#[prost(message, repeated, tag = "21")]
pub attachments: ::prost::alloc::vec::Vec<Attachment>,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct StabilityView {
#[prost(string, tag = "1")]
pub axis: ::prost::alloc::string::String,
#[prost(uint32, tag = "2")]
pub distinct: u32,
#[prost(double, tag = "3")]
pub modal: f64,
#[prost(double, tag = "4")]
pub modal_share: f64,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct StudyView {
#[prost(string, tag = "1")]
pub id: ::prost::alloc::string::String,
#[prost(string, tag = "2")]
pub instrument: ::prost::alloc::string::String,
#[prost(string, repeated, tag = "3")]
pub instruments: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
#[prost(message, repeated, tag = "4")]
pub members: ::prost::alloc::vec::Vec<MemberView>,
#[prost(string, tag = "5")]
pub verdict: ::prost::alloc::string::String,
#[prost(string, repeated, tag = "6")]
pub reasons: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
#[prost(uint32, tag = "7")]
pub trials: u32,
#[prost(uint32, tag = "8")]
pub prior_trials: u32,
#[prost(double, tag = "9")]
pub best_sharpe: f64,
#[prost(double, optional, tag = "10")]
pub expected_best_under_null: ::core::option::Option<f64>,
#[prost(bool, tag = "11")]
pub survived_deflation: bool,
#[prost(message, optional, tag = "12")]
pub surface: ::core::option::Option<SurfaceView>,
#[prost(string, tag = "13")]
pub in_sample: ::prost::alloc::string::String,
#[prost(string, tag = "14")]
pub out_of_sample: ::prost::alloc::string::String,
#[prost(message, repeated, tag = "15")]
pub selected_params: ::prost::alloc::vec::Vec<NamedNumber>,
#[prost(message, optional, tag = "16")]
pub strategy: ::core::option::Option<MetricsView>,
#[prost(message, optional, tag = "17")]
pub benchmark: ::core::option::Option<MetricsView>,
#[prost(double, tag = "18")]
pub excess_return: f64,
#[prost(message, optional, tag = "19")]
pub dividend_gap: ::core::option::Option<DividendGapView>,
#[prost(message, optional, tag = "20")]
pub after_tax: ::core::option::Option<AfterTaxView>,
#[prost(message, repeated, tag = "21")]
pub strategy_curve: ::prost::alloc::vec::Vec<CurvePoint>,
#[prost(message, repeated, tag = "22")]
pub benchmark_curve: ::prost::alloc::vec::Vec<CurvePoint>,
#[prost(message, repeated, tag = "23")]
pub price: ::prost::alloc::vec::Vec<CandlePoint>,
#[prost(message, repeated, tag = "24")]
pub markers: ::prost::alloc::vec::Vec<TradeMarkerView>,
#[prost(message, repeated, tag = "25")]
pub alongside_charts: ::prost::alloc::vec::Vec<InstrumentChartView>,
#[prost(message, repeated, tag = "26")]
pub underwater: ::prost::alloc::vec::Vec<CurvePoint>,
#[prost(message, repeated, tag = "27")]
pub data_findings: ::prost::alloc::vec::Vec<
super::super::market::v1::DataFindingView,
>,
#[prost(message, repeated, tag = "28")]
pub trades: ::prost::alloc::vec::Vec<TradeRowView>,
#[prost(message, repeated, tag = "29")]
pub monthly: ::prost::alloc::vec::Vec<MonthlyReturnView>,
#[prost(message, optional, tag = "30")]
pub trades_detail: ::core::option::Option<TradesView>,
#[prost(message, repeated, tag = "31")]
pub recommendations: ::prost::alloc::vec::Vec<RecommendationView>,
#[prost(string, tag = "32")]
pub dataset_version: ::prost::alloc::string::String,
#[prost(string, tag = "33")]
pub strategy_name: ::prost::alloc::string::String,
#[prost(double, tag = "34")]
pub starting_cash: f64,
#[prost(double, tag = "35")]
pub commission_bps: f64,
#[prost(double, tag = "36")]
pub slippage_bps: f64,
#[prost(string, tag = "37")]
pub engine: ::prost::alloc::string::String,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, Copy, PartialEq, ::prost::Message)]
pub struct SurfaceCell {
#[prost(double, tag = "1")]
pub x: f64,
#[prost(double, tag = "2")]
pub y: f64,
#[prost(double, tag = "3")]
pub sharpe: f64,
#[prost(bool, tag = "4")]
pub selected: bool,
#[prost(bool, tag = "5")]
pub above_null: bool,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct SurfaceView {
#[prost(string, tag = "1")]
pub x_axis: ::prost::alloc::string::String,
#[prost(string, tag = "2")]
pub y_axis: ::prost::alloc::string::String,
#[prost(double, repeated, tag = "3")]
pub x_values: ::prost::alloc::vec::Vec<f64>,
#[prost(double, repeated, tag = "4")]
pub y_values: ::prost::alloc::vec::Vec<f64>,
#[prost(message, repeated, tag = "5")]
pub cells: ::prost::alloc::vec::Vec<SurfaceCell>,
#[prost(double, optional, tag = "6")]
pub null_bar: ::core::option::Option<f64>,
#[prost(double, tag = "7")]
pub best: f64,
#[prost(string, repeated, tag = "8")]
pub collapsed: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct TradeMarkerView {
#[prost(int64, tag = "1")]
pub time: i64,
#[prost(string, tag = "2")]
pub kind: ::prost::alloc::string::String,
#[prost(string, tag = "3")]
pub reason: ::prost::alloc::string::String,
#[prost(string, tag = "4")]
pub label: ::prost::alloc::string::String,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct TradeRowView {
#[prost(string, tag = "1")]
pub instrument: ::prost::alloc::string::String,
#[prost(string, tag = "2")]
pub opened: ::prost::alloc::string::String,
#[prost(string, tag = "3")]
pub closed: ::prost::alloc::string::String,
#[prost(string, tag = "4")]
pub direction: ::prost::alloc::string::String,
#[prost(double, tag = "5")]
pub quantity: f64,
#[prost(double, tag = "6")]
pub entry: f64,
#[prost(double, optional, tag = "7")]
pub exit: ::core::option::Option<f64>,
#[prost(double, tag = "8")]
pub pnl: f64,
#[prost(double, tag = "9")]
pub commission: f64,
#[prost(double, optional, tag = "10")]
pub held_days: ::core::option::Option<f64>,
#[prost(string, tag = "11")]
pub exit_reason: ::prost::alloc::string::String,
#[prost(string, optional, tag = "12")]
pub rule: ::core::option::Option<::prost::alloc::string::String>,
#[prost(double, optional, tag = "13")]
pub signal: ::core::option::Option<f64>,
#[prost(string, optional, tag = "14")]
pub regime: ::core::option::Option<::prost::alloc::string::String>,
#[prost(double, optional, tag = "15")]
pub asked: ::core::option::Option<f64>,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, Copy, PartialEq, ::prost::Message)]
pub struct TradesView {
#[prost(uint32, tag = "1")]
pub closed: u32,
#[prost(uint32, tag = "2")]
pub still_open: u32,
#[prost(double, optional, tag = "3")]
pub win_rate: ::core::option::Option<f64>,
#[prost(double, optional, tag = "4")]
pub profit_factor: ::core::option::Option<f64>,
#[prost(double, optional, tag = "5")]
pub expectancy: ::core::option::Option<f64>,
#[prost(double, optional, tag = "6")]
pub average_win: ::core::option::Option<f64>,
#[prost(double, optional, tag = "7")]
pub average_loss: ::core::option::Option<f64>,
#[prost(double, optional, tag = "8")]
pub average_holding_days: ::core::option::Option<f64>,
#[prost(double, tag = "9")]
pub fees_paid: f64,
#[prost(double, tag = "10")]
pub fees_fraction: f64,
#[prost(uint32, tag = "11")]
pub signal_exits: u32,
#[prost(uint32, tag = "12")]
pub stop_exits: u32,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct UnreadableView {
#[prost(string, tag = "1")]
pub id: ::prost::alloc::string::String,
#[prost(string, tag = "2")]
pub reason: ::prost::alloc::string::String,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct WalkForwardView {
#[prost(string, tag = "1")]
pub id: ::prost::alloc::string::String,
#[prost(string, tag = "2")]
pub instrument: ::prost::alloc::string::String,
#[prost(string, tag = "3")]
pub verdict: ::prost::alloc::string::String,
#[prost(string, repeated, tag = "4")]
pub reasons: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
#[prost(message, repeated, tag = "5")]
pub recommendations: ::prost::alloc::vec::Vec<RecommendationView>,
#[prost(message, repeated, tag = "6")]
pub folds: ::prost::alloc::vec::Vec<FoldView>,
#[prost(uint32, tag = "7")]
pub folds_surviving_deflation: u32,
#[prost(uint32, tag = "8")]
pub folds_without_trades: u32,
#[prost(message, repeated, tag = "9")]
pub stability: ::prost::alloc::vec::Vec<StabilityView>,
#[prost(message, optional, tag = "10")]
pub strategy: ::core::option::Option<MetricsView>,
#[prost(message, optional, tag = "11")]
pub benchmark: ::core::option::Option<MetricsView>,
#[prost(double, tag = "12")]
pub excess_return: f64,
#[prost(message, repeated, tag = "13")]
pub strategy_curve: ::prost::alloc::vec::Vec<CurvePoint>,
#[prost(message, repeated, tag = "14")]
pub benchmark_curve: ::prost::alloc::vec::Vec<CurvePoint>,
#[prost(message, repeated, tag = "15")]
pub price: ::prost::alloc::vec::Vec<CandlePoint>,
#[prost(message, repeated, tag = "16")]
pub markers: ::prost::alloc::vec::Vec<TradeMarkerView>,
#[prost(message, repeated, tag = "17")]
pub underwater: ::prost::alloc::vec::Vec<CurvePoint>,
#[prost(message, repeated, tag = "18")]
pub data_findings: ::prost::alloc::vec::Vec<
super::super::market::v1::DataFindingView,
>,
#[prost(message, repeated, tag = "19")]
pub trades: ::prost::alloc::vec::Vec<TradeRowView>,
#[prost(message, optional, tag = "20")]
pub trades_detail: ::core::option::Option<TradesView>,
#[prost(int64, tag = "21")]
pub in_sample_days: i64,
#[prost(int64, tag = "22")]
pub step_days: i64,
#[prost(bool, tag = "23")]
pub anchored: bool,
#[prost(string, tag = "24")]
pub dataset_version: ::prost::alloc::string::String,
#[prost(string, tag = "25")]
pub strategy_name: ::prost::alloc::string::String,
#[prost(double, tag = "26")]
pub starting_cash: f64,
#[prost(double, tag = "27")]
pub commission_bps: f64,
#[prost(double, tag = "28")]
pub slippage_bps: f64,
#[prost(string, tag = "29")]
pub engine: ::prost::alloc::string::String,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct ReviewView {
#[prost(string, tag = "1")]
pub day: ::prost::alloc::string::String,
#[prost(string, tag = "2")]
pub markdown: ::prost::alloc::string::String,
#[prost(string, tag = "3")]
pub path: ::prost::alloc::string::String,
#[prost(bool, tag = "4")]
pub written_now: bool,
#[prost(string, tag = "5")]
pub json: ::prost::alloc::string::String,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct BarView {
#[prost(string, tag = "1")]
pub at: ::prost::alloc::string::String,
#[prost(double, tag = "2")]
pub open: f64,
#[prost(double, tag = "3")]
pub high: f64,
#[prost(double, tag = "4")]
pub low: f64,
#[prost(double, tag = "5")]
pub close: f64,
#[prost(double, tag = "6")]
pub volume: f64,
#[prost(int64, tag = "7")]
pub time: i64,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct BarsView {
#[prost(string, tag = "1")]
pub instrument: ::prost::alloc::string::String,
#[prost(string, tag = "2")]
pub interval: ::prost::alloc::string::String,
#[prost(message, repeated, tag = "3")]
pub bars: ::prost::alloc::vec::Vec<BarView>,
#[prost(string, tag = "4")]
pub zone: ::prost::alloc::string::String,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct RegimePointView {
#[prost(string, tag = "1")]
pub at: ::prost::alloc::string::String,
#[prost(string, optional, tag = "2")]
pub regime: ::core::option::Option<::prost::alloc::string::String>,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct RegimeView {
#[prost(string, tag = "1")]
pub instrument: ::prost::alloc::string::String,
#[prost(string, tag = "2")]
pub interval: ::prost::alloc::string::String,
#[prost(uint32, tag = "3")]
pub lookback: u32,
#[prost(string, optional, tag = "4")]
pub current: ::core::option::Option<::prost::alloc::string::String>,
#[prost(message, repeated, tag = "5")]
pub points: ::prost::alloc::vec::Vec<RegimePointView>,
#[prost(map = "string, uint32", tag = "6")]
pub shares: ::std::collections::HashMap<::prost::alloc::string::String, u32>,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, Copy, PartialEq, ::prost::Message)]
pub struct CandlePoint {
#[prost(int64, tag = "1")]
pub time: i64,
#[prost(double, tag = "2")]
pub open: f64,
#[prost(double, tag = "3")]
pub high: f64,
#[prost(double, tag = "4")]
pub low: f64,
#[prost(double, tag = "5")]
pub close: f64,
#[prost(double, tag = "6")]
pub volume: f64,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct InstrumentChartView {
#[prost(string, tag = "1")]
pub instrument: ::prost::alloc::string::String,
#[prost(message, repeated, tag = "2")]
pub price: ::prost::alloc::vec::Vec<CandlePoint>,
#[prost(message, repeated, tag = "3")]
pub markers: ::prost::alloc::vec::Vec<TradeMarkerView>,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct ResearchProblemView {
#[prost(string, tag = "1")]
pub path: ::prost::alloc::string::String,
#[prost(uint32, tag = "2")]
pub line: u32,
#[prost(string, tag = "3")]
pub severity: ::prost::alloc::string::String,
#[prost(string, tag = "4")]
pub message: ::prost::alloc::string::String,
#[prost(string, tag = "5")]
pub finding: ::prost::alloc::string::String,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct ProblemsView {
#[prost(message, repeated, tag = "1")]
pub problems: ::prost::alloc::vec::Vec<ResearchProblemView>,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct RankingRowView {
#[prost(string, tag = "1")]
pub id: ::prost::alloc::string::String,
#[prost(string, tag = "2")]
pub subject: ::prost::alloc::string::String,
#[prost(string, tag = "3")]
pub kind: ::prost::alloc::string::String,
#[prost(string, tag = "4")]
pub rule: ::prost::alloc::string::String,
#[prost(string, tag = "5")]
pub interval: ::prost::alloc::string::String,
#[prost(string, tag = "6")]
pub verdict: ::prost::alloc::string::String,
#[prost(string, tag = "7")]
pub conservative_verdict: ::prost::alloc::string::String,
#[prost(double, tag = "8")]
pub expectancy: f64,
#[prost(string, tag = "9")]
pub expectancy_costs: ::prost::alloc::string::String,
#[prost(double, tag = "10")]
pub total_return: f64,
#[prost(double, tag = "11")]
pub max_drawdown: f64,
#[prost(uint32, tag = "12")]
pub trades: u32,
#[prost(string, repeated, tag = "13")]
pub regimes: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
#[prost(uint32, optional, tag = "14")]
pub search: ::core::option::Option<u32>,
#[prost(string, tag = "15")]
pub recorded_at: ::prost::alloc::string::String,
#[prost(bool, optional, tag = "16")]
pub stale: ::core::option::Option<bool>,
}
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct Ranking {
#[prost(message, repeated, tag = "1")]
pub rows: ::prost::alloc::vec::Vec<RankingRowView>,
#[prost(string, repeated, tag = "2")]
pub notes: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
}