pub struct StudyView {Show 37 fields
pub id: String,
pub instrument: String,
pub instruments: Vec<String>,
pub members: Vec<MemberView>,
pub verdict: String,
pub reasons: Vec<String>,
pub trials: u32,
pub prior_trials: u32,
pub best_sharpe: f64,
pub expected_best_under_null: Option<f64>,
pub survived_deflation: bool,
pub surface: Option<SurfaceView>,
pub in_sample: String,
pub out_of_sample: String,
pub selected_params: Vec<NamedNumber>,
pub strategy: Option<MetricsView>,
pub benchmark: Option<MetricsView>,
pub excess_return: f64,
pub dividend_gap: Option<DividendGapView>,
pub after_tax: Option<AfterTaxView>,
pub strategy_curve: Vec<CurvePoint>,
pub benchmark_curve: Vec<CurvePoint>,
pub price: Vec<CandlePoint>,
pub markers: Vec<TradeMarkerView>,
pub alongside_charts: Vec<InstrumentChartView>,
pub underwater: Vec<CurvePoint>,
pub data_findings: Vec<DataFindingView>,
pub trades: Vec<TradeRowView>,
pub monthly: Vec<MonthlyReturnView>,
pub trades_detail: Option<TradesView>,
pub recommendations: Vec<RecommendationView>,
pub dataset_version: String,
pub strategy_name: String,
pub starting_cash: f64,
pub commission_bps: f64,
pub slippage_bps: f64,
pub engine: String,
}Expand description
Every shape at the root as well, because a window names a view on nearly
every line and arvo_api::research::StudyView would be noise. The names
do not collide: proto has no overloading and neither does this.
Every shape at the root as well, because a window names a view on nearly
every line and arvo_api::research::StudyView would be noise. The names
do not collide: proto has no overloading and neither does this.
Every shape at the root as well, because a window names a view on nearly
every line and arvo_api::research::StudyView would be noise. The names
do not collide: proto has no overloading and neither does this.
The full result of a study, flattened for display.
Fields§
§id: StringThe stored finding this view came from, so the window can ask for
something to be done to the record it is showing — a report composed
from it, a file kept with it. Empty for a view that was never
recorded. default because every view built before this had none.
instrument: String§instruments: Vec<String>Every instrument the run held, head first.
One entry is an ordinary study. More than one is a book: the same rule on several instruments settling against a single account, where a position one member takes is capital another cannot have.
default because this is a persisted format — a finding recorded
before a run could hold more than one loads as what it was.
members: Vec<MemberView>What each member of a book contributed. Empty for a single study.
verdict: String§reasons: Vec<String>§trials: u32§prior_trials: u32Configurations tried elsewhere before a shared experiment arrived,
counted into the bar. default: a view built before sharing had none.
best_sharpe: f64§expected_best_under_null: Option<f64>§survived_deflation: bool§surface: Option<SurfaceView>Every configuration the search tried, not only the one it picked.
in_sample: String§out_of_sample: String§selected_params: Vec<NamedNumber>§strategy: Option<MetricsView>§benchmark: Option<MetricsView>§excess_return: f64Uncorrected. [Self::dividend_gap] sits beside it rather than being
folded in: a number silently adjusted by something the reader cannot see
is what this platform exists to stop.
dividend_gap: Option<DividendGapView>How much of that margin is the dividend bias rather than skill.
None means it was never measured — no distribution series is held for
these instruments. The bias is real either way; only its size is
unknown, and recommendations says so.
after_tax: Option<AfterTaxView>Both sides after capital-gains tax at stated rates, sold at the end
(#26). Beside the excess return for the same reason as the dividend
gap. None when the curves are too short to tax.
strategy_curve: Vec<CurvePoint>The two curves behind the numbers. A table says a strategy returned less than the market; a chart says whether it did so steadily or lost it all in one month, and those are different findings.
benchmark_curve: Vec<CurvePoint>§price: Vec<CandlePoint>The instrument’s own bars over the judged period, with every entry and exit marked on them.
The view that shows what the rule did rather than what it added up to. A summary cannot say the entries all landed on three days, or that every winner came out of one gap; this says it at a glance.
markers: Vec<TradeMarkerView>§alongside_charts: Vec<InstrumentChartView>The rest of a book’s instruments, each with its own bars and its own trades. Empty for a single study.
The head instrument is deliberately not repeated here — it is already
[Self::price] and [Self::markers] above. The shape mirrors
Experiment.alongside, which is head plus the rest for the same reason:
carrying the head twice would put a third of a three-member book’s
candles on the wire for nothing.
underwater: Vec<CurvePoint>Depth below the running peak, as a percentage.
data_findings: Vec<DataFindingView>What is wrong with the bars this was produced from.
trades: Vec<TradeRowView>Every round trip, so nobody has to take the summary on trust.
monthly: Vec<MonthlyReturnView>Month-by-month, so a total return can be read as steady or as one lucky quarter. Derived from the same curve, not a second measurement.
trades_detail: Option<TradesView>The round trips behind the return, and what they cost.
recommendations: Vec<RecommendationView>What to do about this finding, most stopping first.
Derived on read rather than stored, so a finding pulled out of memory is read against today’s rules rather than the ones in force when it was recorded.
dataset_version: StringThe dataset this result was produced from, as a content hash. Compared against the live one to decide whether the result is still current.
strategy_name: String§starting_cash: f64§commission_bps: f64§slippage_bps: f64§engine: StringImplementations§
Source§impl StudyView
impl StudyView
Sourcepub fn expected_best_under_null(&self) -> f64
pub fn expected_best_under_null(&self) -> f64
Returns the value of expected_best_under_null, or the default value if expected_best_under_null is unset.
Source§impl StudyView
impl StudyView
Sourcepub fn strategy(&self) -> &MetricsView
pub fn strategy(&self) -> &MetricsView
The sender always fills this.
§Panics
Only if it did not, which would mean the two sides disagree about the contract.
Source§impl StudyView
impl StudyView
Sourcepub fn benchmark(&self) -> &MetricsView
pub fn benchmark(&self) -> &MetricsView
The sender always fills this.
§Panics
Only if it did not, which would mean the two sides disagree about the contract.
Source§impl StudyView
impl StudyView
Sourcepub fn trades_detail(&self) -> &TradesView
pub fn trades_detail(&self) -> &TradesView
The sender always fills this.
§Panics
Only if it did not, which would mean the two sides disagree about the contract.
Trait Implementations§
Source§impl<'de> Deserialize<'de> for StudyView
impl<'de> Deserialize<'de> for StudyView
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl Message for StudyView
impl Message for StudyView
Source§fn encoded_len(&self) -> usize
fn encoded_len(&self) -> usize
Source§fn encode(&self, buf: &mut impl BufMut) -> Result<(), EncodeError>where
Self: Sized,
fn encode(&self, buf: &mut impl BufMut) -> Result<(), EncodeError>where
Self: Sized,
Source§fn encode_to_vec(&self) -> Vec<u8> ⓘwhere
Self: Sized,
fn encode_to_vec(&self) -> Vec<u8> ⓘwhere
Self: Sized,
Source§fn encode_length_delimited(
&self,
buf: &mut impl BufMut,
) -> Result<(), EncodeError>where
Self: Sized,
fn encode_length_delimited(
&self,
buf: &mut impl BufMut,
) -> Result<(), EncodeError>where
Self: Sized,
Source§fn encode_length_delimited_to_vec(&self) -> Vec<u8> ⓘwhere
Self: Sized,
fn encode_length_delimited_to_vec(&self) -> Vec<u8> ⓘwhere
Self: Sized,
Source§fn decode(buf: impl Buf) -> Result<Self, DecodeError>where
Self: Default,
fn decode(buf: impl Buf) -> Result<Self, DecodeError>where
Self: Default,
Source§fn decode_length_delimited(buf: impl Buf) -> Result<Self, DecodeError>where
Self: Default,
fn decode_length_delimited(buf: impl Buf) -> Result<Self, DecodeError>where
Self: Default,
Source§fn merge(&mut self, buf: impl Buf) -> Result<(), DecodeError>where
Self: Sized,
fn merge(&mut self, buf: impl Buf) -> Result<(), DecodeError>where
Self: Sized,
self. Read moreSource§fn merge_length_delimited(&mut self, buf: impl Buf) -> Result<(), DecodeError>where
Self: Sized,
fn merge_length_delimited(&mut self, buf: impl Buf) -> Result<(), DecodeError>where
Self: Sized,
self.