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)]
205#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
206pub struct RankRequest {
207 #[prost(string, optional, tag = "1")]
209 pub rule: ::core::option::Option<::prost::alloc::string::String>,
210 #[prost(string, optional, tag = "2")]
212 pub instrument: ::core::option::Option<::prost::alloc::string::String>,
213}
214#[derive(serde::Serialize, serde::Deserialize)]
216#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
217pub struct ReviewRequest {
218 #[prost(string, optional, tag = "1")]
220 pub day: ::core::option::Option<::prost::alloc::string::String>,
221}
222#[derive(serde::Serialize, serde::Deserialize)]
223#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
224pub struct StudyRequest {
225 #[prost(string, tag = "1")]
226 pub instrument: ::prost::alloc::string::String,
227 #[prost(string, optional, tag = "2")]
229 pub strategy: ::core::option::Option<::prost::alloc::string::String>,
230}
231#[derive(serde::Serialize, serde::Deserialize)]
232#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
233pub struct BookRequest {
234 #[prost(string, repeated, tag = "1")]
235 pub instruments: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
236 #[prost(string, optional, tag = "2")]
237 pub strategy: ::core::option::Option<::prost::alloc::string::String>,
238 #[prost(uint32, optional, tag = "3")]
239 pub max_concurrent_positions: ::core::option::Option<u32>,
240 #[prost(uint32, optional, tag = "4")]
241 pub max_per_sector: ::core::option::Option<u32>,
242}
243#[derive(serde::Serialize, serde::Deserialize)]
245#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
246pub struct PanelRequest {
247 #[prost(string, tag = "1")]
248 pub universe: ::prost::alloc::string::String,
249 #[prost(string, optional, tag = "2")]
251 pub strategy: ::core::option::Option<::prost::alloc::string::String>,
252}
253#[derive(serde::Serialize, serde::Deserialize)]
254#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
255pub struct SharedExperiment {
256 #[prost(string, tag = "1")]
258 pub text: ::prost::alloc::string::String,
259 #[prost(string, tag = "2")]
260 pub instrument: ::prost::alloc::string::String,
261}
262#[derive(serde::Serialize, serde::Deserialize)]
264#[derive(Clone, PartialEq, ::prost::Message)]
265pub struct Point {
266 #[prost(string, tag = "1")]
267 pub at: ::prost::alloc::string::String,
268 #[prost(double, tag = "2")]
269 pub equity: f64,
270}
271#[derive(serde::Serialize, serde::Deserialize)]
274#[derive(Clone, PartialEq, ::prost::Message)]
275pub struct LedgerTrade {
276 #[prost(string, tag = "1")]
278 pub instrument: ::prost::alloc::string::String,
279 #[prost(string, tag = "2")]
280 pub opened: ::prost::alloc::string::String,
281 #[prost(string, tag = "3")]
282 pub closed: ::prost::alloc::string::String,
283 #[prost(string, tag = "4")]
285 pub direction: ::prost::alloc::string::String,
286 #[prost(double, tag = "5")]
287 pub quantity: f64,
288 #[prost(double, tag = "6")]
289 pub entry: f64,
290 #[prost(double, optional, tag = "7")]
291 pub exit: ::core::option::Option<f64>,
292 #[prost(double, tag = "8")]
293 pub pnl: f64,
294 #[prost(double, tag = "9")]
295 pub commission: f64,
296 #[prost(string, tag = "10")]
298 pub exit_reason: ::prost::alloc::string::String,
299 #[prost(string, optional, tag = "11")]
303 pub rule: ::core::option::Option<::prost::alloc::string::String>,
304 #[prost(double, optional, tag = "12")]
305 pub signal: ::core::option::Option<f64>,
306 #[prost(string, optional, tag = "13")]
307 pub regime: ::core::option::Option<::prost::alloc::string::String>,
308 #[prost(double, optional, tag = "14")]
309 pub asked: ::core::option::Option<f64>,
310}
311#[derive(serde::Serialize, serde::Deserialize)]
315#[derive(Clone, PartialEq, ::prost::Message)]
316pub struct ReportRequest {
317 #[prost(string, tag = "1")]
319 pub author: ::prost::alloc::string::String,
320 #[prost(string, tag = "2")]
321 pub origin: ::prost::alloc::string::String,
322 #[prost(string, tag = "3")]
324 pub hypothesis_id: ::prost::alloc::string::String,
325 #[prost(string, tag = "4")]
326 pub claim: ::prost::alloc::string::String,
327 #[prost(string, tag = "5")]
329 pub instrument: ::prost::alloc::string::String,
330 #[prost(string, tag = "6")]
332 pub from: ::prost::alloc::string::String,
333 #[prost(string, tag = "7")]
334 pub to: ::prost::alloc::string::String,
335 #[prost(string, tag = "8")]
337 pub interval: ::prost::alloc::string::String,
338 #[prost(string, tag = "9")]
340 pub dataset_id: ::prost::alloc::string::String,
341 #[prost(string, tag = "10")]
342 pub dataset_version: ::prost::alloc::string::String,
343 #[prost(string, tag = "11")]
345 pub adjustment: ::prost::alloc::string::String,
346 #[prost(string, tag = "12")]
348 pub strategy: ::prost::alloc::string::String,
349 #[prost(map = "string, double", tag = "13")]
350 pub params: ::std::collections::HashMap<::prost::alloc::string::String, f64>,
351 #[prost(double, tag = "14")]
353 pub commission_bps: f64,
354 #[prost(double, tag = "15")]
355 pub slippage_bps: f64,
356 #[prost(double, tag = "16")]
357 pub per_fill: f64,
358 #[prost(double, optional, tag = "17")]
360 pub stop_atr_multiple: ::core::option::Option<f64>,
361 #[prost(double, tag = "18")]
363 pub starting_cash: f64,
364 #[prost(string, tag = "19")]
366 pub engine: ::prost::alloc::string::String,
367 #[prost(message, repeated, tag = "20")]
369 pub strategy_curve: ::prost::alloc::vec::Vec<Point>,
370 #[prost(message, repeated, tag = "21")]
371 pub ledger: ::prost::alloc::vec::Vec<LedgerTrade>,
372 #[prost(message, repeated, tag = "22")]
375 pub benchmark_curve: ::prost::alloc::vec::Vec<Point>,
376 #[prost(uint32, optional, tag = "23")]
378 pub trials: ::core::option::Option<u32>,
379}
380#[derive(serde::Serialize, serde::Deserialize)]
381#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
382pub struct ReportFigure {
383 #[prost(string, tag = "1")]
384 pub finding_id: ::prost::alloc::string::String,
385 #[prost(string, optional, tag = "2")]
388 pub figure: ::core::option::Option<::prost::alloc::string::String>,
389}
390#[derive(serde::Serialize, serde::Deserialize)]
391#[derive(Clone, PartialEq, ::prost::Message)]
392pub struct TradeExport {
393 #[prost(string, tag = "1")]
394 pub name: ::prost::alloc::string::String,
395 #[prost(message, repeated, tag = "2")]
400 pub rows: ::prost::alloc::vec::Vec<TradeRow>,
401}
402#[derive(serde::Serialize, serde::Deserialize)]
404#[derive(Clone, PartialEq, ::prost::Message)]
405pub struct TradeRow {
406 #[prost(string, tag = "1")]
411 pub instrument: ::prost::alloc::string::String,
412 #[prost(string, tag = "2")]
413 pub opened: ::prost::alloc::string::String,
414 #[prost(string, tag = "3")]
415 pub closed: ::prost::alloc::string::String,
416 #[prost(string, tag = "4")]
417 pub direction: ::prost::alloc::string::String,
418 #[prost(double, tag = "5")]
419 pub quantity: f64,
420 #[prost(double, tag = "6")]
421 pub entry: f64,
422 #[prost(double, optional, tag = "7")]
423 pub exit: ::core::option::Option<f64>,
424 #[prost(double, tag = "8")]
425 pub pnl: f64,
426 #[prost(double, tag = "9")]
427 pub commission: f64,
428 #[prost(double, optional, tag = "10")]
429 pub held_days: ::core::option::Option<f64>,
430 #[prost(string, tag = "11")]
431 pub exit_reason: ::prost::alloc::string::String,
432 #[prost(string, optional, tag = "12")]
436 pub rule: ::core::option::Option<::prost::alloc::string::String>,
437 #[prost(double, optional, tag = "13")]
438 pub signal: ::core::option::Option<f64>,
439 #[prost(string, optional, tag = "14")]
440 pub regime: ::core::option::Option<::prost::alloc::string::String>,
441 #[prost(double, optional, tag = "15")]
442 pub asked: ::core::option::Option<f64>,
443}
444#[derive(serde::Serialize, serde::Deserialize)]
446#[derive(Clone, PartialEq, ::prost::Message)]
447pub struct Param {
448 #[prost(string, tag = "1")]
449 pub name: ::prost::alloc::string::String,
450 #[prost(double, repeated, tag = "2")]
451 pub values: ::prost::alloc::vec::Vec<f64>,
452}
453#[derive(serde::Serialize, serde::Deserialize)]
454#[derive(Clone, PartialEq, ::prost::Message)]
455pub struct Fixed {
456 #[prost(string, tag = "1")]
457 pub name: ::prost::alloc::string::String,
458 #[prost(double, tag = "2")]
459 pub value: f64,
460}
461#[derive(serde::Serialize, serde::Deserialize)]
463#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
464pub struct Ruleset {
465 #[prost(string, tag = "1")]
466 pub path: ::prost::alloc::string::String,
467 #[prost(string, tag = "2")]
468 pub name: ::prost::alloc::string::String,
469 #[prost(string, tag = "3")]
470 pub label: ::prost::alloc::string::String,
471 #[prost(string, tag = "4")]
472 pub rule: ::prost::alloc::string::String,
473 #[prost(string, tag = "5")]
474 pub interval: ::prost::alloc::string::String,
475 #[prost(uint32, tag = "6")]
476 pub searches: u32,
477 #[prost(string, optional, tag = "7")]
479 pub problem: ::core::option::Option<::prost::alloc::string::String>,
480}
481#[derive(serde::Serialize, serde::Deserialize)]
482#[derive(Clone, PartialEq, ::prost::Message)]
483pub struct Rulesets {
484 #[prost(message, repeated, tag = "1")]
485 pub rulesets: ::prost::alloc::vec::Vec<Ruleset>,
486}
487#[derive(serde::Serialize, serde::Deserialize)]
488#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
489pub struct RulesetPath {
490 #[prost(string, tag = "1")]
491 pub path: ::prost::alloc::string::String,
492}
493#[derive(serde::Serialize, serde::Deserialize)]
495#[derive(Clone, PartialEq, ::prost::Message)]
496pub struct RulesetForm {
497 #[prost(string, tag = "1")]
498 pub name: ::prost::alloc::string::String,
499 #[prost(string, tag = "2")]
500 pub rule: ::prost::alloc::string::String,
501 #[prost(string, tag = "3")]
502 pub label: ::prost::alloc::string::String,
503 #[prost(string, tag = "4")]
504 pub premise: ::prost::alloc::string::String,
505 #[prost(message, repeated, tag = "5")]
506 pub params: ::prost::alloc::vec::Vec<Param>,
507}
508#[derive(serde::Serialize, serde::Deserialize)]
510#[derive(Clone, PartialEq, ::prost::Message)]
511pub struct Rule {
512 #[prost(string, tag = "1")]
513 pub name: ::prost::alloc::string::String,
514 #[prost(string, tag = "2")]
515 pub label: ::prost::alloc::string::String,
516 #[prost(string, tag = "3")]
517 pub premise: ::prost::alloc::string::String,
518 #[prost(string, tag = "4")]
519 pub interval: ::prost::alloc::string::String,
520 #[prost(message, repeated, tag = "5")]
521 pub fixed: ::prost::alloc::vec::Vec<Fixed>,
522 #[prost(message, repeated, tag = "6")]
523 pub axes: ::prost::alloc::vec::Vec<Param>,
524 #[prost(bool, tag = "7")]
525 pub ranks_a_set: bool,
526 #[prost(bool, tag = "8")]
527 pub trades_options: bool,
528}
529#[derive(serde::Serialize, serde::Deserialize)]
530#[derive(Clone, PartialEq, ::prost::Message)]
531pub struct Rules {
532 #[prost(message, repeated, tag = "1")]
533 pub rules: ::prost::alloc::vec::Vec<Rule>,
534}
535#[derive(serde::Serialize, serde::Deserialize)]
537#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
538pub struct RiskModel {
539 #[prost(string, tag = "1")]
540 pub path: ::prost::alloc::string::String,
541 #[prost(bool, tag = "2")]
542 pub exists: bool,
543 #[prost(string, tag = "3")]
546 pub model_json: ::prost::alloc::string::String,
547 #[prost(string, optional, tag = "4")]
549 pub error: ::core::option::Option<::prost::alloc::string::String>,
550}
551#[derive(serde::Serialize, serde::Deserialize)]
561#[derive(Clone, Copy, PartialEq, ::prost::Message)]
562pub struct AfterTaxView {
563 #[prost(double, tag = "1")]
564 pub strategy_return: f64,
565 #[prost(double, tag = "2")]
566 pub benchmark_return: f64,
567 #[prost(double, tag = "3")]
570 pub excess: f64,
571 #[prost(double, tag = "4")]
572 pub strategy_tax: f64,
573 #[prost(double, tag = "5")]
574 pub benchmark_tax: f64,
575 #[prost(double, tag = "6")]
576 pub short_term_rate: f64,
577 #[prost(double, tag = "7")]
578 pub long_term_rate: f64,
579}
580#[derive(serde::Serialize, serde::Deserialize)]
586#[derive(Clone, Copy, PartialEq, ::prost::Message)]
587pub struct BookView {
588 #[prost(message, optional, tag = "1")]
589 pub metrics: ::core::option::Option<MetricsView>,
590 #[prost(double, tag = "2")]
593 pub diversification: f64,
594}
595#[derive(serde::Serialize, serde::Deserialize)]
601#[derive(Clone, PartialEq, ::prost::Message)]
602pub struct BreadthView {
603 #[prost(string, repeated, tag = "1")]
604 pub instruments: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
605 #[prost(message, repeated, tag = "2")]
608 pub correlations: ::prost::alloc::vec::Vec<CorrelationRow>,
609 #[prost(double, optional, tag = "3")]
610 pub mean_correlation: ::core::option::Option<f64>,
611 #[prost(double, optional, tag = "4")]
613 pub effective: ::core::option::Option<f64>,
614 #[prost(double, optional, tag = "5")]
617 pub overstatement: ::core::option::Option<f64>,
618}
619#[derive(serde::Serialize, serde::Deserialize)]
621#[derive(Clone, PartialEq, ::prost::Message)]
622pub struct ComparisonRowView {
623 #[prost(string, tag = "1")]
624 pub id: ::prost::alloc::string::String,
625 #[prost(string, tag = "2")]
626 pub subject: ::prost::alloc::string::String,
627 #[prost(string, tag = "3")]
628 pub kind: ::prost::alloc::string::String,
629 #[prost(string, tag = "4")]
630 pub strategy_name: ::prost::alloc::string::String,
631 #[prost(string, tag = "5")]
632 pub verdict: ::prost::alloc::string::String,
633 #[prost(string, tag = "6")]
634 pub recorded_at: ::prost::alloc::string::String,
635 #[prost(double, tag = "7")]
636 pub total_return: f64,
637 #[prost(double, tag = "8")]
638 pub excess_return: f64,
639 #[prost(double, optional, tag = "9")]
640 pub sharpe: ::core::option::Option<f64>,
641 #[prost(double, tag = "10")]
642 pub max_drawdown: f64,
643 #[prost(uint32, tag = "11")]
644 pub trades: u32,
645 #[prost(double, optional, tag = "12")]
646 pub win_rate: ::core::option::Option<f64>,
647 #[prost(double, optional, tag = "13")]
648 pub profit_factor: ::core::option::Option<f64>,
649 #[prost(bool, optional, tag = "14")]
651 pub stale: ::core::option::Option<bool>,
652}
653#[derive(serde::Serialize, serde::Deserialize)]
655#[derive(Clone, PartialEq, ::prost::Message)]
656pub struct ComparisonView {
657 #[prost(message, repeated, tag = "1")]
658 pub rows: ::prost::alloc::vec::Vec<ComparisonRowView>,
659 #[prost(message, repeated, tag = "2")]
660 pub curves: ::prost::alloc::vec::Vec<NamedCurveView>,
661 #[prost(double, optional, tag = "3")]
669 pub best_sharpe: ::core::option::Option<f64>,
670 #[prost(double, optional, tag = "4")]
671 pub expected_best_under_null: ::core::option::Option<f64>,
672 #[prost(bool, tag = "5")]
673 pub survived_deflation: bool,
674 #[prost(string, repeated, tag = "6")]
676 pub notes: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
677}
678#[derive(serde::Serialize, serde::Deserialize)]
681#[derive(Clone, PartialEq, ::prost::Message)]
682pub struct CorrelationRow {
683 #[prost(message, repeated, tag = "1")]
684 pub cells: ::prost::alloc::vec::Vec<OptionalDouble>,
685}
686#[derive(serde::Serialize, serde::Deserialize)]
689#[derive(Clone, Copy, PartialEq, ::prost::Message)]
690pub struct CurvePoint {
691 #[prost(int64, tag = "1")]
699 pub time: i64,
700 #[prost(double, tag = "2")]
701 pub value: f64,
702}
703#[derive(serde::Serialize, serde::Deserialize)]
705#[derive(Clone, PartialEq, ::prost::Message)]
706pub struct DivergenceView {
707 #[prost(string, tag = "1")]
708 pub what: ::prost::alloc::string::String,
709 #[prost(uint32, optional, tag = "2")]
710 pub at: ::core::option::Option<u32>,
711 #[prost(string, optional, tag = "3")]
712 pub when: ::core::option::Option<::prost::alloc::string::String>,
713 #[prost(double, tag = "4")]
714 pub recorded: f64,
715 #[prost(double, tag = "5")]
716 pub replayed: f64,
717 #[prost(double, tag = "6")]
720 pub relative: f64,
721}
722#[derive(serde::Serialize, serde::Deserialize)]
723#[derive(Clone, Copy, PartialEq, ::prost::Message)]
724pub struct DividendGapView {
725 #[prost(uint32, tag = "1")]
730 pub events: u32,
731 #[prost(double, tag = "2")]
732 pub strategy_income: f64,
733 #[prost(double, tag = "3")]
734 pub benchmark_income: f64,
735 #[prost(double, tag = "4")]
738 pub overstatement: f64,
739 #[prost(double, optional, tag = "5")]
747 pub corrected_excess: ::core::option::Option<f64>,
748 #[prost(bool, tag = "6")]
751 pub complete: bool,
752 #[prost(uint32, tag = "7")]
753 pub covered: u32,
754 #[prost(uint32, tag = "8")]
755 pub instruments: u32,
756}
757#[derive(serde::Serialize, serde::Deserialize)]
759#[derive(Clone, PartialEq, ::prost::Message)]
760pub struct FoldView {
761 #[prost(string, tag = "1")]
762 pub chose_on: ::prost::alloc::string::String,
763 #[prost(string, tag = "2")]
764 pub judged_on: ::prost::alloc::string::String,
765 #[prost(message, repeated, tag = "3")]
766 pub params: ::prost::alloc::vec::Vec<NamedNumber>,
767 #[prost(double, tag = "4")]
768 pub strategy_return: f64,
769 #[prost(double, tag = "5")]
770 pub benchmark_return: f64,
771 #[prost(uint32, tag = "6")]
772 pub trades: u32,
773 #[prost(bool, tag = "7")]
777 pub survived_deflation: bool,
778}
779#[derive(serde::Serialize, serde::Deserialize)]
780#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
781pub struct HistoryEntryView {
782 #[prost(string, tag = "1")]
783 pub id: ::prost::alloc::string::String,
784 #[prost(string, tag = "2")]
785 pub kind: ::prost::alloc::string::String,
786 #[prost(string, tag = "3")]
787 pub subject: ::prost::alloc::string::String,
788 #[prost(string, tag = "4")]
789 pub verdict: ::prost::alloc::string::String,
790 #[prost(string, tag = "5")]
791 pub recorded_at: ::prost::alloc::string::String,
792 #[prost(bool, optional, tag = "6")]
796 pub stale: ::core::option::Option<bool>,
797 #[prost(string, optional, tag = "7")]
800 pub agent: ::core::option::Option<::prost::alloc::string::String>,
801 #[prost(string, optional, tag = "8")]
803 pub origin: ::core::option::Option<::prost::alloc::string::String>,
804 #[prost(uint32, optional, tag = "9")]
806 pub trials: ::core::option::Option<u32>,
807 #[prost(uint32, tag = "10")]
809 pub attachments: u32,
810 #[prost(string, tag = "11")]
814 pub code_commit: ::prost::alloc::string::String,
815 #[prost(string, tag = "12")]
816 pub ruleset_hash: ::prost::alloc::string::String,
817 #[prost(string, tag = "13")]
820 pub stale_reason: ::prost::alloc::string::String,
821}
822#[derive(serde::Serialize, serde::Deserialize)]
825#[derive(Clone, PartialEq, ::prost::Message)]
826pub struct HistoryView {
827 #[prost(message, repeated, tag = "1")]
828 pub entries: ::prost::alloc::vec::Vec<HistoryEntryView>,
829 #[prost(message, repeated, tag = "2")]
830 pub unreadable: ::prost::alloc::vec::Vec<UnreadableView>,
831}
832#[derive(serde::Serialize, serde::Deserialize)]
839#[derive(Clone, PartialEq, ::prost::Message)]
840pub struct MemberView {
841 #[prost(string, tag = "1")]
842 pub instrument: ::prost::alloc::string::String,
843 #[prost(uint32, tag = "2")]
844 pub trades: u32,
845 #[prost(double, tag = "3")]
847 pub pnl: f64,
848 #[prost(double, optional, tag = "4")]
853 pub share: ::core::option::Option<f64>,
854 #[prost(bool, tag = "5")]
859 pub silent: bool,
860}
861#[derive(serde::Serialize, serde::Deserialize)]
862#[derive(Clone, Copy, PartialEq, ::prost::Message)]
863pub struct MetricsView {
864 #[prost(double, tag = "1")]
865 pub total_return: f64,
866 #[prost(double, tag = "2")]
867 pub cagr: f64,
868 #[prost(double, tag = "3")]
869 pub max_drawdown: f64,
870 #[prost(double, tag = "4")]
871 pub volatility: f64,
872 #[prost(double, optional, tag = "5")]
873 pub sharpe: ::core::option::Option<f64>,
874 #[prost(double, optional, tag = "6")]
875 pub sortino: ::core::option::Option<f64>,
876 #[prost(double, optional, tag = "7")]
877 pub calmar: ::core::option::Option<f64>,
878 #[prost(double, optional, tag = "8")]
883 pub psr: ::core::option::Option<f64>,
884 #[prost(uint32, tag = "9")]
885 pub trades: u32,
886}
887#[derive(serde::Serialize, serde::Deserialize)]
889#[derive(Clone, Copy, PartialEq, ::prost::Message)]
890pub struct MonthlyReturnView {
891 #[prost(int32, tag = "1")]
892 pub year: i32,
893 #[prost(uint32, tag = "2")]
894 pub month: u32,
895 #[prost(double, tag = "3")]
896 pub value: f64,
897}
898#[derive(serde::Serialize, serde::Deserialize)]
900#[derive(Clone, PartialEq, ::prost::Message)]
901pub struct NamedCurveView {
902 #[prost(string, tag = "1")]
903 pub name: ::prost::alloc::string::String,
904 #[prost(message, repeated, tag = "2")]
905 pub points: ::prost::alloc::vec::Vec<CurvePoint>,
906}
907#[derive(serde::Serialize, serde::Deserialize)]
919#[derive(Clone, PartialEq, ::prost::Message)]
920pub struct NamedNumber {
921 #[prost(string, tag = "1")]
922 pub name: ::prost::alloc::string::String,
923 #[prost(double, tag = "2")]
924 pub value: f64,
925}
926#[derive(serde::Serialize, serde::Deserialize)]
927#[derive(Clone, Copy, PartialEq, ::prost::Message)]
928pub struct OptionalDouble {
929 #[prost(double, optional, tag = "1")]
930 pub value: ::core::option::Option<f64>,
931}
932#[derive(serde::Serialize, serde::Deserialize)]
934#[derive(Clone, PartialEq, ::prost::Message)]
935pub struct OutcomeView {
936 #[prost(string, tag = "1")]
937 pub instrument: ::prost::alloc::string::String,
938 #[prost(double, tag = "2")]
939 pub strategy_return: f64,
940 #[prost(double, tag = "3")]
941 pub benchmark_return: f64,
942 #[prost(double, tag = "4")]
943 pub excess_return: f64,
944 #[prost(double, tag = "5")]
945 pub max_drawdown: f64,
946 #[prost(uint32, tag = "6")]
947 pub trades: u32,
948}
949#[derive(serde::Serialize, serde::Deserialize)]
951#[derive(Clone, PartialEq, ::prost::Message)]
952pub struct PanelView {
953 #[prost(string, tag = "1")]
958 pub id: ::prost::alloc::string::String,
959 #[prost(string, tag = "2")]
960 pub verdict: ::prost::alloc::string::String,
961 #[prost(string, repeated, tag = "3")]
962 pub reasons: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
963 #[prost(message, repeated, tag = "4")]
964 pub recommendations: ::prost::alloc::vec::Vec<RecommendationView>,
965 #[prost(uint32, tag = "5")]
966 pub instruments: u32,
967 #[prost(uint32, tag = "6")]
968 pub total_trades: u32,
969 #[prost(double, tag = "7")]
970 pub mean_excess_return: f64,
971 #[prost(uint32, tag = "8")]
972 pub beat_benchmark: u32,
973 #[prost(double, tag = "9")]
974 pub mean_max_drawdown: f64,
975 #[prost(message, optional, tag = "10")]
976 pub breadth: ::core::option::Option<BreadthView>,
977 #[prost(message, optional, tag = "11")]
978 pub book: ::core::option::Option<BookView>,
979 #[prost(double, tag = "12")]
980 pub worst_max_drawdown: f64,
981 #[prost(uint32, tag = "13")]
982 pub trials: u32,
983 #[prost(double, tag = "14")]
984 pub best_sharpe: f64,
985 #[prost(double, optional, tag = "15")]
986 pub expected_best_under_null: ::core::option::Option<f64>,
987 #[prost(bool, tag = "16")]
988 pub survived_deflation: bool,
989 #[prost(string, tag = "17")]
990 pub in_sample: ::prost::alloc::string::String,
991 #[prost(string, tag = "18")]
992 pub out_of_sample: ::prost::alloc::string::String,
993 #[prost(message, repeated, tag = "19")]
994 pub selected_params: ::prost::alloc::vec::Vec<NamedNumber>,
995 #[prost(message, repeated, tag = "20")]
996 pub per_instrument: ::prost::alloc::vec::Vec<OutcomeView>,
997 #[prost(string, repeated, tag = "21")]
998 pub failures: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
999 #[prost(string, tag = "22")]
1000 pub dataset_version: ::prost::alloc::string::String,
1001 #[prost(string, tag = "23")]
1002 pub strategy_name: ::prost::alloc::string::String,
1003 #[prost(double, tag = "24")]
1004 pub starting_cash: f64,
1005 #[prost(double, tag = "25")]
1006 pub commission_bps: f64,
1007 #[prost(double, tag = "26")]
1008 pub slippage_bps: f64,
1009 #[prost(string, tag = "27")]
1010 pub engine: ::prost::alloc::string::String,
1011 #[prost(string, tag = "28")]
1013 pub universe: ::prost::alloc::string::String,
1014 #[prost(string, repeated, tag = "29")]
1017 pub notes: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1018}
1019#[derive(serde::Serialize, serde::Deserialize)]
1021#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
1022pub struct RecommendationView {
1023 #[prost(string, tag = "1")]
1024 pub severity: ::prost::alloc::string::String,
1025 #[prost(string, tag = "2")]
1026 pub finding: ::prost::alloc::string::String,
1027 #[prost(string, tag = "3")]
1028 pub action: ::prost::alloc::string::String,
1029 #[prost(string, tag = "4")]
1030 pub evidence: ::prost::alloc::string::String,
1031}
1032#[derive(serde::Serialize, serde::Deserialize)]
1034#[derive(Clone, PartialEq, ::prost::Message)]
1035pub struct RecordView {
1036 #[prost(oneof = "record_view::Of", tags = "1, 2, 3, 4")]
1037 pub of: ::core::option::Option<record_view::Of>,
1038}
1039pub mod record_view {
1041 #[derive(serde::Serialize, serde::Deserialize)]
1042 #[derive(Clone, PartialEq, ::prost::Oneof)]
1043 pub enum Of {
1044 #[prost(message, tag = "1")]
1045 Study(super::StudyView),
1046 #[prost(message, tag = "2")]
1047 Panel(super::PanelView),
1048 #[prost(message, tag = "3")]
1049 Walkforward(super::WalkForwardView),
1050 #[prost(message, tag = "4")]
1051 Reported(super::ReportedView),
1052 }
1053}
1054#[derive(serde::Serialize, serde::Deserialize)]
1059#[derive(Clone, PartialEq, ::prost::Message)]
1060pub struct ReplayView {
1061 #[prost(string, tag = "1")]
1065 pub outcome: ::prost::alloc::string::String,
1066 #[prost(bool, tag = "2")]
1070 pub holds: bool,
1071 #[prost(string, tag = "3")]
1072 pub detail: ::prost::alloc::string::String,
1073 #[prost(message, optional, tag = "4")]
1074 pub divergence: ::core::option::Option<DivergenceView>,
1075}
1076#[derive(serde::Serialize, serde::Deserialize)]
1080#[derive(Clone, PartialEq, ::prost::Message)]
1081pub struct ReportedView {
1082 #[prost(string, tag = "1")]
1083 pub id: ::prost::alloc::string::String,
1084 #[prost(string, tag = "2")]
1085 pub hypothesis: ::prost::alloc::string::String,
1086 #[prost(string, tag = "3")]
1087 pub claim: ::prost::alloc::string::String,
1088 #[prost(string, tag = "4")]
1089 pub instrument: ::prost::alloc::string::String,
1090 #[prost(string, tag = "5")]
1091 pub engine: ::prost::alloc::string::String,
1092 #[prost(string, tag = "6")]
1093 pub from: ::prost::alloc::string::String,
1094 #[prost(string, tag = "7")]
1095 pub to: ::prost::alloc::string::String,
1096 #[prost(string, tag = "8")]
1097 pub interval: ::prost::alloc::string::String,
1098 #[prost(string, tag = "9")]
1100 pub dataset: ::prost::alloc::string::String,
1101 #[prost(string, tag = "10")]
1102 pub strategy: ::prost::alloc::string::String,
1103 #[prost(string, tag = "11")]
1104 pub verdict: ::prost::alloc::string::String,
1105 #[prost(string, repeated, tag = "12")]
1106 pub reasons: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1107 #[prost(uint32, tag = "13")]
1108 pub trades: u32,
1109 #[prost(uint32, optional, tag = "14")]
1110 pub trials: ::core::option::Option<u32>,
1111 #[prost(double, optional, tag = "15")]
1113 pub total_return: ::core::option::Option<f64>,
1114 #[prost(double, optional, tag = "16")]
1115 pub excess_return: ::core::option::Option<f64>,
1116 #[prost(double, optional, tag = "17")]
1117 pub sharpe: ::core::option::Option<f64>,
1118 #[prost(double, optional, tag = "18")]
1119 pub max_drawdown: ::core::option::Option<f64>,
1120 #[prost(string, tag = "19")]
1121 pub recorded_at: ::prost::alloc::string::String,
1122 #[prost(string, tag = "20")]
1123 pub author: ::prost::alloc::string::String,
1124 #[prost(message, repeated, tag = "21")]
1126 pub attachments: ::prost::alloc::vec::Vec<Attachment>,
1127}
1128#[derive(serde::Serialize, serde::Deserialize)]
1130#[derive(Clone, PartialEq, ::prost::Message)]
1131pub struct StabilityView {
1132 #[prost(string, tag = "1")]
1133 pub axis: ::prost::alloc::string::String,
1134 #[prost(uint32, tag = "2")]
1135 pub distinct: u32,
1136 #[prost(double, tag = "3")]
1137 pub modal: f64,
1138 #[prost(double, tag = "4")]
1139 pub modal_share: f64,
1140}
1141#[derive(serde::Serialize, serde::Deserialize)]
1143#[derive(Clone, PartialEq, ::prost::Message)]
1144pub struct StudyView {
1145 #[prost(string, tag = "1")]
1150 pub id: ::prost::alloc::string::String,
1151 #[prost(string, tag = "2")]
1152 pub instrument: ::prost::alloc::string::String,
1153 #[prost(string, repeated, tag = "3")]
1162 pub instruments: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1163 #[prost(message, repeated, tag = "4")]
1165 pub members: ::prost::alloc::vec::Vec<MemberView>,
1166 #[prost(string, tag = "5")]
1167 pub verdict: ::prost::alloc::string::String,
1168 #[prost(string, repeated, tag = "6")]
1169 pub reasons: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1170 #[prost(uint32, tag = "7")]
1171 pub trials: u32,
1172 #[prost(uint32, tag = "8")]
1175 pub prior_trials: u32,
1176 #[prost(double, tag = "9")]
1177 pub best_sharpe: f64,
1178 #[prost(double, optional, tag = "10")]
1179 pub expected_best_under_null: ::core::option::Option<f64>,
1180 #[prost(bool, tag = "11")]
1181 pub survived_deflation: bool,
1182 #[prost(message, optional, tag = "12")]
1184 pub surface: ::core::option::Option<SurfaceView>,
1185 #[prost(string, tag = "13")]
1186 pub in_sample: ::prost::alloc::string::String,
1187 #[prost(string, tag = "14")]
1188 pub out_of_sample: ::prost::alloc::string::String,
1189 #[prost(message, repeated, tag = "15")]
1190 pub selected_params: ::prost::alloc::vec::Vec<NamedNumber>,
1191 #[prost(message, optional, tag = "16")]
1192 pub strategy: ::core::option::Option<MetricsView>,
1193 #[prost(message, optional, tag = "17")]
1194 pub benchmark: ::core::option::Option<MetricsView>,
1195 #[prost(double, tag = "18")]
1199 pub excess_return: f64,
1200 #[prost(message, optional, tag = "19")]
1206 pub dividend_gap: ::core::option::Option<DividendGapView>,
1207 #[prost(message, optional, tag = "20")]
1211 pub after_tax: ::core::option::Option<AfterTaxView>,
1212 #[prost(message, repeated, tag = "21")]
1216 pub strategy_curve: ::prost::alloc::vec::Vec<CurvePoint>,
1217 #[prost(message, repeated, tag = "22")]
1218 pub benchmark_curve: ::prost::alloc::vec::Vec<CurvePoint>,
1219 #[prost(message, repeated, tag = "23")]
1226 pub price: ::prost::alloc::vec::Vec<CandlePoint>,
1227 #[prost(message, repeated, tag = "24")]
1228 pub markers: ::prost::alloc::vec::Vec<TradeMarkerView>,
1229 #[prost(message, repeated, tag = "25")]
1238 pub alongside_charts: ::prost::alloc::vec::Vec<InstrumentChartView>,
1239 #[prost(message, repeated, tag = "26")]
1241 pub underwater: ::prost::alloc::vec::Vec<CurvePoint>,
1242 #[prost(message, repeated, tag = "27")]
1244 pub data_findings: ::prost::alloc::vec::Vec<
1245 super::super::market::v1::DataFindingView,
1246 >,
1247 #[prost(message, repeated, tag = "28")]
1249 pub trades: ::prost::alloc::vec::Vec<TradeRowView>,
1250 #[prost(message, repeated, tag = "29")]
1253 pub monthly: ::prost::alloc::vec::Vec<MonthlyReturnView>,
1254 #[prost(message, optional, tag = "30")]
1256 pub trades_detail: ::core::option::Option<TradesView>,
1257 #[prost(message, repeated, tag = "31")]
1263 pub recommendations: ::prost::alloc::vec::Vec<RecommendationView>,
1264 #[prost(string, tag = "32")]
1267 pub dataset_version: ::prost::alloc::string::String,
1268 #[prost(string, tag = "33")]
1269 pub strategy_name: ::prost::alloc::string::String,
1270 #[prost(double, tag = "34")]
1271 pub starting_cash: f64,
1272 #[prost(double, tag = "35")]
1273 pub commission_bps: f64,
1274 #[prost(double, tag = "36")]
1275 pub slippage_bps: f64,
1276 #[prost(string, tag = "37")]
1277 pub engine: ::prost::alloc::string::String,
1278}
1279#[derive(serde::Serialize, serde::Deserialize)]
1281#[derive(Clone, Copy, PartialEq, ::prost::Message)]
1282pub struct SurfaceCell {
1283 #[prost(double, tag = "1")]
1284 pub x: f64,
1285 #[prost(double, tag = "2")]
1286 pub y: f64,
1287 #[prost(double, tag = "3")]
1288 pub sharpe: f64,
1289 #[prost(bool, tag = "4")]
1291 pub selected: bool,
1292 #[prost(bool, tag = "5")]
1298 pub above_null: bool,
1299}
1300#[derive(serde::Serialize, serde::Deserialize)]
1311#[derive(Clone, PartialEq, ::prost::Message)]
1312pub struct SurfaceView {
1313 #[prost(string, tag = "1")]
1315 pub x_axis: ::prost::alloc::string::String,
1316 #[prost(string, tag = "2")]
1317 pub y_axis: ::prost::alloc::string::String,
1318 #[prost(double, repeated, tag = "3")]
1319 pub x_values: ::prost::alloc::vec::Vec<f64>,
1320 #[prost(double, repeated, tag = "4")]
1321 pub y_values: ::prost::alloc::vec::Vec<f64>,
1322 #[prost(message, repeated, tag = "5")]
1323 pub cells: ::prost::alloc::vec::Vec<SurfaceCell>,
1324 #[prost(double, optional, tag = "6")]
1327 pub null_bar: ::core::option::Option<f64>,
1328 #[prost(double, tag = "7")]
1329 pub best: f64,
1330 #[prost(string, repeated, tag = "8")]
1333 pub collapsed: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1334}
1335#[derive(serde::Serialize, serde::Deserialize)]
1337#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
1338pub struct TradeMarkerView {
1339 #[prost(int64, tag = "1")]
1340 pub time: i64,
1341 #[prost(string, tag = "2")]
1343 pub kind: ::prost::alloc::string::String,
1344 #[prost(string, tag = "3")]
1347 pub reason: ::prost::alloc::string::String,
1348 #[prost(string, tag = "4")]
1349 pub label: ::prost::alloc::string::String,
1350}
1351#[derive(serde::Serialize, serde::Deserialize)]
1360#[derive(Clone, PartialEq, ::prost::Message)]
1361pub struct TradeRowView {
1362 #[prost(string, tag = "1")]
1368 pub instrument: ::prost::alloc::string::String,
1369 #[prost(string, tag = "2")]
1370 pub opened: ::prost::alloc::string::String,
1371 #[prost(string, tag = "3")]
1373 pub closed: ::prost::alloc::string::String,
1374 #[prost(string, tag = "4")]
1375 pub direction: ::prost::alloc::string::String,
1376 #[prost(double, tag = "5")]
1377 pub quantity: f64,
1378 #[prost(double, tag = "6")]
1379 pub entry: f64,
1380 #[prost(double, optional, tag = "7")]
1383 pub exit: ::core::option::Option<f64>,
1384 #[prost(double, tag = "8")]
1385 pub pnl: f64,
1386 #[prost(double, tag = "9")]
1387 pub commission: f64,
1388 #[prost(double, optional, tag = "10")]
1392 pub held_days: ::core::option::Option<f64>,
1393 #[prost(string, tag = "11")]
1395 pub exit_reason: ::prost::alloc::string::String,
1396 #[prost(string, optional, tag = "12")]
1400 pub rule: ::core::option::Option<::prost::alloc::string::String>,
1401 #[prost(double, optional, tag = "13")]
1402 pub signal: ::core::option::Option<f64>,
1403 #[prost(string, optional, tag = "14")]
1404 pub regime: ::core::option::Option<::prost::alloc::string::String>,
1405 #[prost(double, optional, tag = "15")]
1406 pub asked: ::core::option::Option<f64>,
1407}
1408#[derive(serde::Serialize, serde::Deserialize)]
1414#[derive(Clone, Copy, PartialEq, ::prost::Message)]
1415pub struct TradesView {
1416 #[prost(uint32, tag = "1")]
1417 pub closed: u32,
1418 #[prost(uint32, tag = "2")]
1419 pub still_open: u32,
1420 #[prost(double, optional, tag = "3")]
1421 pub win_rate: ::core::option::Option<f64>,
1422 #[prost(double, optional, tag = "4")]
1423 pub profit_factor: ::core::option::Option<f64>,
1424 #[prost(double, optional, tag = "5")]
1425 pub expectancy: ::core::option::Option<f64>,
1426 #[prost(double, optional, tag = "6")]
1427 pub average_win: ::core::option::Option<f64>,
1428 #[prost(double, optional, tag = "7")]
1429 pub average_loss: ::core::option::Option<f64>,
1430 #[prost(double, optional, tag = "8")]
1433 pub average_holding_days: ::core::option::Option<f64>,
1434 #[prost(double, tag = "9")]
1441 pub fees_paid: f64,
1442 #[prost(double, tag = "10")]
1445 pub fees_fraction: f64,
1446 #[prost(uint32, tag = "11")]
1447 pub signal_exits: u32,
1448 #[prost(uint32, tag = "12")]
1449 pub stop_exits: u32,
1450}
1451#[derive(serde::Serialize, serde::Deserialize)]
1457#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
1458pub struct UnreadableView {
1459 #[prost(string, tag = "1")]
1460 pub id: ::prost::alloc::string::String,
1461 #[prost(string, tag = "2")]
1462 pub reason: ::prost::alloc::string::String,
1463}
1464#[derive(serde::Serialize, serde::Deserialize)]
1466#[derive(Clone, PartialEq, ::prost::Message)]
1467pub struct WalkForwardView {
1468 #[prost(string, tag = "1")]
1473 pub id: ::prost::alloc::string::String,
1474 #[prost(string, tag = "2")]
1475 pub instrument: ::prost::alloc::string::String,
1476 #[prost(string, tag = "3")]
1477 pub verdict: ::prost::alloc::string::String,
1478 #[prost(string, repeated, tag = "4")]
1479 pub reasons: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1480 #[prost(message, repeated, tag = "5")]
1481 pub recommendations: ::prost::alloc::vec::Vec<RecommendationView>,
1482 #[prost(message, repeated, tag = "6")]
1483 pub folds: ::prost::alloc::vec::Vec<FoldView>,
1484 #[prost(uint32, tag = "7")]
1485 pub folds_surviving_deflation: u32,
1486 #[prost(uint32, tag = "8")]
1489 pub folds_without_trades: u32,
1490 #[prost(message, repeated, tag = "9")]
1492 pub stability: ::prost::alloc::vec::Vec<StabilityView>,
1493 #[prost(message, optional, tag = "10")]
1494 pub strategy: ::core::option::Option<MetricsView>,
1495 #[prost(message, optional, tag = "11")]
1496 pub benchmark: ::core::option::Option<MetricsView>,
1497 #[prost(double, tag = "12")]
1498 pub excess_return: f64,
1499 #[prost(message, repeated, tag = "13")]
1500 pub strategy_curve: ::prost::alloc::vec::Vec<CurvePoint>,
1501 #[prost(message, repeated, tag = "14")]
1502 pub benchmark_curve: ::prost::alloc::vec::Vec<CurvePoint>,
1503 #[prost(message, repeated, tag = "15")]
1504 pub price: ::prost::alloc::vec::Vec<CandlePoint>,
1505 #[prost(message, repeated, tag = "16")]
1506 pub markers: ::prost::alloc::vec::Vec<TradeMarkerView>,
1507 #[prost(message, repeated, tag = "17")]
1508 pub underwater: ::prost::alloc::vec::Vec<CurvePoint>,
1509 #[prost(message, repeated, tag = "18")]
1511 pub data_findings: ::prost::alloc::vec::Vec<
1512 super::super::market::v1::DataFindingView,
1513 >,
1514 #[prost(message, repeated, tag = "19")]
1515 pub trades: ::prost::alloc::vec::Vec<TradeRowView>,
1516 #[prost(message, optional, tag = "20")]
1517 pub trades_detail: ::core::option::Option<TradesView>,
1518 #[prost(int64, tag = "21")]
1519 pub in_sample_days: i64,
1520 #[prost(int64, tag = "22")]
1521 pub step_days: i64,
1522 #[prost(bool, tag = "23")]
1523 pub anchored: bool,
1524 #[prost(string, tag = "24")]
1525 pub dataset_version: ::prost::alloc::string::String,
1526 #[prost(string, tag = "25")]
1527 pub strategy_name: ::prost::alloc::string::String,
1528 #[prost(double, tag = "26")]
1529 pub starting_cash: f64,
1530 #[prost(double, tag = "27")]
1531 pub commission_bps: f64,
1532 #[prost(double, tag = "28")]
1533 pub slippage_bps: f64,
1534 #[prost(string, tag = "29")]
1535 pub engine: ::prost::alloc::string::String,
1536}
1537#[derive(serde::Serialize, serde::Deserialize)]
1541#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
1542pub struct ReviewView {
1543 #[prost(string, tag = "1")]
1544 pub day: ::prost::alloc::string::String,
1545 #[prost(string, tag = "2")]
1546 pub markdown: ::prost::alloc::string::String,
1547 #[prost(string, tag = "3")]
1549 pub path: ::prost::alloc::string::String,
1550 #[prost(bool, tag = "4")]
1552 pub written_now: bool,
1553}
1554#[derive(serde::Serialize, serde::Deserialize)]
1556#[derive(Clone, PartialEq, ::prost::Message)]
1557pub struct BarView {
1558 #[prost(string, tag = "1")]
1560 pub at: ::prost::alloc::string::String,
1561 #[prost(double, tag = "2")]
1562 pub open: f64,
1563 #[prost(double, tag = "3")]
1564 pub high: f64,
1565 #[prost(double, tag = "4")]
1566 pub low: f64,
1567 #[prost(double, tag = "5")]
1568 pub close: f64,
1569 #[prost(double, tag = "6")]
1570 pub volume: f64,
1571}
1572#[derive(serde::Serialize, serde::Deserialize)]
1573#[derive(Clone, PartialEq, ::prost::Message)]
1574pub struct BarsView {
1575 #[prost(string, tag = "1")]
1576 pub instrument: ::prost::alloc::string::String,
1577 #[prost(string, tag = "2")]
1578 pub interval: ::prost::alloc::string::String,
1579 #[prost(message, repeated, tag = "3")]
1580 pub bars: ::prost::alloc::vec::Vec<BarView>,
1581}
1582#[derive(serde::Serialize, serde::Deserialize)]
1587#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
1588pub struct RegimePointView {
1589 #[prost(string, tag = "1")]
1590 pub at: ::prost::alloc::string::String,
1591 #[prost(string, optional, tag = "2")]
1592 pub regime: ::core::option::Option<::prost::alloc::string::String>,
1593}
1594#[derive(serde::Serialize, serde::Deserialize)]
1595#[derive(Clone, PartialEq, ::prost::Message)]
1596pub struct RegimeView {
1597 #[prost(string, tag = "1")]
1598 pub instrument: ::prost::alloc::string::String,
1599 #[prost(string, tag = "2")]
1600 pub interval: ::prost::alloc::string::String,
1601 #[prost(uint32, tag = "3")]
1603 pub lookback: u32,
1604 #[prost(string, optional, tag = "4")]
1606 pub current: ::core::option::Option<::prost::alloc::string::String>,
1607 #[prost(message, repeated, tag = "5")]
1608 pub points: ::prost::alloc::vec::Vec<RegimePointView>,
1609 #[prost(map = "string, uint32", tag = "6")]
1611 pub shares: ::std::collections::HashMap<::prost::alloc::string::String, u32>,
1612}
1613#[derive(serde::Serialize, serde::Deserialize)]
1614#[derive(Clone, Copy, PartialEq, ::prost::Message)]
1615pub struct CandlePoint {
1616 #[prost(int64, tag = "1")]
1617 pub time: i64,
1618 #[prost(double, tag = "2")]
1619 pub open: f64,
1620 #[prost(double, tag = "3")]
1621 pub high: f64,
1622 #[prost(double, tag = "4")]
1623 pub low: f64,
1624 #[prost(double, tag = "5")]
1625 pub close: f64,
1626}
1627#[derive(serde::Serialize, serde::Deserialize)]
1633#[derive(Clone, PartialEq, ::prost::Message)]
1634pub struct InstrumentChartView {
1635 #[prost(string, tag = "1")]
1636 pub instrument: ::prost::alloc::string::String,
1637 #[prost(message, repeated, tag = "2")]
1638 pub price: ::prost::alloc::vec::Vec<CandlePoint>,
1639 #[prost(message, repeated, tag = "3")]
1640 pub markers: ::prost::alloc::vec::Vec<TradeMarkerView>,
1641}
1642#[derive(serde::Serialize, serde::Deserialize)]
1645#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
1646pub struct ResearchProblemView {
1647 #[prost(string, tag = "1")]
1649 pub path: ::prost::alloc::string::String,
1650 #[prost(uint32, tag = "2")]
1651 pub line: u32,
1652 #[prost(string, tag = "3")]
1654 pub severity: ::prost::alloc::string::String,
1655 #[prost(string, tag = "4")]
1656 pub message: ::prost::alloc::string::String,
1657 #[prost(string, tag = "5")]
1659 pub finding: ::prost::alloc::string::String,
1660}
1661#[derive(serde::Serialize, serde::Deserialize)]
1666#[derive(Clone, PartialEq, ::prost::Message)]
1667pub struct ProblemsView {
1668 #[prost(message, repeated, tag = "1")]
1669 pub problems: ::prost::alloc::vec::Vec<ResearchProblemView>,
1670}
1671#[derive(serde::Serialize, serde::Deserialize)]
1673#[derive(Clone, PartialEq, ::prost::Message)]
1674pub struct RankingRowView {
1675 #[prost(string, tag = "1")]
1676 pub id: ::prost::alloc::string::String,
1677 #[prost(string, tag = "2")]
1678 pub subject: ::prost::alloc::string::String,
1679 #[prost(string, tag = "3")]
1680 pub kind: ::prost::alloc::string::String,
1681 #[prost(string, tag = "4")]
1682 pub rule: ::prost::alloc::string::String,
1683 #[prost(string, tag = "5")]
1684 pub interval: ::prost::alloc::string::String,
1685 #[prost(string, tag = "6")]
1686 pub verdict: ::prost::alloc::string::String,
1687 #[prost(string, tag = "7")]
1690 pub conservative_verdict: ::prost::alloc::string::String,
1691 #[prost(double, tag = "8")]
1694 pub expectancy: f64,
1695 #[prost(string, tag = "9")]
1697 pub expectancy_costs: ::prost::alloc::string::String,
1698 #[prost(double, tag = "10")]
1700 pub total_return: f64,
1701 #[prost(double, tag = "11")]
1702 pub max_drawdown: f64,
1703 #[prost(uint32, tag = "12")]
1704 pub trades: u32,
1705 #[prost(string, repeated, tag = "13")]
1707 pub regimes: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1708 #[prost(uint32, optional, tag = "14")]
1710 pub search: ::core::option::Option<u32>,
1711 #[prost(string, tag = "15")]
1712 pub recorded_at: ::prost::alloc::string::String,
1713 #[prost(bool, optional, tag = "16")]
1714 pub stale: ::core::option::Option<bool>,
1715}
1716#[derive(serde::Serialize, serde::Deserialize)]
1721#[derive(Clone, PartialEq, ::prost::Message)]
1722pub struct Ranking {
1723 #[prost(message, repeated, tag = "1")]
1724 pub rows: ::prost::alloc::vec::Vec<RankingRowView>,
1725 #[prost(string, repeated, tag = "2")]
1727 pub notes: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1728}