Skip to main content

StudyView

Struct StudyView 

Source
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: String

The 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: u32

Configurations 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: f64

Uncorrected. [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: String

The 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: String

Implementations§

Source§

impl StudyView

Source

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

Source

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

Source

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

Source

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 Clone for StudyView

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for StudyView

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for StudyView

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl<'de> Deserialize<'de> for StudyView

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Message for StudyView

Source§

fn encoded_len(&self) -> usize

Returns the encoded length of the message without a length delimiter.
Source§

fn clear(&mut self)

Clears the message, resetting all fields to their default.
Source§

fn encode(&self, buf: &mut impl BufMut) -> Result<(), EncodeError>
where Self: Sized,

Encodes the message to a buffer. Read more
Source§

fn encode_to_vec(&self) -> Vec<u8> ⓘ
where Self: Sized,

Encodes the message to a newly allocated buffer.
Source§

fn encode_length_delimited( &self, buf: &mut impl BufMut, ) -> Result<(), EncodeError>
where Self: Sized,

Encodes the message with a length-delimiter to a buffer. Read more
Source§

fn encode_length_delimited_to_vec(&self) -> Vec<u8> ⓘ
where Self: Sized,

Encodes the message with a length-delimiter to a newly allocated buffer.
Source§

fn decode(buf: impl Buf) -> Result<Self, DecodeError>
where Self: Default,

Decodes an instance of the message from a buffer. Read more
Source§

fn decode_length_delimited(buf: impl Buf) -> Result<Self, DecodeError>
where Self: Default,

Decodes a length-delimited instance of the message from the buffer.
Source§

fn merge(&mut self, buf: impl Buf) -> Result<(), DecodeError>
where Self: Sized,

Decodes an instance of the message from a buffer, and merges it into self. Read more
Source§

fn merge_length_delimited(&mut self, buf: impl Buf) -> Result<(), DecodeError>
where Self: Sized,

Decodes a length-delimited instance of the message from buffer, and merges it into self.
Source§

impl PartialEq for StudyView

Source§

fn eq(&self, other: &Self) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl Serialize for StudyView

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl StructuralPartialEq for StudyView

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.