1#[derive(serde::Serialize, serde::Deserialize)]
3#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
4pub struct Strategy {
5 #[prost(string, tag = "1")]
6 pub name: ::prost::alloc::string::String,
7 #[prost(string, tag = "2")]
8 pub label: ::prost::alloc::string::String,
9 #[prost(string, tag = "3")]
11 pub interval: ::prost::alloc::string::String,
12 #[prost(string, tag = "4")]
14 pub premise: ::prost::alloc::string::String,
15 #[prost(bool, tag = "5")]
17 pub ranks_a_set: bool,
18 #[prost(uint32, tag = "6")]
20 pub backtests: u32,
21}
22#[derive(serde::Serialize, serde::Deserialize)]
23#[derive(Clone, PartialEq, ::prost::Message)]
24pub struct Strategies {
25 #[prost(message, repeated, tag = "1")]
26 pub strategies: ::prost::alloc::vec::Vec<Strategy>,
27}
28#[derive(serde::Serialize, serde::Deserialize)]
29#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
30pub struct FindingSummary {
31 #[prost(string, tag = "1")]
32 pub id: ::prost::alloc::string::String,
33 #[prost(string, tag = "2")]
35 pub kind: ::prost::alloc::string::String,
36 #[prost(string, tag = "3")]
37 pub subject: ::prost::alloc::string::String,
38 #[prost(string, tag = "4")]
40 pub verdict: ::prost::alloc::string::String,
41 #[prost(string, tag = "5")]
43 pub recorded_at: ::prost::alloc::string::String,
44 #[prost(string, tag = "6")]
46 pub author: ::prost::alloc::string::String,
47 #[prost(string, tag = "7")]
50 pub strategy: ::prost::alloc::string::String,
51 #[prost(string, tag = "8")]
55 pub code_commit: ::prost::alloc::string::String,
56 #[prost(string, tag = "9")]
61 pub ruleset_hash: ::prost::alloc::string::String,
62}
63#[derive(serde::Serialize, serde::Deserialize)]
64#[derive(Clone, PartialEq, ::prost::Message)]
65pub struct Findings {
66 #[prost(message, repeated, tag = "1")]
67 pub findings: ::prost::alloc::vec::Vec<FindingSummary>,
68 #[prost(uint32, tag = "2")]
70 pub unreadable: u32,
71}
72#[derive(serde::Serialize, serde::Deserialize)]
73#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
74pub struct FindingId {
75 #[prost(string, tag = "1")]
76 pub id: ::prost::alloc::string::String,
77}
78#[derive(serde::Serialize, serde::Deserialize)]
79#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
80pub struct FindingIds {
81 #[prost(string, repeated, tag = "1")]
82 pub ids: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
83}
84#[derive(serde::Serialize, serde::Deserialize)]
85#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
86pub struct Advice {
87 #[prost(string, tag = "1")]
89 pub severity: ::prost::alloc::string::String,
90 #[prost(string, tag = "2")]
91 pub finding: ::prost::alloc::string::String,
92 #[prost(string, tag = "3")]
93 pub action: ::prost::alloc::string::String,
94 #[prost(string, tag = "4")]
95 pub evidence: ::prost::alloc::string::String,
96}
97#[derive(serde::Serialize, serde::Deserialize)]
99#[derive(Clone, PartialEq, ::prost::Message)]
100pub struct Finding {
101 #[prost(message, optional, tag = "1")]
102 pub summary: ::core::option::Option<FindingSummary>,
103 #[prost(string, tag = "2")]
105 pub read_this_first: ::prost::alloc::string::String,
106 #[prost(string, repeated, tag = "3")]
107 pub reasons: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
108 #[prost(message, repeated, tag = "4")]
109 pub advice: ::prost::alloc::vec::Vec<Advice>,
110 #[prost(string, tag = "5")]
114 pub detail_json: ::prost::alloc::string::String,
115 #[prost(message, repeated, tag = "6")]
117 pub attachments: ::prost::alloc::vec::Vec<Attachment>,
118}
119#[derive(serde::Serialize, serde::Deserialize)]
122#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
123pub struct Attachment {
124 #[prost(string, tag = "1")]
125 pub name: ::prost::alloc::string::String,
126 #[prost(string, tag = "2")]
127 pub media_type: ::prost::alloc::string::String,
128 #[prost(string, tag = "3")]
130 pub hash: ::prost::alloc::string::String,
131 #[prost(uint64, tag = "4")]
132 pub bytes: u64,
133 #[prost(string, tag = "5")]
135 pub added_at: ::prost::alloc::string::String,
136}
137#[derive(serde::Serialize, serde::Deserialize)]
139#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
140pub struct AttachRequest {
141 #[prost(string, tag = "1")]
142 pub finding_id: ::prost::alloc::string::String,
143 #[prost(string, tag = "2")]
145 pub name: ::prost::alloc::string::String,
146 #[prost(string, tag = "3")]
148 pub media_type: ::prost::alloc::string::String,
149 #[prost(bytes = "vec", tag = "4")]
150 pub data: ::prost::alloc::vec::Vec<u8>,
151}
152#[derive(serde::Serialize, serde::Deserialize)]
153#[derive(Clone, PartialEq, ::prost::Message)]
154pub struct Attachments {
155 #[prost(message, repeated, tag = "1")]
156 pub attachments: ::prost::alloc::vec::Vec<Attachment>,
157}
158#[derive(serde::Serialize, serde::Deserialize)]
159#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
160pub struct AttachmentRef {
161 #[prost(string, tag = "1")]
162 pub finding_id: ::prost::alloc::string::String,
163 #[prost(string, tag = "2")]
164 pub hash: ::prost::alloc::string::String,
165}
166#[derive(serde::Serialize, serde::Deserialize)]
167#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
168pub struct RunRequest {
169 #[prost(string, tag = "1")]
170 pub instrument: ::prost::alloc::string::String,
171 #[prost(string, tag = "2")]
172 pub strategy: ::prost::alloc::string::String,
173 #[prost(string, tag = "3")]
177 pub author: ::prost::alloc::string::String,
178 #[prost(string, tag = "4")]
181 pub origin: ::prost::alloc::string::String,
182}
183#[derive(serde::Serialize, serde::Deserialize)]
185#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
186pub struct BarsRequest {
187 #[prost(string, tag = "1")]
188 pub instrument: ::prost::alloc::string::String,
189 #[prost(string, optional, tag = "2")]
192 pub interval: ::core::option::Option<::prost::alloc::string::String>,
193 #[prost(string, optional, tag = "3")]
195 pub from: ::core::option::Option<::prost::alloc::string::String>,
196 #[prost(string, optional, tag = "4")]
197 pub to: ::core::option::Option<::prost::alloc::string::String>,
198 #[prost(uint32, optional, tag = "5")]
201 pub last: ::core::option::Option<u32>,
202}
203#[derive(serde::Serialize, serde::Deserialize)]
204#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
205pub struct StudyRequest {
206 #[prost(string, tag = "1")]
207 pub instrument: ::prost::alloc::string::String,
208 #[prost(string, optional, tag = "2")]
210 pub strategy: ::core::option::Option<::prost::alloc::string::String>,
211}
212#[derive(serde::Serialize, serde::Deserialize)]
213#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
214pub struct BookRequest {
215 #[prost(string, repeated, tag = "1")]
216 pub instruments: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
217 #[prost(string, optional, tag = "2")]
218 pub strategy: ::core::option::Option<::prost::alloc::string::String>,
219 #[prost(uint32, optional, tag = "3")]
220 pub max_concurrent_positions: ::core::option::Option<u32>,
221 #[prost(uint32, optional, tag = "4")]
222 pub max_per_sector: ::core::option::Option<u32>,
223}
224#[derive(serde::Serialize, serde::Deserialize)]
225#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
226pub struct SharedExperiment {
227 #[prost(string, tag = "1")]
229 pub text: ::prost::alloc::string::String,
230 #[prost(string, tag = "2")]
231 pub instrument: ::prost::alloc::string::String,
232}
233#[derive(serde::Serialize, serde::Deserialize)]
235#[derive(Clone, PartialEq, ::prost::Message)]
236pub struct Point {
237 #[prost(string, tag = "1")]
238 pub at: ::prost::alloc::string::String,
239 #[prost(double, tag = "2")]
240 pub equity: f64,
241}
242#[derive(serde::Serialize, serde::Deserialize)]
245#[derive(Clone, PartialEq, ::prost::Message)]
246pub struct LedgerTrade {
247 #[prost(string, tag = "1")]
249 pub instrument: ::prost::alloc::string::String,
250 #[prost(string, tag = "2")]
251 pub opened: ::prost::alloc::string::String,
252 #[prost(string, tag = "3")]
253 pub closed: ::prost::alloc::string::String,
254 #[prost(string, tag = "4")]
256 pub direction: ::prost::alloc::string::String,
257 #[prost(double, tag = "5")]
258 pub quantity: f64,
259 #[prost(double, tag = "6")]
260 pub entry: f64,
261 #[prost(double, optional, tag = "7")]
262 pub exit: ::core::option::Option<f64>,
263 #[prost(double, tag = "8")]
264 pub pnl: f64,
265 #[prost(double, tag = "9")]
266 pub commission: f64,
267 #[prost(string, tag = "10")]
269 pub exit_reason: ::prost::alloc::string::String,
270 #[prost(string, optional, tag = "11")]
274 pub rule: ::core::option::Option<::prost::alloc::string::String>,
275 #[prost(double, optional, tag = "12")]
276 pub signal: ::core::option::Option<f64>,
277 #[prost(string, optional, tag = "13")]
278 pub regime: ::core::option::Option<::prost::alloc::string::String>,
279 #[prost(double, optional, tag = "14")]
280 pub asked: ::core::option::Option<f64>,
281}
282#[derive(serde::Serialize, serde::Deserialize)]
286#[derive(Clone, PartialEq, ::prost::Message)]
287pub struct ReportRequest {
288 #[prost(string, tag = "1")]
290 pub author: ::prost::alloc::string::String,
291 #[prost(string, tag = "2")]
292 pub origin: ::prost::alloc::string::String,
293 #[prost(string, tag = "3")]
295 pub hypothesis_id: ::prost::alloc::string::String,
296 #[prost(string, tag = "4")]
297 pub claim: ::prost::alloc::string::String,
298 #[prost(string, tag = "5")]
300 pub instrument: ::prost::alloc::string::String,
301 #[prost(string, tag = "6")]
303 pub from: ::prost::alloc::string::String,
304 #[prost(string, tag = "7")]
305 pub to: ::prost::alloc::string::String,
306 #[prost(string, tag = "8")]
308 pub interval: ::prost::alloc::string::String,
309 #[prost(string, tag = "9")]
311 pub dataset_id: ::prost::alloc::string::String,
312 #[prost(string, tag = "10")]
313 pub dataset_version: ::prost::alloc::string::String,
314 #[prost(string, tag = "11")]
316 pub adjustment: ::prost::alloc::string::String,
317 #[prost(string, tag = "12")]
319 pub strategy: ::prost::alloc::string::String,
320 #[prost(map = "string, double", tag = "13")]
321 pub params: ::std::collections::HashMap<::prost::alloc::string::String, f64>,
322 #[prost(double, tag = "14")]
324 pub commission_bps: f64,
325 #[prost(double, tag = "15")]
326 pub slippage_bps: f64,
327 #[prost(double, tag = "16")]
328 pub per_fill: f64,
329 #[prost(double, optional, tag = "17")]
331 pub stop_atr_multiple: ::core::option::Option<f64>,
332 #[prost(double, tag = "18")]
334 pub starting_cash: f64,
335 #[prost(string, tag = "19")]
337 pub engine: ::prost::alloc::string::String,
338 #[prost(message, repeated, tag = "20")]
340 pub strategy_curve: ::prost::alloc::vec::Vec<Point>,
341 #[prost(message, repeated, tag = "21")]
342 pub ledger: ::prost::alloc::vec::Vec<LedgerTrade>,
343 #[prost(message, repeated, tag = "22")]
346 pub benchmark_curve: ::prost::alloc::vec::Vec<Point>,
347 #[prost(uint32, optional, tag = "23")]
349 pub trials: ::core::option::Option<u32>,
350}
351#[derive(serde::Serialize, serde::Deserialize)]
352#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
353pub struct ReportFigure {
354 #[prost(string, tag = "1")]
355 pub finding_id: ::prost::alloc::string::String,
356 #[prost(string, optional, tag = "2")]
359 pub figure: ::core::option::Option<::prost::alloc::string::String>,
360}
361#[derive(serde::Serialize, serde::Deserialize)]
362#[derive(Clone, PartialEq, ::prost::Message)]
363pub struct TradeExport {
364 #[prost(string, tag = "1")]
365 pub name: ::prost::alloc::string::String,
366 #[prost(message, repeated, tag = "2")]
371 pub rows: ::prost::alloc::vec::Vec<TradeRow>,
372}
373#[derive(serde::Serialize, serde::Deserialize)]
375#[derive(Clone, PartialEq, ::prost::Message)]
376pub struct TradeRow {
377 #[prost(string, tag = "1")]
382 pub instrument: ::prost::alloc::string::String,
383 #[prost(string, tag = "2")]
384 pub opened: ::prost::alloc::string::String,
385 #[prost(string, tag = "3")]
386 pub closed: ::prost::alloc::string::String,
387 #[prost(string, tag = "4")]
388 pub direction: ::prost::alloc::string::String,
389 #[prost(double, tag = "5")]
390 pub quantity: f64,
391 #[prost(double, tag = "6")]
392 pub entry: f64,
393 #[prost(double, optional, tag = "7")]
394 pub exit: ::core::option::Option<f64>,
395 #[prost(double, tag = "8")]
396 pub pnl: f64,
397 #[prost(double, tag = "9")]
398 pub commission: f64,
399 #[prost(double, optional, tag = "10")]
400 pub held_days: ::core::option::Option<f64>,
401 #[prost(string, tag = "11")]
402 pub exit_reason: ::prost::alloc::string::String,
403 #[prost(string, optional, tag = "12")]
407 pub rule: ::core::option::Option<::prost::alloc::string::String>,
408 #[prost(double, optional, tag = "13")]
409 pub signal: ::core::option::Option<f64>,
410 #[prost(string, optional, tag = "14")]
411 pub regime: ::core::option::Option<::prost::alloc::string::String>,
412 #[prost(double, optional, tag = "15")]
413 pub asked: ::core::option::Option<f64>,
414}
415#[derive(serde::Serialize, serde::Deserialize)]
417#[derive(Clone, PartialEq, ::prost::Message)]
418pub struct Param {
419 #[prost(string, tag = "1")]
420 pub name: ::prost::alloc::string::String,
421 #[prost(double, repeated, tag = "2")]
422 pub values: ::prost::alloc::vec::Vec<f64>,
423}
424#[derive(serde::Serialize, serde::Deserialize)]
425#[derive(Clone, PartialEq, ::prost::Message)]
426pub struct Fixed {
427 #[prost(string, tag = "1")]
428 pub name: ::prost::alloc::string::String,
429 #[prost(double, tag = "2")]
430 pub value: f64,
431}
432#[derive(serde::Serialize, serde::Deserialize)]
434#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
435pub struct Ruleset {
436 #[prost(string, tag = "1")]
437 pub path: ::prost::alloc::string::String,
438 #[prost(string, tag = "2")]
439 pub name: ::prost::alloc::string::String,
440 #[prost(string, tag = "3")]
441 pub label: ::prost::alloc::string::String,
442 #[prost(string, tag = "4")]
443 pub rule: ::prost::alloc::string::String,
444 #[prost(string, tag = "5")]
445 pub interval: ::prost::alloc::string::String,
446 #[prost(uint32, tag = "6")]
447 pub searches: u32,
448 #[prost(string, optional, tag = "7")]
450 pub problem: ::core::option::Option<::prost::alloc::string::String>,
451}
452#[derive(serde::Serialize, serde::Deserialize)]
453#[derive(Clone, PartialEq, ::prost::Message)]
454pub struct Rulesets {
455 #[prost(message, repeated, tag = "1")]
456 pub rulesets: ::prost::alloc::vec::Vec<Ruleset>,
457}
458#[derive(serde::Serialize, serde::Deserialize)]
459#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
460pub struct RulesetPath {
461 #[prost(string, tag = "1")]
462 pub path: ::prost::alloc::string::String,
463}
464#[derive(serde::Serialize, serde::Deserialize)]
466#[derive(Clone, PartialEq, ::prost::Message)]
467pub struct RulesetForm {
468 #[prost(string, tag = "1")]
469 pub name: ::prost::alloc::string::String,
470 #[prost(string, tag = "2")]
471 pub rule: ::prost::alloc::string::String,
472 #[prost(string, tag = "3")]
473 pub label: ::prost::alloc::string::String,
474 #[prost(string, tag = "4")]
475 pub premise: ::prost::alloc::string::String,
476 #[prost(message, repeated, tag = "5")]
477 pub params: ::prost::alloc::vec::Vec<Param>,
478}
479#[derive(serde::Serialize, serde::Deserialize)]
481#[derive(Clone, PartialEq, ::prost::Message)]
482pub struct Rule {
483 #[prost(string, tag = "1")]
484 pub name: ::prost::alloc::string::String,
485 #[prost(string, tag = "2")]
486 pub label: ::prost::alloc::string::String,
487 #[prost(string, tag = "3")]
488 pub premise: ::prost::alloc::string::String,
489 #[prost(string, tag = "4")]
490 pub interval: ::prost::alloc::string::String,
491 #[prost(message, repeated, tag = "5")]
492 pub fixed: ::prost::alloc::vec::Vec<Fixed>,
493 #[prost(message, repeated, tag = "6")]
494 pub axes: ::prost::alloc::vec::Vec<Param>,
495 #[prost(bool, tag = "7")]
496 pub ranks_a_set: bool,
497 #[prost(bool, tag = "8")]
498 pub trades_options: bool,
499}
500#[derive(serde::Serialize, serde::Deserialize)]
501#[derive(Clone, PartialEq, ::prost::Message)]
502pub struct Rules {
503 #[prost(message, repeated, tag = "1")]
504 pub rules: ::prost::alloc::vec::Vec<Rule>,
505}
506#[derive(serde::Serialize, serde::Deserialize)]
508#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
509pub struct RiskModel {
510 #[prost(string, tag = "1")]
511 pub path: ::prost::alloc::string::String,
512 #[prost(bool, tag = "2")]
513 pub exists: bool,
514 #[prost(string, tag = "3")]
517 pub model_json: ::prost::alloc::string::String,
518 #[prost(string, optional, tag = "4")]
520 pub error: ::core::option::Option<::prost::alloc::string::String>,
521}
522#[derive(serde::Serialize, serde::Deserialize)]
532#[derive(Clone, Copy, PartialEq, ::prost::Message)]
533pub struct AfterTaxView {
534 #[prost(double, tag = "1")]
535 pub strategy_return: f64,
536 #[prost(double, tag = "2")]
537 pub benchmark_return: f64,
538 #[prost(double, tag = "3")]
541 pub excess: f64,
542 #[prost(double, tag = "4")]
543 pub strategy_tax: f64,
544 #[prost(double, tag = "5")]
545 pub benchmark_tax: f64,
546 #[prost(double, tag = "6")]
547 pub short_term_rate: f64,
548 #[prost(double, tag = "7")]
549 pub long_term_rate: f64,
550}
551#[derive(serde::Serialize, serde::Deserialize)]
557#[derive(Clone, Copy, PartialEq, ::prost::Message)]
558pub struct BookView {
559 #[prost(message, optional, tag = "1")]
560 pub metrics: ::core::option::Option<MetricsView>,
561 #[prost(double, tag = "2")]
564 pub diversification: f64,
565}
566#[derive(serde::Serialize, serde::Deserialize)]
572#[derive(Clone, PartialEq, ::prost::Message)]
573pub struct BreadthView {
574 #[prost(string, repeated, tag = "1")]
575 pub instruments: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
576 #[prost(message, repeated, tag = "2")]
579 pub correlations: ::prost::alloc::vec::Vec<CorrelationRow>,
580 #[prost(double, optional, tag = "3")]
581 pub mean_correlation: ::core::option::Option<f64>,
582 #[prost(double, optional, tag = "4")]
584 pub effective: ::core::option::Option<f64>,
585 #[prost(double, optional, tag = "5")]
588 pub overstatement: ::core::option::Option<f64>,
589}
590#[derive(serde::Serialize, serde::Deserialize)]
592#[derive(Clone, PartialEq, ::prost::Message)]
593pub struct ComparisonRowView {
594 #[prost(string, tag = "1")]
595 pub id: ::prost::alloc::string::String,
596 #[prost(string, tag = "2")]
597 pub subject: ::prost::alloc::string::String,
598 #[prost(string, tag = "3")]
599 pub kind: ::prost::alloc::string::String,
600 #[prost(string, tag = "4")]
601 pub strategy_name: ::prost::alloc::string::String,
602 #[prost(string, tag = "5")]
603 pub verdict: ::prost::alloc::string::String,
604 #[prost(string, tag = "6")]
605 pub recorded_at: ::prost::alloc::string::String,
606 #[prost(double, tag = "7")]
607 pub total_return: f64,
608 #[prost(double, tag = "8")]
609 pub excess_return: f64,
610 #[prost(double, optional, tag = "9")]
611 pub sharpe: ::core::option::Option<f64>,
612 #[prost(double, tag = "10")]
613 pub max_drawdown: f64,
614 #[prost(uint32, tag = "11")]
615 pub trades: u32,
616 #[prost(double, optional, tag = "12")]
617 pub win_rate: ::core::option::Option<f64>,
618 #[prost(double, optional, tag = "13")]
619 pub profit_factor: ::core::option::Option<f64>,
620 #[prost(bool, optional, tag = "14")]
622 pub stale: ::core::option::Option<bool>,
623}
624#[derive(serde::Serialize, serde::Deserialize)]
626#[derive(Clone, PartialEq, ::prost::Message)]
627pub struct ComparisonView {
628 #[prost(message, repeated, tag = "1")]
629 pub rows: ::prost::alloc::vec::Vec<ComparisonRowView>,
630 #[prost(message, repeated, tag = "2")]
631 pub curves: ::prost::alloc::vec::Vec<NamedCurveView>,
632 #[prost(double, optional, tag = "3")]
640 pub best_sharpe: ::core::option::Option<f64>,
641 #[prost(double, optional, tag = "4")]
642 pub expected_best_under_null: ::core::option::Option<f64>,
643 #[prost(bool, tag = "5")]
644 pub survived_deflation: bool,
645 #[prost(string, repeated, tag = "6")]
647 pub notes: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
648}
649#[derive(serde::Serialize, serde::Deserialize)]
652#[derive(Clone, PartialEq, ::prost::Message)]
653pub struct CorrelationRow {
654 #[prost(message, repeated, tag = "1")]
655 pub cells: ::prost::alloc::vec::Vec<OptionalDouble>,
656}
657#[derive(serde::Serialize, serde::Deserialize)]
660#[derive(Clone, Copy, PartialEq, ::prost::Message)]
661pub struct CurvePoint {
662 #[prost(int64, tag = "1")]
670 pub time: i64,
671 #[prost(double, tag = "2")]
672 pub value: f64,
673}
674#[derive(serde::Serialize, serde::Deserialize)]
676#[derive(Clone, PartialEq, ::prost::Message)]
677pub struct DivergenceView {
678 #[prost(string, tag = "1")]
679 pub what: ::prost::alloc::string::String,
680 #[prost(uint32, optional, tag = "2")]
681 pub at: ::core::option::Option<u32>,
682 #[prost(string, optional, tag = "3")]
683 pub when: ::core::option::Option<::prost::alloc::string::String>,
684 #[prost(double, tag = "4")]
685 pub recorded: f64,
686 #[prost(double, tag = "5")]
687 pub replayed: f64,
688 #[prost(double, tag = "6")]
691 pub relative: f64,
692}
693#[derive(serde::Serialize, serde::Deserialize)]
694#[derive(Clone, Copy, PartialEq, ::prost::Message)]
695pub struct DividendGapView {
696 #[prost(uint32, tag = "1")]
701 pub events: u32,
702 #[prost(double, tag = "2")]
703 pub strategy_income: f64,
704 #[prost(double, tag = "3")]
705 pub benchmark_income: f64,
706 #[prost(double, tag = "4")]
709 pub overstatement: f64,
710 #[prost(double, optional, tag = "5")]
718 pub corrected_excess: ::core::option::Option<f64>,
719 #[prost(bool, tag = "6")]
722 pub complete: bool,
723 #[prost(uint32, tag = "7")]
724 pub covered: u32,
725 #[prost(uint32, tag = "8")]
726 pub instruments: u32,
727}
728#[derive(serde::Serialize, serde::Deserialize)]
730#[derive(Clone, PartialEq, ::prost::Message)]
731pub struct FoldView {
732 #[prost(string, tag = "1")]
733 pub chose_on: ::prost::alloc::string::String,
734 #[prost(string, tag = "2")]
735 pub judged_on: ::prost::alloc::string::String,
736 #[prost(message, repeated, tag = "3")]
737 pub params: ::prost::alloc::vec::Vec<NamedNumber>,
738 #[prost(double, tag = "4")]
739 pub strategy_return: f64,
740 #[prost(double, tag = "5")]
741 pub benchmark_return: f64,
742 #[prost(uint32, tag = "6")]
743 pub trades: u32,
744 #[prost(bool, tag = "7")]
748 pub survived_deflation: bool,
749}
750#[derive(serde::Serialize, serde::Deserialize)]
751#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
752pub struct HistoryEntryView {
753 #[prost(string, tag = "1")]
754 pub id: ::prost::alloc::string::String,
755 #[prost(string, tag = "2")]
756 pub kind: ::prost::alloc::string::String,
757 #[prost(string, tag = "3")]
758 pub subject: ::prost::alloc::string::String,
759 #[prost(string, tag = "4")]
760 pub verdict: ::prost::alloc::string::String,
761 #[prost(string, tag = "5")]
762 pub recorded_at: ::prost::alloc::string::String,
763 #[prost(bool, optional, tag = "6")]
767 pub stale: ::core::option::Option<bool>,
768 #[prost(string, optional, tag = "7")]
771 pub agent: ::core::option::Option<::prost::alloc::string::String>,
772 #[prost(string, optional, tag = "8")]
774 pub origin: ::core::option::Option<::prost::alloc::string::String>,
775 #[prost(uint32, optional, tag = "9")]
777 pub trials: ::core::option::Option<u32>,
778 #[prost(uint32, tag = "10")]
780 pub attachments: u32,
781 #[prost(string, tag = "11")]
785 pub code_commit: ::prost::alloc::string::String,
786 #[prost(string, tag = "12")]
787 pub ruleset_hash: ::prost::alloc::string::String,
788 #[prost(string, tag = "13")]
791 pub stale_reason: ::prost::alloc::string::String,
792}
793#[derive(serde::Serialize, serde::Deserialize)]
796#[derive(Clone, PartialEq, ::prost::Message)]
797pub struct HistoryView {
798 #[prost(message, repeated, tag = "1")]
799 pub entries: ::prost::alloc::vec::Vec<HistoryEntryView>,
800 #[prost(message, repeated, tag = "2")]
801 pub unreadable: ::prost::alloc::vec::Vec<UnreadableView>,
802}
803#[derive(serde::Serialize, serde::Deserialize)]
810#[derive(Clone, PartialEq, ::prost::Message)]
811pub struct MemberView {
812 #[prost(string, tag = "1")]
813 pub instrument: ::prost::alloc::string::String,
814 #[prost(uint32, tag = "2")]
815 pub trades: u32,
816 #[prost(double, tag = "3")]
818 pub pnl: f64,
819 #[prost(double, optional, tag = "4")]
824 pub share: ::core::option::Option<f64>,
825 #[prost(bool, tag = "5")]
830 pub silent: bool,
831}
832#[derive(serde::Serialize, serde::Deserialize)]
833#[derive(Clone, Copy, PartialEq, ::prost::Message)]
834pub struct MetricsView {
835 #[prost(double, tag = "1")]
836 pub total_return: f64,
837 #[prost(double, tag = "2")]
838 pub cagr: f64,
839 #[prost(double, tag = "3")]
840 pub max_drawdown: f64,
841 #[prost(double, tag = "4")]
842 pub volatility: f64,
843 #[prost(double, optional, tag = "5")]
844 pub sharpe: ::core::option::Option<f64>,
845 #[prost(double, optional, tag = "6")]
846 pub sortino: ::core::option::Option<f64>,
847 #[prost(double, optional, tag = "7")]
848 pub calmar: ::core::option::Option<f64>,
849 #[prost(double, optional, tag = "8")]
854 pub psr: ::core::option::Option<f64>,
855 #[prost(uint32, tag = "9")]
856 pub trades: u32,
857}
858#[derive(serde::Serialize, serde::Deserialize)]
860#[derive(Clone, Copy, PartialEq, ::prost::Message)]
861pub struct MonthlyReturnView {
862 #[prost(int32, tag = "1")]
863 pub year: i32,
864 #[prost(uint32, tag = "2")]
865 pub month: u32,
866 #[prost(double, tag = "3")]
867 pub value: f64,
868}
869#[derive(serde::Serialize, serde::Deserialize)]
871#[derive(Clone, PartialEq, ::prost::Message)]
872pub struct NamedCurveView {
873 #[prost(string, tag = "1")]
874 pub name: ::prost::alloc::string::String,
875 #[prost(message, repeated, tag = "2")]
876 pub points: ::prost::alloc::vec::Vec<CurvePoint>,
877}
878#[derive(serde::Serialize, serde::Deserialize)]
890#[derive(Clone, PartialEq, ::prost::Message)]
891pub struct NamedNumber {
892 #[prost(string, tag = "1")]
893 pub name: ::prost::alloc::string::String,
894 #[prost(double, tag = "2")]
895 pub value: f64,
896}
897#[derive(serde::Serialize, serde::Deserialize)]
898#[derive(Clone, Copy, PartialEq, ::prost::Message)]
899pub struct OptionalDouble {
900 #[prost(double, optional, tag = "1")]
901 pub value: ::core::option::Option<f64>,
902}
903#[derive(serde::Serialize, serde::Deserialize)]
905#[derive(Clone, PartialEq, ::prost::Message)]
906pub struct OutcomeView {
907 #[prost(string, tag = "1")]
908 pub instrument: ::prost::alloc::string::String,
909 #[prost(double, tag = "2")]
910 pub strategy_return: f64,
911 #[prost(double, tag = "3")]
912 pub benchmark_return: f64,
913 #[prost(double, tag = "4")]
914 pub excess_return: f64,
915 #[prost(double, tag = "5")]
916 pub max_drawdown: f64,
917 #[prost(uint32, tag = "6")]
918 pub trades: u32,
919}
920#[derive(serde::Serialize, serde::Deserialize)]
922#[derive(Clone, PartialEq, ::prost::Message)]
923pub struct PanelView {
924 #[prost(string, tag = "1")]
929 pub id: ::prost::alloc::string::String,
930 #[prost(string, tag = "2")]
931 pub verdict: ::prost::alloc::string::String,
932 #[prost(string, repeated, tag = "3")]
933 pub reasons: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
934 #[prost(message, repeated, tag = "4")]
935 pub recommendations: ::prost::alloc::vec::Vec<RecommendationView>,
936 #[prost(uint32, tag = "5")]
937 pub instruments: u32,
938 #[prost(uint32, tag = "6")]
939 pub total_trades: u32,
940 #[prost(double, tag = "7")]
941 pub mean_excess_return: f64,
942 #[prost(uint32, tag = "8")]
943 pub beat_benchmark: u32,
944 #[prost(double, tag = "9")]
945 pub mean_max_drawdown: f64,
946 #[prost(message, optional, tag = "10")]
947 pub breadth: ::core::option::Option<BreadthView>,
948 #[prost(message, optional, tag = "11")]
949 pub book: ::core::option::Option<BookView>,
950 #[prost(double, tag = "12")]
951 pub worst_max_drawdown: f64,
952 #[prost(uint32, tag = "13")]
953 pub trials: u32,
954 #[prost(double, tag = "14")]
955 pub best_sharpe: f64,
956 #[prost(double, optional, tag = "15")]
957 pub expected_best_under_null: ::core::option::Option<f64>,
958 #[prost(bool, tag = "16")]
959 pub survived_deflation: bool,
960 #[prost(string, tag = "17")]
961 pub in_sample: ::prost::alloc::string::String,
962 #[prost(string, tag = "18")]
963 pub out_of_sample: ::prost::alloc::string::String,
964 #[prost(message, repeated, tag = "19")]
965 pub selected_params: ::prost::alloc::vec::Vec<NamedNumber>,
966 #[prost(message, repeated, tag = "20")]
967 pub per_instrument: ::prost::alloc::vec::Vec<OutcomeView>,
968 #[prost(string, repeated, tag = "21")]
969 pub failures: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
970 #[prost(string, tag = "22")]
971 pub dataset_version: ::prost::alloc::string::String,
972 #[prost(string, tag = "23")]
973 pub strategy_name: ::prost::alloc::string::String,
974 #[prost(double, tag = "24")]
975 pub starting_cash: f64,
976 #[prost(double, tag = "25")]
977 pub commission_bps: f64,
978 #[prost(double, tag = "26")]
979 pub slippage_bps: f64,
980 #[prost(string, tag = "27")]
981 pub engine: ::prost::alloc::string::String,
982}
983#[derive(serde::Serialize, serde::Deserialize)]
985#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
986pub struct RecommendationView {
987 #[prost(string, tag = "1")]
988 pub severity: ::prost::alloc::string::String,
989 #[prost(string, tag = "2")]
990 pub finding: ::prost::alloc::string::String,
991 #[prost(string, tag = "3")]
992 pub action: ::prost::alloc::string::String,
993 #[prost(string, tag = "4")]
994 pub evidence: ::prost::alloc::string::String,
995}
996#[derive(serde::Serialize, serde::Deserialize)]
998#[derive(Clone, PartialEq, ::prost::Message)]
999pub struct RecordView {
1000 #[prost(oneof = "record_view::Of", tags = "1, 2, 3, 4")]
1001 pub of: ::core::option::Option<record_view::Of>,
1002}
1003pub mod record_view {
1005 #[derive(serde::Serialize, serde::Deserialize)]
1006 #[derive(Clone, PartialEq, ::prost::Oneof)]
1007 pub enum Of {
1008 #[prost(message, tag = "1")]
1009 Study(super::StudyView),
1010 #[prost(message, tag = "2")]
1011 Panel(super::PanelView),
1012 #[prost(message, tag = "3")]
1013 Walkforward(super::WalkForwardView),
1014 #[prost(message, tag = "4")]
1015 Reported(super::ReportedView),
1016 }
1017}
1018#[derive(serde::Serialize, serde::Deserialize)]
1023#[derive(Clone, PartialEq, ::prost::Message)]
1024pub struct ReplayView {
1025 #[prost(string, tag = "1")]
1029 pub outcome: ::prost::alloc::string::String,
1030 #[prost(bool, tag = "2")]
1034 pub holds: bool,
1035 #[prost(string, tag = "3")]
1036 pub detail: ::prost::alloc::string::String,
1037 #[prost(message, optional, tag = "4")]
1038 pub divergence: ::core::option::Option<DivergenceView>,
1039}
1040#[derive(serde::Serialize, serde::Deserialize)]
1044#[derive(Clone, PartialEq, ::prost::Message)]
1045pub struct ReportedView {
1046 #[prost(string, tag = "1")]
1047 pub id: ::prost::alloc::string::String,
1048 #[prost(string, tag = "2")]
1049 pub hypothesis: ::prost::alloc::string::String,
1050 #[prost(string, tag = "3")]
1051 pub claim: ::prost::alloc::string::String,
1052 #[prost(string, tag = "4")]
1053 pub instrument: ::prost::alloc::string::String,
1054 #[prost(string, tag = "5")]
1055 pub engine: ::prost::alloc::string::String,
1056 #[prost(string, tag = "6")]
1057 pub from: ::prost::alloc::string::String,
1058 #[prost(string, tag = "7")]
1059 pub to: ::prost::alloc::string::String,
1060 #[prost(string, tag = "8")]
1061 pub interval: ::prost::alloc::string::String,
1062 #[prost(string, tag = "9")]
1064 pub dataset: ::prost::alloc::string::String,
1065 #[prost(string, tag = "10")]
1066 pub strategy: ::prost::alloc::string::String,
1067 #[prost(string, tag = "11")]
1068 pub verdict: ::prost::alloc::string::String,
1069 #[prost(string, repeated, tag = "12")]
1070 pub reasons: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1071 #[prost(uint32, tag = "13")]
1072 pub trades: u32,
1073 #[prost(uint32, optional, tag = "14")]
1074 pub trials: ::core::option::Option<u32>,
1075 #[prost(double, optional, tag = "15")]
1077 pub total_return: ::core::option::Option<f64>,
1078 #[prost(double, optional, tag = "16")]
1079 pub excess_return: ::core::option::Option<f64>,
1080 #[prost(double, optional, tag = "17")]
1081 pub sharpe: ::core::option::Option<f64>,
1082 #[prost(double, optional, tag = "18")]
1083 pub max_drawdown: ::core::option::Option<f64>,
1084 #[prost(string, tag = "19")]
1085 pub recorded_at: ::prost::alloc::string::String,
1086 #[prost(string, tag = "20")]
1087 pub author: ::prost::alloc::string::String,
1088 #[prost(message, repeated, tag = "21")]
1090 pub attachments: ::prost::alloc::vec::Vec<Attachment>,
1091}
1092#[derive(serde::Serialize, serde::Deserialize)]
1094#[derive(Clone, PartialEq, ::prost::Message)]
1095pub struct StabilityView {
1096 #[prost(string, tag = "1")]
1097 pub axis: ::prost::alloc::string::String,
1098 #[prost(uint32, tag = "2")]
1099 pub distinct: u32,
1100 #[prost(double, tag = "3")]
1101 pub modal: f64,
1102 #[prost(double, tag = "4")]
1103 pub modal_share: f64,
1104}
1105#[derive(serde::Serialize, serde::Deserialize)]
1107#[derive(Clone, PartialEq, ::prost::Message)]
1108pub struct StudyView {
1109 #[prost(string, tag = "1")]
1114 pub id: ::prost::alloc::string::String,
1115 #[prost(string, tag = "2")]
1116 pub instrument: ::prost::alloc::string::String,
1117 #[prost(string, repeated, tag = "3")]
1126 pub instruments: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1127 #[prost(message, repeated, tag = "4")]
1129 pub members: ::prost::alloc::vec::Vec<MemberView>,
1130 #[prost(string, tag = "5")]
1131 pub verdict: ::prost::alloc::string::String,
1132 #[prost(string, repeated, tag = "6")]
1133 pub reasons: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1134 #[prost(uint32, tag = "7")]
1135 pub trials: u32,
1136 #[prost(uint32, tag = "8")]
1139 pub prior_trials: u32,
1140 #[prost(double, tag = "9")]
1141 pub best_sharpe: f64,
1142 #[prost(double, optional, tag = "10")]
1143 pub expected_best_under_null: ::core::option::Option<f64>,
1144 #[prost(bool, tag = "11")]
1145 pub survived_deflation: bool,
1146 #[prost(message, optional, tag = "12")]
1148 pub surface: ::core::option::Option<SurfaceView>,
1149 #[prost(string, tag = "13")]
1150 pub in_sample: ::prost::alloc::string::String,
1151 #[prost(string, tag = "14")]
1152 pub out_of_sample: ::prost::alloc::string::String,
1153 #[prost(message, repeated, tag = "15")]
1154 pub selected_params: ::prost::alloc::vec::Vec<NamedNumber>,
1155 #[prost(message, optional, tag = "16")]
1156 pub strategy: ::core::option::Option<MetricsView>,
1157 #[prost(message, optional, tag = "17")]
1158 pub benchmark: ::core::option::Option<MetricsView>,
1159 #[prost(double, tag = "18")]
1163 pub excess_return: f64,
1164 #[prost(message, optional, tag = "19")]
1170 pub dividend_gap: ::core::option::Option<DividendGapView>,
1171 #[prost(message, optional, tag = "20")]
1175 pub after_tax: ::core::option::Option<AfterTaxView>,
1176 #[prost(message, repeated, tag = "21")]
1180 pub strategy_curve: ::prost::alloc::vec::Vec<CurvePoint>,
1181 #[prost(message, repeated, tag = "22")]
1182 pub benchmark_curve: ::prost::alloc::vec::Vec<CurvePoint>,
1183 #[prost(message, repeated, tag = "23")]
1190 pub price: ::prost::alloc::vec::Vec<CandlePoint>,
1191 #[prost(message, repeated, tag = "24")]
1192 pub markers: ::prost::alloc::vec::Vec<TradeMarkerView>,
1193 #[prost(message, repeated, tag = "25")]
1202 pub alongside_charts: ::prost::alloc::vec::Vec<InstrumentChartView>,
1203 #[prost(message, repeated, tag = "26")]
1205 pub underwater: ::prost::alloc::vec::Vec<CurvePoint>,
1206 #[prost(message, repeated, tag = "27")]
1208 pub data_findings: ::prost::alloc::vec::Vec<
1209 super::super::market::v1::DataFindingView,
1210 >,
1211 #[prost(message, repeated, tag = "28")]
1213 pub trades: ::prost::alloc::vec::Vec<TradeRowView>,
1214 #[prost(message, repeated, tag = "29")]
1217 pub monthly: ::prost::alloc::vec::Vec<MonthlyReturnView>,
1218 #[prost(message, optional, tag = "30")]
1220 pub trades_detail: ::core::option::Option<TradesView>,
1221 #[prost(message, repeated, tag = "31")]
1227 pub recommendations: ::prost::alloc::vec::Vec<RecommendationView>,
1228 #[prost(string, tag = "32")]
1231 pub dataset_version: ::prost::alloc::string::String,
1232 #[prost(string, tag = "33")]
1233 pub strategy_name: ::prost::alloc::string::String,
1234 #[prost(double, tag = "34")]
1235 pub starting_cash: f64,
1236 #[prost(double, tag = "35")]
1237 pub commission_bps: f64,
1238 #[prost(double, tag = "36")]
1239 pub slippage_bps: f64,
1240 #[prost(string, tag = "37")]
1241 pub engine: ::prost::alloc::string::String,
1242}
1243#[derive(serde::Serialize, serde::Deserialize)]
1245#[derive(Clone, Copy, PartialEq, ::prost::Message)]
1246pub struct SurfaceCell {
1247 #[prost(double, tag = "1")]
1248 pub x: f64,
1249 #[prost(double, tag = "2")]
1250 pub y: f64,
1251 #[prost(double, tag = "3")]
1252 pub sharpe: f64,
1253 #[prost(bool, tag = "4")]
1255 pub selected: bool,
1256 #[prost(bool, tag = "5")]
1262 pub above_null: bool,
1263}
1264#[derive(serde::Serialize, serde::Deserialize)]
1275#[derive(Clone, PartialEq, ::prost::Message)]
1276pub struct SurfaceView {
1277 #[prost(string, tag = "1")]
1279 pub x_axis: ::prost::alloc::string::String,
1280 #[prost(string, tag = "2")]
1281 pub y_axis: ::prost::alloc::string::String,
1282 #[prost(double, repeated, tag = "3")]
1283 pub x_values: ::prost::alloc::vec::Vec<f64>,
1284 #[prost(double, repeated, tag = "4")]
1285 pub y_values: ::prost::alloc::vec::Vec<f64>,
1286 #[prost(message, repeated, tag = "5")]
1287 pub cells: ::prost::alloc::vec::Vec<SurfaceCell>,
1288 #[prost(double, optional, tag = "6")]
1291 pub null_bar: ::core::option::Option<f64>,
1292 #[prost(double, tag = "7")]
1293 pub best: f64,
1294 #[prost(string, repeated, tag = "8")]
1297 pub collapsed: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1298}
1299#[derive(serde::Serialize, serde::Deserialize)]
1301#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
1302pub struct TradeMarkerView {
1303 #[prost(int64, tag = "1")]
1304 pub time: i64,
1305 #[prost(string, tag = "2")]
1307 pub kind: ::prost::alloc::string::String,
1308 #[prost(string, tag = "3")]
1311 pub reason: ::prost::alloc::string::String,
1312 #[prost(string, tag = "4")]
1313 pub label: ::prost::alloc::string::String,
1314}
1315#[derive(serde::Serialize, serde::Deserialize)]
1324#[derive(Clone, PartialEq, ::prost::Message)]
1325pub struct TradeRowView {
1326 #[prost(string, tag = "1")]
1332 pub instrument: ::prost::alloc::string::String,
1333 #[prost(string, tag = "2")]
1334 pub opened: ::prost::alloc::string::String,
1335 #[prost(string, tag = "3")]
1337 pub closed: ::prost::alloc::string::String,
1338 #[prost(string, tag = "4")]
1339 pub direction: ::prost::alloc::string::String,
1340 #[prost(double, tag = "5")]
1341 pub quantity: f64,
1342 #[prost(double, tag = "6")]
1343 pub entry: f64,
1344 #[prost(double, optional, tag = "7")]
1347 pub exit: ::core::option::Option<f64>,
1348 #[prost(double, tag = "8")]
1349 pub pnl: f64,
1350 #[prost(double, tag = "9")]
1351 pub commission: f64,
1352 #[prost(double, optional, tag = "10")]
1356 pub held_days: ::core::option::Option<f64>,
1357 #[prost(string, tag = "11")]
1359 pub exit_reason: ::prost::alloc::string::String,
1360 #[prost(string, optional, tag = "12")]
1364 pub rule: ::core::option::Option<::prost::alloc::string::String>,
1365 #[prost(double, optional, tag = "13")]
1366 pub signal: ::core::option::Option<f64>,
1367 #[prost(string, optional, tag = "14")]
1368 pub regime: ::core::option::Option<::prost::alloc::string::String>,
1369 #[prost(double, optional, tag = "15")]
1370 pub asked: ::core::option::Option<f64>,
1371}
1372#[derive(serde::Serialize, serde::Deserialize)]
1378#[derive(Clone, Copy, PartialEq, ::prost::Message)]
1379pub struct TradesView {
1380 #[prost(uint32, tag = "1")]
1381 pub closed: u32,
1382 #[prost(uint32, tag = "2")]
1383 pub still_open: u32,
1384 #[prost(double, optional, tag = "3")]
1385 pub win_rate: ::core::option::Option<f64>,
1386 #[prost(double, optional, tag = "4")]
1387 pub profit_factor: ::core::option::Option<f64>,
1388 #[prost(double, optional, tag = "5")]
1389 pub expectancy: ::core::option::Option<f64>,
1390 #[prost(double, optional, tag = "6")]
1391 pub average_win: ::core::option::Option<f64>,
1392 #[prost(double, optional, tag = "7")]
1393 pub average_loss: ::core::option::Option<f64>,
1394 #[prost(double, optional, tag = "8")]
1397 pub average_holding_days: ::core::option::Option<f64>,
1398 #[prost(double, tag = "9")]
1405 pub fees_paid: f64,
1406 #[prost(double, tag = "10")]
1409 pub fees_fraction: f64,
1410 #[prost(uint32, tag = "11")]
1411 pub signal_exits: u32,
1412 #[prost(uint32, tag = "12")]
1413 pub stop_exits: u32,
1414}
1415#[derive(serde::Serialize, serde::Deserialize)]
1421#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
1422pub struct UnreadableView {
1423 #[prost(string, tag = "1")]
1424 pub id: ::prost::alloc::string::String,
1425 #[prost(string, tag = "2")]
1426 pub reason: ::prost::alloc::string::String,
1427}
1428#[derive(serde::Serialize, serde::Deserialize)]
1430#[derive(Clone, PartialEq, ::prost::Message)]
1431pub struct WalkForwardView {
1432 #[prost(string, tag = "1")]
1437 pub id: ::prost::alloc::string::String,
1438 #[prost(string, tag = "2")]
1439 pub instrument: ::prost::alloc::string::String,
1440 #[prost(string, tag = "3")]
1441 pub verdict: ::prost::alloc::string::String,
1442 #[prost(string, repeated, tag = "4")]
1443 pub reasons: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1444 #[prost(message, repeated, tag = "5")]
1445 pub recommendations: ::prost::alloc::vec::Vec<RecommendationView>,
1446 #[prost(message, repeated, tag = "6")]
1447 pub folds: ::prost::alloc::vec::Vec<FoldView>,
1448 #[prost(uint32, tag = "7")]
1449 pub folds_surviving_deflation: u32,
1450 #[prost(uint32, tag = "8")]
1453 pub folds_without_trades: u32,
1454 #[prost(message, repeated, tag = "9")]
1456 pub stability: ::prost::alloc::vec::Vec<StabilityView>,
1457 #[prost(message, optional, tag = "10")]
1458 pub strategy: ::core::option::Option<MetricsView>,
1459 #[prost(message, optional, tag = "11")]
1460 pub benchmark: ::core::option::Option<MetricsView>,
1461 #[prost(double, tag = "12")]
1462 pub excess_return: f64,
1463 #[prost(message, repeated, tag = "13")]
1464 pub strategy_curve: ::prost::alloc::vec::Vec<CurvePoint>,
1465 #[prost(message, repeated, tag = "14")]
1466 pub benchmark_curve: ::prost::alloc::vec::Vec<CurvePoint>,
1467 #[prost(message, repeated, tag = "15")]
1468 pub price: ::prost::alloc::vec::Vec<CandlePoint>,
1469 #[prost(message, repeated, tag = "16")]
1470 pub markers: ::prost::alloc::vec::Vec<TradeMarkerView>,
1471 #[prost(message, repeated, tag = "17")]
1472 pub underwater: ::prost::alloc::vec::Vec<CurvePoint>,
1473 #[prost(message, repeated, tag = "18")]
1475 pub data_findings: ::prost::alloc::vec::Vec<
1476 super::super::market::v1::DataFindingView,
1477 >,
1478 #[prost(message, repeated, tag = "19")]
1479 pub trades: ::prost::alloc::vec::Vec<TradeRowView>,
1480 #[prost(message, optional, tag = "20")]
1481 pub trades_detail: ::core::option::Option<TradesView>,
1482 #[prost(int64, tag = "21")]
1483 pub in_sample_days: i64,
1484 #[prost(int64, tag = "22")]
1485 pub step_days: i64,
1486 #[prost(bool, tag = "23")]
1487 pub anchored: bool,
1488 #[prost(string, tag = "24")]
1489 pub dataset_version: ::prost::alloc::string::String,
1490 #[prost(string, tag = "25")]
1491 pub strategy_name: ::prost::alloc::string::String,
1492 #[prost(double, tag = "26")]
1493 pub starting_cash: f64,
1494 #[prost(double, tag = "27")]
1495 pub commission_bps: f64,
1496 #[prost(double, tag = "28")]
1497 pub slippage_bps: f64,
1498 #[prost(string, tag = "29")]
1499 pub engine: ::prost::alloc::string::String,
1500}
1501#[derive(serde::Serialize, serde::Deserialize)]
1504#[derive(Clone, PartialEq, ::prost::Message)]
1505pub struct BarView {
1506 #[prost(string, tag = "1")]
1508 pub at: ::prost::alloc::string::String,
1509 #[prost(double, tag = "2")]
1510 pub open: f64,
1511 #[prost(double, tag = "3")]
1512 pub high: f64,
1513 #[prost(double, tag = "4")]
1514 pub low: f64,
1515 #[prost(double, tag = "5")]
1516 pub close: f64,
1517 #[prost(double, tag = "6")]
1518 pub volume: f64,
1519}
1520#[derive(serde::Serialize, serde::Deserialize)]
1521#[derive(Clone, PartialEq, ::prost::Message)]
1522pub struct BarsView {
1523 #[prost(string, tag = "1")]
1524 pub instrument: ::prost::alloc::string::String,
1525 #[prost(string, tag = "2")]
1526 pub interval: ::prost::alloc::string::String,
1527 #[prost(message, repeated, tag = "3")]
1528 pub bars: ::prost::alloc::vec::Vec<BarView>,
1529}
1530#[derive(serde::Serialize, serde::Deserialize)]
1535#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
1536pub struct RegimePointView {
1537 #[prost(string, tag = "1")]
1538 pub at: ::prost::alloc::string::String,
1539 #[prost(string, optional, tag = "2")]
1540 pub regime: ::core::option::Option<::prost::alloc::string::String>,
1541}
1542#[derive(serde::Serialize, serde::Deserialize)]
1543#[derive(Clone, PartialEq, ::prost::Message)]
1544pub struct RegimeView {
1545 #[prost(string, tag = "1")]
1546 pub instrument: ::prost::alloc::string::String,
1547 #[prost(string, tag = "2")]
1548 pub interval: ::prost::alloc::string::String,
1549 #[prost(uint32, tag = "3")]
1551 pub lookback: u32,
1552 #[prost(string, optional, tag = "4")]
1554 pub current: ::core::option::Option<::prost::alloc::string::String>,
1555 #[prost(message, repeated, tag = "5")]
1556 pub points: ::prost::alloc::vec::Vec<RegimePointView>,
1557 #[prost(map = "string, uint32", tag = "6")]
1559 pub shares: ::std::collections::HashMap<::prost::alloc::string::String, u32>,
1560}
1561#[derive(serde::Serialize, serde::Deserialize)]
1562#[derive(Clone, Copy, PartialEq, ::prost::Message)]
1563pub struct CandlePoint {
1564 #[prost(int64, tag = "1")]
1565 pub time: i64,
1566 #[prost(double, tag = "2")]
1567 pub open: f64,
1568 #[prost(double, tag = "3")]
1569 pub high: f64,
1570 #[prost(double, tag = "4")]
1571 pub low: f64,
1572 #[prost(double, tag = "5")]
1573 pub close: f64,
1574}
1575#[derive(serde::Serialize, serde::Deserialize)]
1581#[derive(Clone, PartialEq, ::prost::Message)]
1582pub struct InstrumentChartView {
1583 #[prost(string, tag = "1")]
1584 pub instrument: ::prost::alloc::string::String,
1585 #[prost(message, repeated, tag = "2")]
1586 pub price: ::prost::alloc::vec::Vec<CandlePoint>,
1587 #[prost(message, repeated, tag = "3")]
1588 pub markers: ::prost::alloc::vec::Vec<TradeMarkerView>,
1589}
1590#[derive(serde::Serialize, serde::Deserialize)]
1593#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
1594pub struct ResearchProblemView {
1595 #[prost(string, tag = "1")]
1597 pub path: ::prost::alloc::string::String,
1598 #[prost(uint32, tag = "2")]
1599 pub line: u32,
1600 #[prost(string, tag = "3")]
1602 pub severity: ::prost::alloc::string::String,
1603 #[prost(string, tag = "4")]
1604 pub message: ::prost::alloc::string::String,
1605 #[prost(string, tag = "5")]
1607 pub finding: ::prost::alloc::string::String,
1608}
1609#[derive(serde::Serialize, serde::Deserialize)]
1614#[derive(Clone, PartialEq, ::prost::Message)]
1615pub struct ProblemsView {
1616 #[prost(message, repeated, tag = "1")]
1617 pub problems: ::prost::alloc::vec::Vec<ResearchProblemView>,
1618}