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 ReviewRequest {
207 #[prost(string, optional, tag = "1")]
209 pub day: ::core::option::Option<::prost::alloc::string::String>,
210}
211#[derive(serde::Serialize, serde::Deserialize)]
212#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
213pub struct StudyRequest {
214 #[prost(string, tag = "1")]
215 pub instrument: ::prost::alloc::string::String,
216 #[prost(string, optional, tag = "2")]
218 pub strategy: ::core::option::Option<::prost::alloc::string::String>,
219}
220#[derive(serde::Serialize, serde::Deserialize)]
221#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
222pub struct BookRequest {
223 #[prost(string, repeated, tag = "1")]
224 pub instruments: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
225 #[prost(string, optional, tag = "2")]
226 pub strategy: ::core::option::Option<::prost::alloc::string::String>,
227 #[prost(uint32, optional, tag = "3")]
228 pub max_concurrent_positions: ::core::option::Option<u32>,
229 #[prost(uint32, optional, tag = "4")]
230 pub max_per_sector: ::core::option::Option<u32>,
231}
232#[derive(serde::Serialize, serde::Deserialize)]
233#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
234pub struct SharedExperiment {
235 #[prost(string, tag = "1")]
237 pub text: ::prost::alloc::string::String,
238 #[prost(string, tag = "2")]
239 pub instrument: ::prost::alloc::string::String,
240}
241#[derive(serde::Serialize, serde::Deserialize)]
243#[derive(Clone, PartialEq, ::prost::Message)]
244pub struct Point {
245 #[prost(string, tag = "1")]
246 pub at: ::prost::alloc::string::String,
247 #[prost(double, tag = "2")]
248 pub equity: f64,
249}
250#[derive(serde::Serialize, serde::Deserialize)]
253#[derive(Clone, PartialEq, ::prost::Message)]
254pub struct LedgerTrade {
255 #[prost(string, tag = "1")]
257 pub instrument: ::prost::alloc::string::String,
258 #[prost(string, tag = "2")]
259 pub opened: ::prost::alloc::string::String,
260 #[prost(string, tag = "3")]
261 pub closed: ::prost::alloc::string::String,
262 #[prost(string, tag = "4")]
264 pub direction: ::prost::alloc::string::String,
265 #[prost(double, tag = "5")]
266 pub quantity: f64,
267 #[prost(double, tag = "6")]
268 pub entry: f64,
269 #[prost(double, optional, tag = "7")]
270 pub exit: ::core::option::Option<f64>,
271 #[prost(double, tag = "8")]
272 pub pnl: f64,
273 #[prost(double, tag = "9")]
274 pub commission: f64,
275 #[prost(string, tag = "10")]
277 pub exit_reason: ::prost::alloc::string::String,
278 #[prost(string, optional, tag = "11")]
282 pub rule: ::core::option::Option<::prost::alloc::string::String>,
283 #[prost(double, optional, tag = "12")]
284 pub signal: ::core::option::Option<f64>,
285 #[prost(string, optional, tag = "13")]
286 pub regime: ::core::option::Option<::prost::alloc::string::String>,
287 #[prost(double, optional, tag = "14")]
288 pub asked: ::core::option::Option<f64>,
289}
290#[derive(serde::Serialize, serde::Deserialize)]
294#[derive(Clone, PartialEq, ::prost::Message)]
295pub struct ReportRequest {
296 #[prost(string, tag = "1")]
298 pub author: ::prost::alloc::string::String,
299 #[prost(string, tag = "2")]
300 pub origin: ::prost::alloc::string::String,
301 #[prost(string, tag = "3")]
303 pub hypothesis_id: ::prost::alloc::string::String,
304 #[prost(string, tag = "4")]
305 pub claim: ::prost::alloc::string::String,
306 #[prost(string, tag = "5")]
308 pub instrument: ::prost::alloc::string::String,
309 #[prost(string, tag = "6")]
311 pub from: ::prost::alloc::string::String,
312 #[prost(string, tag = "7")]
313 pub to: ::prost::alloc::string::String,
314 #[prost(string, tag = "8")]
316 pub interval: ::prost::alloc::string::String,
317 #[prost(string, tag = "9")]
319 pub dataset_id: ::prost::alloc::string::String,
320 #[prost(string, tag = "10")]
321 pub dataset_version: ::prost::alloc::string::String,
322 #[prost(string, tag = "11")]
324 pub adjustment: ::prost::alloc::string::String,
325 #[prost(string, tag = "12")]
327 pub strategy: ::prost::alloc::string::String,
328 #[prost(map = "string, double", tag = "13")]
329 pub params: ::std::collections::HashMap<::prost::alloc::string::String, f64>,
330 #[prost(double, tag = "14")]
332 pub commission_bps: f64,
333 #[prost(double, tag = "15")]
334 pub slippage_bps: f64,
335 #[prost(double, tag = "16")]
336 pub per_fill: f64,
337 #[prost(double, optional, tag = "17")]
339 pub stop_atr_multiple: ::core::option::Option<f64>,
340 #[prost(double, tag = "18")]
342 pub starting_cash: f64,
343 #[prost(string, tag = "19")]
345 pub engine: ::prost::alloc::string::String,
346 #[prost(message, repeated, tag = "20")]
348 pub strategy_curve: ::prost::alloc::vec::Vec<Point>,
349 #[prost(message, repeated, tag = "21")]
350 pub ledger: ::prost::alloc::vec::Vec<LedgerTrade>,
351 #[prost(message, repeated, tag = "22")]
354 pub benchmark_curve: ::prost::alloc::vec::Vec<Point>,
355 #[prost(uint32, optional, tag = "23")]
357 pub trials: ::core::option::Option<u32>,
358}
359#[derive(serde::Serialize, serde::Deserialize)]
360#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
361pub struct ReportFigure {
362 #[prost(string, tag = "1")]
363 pub finding_id: ::prost::alloc::string::String,
364 #[prost(string, optional, tag = "2")]
367 pub figure: ::core::option::Option<::prost::alloc::string::String>,
368}
369#[derive(serde::Serialize, serde::Deserialize)]
370#[derive(Clone, PartialEq, ::prost::Message)]
371pub struct TradeExport {
372 #[prost(string, tag = "1")]
373 pub name: ::prost::alloc::string::String,
374 #[prost(message, repeated, tag = "2")]
379 pub rows: ::prost::alloc::vec::Vec<TradeRow>,
380}
381#[derive(serde::Serialize, serde::Deserialize)]
383#[derive(Clone, PartialEq, ::prost::Message)]
384pub struct TradeRow {
385 #[prost(string, tag = "1")]
390 pub instrument: ::prost::alloc::string::String,
391 #[prost(string, tag = "2")]
392 pub opened: ::prost::alloc::string::String,
393 #[prost(string, tag = "3")]
394 pub closed: ::prost::alloc::string::String,
395 #[prost(string, tag = "4")]
396 pub direction: ::prost::alloc::string::String,
397 #[prost(double, tag = "5")]
398 pub quantity: f64,
399 #[prost(double, tag = "6")]
400 pub entry: f64,
401 #[prost(double, optional, tag = "7")]
402 pub exit: ::core::option::Option<f64>,
403 #[prost(double, tag = "8")]
404 pub pnl: f64,
405 #[prost(double, tag = "9")]
406 pub commission: f64,
407 #[prost(double, optional, tag = "10")]
408 pub held_days: ::core::option::Option<f64>,
409 #[prost(string, tag = "11")]
410 pub exit_reason: ::prost::alloc::string::String,
411 #[prost(string, optional, tag = "12")]
415 pub rule: ::core::option::Option<::prost::alloc::string::String>,
416 #[prost(double, optional, tag = "13")]
417 pub signal: ::core::option::Option<f64>,
418 #[prost(string, optional, tag = "14")]
419 pub regime: ::core::option::Option<::prost::alloc::string::String>,
420 #[prost(double, optional, tag = "15")]
421 pub asked: ::core::option::Option<f64>,
422}
423#[derive(serde::Serialize, serde::Deserialize)]
425#[derive(Clone, PartialEq, ::prost::Message)]
426pub struct Param {
427 #[prost(string, tag = "1")]
428 pub name: ::prost::alloc::string::String,
429 #[prost(double, repeated, tag = "2")]
430 pub values: ::prost::alloc::vec::Vec<f64>,
431}
432#[derive(serde::Serialize, serde::Deserialize)]
433#[derive(Clone, PartialEq, ::prost::Message)]
434pub struct Fixed {
435 #[prost(string, tag = "1")]
436 pub name: ::prost::alloc::string::String,
437 #[prost(double, tag = "2")]
438 pub value: f64,
439}
440#[derive(serde::Serialize, serde::Deserialize)]
442#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
443pub struct Ruleset {
444 #[prost(string, tag = "1")]
445 pub path: ::prost::alloc::string::String,
446 #[prost(string, tag = "2")]
447 pub name: ::prost::alloc::string::String,
448 #[prost(string, tag = "3")]
449 pub label: ::prost::alloc::string::String,
450 #[prost(string, tag = "4")]
451 pub rule: ::prost::alloc::string::String,
452 #[prost(string, tag = "5")]
453 pub interval: ::prost::alloc::string::String,
454 #[prost(uint32, tag = "6")]
455 pub searches: u32,
456 #[prost(string, optional, tag = "7")]
458 pub problem: ::core::option::Option<::prost::alloc::string::String>,
459}
460#[derive(serde::Serialize, serde::Deserialize)]
461#[derive(Clone, PartialEq, ::prost::Message)]
462pub struct Rulesets {
463 #[prost(message, repeated, tag = "1")]
464 pub rulesets: ::prost::alloc::vec::Vec<Ruleset>,
465}
466#[derive(serde::Serialize, serde::Deserialize)]
467#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
468pub struct RulesetPath {
469 #[prost(string, tag = "1")]
470 pub path: ::prost::alloc::string::String,
471}
472#[derive(serde::Serialize, serde::Deserialize)]
474#[derive(Clone, PartialEq, ::prost::Message)]
475pub struct RulesetForm {
476 #[prost(string, tag = "1")]
477 pub name: ::prost::alloc::string::String,
478 #[prost(string, tag = "2")]
479 pub rule: ::prost::alloc::string::String,
480 #[prost(string, tag = "3")]
481 pub label: ::prost::alloc::string::String,
482 #[prost(string, tag = "4")]
483 pub premise: ::prost::alloc::string::String,
484 #[prost(message, repeated, tag = "5")]
485 pub params: ::prost::alloc::vec::Vec<Param>,
486}
487#[derive(serde::Serialize, serde::Deserialize)]
489#[derive(Clone, PartialEq, ::prost::Message)]
490pub struct Rule {
491 #[prost(string, tag = "1")]
492 pub name: ::prost::alloc::string::String,
493 #[prost(string, tag = "2")]
494 pub label: ::prost::alloc::string::String,
495 #[prost(string, tag = "3")]
496 pub premise: ::prost::alloc::string::String,
497 #[prost(string, tag = "4")]
498 pub interval: ::prost::alloc::string::String,
499 #[prost(message, repeated, tag = "5")]
500 pub fixed: ::prost::alloc::vec::Vec<Fixed>,
501 #[prost(message, repeated, tag = "6")]
502 pub axes: ::prost::alloc::vec::Vec<Param>,
503 #[prost(bool, tag = "7")]
504 pub ranks_a_set: bool,
505 #[prost(bool, tag = "8")]
506 pub trades_options: bool,
507}
508#[derive(serde::Serialize, serde::Deserialize)]
509#[derive(Clone, PartialEq, ::prost::Message)]
510pub struct Rules {
511 #[prost(message, repeated, tag = "1")]
512 pub rules: ::prost::alloc::vec::Vec<Rule>,
513}
514#[derive(serde::Serialize, serde::Deserialize)]
516#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
517pub struct RiskModel {
518 #[prost(string, tag = "1")]
519 pub path: ::prost::alloc::string::String,
520 #[prost(bool, tag = "2")]
521 pub exists: bool,
522 #[prost(string, tag = "3")]
525 pub model_json: ::prost::alloc::string::String,
526 #[prost(string, optional, tag = "4")]
528 pub error: ::core::option::Option<::prost::alloc::string::String>,
529}
530#[derive(serde::Serialize, serde::Deserialize)]
540#[derive(Clone, Copy, PartialEq, ::prost::Message)]
541pub struct AfterTaxView {
542 #[prost(double, tag = "1")]
543 pub strategy_return: f64,
544 #[prost(double, tag = "2")]
545 pub benchmark_return: f64,
546 #[prost(double, tag = "3")]
549 pub excess: f64,
550 #[prost(double, tag = "4")]
551 pub strategy_tax: f64,
552 #[prost(double, tag = "5")]
553 pub benchmark_tax: f64,
554 #[prost(double, tag = "6")]
555 pub short_term_rate: f64,
556 #[prost(double, tag = "7")]
557 pub long_term_rate: f64,
558}
559#[derive(serde::Serialize, serde::Deserialize)]
565#[derive(Clone, Copy, PartialEq, ::prost::Message)]
566pub struct BookView {
567 #[prost(message, optional, tag = "1")]
568 pub metrics: ::core::option::Option<MetricsView>,
569 #[prost(double, tag = "2")]
572 pub diversification: f64,
573}
574#[derive(serde::Serialize, serde::Deserialize)]
580#[derive(Clone, PartialEq, ::prost::Message)]
581pub struct BreadthView {
582 #[prost(string, repeated, tag = "1")]
583 pub instruments: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
584 #[prost(message, repeated, tag = "2")]
587 pub correlations: ::prost::alloc::vec::Vec<CorrelationRow>,
588 #[prost(double, optional, tag = "3")]
589 pub mean_correlation: ::core::option::Option<f64>,
590 #[prost(double, optional, tag = "4")]
592 pub effective: ::core::option::Option<f64>,
593 #[prost(double, optional, tag = "5")]
596 pub overstatement: ::core::option::Option<f64>,
597}
598#[derive(serde::Serialize, serde::Deserialize)]
600#[derive(Clone, PartialEq, ::prost::Message)]
601pub struct ComparisonRowView {
602 #[prost(string, tag = "1")]
603 pub id: ::prost::alloc::string::String,
604 #[prost(string, tag = "2")]
605 pub subject: ::prost::alloc::string::String,
606 #[prost(string, tag = "3")]
607 pub kind: ::prost::alloc::string::String,
608 #[prost(string, tag = "4")]
609 pub strategy_name: ::prost::alloc::string::String,
610 #[prost(string, tag = "5")]
611 pub verdict: ::prost::alloc::string::String,
612 #[prost(string, tag = "6")]
613 pub recorded_at: ::prost::alloc::string::String,
614 #[prost(double, tag = "7")]
615 pub total_return: f64,
616 #[prost(double, tag = "8")]
617 pub excess_return: f64,
618 #[prost(double, optional, tag = "9")]
619 pub sharpe: ::core::option::Option<f64>,
620 #[prost(double, tag = "10")]
621 pub max_drawdown: f64,
622 #[prost(uint32, tag = "11")]
623 pub trades: u32,
624 #[prost(double, optional, tag = "12")]
625 pub win_rate: ::core::option::Option<f64>,
626 #[prost(double, optional, tag = "13")]
627 pub profit_factor: ::core::option::Option<f64>,
628 #[prost(bool, optional, tag = "14")]
630 pub stale: ::core::option::Option<bool>,
631}
632#[derive(serde::Serialize, serde::Deserialize)]
634#[derive(Clone, PartialEq, ::prost::Message)]
635pub struct ComparisonView {
636 #[prost(message, repeated, tag = "1")]
637 pub rows: ::prost::alloc::vec::Vec<ComparisonRowView>,
638 #[prost(message, repeated, tag = "2")]
639 pub curves: ::prost::alloc::vec::Vec<NamedCurveView>,
640 #[prost(double, optional, tag = "3")]
648 pub best_sharpe: ::core::option::Option<f64>,
649 #[prost(double, optional, tag = "4")]
650 pub expected_best_under_null: ::core::option::Option<f64>,
651 #[prost(bool, tag = "5")]
652 pub survived_deflation: bool,
653 #[prost(string, repeated, tag = "6")]
655 pub notes: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
656}
657#[derive(serde::Serialize, serde::Deserialize)]
660#[derive(Clone, PartialEq, ::prost::Message)]
661pub struct CorrelationRow {
662 #[prost(message, repeated, tag = "1")]
663 pub cells: ::prost::alloc::vec::Vec<OptionalDouble>,
664}
665#[derive(serde::Serialize, serde::Deserialize)]
668#[derive(Clone, Copy, PartialEq, ::prost::Message)]
669pub struct CurvePoint {
670 #[prost(int64, tag = "1")]
678 pub time: i64,
679 #[prost(double, tag = "2")]
680 pub value: f64,
681}
682#[derive(serde::Serialize, serde::Deserialize)]
684#[derive(Clone, PartialEq, ::prost::Message)]
685pub struct DivergenceView {
686 #[prost(string, tag = "1")]
687 pub what: ::prost::alloc::string::String,
688 #[prost(uint32, optional, tag = "2")]
689 pub at: ::core::option::Option<u32>,
690 #[prost(string, optional, tag = "3")]
691 pub when: ::core::option::Option<::prost::alloc::string::String>,
692 #[prost(double, tag = "4")]
693 pub recorded: f64,
694 #[prost(double, tag = "5")]
695 pub replayed: f64,
696 #[prost(double, tag = "6")]
699 pub relative: f64,
700}
701#[derive(serde::Serialize, serde::Deserialize)]
702#[derive(Clone, Copy, PartialEq, ::prost::Message)]
703pub struct DividendGapView {
704 #[prost(uint32, tag = "1")]
709 pub events: u32,
710 #[prost(double, tag = "2")]
711 pub strategy_income: f64,
712 #[prost(double, tag = "3")]
713 pub benchmark_income: f64,
714 #[prost(double, tag = "4")]
717 pub overstatement: f64,
718 #[prost(double, optional, tag = "5")]
726 pub corrected_excess: ::core::option::Option<f64>,
727 #[prost(bool, tag = "6")]
730 pub complete: bool,
731 #[prost(uint32, tag = "7")]
732 pub covered: u32,
733 #[prost(uint32, tag = "8")]
734 pub instruments: u32,
735}
736#[derive(serde::Serialize, serde::Deserialize)]
738#[derive(Clone, PartialEq, ::prost::Message)]
739pub struct FoldView {
740 #[prost(string, tag = "1")]
741 pub chose_on: ::prost::alloc::string::String,
742 #[prost(string, tag = "2")]
743 pub judged_on: ::prost::alloc::string::String,
744 #[prost(message, repeated, tag = "3")]
745 pub params: ::prost::alloc::vec::Vec<NamedNumber>,
746 #[prost(double, tag = "4")]
747 pub strategy_return: f64,
748 #[prost(double, tag = "5")]
749 pub benchmark_return: f64,
750 #[prost(uint32, tag = "6")]
751 pub trades: u32,
752 #[prost(bool, tag = "7")]
756 pub survived_deflation: bool,
757}
758#[derive(serde::Serialize, serde::Deserialize)]
759#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
760pub struct HistoryEntryView {
761 #[prost(string, tag = "1")]
762 pub id: ::prost::alloc::string::String,
763 #[prost(string, tag = "2")]
764 pub kind: ::prost::alloc::string::String,
765 #[prost(string, tag = "3")]
766 pub subject: ::prost::alloc::string::String,
767 #[prost(string, tag = "4")]
768 pub verdict: ::prost::alloc::string::String,
769 #[prost(string, tag = "5")]
770 pub recorded_at: ::prost::alloc::string::String,
771 #[prost(bool, optional, tag = "6")]
775 pub stale: ::core::option::Option<bool>,
776 #[prost(string, optional, tag = "7")]
779 pub agent: ::core::option::Option<::prost::alloc::string::String>,
780 #[prost(string, optional, tag = "8")]
782 pub origin: ::core::option::Option<::prost::alloc::string::String>,
783 #[prost(uint32, optional, tag = "9")]
785 pub trials: ::core::option::Option<u32>,
786 #[prost(uint32, tag = "10")]
788 pub attachments: u32,
789 #[prost(string, tag = "11")]
793 pub code_commit: ::prost::alloc::string::String,
794 #[prost(string, tag = "12")]
795 pub ruleset_hash: ::prost::alloc::string::String,
796 #[prost(string, tag = "13")]
799 pub stale_reason: ::prost::alloc::string::String,
800}
801#[derive(serde::Serialize, serde::Deserialize)]
804#[derive(Clone, PartialEq, ::prost::Message)]
805pub struct HistoryView {
806 #[prost(message, repeated, tag = "1")]
807 pub entries: ::prost::alloc::vec::Vec<HistoryEntryView>,
808 #[prost(message, repeated, tag = "2")]
809 pub unreadable: ::prost::alloc::vec::Vec<UnreadableView>,
810}
811#[derive(serde::Serialize, serde::Deserialize)]
818#[derive(Clone, PartialEq, ::prost::Message)]
819pub struct MemberView {
820 #[prost(string, tag = "1")]
821 pub instrument: ::prost::alloc::string::String,
822 #[prost(uint32, tag = "2")]
823 pub trades: u32,
824 #[prost(double, tag = "3")]
826 pub pnl: f64,
827 #[prost(double, optional, tag = "4")]
832 pub share: ::core::option::Option<f64>,
833 #[prost(bool, tag = "5")]
838 pub silent: bool,
839}
840#[derive(serde::Serialize, serde::Deserialize)]
841#[derive(Clone, Copy, PartialEq, ::prost::Message)]
842pub struct MetricsView {
843 #[prost(double, tag = "1")]
844 pub total_return: f64,
845 #[prost(double, tag = "2")]
846 pub cagr: f64,
847 #[prost(double, tag = "3")]
848 pub max_drawdown: f64,
849 #[prost(double, tag = "4")]
850 pub volatility: f64,
851 #[prost(double, optional, tag = "5")]
852 pub sharpe: ::core::option::Option<f64>,
853 #[prost(double, optional, tag = "6")]
854 pub sortino: ::core::option::Option<f64>,
855 #[prost(double, optional, tag = "7")]
856 pub calmar: ::core::option::Option<f64>,
857 #[prost(double, optional, tag = "8")]
862 pub psr: ::core::option::Option<f64>,
863 #[prost(uint32, tag = "9")]
864 pub trades: u32,
865}
866#[derive(serde::Serialize, serde::Deserialize)]
868#[derive(Clone, Copy, PartialEq, ::prost::Message)]
869pub struct MonthlyReturnView {
870 #[prost(int32, tag = "1")]
871 pub year: i32,
872 #[prost(uint32, tag = "2")]
873 pub month: u32,
874 #[prost(double, tag = "3")]
875 pub value: f64,
876}
877#[derive(serde::Serialize, serde::Deserialize)]
879#[derive(Clone, PartialEq, ::prost::Message)]
880pub struct NamedCurveView {
881 #[prost(string, tag = "1")]
882 pub name: ::prost::alloc::string::String,
883 #[prost(message, repeated, tag = "2")]
884 pub points: ::prost::alloc::vec::Vec<CurvePoint>,
885}
886#[derive(serde::Serialize, serde::Deserialize)]
898#[derive(Clone, PartialEq, ::prost::Message)]
899pub struct NamedNumber {
900 #[prost(string, tag = "1")]
901 pub name: ::prost::alloc::string::String,
902 #[prost(double, tag = "2")]
903 pub value: f64,
904}
905#[derive(serde::Serialize, serde::Deserialize)]
906#[derive(Clone, Copy, PartialEq, ::prost::Message)]
907pub struct OptionalDouble {
908 #[prost(double, optional, tag = "1")]
909 pub value: ::core::option::Option<f64>,
910}
911#[derive(serde::Serialize, serde::Deserialize)]
913#[derive(Clone, PartialEq, ::prost::Message)]
914pub struct OutcomeView {
915 #[prost(string, tag = "1")]
916 pub instrument: ::prost::alloc::string::String,
917 #[prost(double, tag = "2")]
918 pub strategy_return: f64,
919 #[prost(double, tag = "3")]
920 pub benchmark_return: f64,
921 #[prost(double, tag = "4")]
922 pub excess_return: f64,
923 #[prost(double, tag = "5")]
924 pub max_drawdown: f64,
925 #[prost(uint32, tag = "6")]
926 pub trades: u32,
927}
928#[derive(serde::Serialize, serde::Deserialize)]
930#[derive(Clone, PartialEq, ::prost::Message)]
931pub struct PanelView {
932 #[prost(string, tag = "1")]
937 pub id: ::prost::alloc::string::String,
938 #[prost(string, tag = "2")]
939 pub verdict: ::prost::alloc::string::String,
940 #[prost(string, repeated, tag = "3")]
941 pub reasons: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
942 #[prost(message, repeated, tag = "4")]
943 pub recommendations: ::prost::alloc::vec::Vec<RecommendationView>,
944 #[prost(uint32, tag = "5")]
945 pub instruments: u32,
946 #[prost(uint32, tag = "6")]
947 pub total_trades: u32,
948 #[prost(double, tag = "7")]
949 pub mean_excess_return: f64,
950 #[prost(uint32, tag = "8")]
951 pub beat_benchmark: u32,
952 #[prost(double, tag = "9")]
953 pub mean_max_drawdown: f64,
954 #[prost(message, optional, tag = "10")]
955 pub breadth: ::core::option::Option<BreadthView>,
956 #[prost(message, optional, tag = "11")]
957 pub book: ::core::option::Option<BookView>,
958 #[prost(double, tag = "12")]
959 pub worst_max_drawdown: f64,
960 #[prost(uint32, tag = "13")]
961 pub trials: u32,
962 #[prost(double, tag = "14")]
963 pub best_sharpe: f64,
964 #[prost(double, optional, tag = "15")]
965 pub expected_best_under_null: ::core::option::Option<f64>,
966 #[prost(bool, tag = "16")]
967 pub survived_deflation: bool,
968 #[prost(string, tag = "17")]
969 pub in_sample: ::prost::alloc::string::String,
970 #[prost(string, tag = "18")]
971 pub out_of_sample: ::prost::alloc::string::String,
972 #[prost(message, repeated, tag = "19")]
973 pub selected_params: ::prost::alloc::vec::Vec<NamedNumber>,
974 #[prost(message, repeated, tag = "20")]
975 pub per_instrument: ::prost::alloc::vec::Vec<OutcomeView>,
976 #[prost(string, repeated, tag = "21")]
977 pub failures: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
978 #[prost(string, tag = "22")]
979 pub dataset_version: ::prost::alloc::string::String,
980 #[prost(string, tag = "23")]
981 pub strategy_name: ::prost::alloc::string::String,
982 #[prost(double, tag = "24")]
983 pub starting_cash: f64,
984 #[prost(double, tag = "25")]
985 pub commission_bps: f64,
986 #[prost(double, tag = "26")]
987 pub slippage_bps: f64,
988 #[prost(string, tag = "27")]
989 pub engine: ::prost::alloc::string::String,
990}
991#[derive(serde::Serialize, serde::Deserialize)]
993#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
994pub struct RecommendationView {
995 #[prost(string, tag = "1")]
996 pub severity: ::prost::alloc::string::String,
997 #[prost(string, tag = "2")]
998 pub finding: ::prost::alloc::string::String,
999 #[prost(string, tag = "3")]
1000 pub action: ::prost::alloc::string::String,
1001 #[prost(string, tag = "4")]
1002 pub evidence: ::prost::alloc::string::String,
1003}
1004#[derive(serde::Serialize, serde::Deserialize)]
1006#[derive(Clone, PartialEq, ::prost::Message)]
1007pub struct RecordView {
1008 #[prost(oneof = "record_view::Of", tags = "1, 2, 3, 4")]
1009 pub of: ::core::option::Option<record_view::Of>,
1010}
1011pub mod record_view {
1013 #[derive(serde::Serialize, serde::Deserialize)]
1014 #[derive(Clone, PartialEq, ::prost::Oneof)]
1015 pub enum Of {
1016 #[prost(message, tag = "1")]
1017 Study(super::StudyView),
1018 #[prost(message, tag = "2")]
1019 Panel(super::PanelView),
1020 #[prost(message, tag = "3")]
1021 Walkforward(super::WalkForwardView),
1022 #[prost(message, tag = "4")]
1023 Reported(super::ReportedView),
1024 }
1025}
1026#[derive(serde::Serialize, serde::Deserialize)]
1031#[derive(Clone, PartialEq, ::prost::Message)]
1032pub struct ReplayView {
1033 #[prost(string, tag = "1")]
1037 pub outcome: ::prost::alloc::string::String,
1038 #[prost(bool, tag = "2")]
1042 pub holds: bool,
1043 #[prost(string, tag = "3")]
1044 pub detail: ::prost::alloc::string::String,
1045 #[prost(message, optional, tag = "4")]
1046 pub divergence: ::core::option::Option<DivergenceView>,
1047}
1048#[derive(serde::Serialize, serde::Deserialize)]
1052#[derive(Clone, PartialEq, ::prost::Message)]
1053pub struct ReportedView {
1054 #[prost(string, tag = "1")]
1055 pub id: ::prost::alloc::string::String,
1056 #[prost(string, tag = "2")]
1057 pub hypothesis: ::prost::alloc::string::String,
1058 #[prost(string, tag = "3")]
1059 pub claim: ::prost::alloc::string::String,
1060 #[prost(string, tag = "4")]
1061 pub instrument: ::prost::alloc::string::String,
1062 #[prost(string, tag = "5")]
1063 pub engine: ::prost::alloc::string::String,
1064 #[prost(string, tag = "6")]
1065 pub from: ::prost::alloc::string::String,
1066 #[prost(string, tag = "7")]
1067 pub to: ::prost::alloc::string::String,
1068 #[prost(string, tag = "8")]
1069 pub interval: ::prost::alloc::string::String,
1070 #[prost(string, tag = "9")]
1072 pub dataset: ::prost::alloc::string::String,
1073 #[prost(string, tag = "10")]
1074 pub strategy: ::prost::alloc::string::String,
1075 #[prost(string, tag = "11")]
1076 pub verdict: ::prost::alloc::string::String,
1077 #[prost(string, repeated, tag = "12")]
1078 pub reasons: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1079 #[prost(uint32, tag = "13")]
1080 pub trades: u32,
1081 #[prost(uint32, optional, tag = "14")]
1082 pub trials: ::core::option::Option<u32>,
1083 #[prost(double, optional, tag = "15")]
1085 pub total_return: ::core::option::Option<f64>,
1086 #[prost(double, optional, tag = "16")]
1087 pub excess_return: ::core::option::Option<f64>,
1088 #[prost(double, optional, tag = "17")]
1089 pub sharpe: ::core::option::Option<f64>,
1090 #[prost(double, optional, tag = "18")]
1091 pub max_drawdown: ::core::option::Option<f64>,
1092 #[prost(string, tag = "19")]
1093 pub recorded_at: ::prost::alloc::string::String,
1094 #[prost(string, tag = "20")]
1095 pub author: ::prost::alloc::string::String,
1096 #[prost(message, repeated, tag = "21")]
1098 pub attachments: ::prost::alloc::vec::Vec<Attachment>,
1099}
1100#[derive(serde::Serialize, serde::Deserialize)]
1102#[derive(Clone, PartialEq, ::prost::Message)]
1103pub struct StabilityView {
1104 #[prost(string, tag = "1")]
1105 pub axis: ::prost::alloc::string::String,
1106 #[prost(uint32, tag = "2")]
1107 pub distinct: u32,
1108 #[prost(double, tag = "3")]
1109 pub modal: f64,
1110 #[prost(double, tag = "4")]
1111 pub modal_share: f64,
1112}
1113#[derive(serde::Serialize, serde::Deserialize)]
1115#[derive(Clone, PartialEq, ::prost::Message)]
1116pub struct StudyView {
1117 #[prost(string, tag = "1")]
1122 pub id: ::prost::alloc::string::String,
1123 #[prost(string, tag = "2")]
1124 pub instrument: ::prost::alloc::string::String,
1125 #[prost(string, repeated, tag = "3")]
1134 pub instruments: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1135 #[prost(message, repeated, tag = "4")]
1137 pub members: ::prost::alloc::vec::Vec<MemberView>,
1138 #[prost(string, tag = "5")]
1139 pub verdict: ::prost::alloc::string::String,
1140 #[prost(string, repeated, tag = "6")]
1141 pub reasons: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1142 #[prost(uint32, tag = "7")]
1143 pub trials: u32,
1144 #[prost(uint32, tag = "8")]
1147 pub prior_trials: u32,
1148 #[prost(double, tag = "9")]
1149 pub best_sharpe: f64,
1150 #[prost(double, optional, tag = "10")]
1151 pub expected_best_under_null: ::core::option::Option<f64>,
1152 #[prost(bool, tag = "11")]
1153 pub survived_deflation: bool,
1154 #[prost(message, optional, tag = "12")]
1156 pub surface: ::core::option::Option<SurfaceView>,
1157 #[prost(string, tag = "13")]
1158 pub in_sample: ::prost::alloc::string::String,
1159 #[prost(string, tag = "14")]
1160 pub out_of_sample: ::prost::alloc::string::String,
1161 #[prost(message, repeated, tag = "15")]
1162 pub selected_params: ::prost::alloc::vec::Vec<NamedNumber>,
1163 #[prost(message, optional, tag = "16")]
1164 pub strategy: ::core::option::Option<MetricsView>,
1165 #[prost(message, optional, tag = "17")]
1166 pub benchmark: ::core::option::Option<MetricsView>,
1167 #[prost(double, tag = "18")]
1171 pub excess_return: f64,
1172 #[prost(message, optional, tag = "19")]
1178 pub dividend_gap: ::core::option::Option<DividendGapView>,
1179 #[prost(message, optional, tag = "20")]
1183 pub after_tax: ::core::option::Option<AfterTaxView>,
1184 #[prost(message, repeated, tag = "21")]
1188 pub strategy_curve: ::prost::alloc::vec::Vec<CurvePoint>,
1189 #[prost(message, repeated, tag = "22")]
1190 pub benchmark_curve: ::prost::alloc::vec::Vec<CurvePoint>,
1191 #[prost(message, repeated, tag = "23")]
1198 pub price: ::prost::alloc::vec::Vec<CandlePoint>,
1199 #[prost(message, repeated, tag = "24")]
1200 pub markers: ::prost::alloc::vec::Vec<TradeMarkerView>,
1201 #[prost(message, repeated, tag = "25")]
1210 pub alongside_charts: ::prost::alloc::vec::Vec<InstrumentChartView>,
1211 #[prost(message, repeated, tag = "26")]
1213 pub underwater: ::prost::alloc::vec::Vec<CurvePoint>,
1214 #[prost(message, repeated, tag = "27")]
1216 pub data_findings: ::prost::alloc::vec::Vec<
1217 super::super::market::v1::DataFindingView,
1218 >,
1219 #[prost(message, repeated, tag = "28")]
1221 pub trades: ::prost::alloc::vec::Vec<TradeRowView>,
1222 #[prost(message, repeated, tag = "29")]
1225 pub monthly: ::prost::alloc::vec::Vec<MonthlyReturnView>,
1226 #[prost(message, optional, tag = "30")]
1228 pub trades_detail: ::core::option::Option<TradesView>,
1229 #[prost(message, repeated, tag = "31")]
1235 pub recommendations: ::prost::alloc::vec::Vec<RecommendationView>,
1236 #[prost(string, tag = "32")]
1239 pub dataset_version: ::prost::alloc::string::String,
1240 #[prost(string, tag = "33")]
1241 pub strategy_name: ::prost::alloc::string::String,
1242 #[prost(double, tag = "34")]
1243 pub starting_cash: f64,
1244 #[prost(double, tag = "35")]
1245 pub commission_bps: f64,
1246 #[prost(double, tag = "36")]
1247 pub slippage_bps: f64,
1248 #[prost(string, tag = "37")]
1249 pub engine: ::prost::alloc::string::String,
1250}
1251#[derive(serde::Serialize, serde::Deserialize)]
1253#[derive(Clone, Copy, PartialEq, ::prost::Message)]
1254pub struct SurfaceCell {
1255 #[prost(double, tag = "1")]
1256 pub x: f64,
1257 #[prost(double, tag = "2")]
1258 pub y: f64,
1259 #[prost(double, tag = "3")]
1260 pub sharpe: f64,
1261 #[prost(bool, tag = "4")]
1263 pub selected: bool,
1264 #[prost(bool, tag = "5")]
1270 pub above_null: bool,
1271}
1272#[derive(serde::Serialize, serde::Deserialize)]
1283#[derive(Clone, PartialEq, ::prost::Message)]
1284pub struct SurfaceView {
1285 #[prost(string, tag = "1")]
1287 pub x_axis: ::prost::alloc::string::String,
1288 #[prost(string, tag = "2")]
1289 pub y_axis: ::prost::alloc::string::String,
1290 #[prost(double, repeated, tag = "3")]
1291 pub x_values: ::prost::alloc::vec::Vec<f64>,
1292 #[prost(double, repeated, tag = "4")]
1293 pub y_values: ::prost::alloc::vec::Vec<f64>,
1294 #[prost(message, repeated, tag = "5")]
1295 pub cells: ::prost::alloc::vec::Vec<SurfaceCell>,
1296 #[prost(double, optional, tag = "6")]
1299 pub null_bar: ::core::option::Option<f64>,
1300 #[prost(double, tag = "7")]
1301 pub best: f64,
1302 #[prost(string, repeated, tag = "8")]
1305 pub collapsed: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1306}
1307#[derive(serde::Serialize, serde::Deserialize)]
1309#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
1310pub struct TradeMarkerView {
1311 #[prost(int64, tag = "1")]
1312 pub time: i64,
1313 #[prost(string, tag = "2")]
1315 pub kind: ::prost::alloc::string::String,
1316 #[prost(string, tag = "3")]
1319 pub reason: ::prost::alloc::string::String,
1320 #[prost(string, tag = "4")]
1321 pub label: ::prost::alloc::string::String,
1322}
1323#[derive(serde::Serialize, serde::Deserialize)]
1332#[derive(Clone, PartialEq, ::prost::Message)]
1333pub struct TradeRowView {
1334 #[prost(string, tag = "1")]
1340 pub instrument: ::prost::alloc::string::String,
1341 #[prost(string, tag = "2")]
1342 pub opened: ::prost::alloc::string::String,
1343 #[prost(string, tag = "3")]
1345 pub closed: ::prost::alloc::string::String,
1346 #[prost(string, tag = "4")]
1347 pub direction: ::prost::alloc::string::String,
1348 #[prost(double, tag = "5")]
1349 pub quantity: f64,
1350 #[prost(double, tag = "6")]
1351 pub entry: f64,
1352 #[prost(double, optional, tag = "7")]
1355 pub exit: ::core::option::Option<f64>,
1356 #[prost(double, tag = "8")]
1357 pub pnl: f64,
1358 #[prost(double, tag = "9")]
1359 pub commission: f64,
1360 #[prost(double, optional, tag = "10")]
1364 pub held_days: ::core::option::Option<f64>,
1365 #[prost(string, tag = "11")]
1367 pub exit_reason: ::prost::alloc::string::String,
1368 #[prost(string, optional, tag = "12")]
1372 pub rule: ::core::option::Option<::prost::alloc::string::String>,
1373 #[prost(double, optional, tag = "13")]
1374 pub signal: ::core::option::Option<f64>,
1375 #[prost(string, optional, tag = "14")]
1376 pub regime: ::core::option::Option<::prost::alloc::string::String>,
1377 #[prost(double, optional, tag = "15")]
1378 pub asked: ::core::option::Option<f64>,
1379}
1380#[derive(serde::Serialize, serde::Deserialize)]
1386#[derive(Clone, Copy, PartialEq, ::prost::Message)]
1387pub struct TradesView {
1388 #[prost(uint32, tag = "1")]
1389 pub closed: u32,
1390 #[prost(uint32, tag = "2")]
1391 pub still_open: u32,
1392 #[prost(double, optional, tag = "3")]
1393 pub win_rate: ::core::option::Option<f64>,
1394 #[prost(double, optional, tag = "4")]
1395 pub profit_factor: ::core::option::Option<f64>,
1396 #[prost(double, optional, tag = "5")]
1397 pub expectancy: ::core::option::Option<f64>,
1398 #[prost(double, optional, tag = "6")]
1399 pub average_win: ::core::option::Option<f64>,
1400 #[prost(double, optional, tag = "7")]
1401 pub average_loss: ::core::option::Option<f64>,
1402 #[prost(double, optional, tag = "8")]
1405 pub average_holding_days: ::core::option::Option<f64>,
1406 #[prost(double, tag = "9")]
1413 pub fees_paid: f64,
1414 #[prost(double, tag = "10")]
1417 pub fees_fraction: f64,
1418 #[prost(uint32, tag = "11")]
1419 pub signal_exits: u32,
1420 #[prost(uint32, tag = "12")]
1421 pub stop_exits: u32,
1422}
1423#[derive(serde::Serialize, serde::Deserialize)]
1429#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
1430pub struct UnreadableView {
1431 #[prost(string, tag = "1")]
1432 pub id: ::prost::alloc::string::String,
1433 #[prost(string, tag = "2")]
1434 pub reason: ::prost::alloc::string::String,
1435}
1436#[derive(serde::Serialize, serde::Deserialize)]
1438#[derive(Clone, PartialEq, ::prost::Message)]
1439pub struct WalkForwardView {
1440 #[prost(string, tag = "1")]
1445 pub id: ::prost::alloc::string::String,
1446 #[prost(string, tag = "2")]
1447 pub instrument: ::prost::alloc::string::String,
1448 #[prost(string, tag = "3")]
1449 pub verdict: ::prost::alloc::string::String,
1450 #[prost(string, repeated, tag = "4")]
1451 pub reasons: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1452 #[prost(message, repeated, tag = "5")]
1453 pub recommendations: ::prost::alloc::vec::Vec<RecommendationView>,
1454 #[prost(message, repeated, tag = "6")]
1455 pub folds: ::prost::alloc::vec::Vec<FoldView>,
1456 #[prost(uint32, tag = "7")]
1457 pub folds_surviving_deflation: u32,
1458 #[prost(uint32, tag = "8")]
1461 pub folds_without_trades: u32,
1462 #[prost(message, repeated, tag = "9")]
1464 pub stability: ::prost::alloc::vec::Vec<StabilityView>,
1465 #[prost(message, optional, tag = "10")]
1466 pub strategy: ::core::option::Option<MetricsView>,
1467 #[prost(message, optional, tag = "11")]
1468 pub benchmark: ::core::option::Option<MetricsView>,
1469 #[prost(double, tag = "12")]
1470 pub excess_return: f64,
1471 #[prost(message, repeated, tag = "13")]
1472 pub strategy_curve: ::prost::alloc::vec::Vec<CurvePoint>,
1473 #[prost(message, repeated, tag = "14")]
1474 pub benchmark_curve: ::prost::alloc::vec::Vec<CurvePoint>,
1475 #[prost(message, repeated, tag = "15")]
1476 pub price: ::prost::alloc::vec::Vec<CandlePoint>,
1477 #[prost(message, repeated, tag = "16")]
1478 pub markers: ::prost::alloc::vec::Vec<TradeMarkerView>,
1479 #[prost(message, repeated, tag = "17")]
1480 pub underwater: ::prost::alloc::vec::Vec<CurvePoint>,
1481 #[prost(message, repeated, tag = "18")]
1483 pub data_findings: ::prost::alloc::vec::Vec<
1484 super::super::market::v1::DataFindingView,
1485 >,
1486 #[prost(message, repeated, tag = "19")]
1487 pub trades: ::prost::alloc::vec::Vec<TradeRowView>,
1488 #[prost(message, optional, tag = "20")]
1489 pub trades_detail: ::core::option::Option<TradesView>,
1490 #[prost(int64, tag = "21")]
1491 pub in_sample_days: i64,
1492 #[prost(int64, tag = "22")]
1493 pub step_days: i64,
1494 #[prost(bool, tag = "23")]
1495 pub anchored: bool,
1496 #[prost(string, tag = "24")]
1497 pub dataset_version: ::prost::alloc::string::String,
1498 #[prost(string, tag = "25")]
1499 pub strategy_name: ::prost::alloc::string::String,
1500 #[prost(double, tag = "26")]
1501 pub starting_cash: f64,
1502 #[prost(double, tag = "27")]
1503 pub commission_bps: f64,
1504 #[prost(double, tag = "28")]
1505 pub slippage_bps: f64,
1506 #[prost(string, tag = "29")]
1507 pub engine: ::prost::alloc::string::String,
1508}
1509#[derive(serde::Serialize, serde::Deserialize)]
1513#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
1514pub struct ReviewView {
1515 #[prost(string, tag = "1")]
1516 pub day: ::prost::alloc::string::String,
1517 #[prost(string, tag = "2")]
1518 pub markdown: ::prost::alloc::string::String,
1519 #[prost(string, tag = "3")]
1521 pub path: ::prost::alloc::string::String,
1522 #[prost(bool, tag = "4")]
1524 pub written_now: bool,
1525}
1526#[derive(serde::Serialize, serde::Deserialize)]
1528#[derive(Clone, PartialEq, ::prost::Message)]
1529pub struct BarView {
1530 #[prost(string, tag = "1")]
1532 pub at: ::prost::alloc::string::String,
1533 #[prost(double, tag = "2")]
1534 pub open: f64,
1535 #[prost(double, tag = "3")]
1536 pub high: f64,
1537 #[prost(double, tag = "4")]
1538 pub low: f64,
1539 #[prost(double, tag = "5")]
1540 pub close: f64,
1541 #[prost(double, tag = "6")]
1542 pub volume: f64,
1543}
1544#[derive(serde::Serialize, serde::Deserialize)]
1545#[derive(Clone, PartialEq, ::prost::Message)]
1546pub struct BarsView {
1547 #[prost(string, tag = "1")]
1548 pub instrument: ::prost::alloc::string::String,
1549 #[prost(string, tag = "2")]
1550 pub interval: ::prost::alloc::string::String,
1551 #[prost(message, repeated, tag = "3")]
1552 pub bars: ::prost::alloc::vec::Vec<BarView>,
1553}
1554#[derive(serde::Serialize, serde::Deserialize)]
1559#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
1560pub struct RegimePointView {
1561 #[prost(string, tag = "1")]
1562 pub at: ::prost::alloc::string::String,
1563 #[prost(string, optional, tag = "2")]
1564 pub regime: ::core::option::Option<::prost::alloc::string::String>,
1565}
1566#[derive(serde::Serialize, serde::Deserialize)]
1567#[derive(Clone, PartialEq, ::prost::Message)]
1568pub struct RegimeView {
1569 #[prost(string, tag = "1")]
1570 pub instrument: ::prost::alloc::string::String,
1571 #[prost(string, tag = "2")]
1572 pub interval: ::prost::alloc::string::String,
1573 #[prost(uint32, tag = "3")]
1575 pub lookback: u32,
1576 #[prost(string, optional, tag = "4")]
1578 pub current: ::core::option::Option<::prost::alloc::string::String>,
1579 #[prost(message, repeated, tag = "5")]
1580 pub points: ::prost::alloc::vec::Vec<RegimePointView>,
1581 #[prost(map = "string, uint32", tag = "6")]
1583 pub shares: ::std::collections::HashMap<::prost::alloc::string::String, u32>,
1584}
1585#[derive(serde::Serialize, serde::Deserialize)]
1586#[derive(Clone, Copy, PartialEq, ::prost::Message)]
1587pub struct CandlePoint {
1588 #[prost(int64, tag = "1")]
1589 pub time: i64,
1590 #[prost(double, tag = "2")]
1591 pub open: f64,
1592 #[prost(double, tag = "3")]
1593 pub high: f64,
1594 #[prost(double, tag = "4")]
1595 pub low: f64,
1596 #[prost(double, tag = "5")]
1597 pub close: f64,
1598}
1599#[derive(serde::Serialize, serde::Deserialize)]
1605#[derive(Clone, PartialEq, ::prost::Message)]
1606pub struct InstrumentChartView {
1607 #[prost(string, tag = "1")]
1608 pub instrument: ::prost::alloc::string::String,
1609 #[prost(message, repeated, tag = "2")]
1610 pub price: ::prost::alloc::vec::Vec<CandlePoint>,
1611 #[prost(message, repeated, tag = "3")]
1612 pub markers: ::prost::alloc::vec::Vec<TradeMarkerView>,
1613}
1614#[derive(serde::Serialize, serde::Deserialize)]
1617#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
1618pub struct ResearchProblemView {
1619 #[prost(string, tag = "1")]
1621 pub path: ::prost::alloc::string::String,
1622 #[prost(uint32, tag = "2")]
1623 pub line: u32,
1624 #[prost(string, tag = "3")]
1626 pub severity: ::prost::alloc::string::String,
1627 #[prost(string, tag = "4")]
1628 pub message: ::prost::alloc::string::String,
1629 #[prost(string, tag = "5")]
1631 pub finding: ::prost::alloc::string::String,
1632}
1633#[derive(serde::Serialize, serde::Deserialize)]
1638#[derive(Clone, PartialEq, ::prost::Message)]
1639pub struct ProblemsView {
1640 #[prost(message, repeated, tag = "1")]
1641 pub problems: ::prost::alloc::vec::Vec<ResearchProblemView>,
1642}