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")]
202 pub last: ::core::option::Option<u32>,
203}
204#[derive(serde::Serialize, serde::Deserialize)]
212#[derive(Clone, PartialEq, ::prost::Message)]
213pub struct IndicatorRequest {
214 #[prost(message, optional, tag = "1")]
215 pub bars: ::core::option::Option<BarsRequest>,
216 #[prost(string, tag = "2")]
217 pub indicator: ::prost::alloc::string::String,
218 #[prost(map = "string, double", tag = "3")]
219 pub params: ::std::collections::HashMap<::prost::alloc::string::String, f64>,
220}
221#[derive(serde::Serialize, serde::Deserialize)]
223#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
224pub struct RankRequest {
225 #[prost(string, optional, tag = "1")]
227 pub rule: ::core::option::Option<::prost::alloc::string::String>,
228 #[prost(string, optional, tag = "2")]
230 pub instrument: ::core::option::Option<::prost::alloc::string::String>,
231}
232#[derive(serde::Serialize, serde::Deserialize)]
234#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
235pub struct ReviewRequest {
236 #[prost(string, optional, tag = "1")]
238 pub day: ::core::option::Option<::prost::alloc::string::String>,
239}
240#[derive(serde::Serialize, serde::Deserialize)]
241#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
242pub struct StudyRequest {
243 #[prost(string, tag = "1")]
244 pub instrument: ::prost::alloc::string::String,
245 #[prost(string, optional, tag = "2")]
247 pub strategy: ::core::option::Option<::prost::alloc::string::String>,
248}
249#[derive(serde::Serialize, serde::Deserialize)]
250#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
251pub struct BookRequest {
252 #[prost(string, repeated, tag = "1")]
253 pub instruments: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
254 #[prost(string, optional, tag = "2")]
255 pub strategy: ::core::option::Option<::prost::alloc::string::String>,
256 #[prost(uint32, optional, tag = "3")]
257 pub max_concurrent_positions: ::core::option::Option<u32>,
258 #[prost(uint32, optional, tag = "4")]
259 pub max_per_sector: ::core::option::Option<u32>,
260}
261#[derive(serde::Serialize, serde::Deserialize)]
263#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
264pub struct PanelRequest {
265 #[prost(string, tag = "1")]
266 pub universe: ::prost::alloc::string::String,
267 #[prost(string, optional, tag = "2")]
269 pub strategy: ::core::option::Option<::prost::alloc::string::String>,
270}
271#[derive(serde::Serialize, serde::Deserialize)]
272#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
273pub struct SharedExperiment {
274 #[prost(string, tag = "1")]
276 pub text: ::prost::alloc::string::String,
277 #[prost(string, tag = "2")]
278 pub instrument: ::prost::alloc::string::String,
279}
280#[derive(serde::Serialize, serde::Deserialize)]
282#[derive(Clone, PartialEq, ::prost::Message)]
283pub struct Point {
284 #[prost(string, tag = "1")]
285 pub at: ::prost::alloc::string::String,
286 #[prost(double, tag = "2")]
287 pub equity: f64,
288}
289#[derive(serde::Serialize, serde::Deserialize)]
292#[derive(Clone, PartialEq, ::prost::Message)]
293pub struct LedgerTrade {
294 #[prost(string, tag = "1")]
296 pub instrument: ::prost::alloc::string::String,
297 #[prost(string, tag = "2")]
298 pub opened: ::prost::alloc::string::String,
299 #[prost(string, tag = "3")]
300 pub closed: ::prost::alloc::string::String,
301 #[prost(string, tag = "4")]
303 pub direction: ::prost::alloc::string::String,
304 #[prost(double, tag = "5")]
305 pub quantity: f64,
306 #[prost(double, tag = "6")]
307 pub entry: f64,
308 #[prost(double, optional, tag = "7")]
309 pub exit: ::core::option::Option<f64>,
310 #[prost(double, tag = "8")]
311 pub pnl: f64,
312 #[prost(double, tag = "9")]
313 pub commission: f64,
314 #[prost(string, tag = "10")]
316 pub exit_reason: ::prost::alloc::string::String,
317 #[prost(string, optional, tag = "11")]
321 pub rule: ::core::option::Option<::prost::alloc::string::String>,
322 #[prost(double, optional, tag = "12")]
323 pub signal: ::core::option::Option<f64>,
324 #[prost(string, optional, tag = "13")]
325 pub regime: ::core::option::Option<::prost::alloc::string::String>,
326 #[prost(double, optional, tag = "14")]
327 pub asked: ::core::option::Option<f64>,
328}
329#[derive(serde::Serialize, serde::Deserialize)]
333#[derive(Clone, PartialEq, ::prost::Message)]
334pub struct ReportRequest {
335 #[prost(string, tag = "1")]
337 pub author: ::prost::alloc::string::String,
338 #[prost(string, tag = "2")]
339 pub origin: ::prost::alloc::string::String,
340 #[prost(string, tag = "3")]
342 pub hypothesis_id: ::prost::alloc::string::String,
343 #[prost(string, tag = "4")]
344 pub claim: ::prost::alloc::string::String,
345 #[prost(string, tag = "5")]
347 pub instrument: ::prost::alloc::string::String,
348 #[prost(string, tag = "6")]
350 pub from: ::prost::alloc::string::String,
351 #[prost(string, tag = "7")]
352 pub to: ::prost::alloc::string::String,
353 #[prost(string, tag = "8")]
355 pub interval: ::prost::alloc::string::String,
356 #[prost(string, tag = "9")]
358 pub dataset_id: ::prost::alloc::string::String,
359 #[prost(string, tag = "10")]
360 pub dataset_version: ::prost::alloc::string::String,
361 #[prost(string, tag = "11")]
363 pub adjustment: ::prost::alloc::string::String,
364 #[prost(string, tag = "12")]
366 pub strategy: ::prost::alloc::string::String,
367 #[prost(map = "string, double", tag = "13")]
368 pub params: ::std::collections::HashMap<::prost::alloc::string::String, f64>,
369 #[prost(double, tag = "14")]
371 pub commission_bps: f64,
372 #[prost(double, tag = "15")]
373 pub slippage_bps: f64,
374 #[prost(double, tag = "16")]
375 pub per_fill: f64,
376 #[prost(double, optional, tag = "17")]
378 pub stop_atr_multiple: ::core::option::Option<f64>,
379 #[prost(double, tag = "18")]
381 pub starting_cash: f64,
382 #[prost(string, tag = "19")]
384 pub engine: ::prost::alloc::string::String,
385 #[prost(message, repeated, tag = "20")]
387 pub strategy_curve: ::prost::alloc::vec::Vec<Point>,
388 #[prost(message, repeated, tag = "21")]
389 pub ledger: ::prost::alloc::vec::Vec<LedgerTrade>,
390 #[prost(message, repeated, tag = "22")]
393 pub benchmark_curve: ::prost::alloc::vec::Vec<Point>,
394 #[prost(uint32, optional, tag = "23")]
396 pub trials: ::core::option::Option<u32>,
397}
398#[derive(serde::Serialize, serde::Deserialize)]
399#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
400pub struct ReportFigure {
401 #[prost(string, tag = "1")]
402 pub finding_id: ::prost::alloc::string::String,
403 #[prost(string, optional, tag = "2")]
406 pub figure: ::core::option::Option<::prost::alloc::string::String>,
407}
408#[derive(serde::Serialize, serde::Deserialize)]
409#[derive(Clone, PartialEq, ::prost::Message)]
410pub struct TradeExport {
411 #[prost(string, tag = "1")]
412 pub name: ::prost::alloc::string::String,
413 #[prost(message, repeated, tag = "2")]
418 pub rows: ::prost::alloc::vec::Vec<TradeRow>,
419}
420#[derive(serde::Serialize, serde::Deserialize)]
422#[derive(Clone, PartialEq, ::prost::Message)]
423pub struct TradeRow {
424 #[prost(string, tag = "1")]
429 pub instrument: ::prost::alloc::string::String,
430 #[prost(string, tag = "2")]
431 pub opened: ::prost::alloc::string::String,
432 #[prost(string, tag = "3")]
433 pub closed: ::prost::alloc::string::String,
434 #[prost(string, tag = "4")]
435 pub direction: ::prost::alloc::string::String,
436 #[prost(double, tag = "5")]
437 pub quantity: f64,
438 #[prost(double, tag = "6")]
439 pub entry: f64,
440 #[prost(double, optional, tag = "7")]
441 pub exit: ::core::option::Option<f64>,
442 #[prost(double, tag = "8")]
443 pub pnl: f64,
444 #[prost(double, tag = "9")]
445 pub commission: f64,
446 #[prost(double, optional, tag = "10")]
447 pub held_days: ::core::option::Option<f64>,
448 #[prost(string, tag = "11")]
449 pub exit_reason: ::prost::alloc::string::String,
450 #[prost(string, optional, tag = "12")]
454 pub rule: ::core::option::Option<::prost::alloc::string::String>,
455 #[prost(double, optional, tag = "13")]
456 pub signal: ::core::option::Option<f64>,
457 #[prost(string, optional, tag = "14")]
458 pub regime: ::core::option::Option<::prost::alloc::string::String>,
459 #[prost(double, optional, tag = "15")]
460 pub asked: ::core::option::Option<f64>,
461}
462#[derive(serde::Serialize, serde::Deserialize)]
464#[derive(Clone, PartialEq, ::prost::Message)]
465pub struct Param {
466 #[prost(string, tag = "1")]
467 pub name: ::prost::alloc::string::String,
468 #[prost(double, repeated, tag = "2")]
469 pub values: ::prost::alloc::vec::Vec<f64>,
470}
471#[derive(serde::Serialize, serde::Deserialize)]
472#[derive(Clone, PartialEq, ::prost::Message)]
473pub struct Fixed {
474 #[prost(string, tag = "1")]
475 pub name: ::prost::alloc::string::String,
476 #[prost(double, tag = "2")]
477 pub value: f64,
478}
479#[derive(serde::Serialize, serde::Deserialize)]
481#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
482pub struct Ruleset {
483 #[prost(string, tag = "1")]
484 pub path: ::prost::alloc::string::String,
485 #[prost(string, tag = "2")]
486 pub name: ::prost::alloc::string::String,
487 #[prost(string, tag = "3")]
488 pub label: ::prost::alloc::string::String,
489 #[prost(string, tag = "4")]
490 pub rule: ::prost::alloc::string::String,
491 #[prost(string, tag = "5")]
492 pub interval: ::prost::alloc::string::String,
493 #[prost(uint32, tag = "6")]
494 pub searches: u32,
495 #[prost(string, optional, tag = "7")]
497 pub problem: ::core::option::Option<::prost::alloc::string::String>,
498}
499#[derive(serde::Serialize, serde::Deserialize)]
500#[derive(Clone, PartialEq, ::prost::Message)]
501pub struct Rulesets {
502 #[prost(message, repeated, tag = "1")]
503 pub rulesets: ::prost::alloc::vec::Vec<Ruleset>,
504}
505#[derive(serde::Serialize, serde::Deserialize)]
508#[derive(Clone, PartialEq, ::prost::Message)]
509pub struct RuleFile {
510 #[prost(string, tag = "1")]
511 pub path: ::prost::alloc::string::String,
512 #[prost(string, tag = "2")]
513 pub name: ::prost::alloc::string::String,
514 #[prost(string, tag = "3")]
515 pub label: ::prost::alloc::string::String,
516 #[prost(string, tag = "4")]
517 pub premise: ::prost::alloc::string::String,
518 #[prost(string, tag = "5")]
519 pub interval: ::prost::alloc::string::String,
520 #[prost(string, repeated, tag = "6")]
522 pub indicators: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
523 #[prost(message, repeated, tag = "7")]
525 pub params: ::prost::alloc::vec::Vec<Fixed>,
526 #[prost(string, tag = "8")]
528 pub entry: ::prost::alloc::string::String,
529 #[prost(string, tag = "9")]
530 pub exit: ::prost::alloc::string::String,
531 #[prost(string, tag = "10")]
533 pub version: ::prost::alloc::string::String,
534 #[prost(string, optional, tag = "11")]
536 pub problem: ::core::option::Option<::prost::alloc::string::String>,
537}
538#[derive(serde::Serialize, serde::Deserialize)]
539#[derive(Clone, PartialEq, ::prost::Message)]
540pub struct RuleFiles {
541 #[prost(message, repeated, tag = "1")]
542 pub rules: ::prost::alloc::vec::Vec<RuleFile>,
543}
544#[derive(serde::Serialize, serde::Deserialize)]
546#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
547pub struct PineScript {
548 #[prost(string, tag = "1")]
550 pub text: ::prost::alloc::string::String,
551 #[prost(string, optional, tag = "2")]
554 pub interval: ::core::option::Option<::prost::alloc::string::String>,
555}
556#[derive(serde::Serialize, serde::Deserialize)]
559#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
560pub struct PineTranslation {
561 #[prost(string, tag = "1")]
563 pub rule: ::prost::alloc::string::String,
564 #[prost(string, repeated, tag = "2")]
567 pub ignored: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
568 #[prost(string, tag = "3")]
570 pub name: ::prost::alloc::string::String,
571 #[prost(string, tag = "4")]
572 pub entry: ::prost::alloc::string::String,
573 #[prost(string, tag = "5")]
574 pub exit: ::prost::alloc::string::String,
575}
576#[derive(serde::Serialize, serde::Deserialize)]
582#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
583pub struct RuleText {
584 #[prost(string, tag = "1")]
586 pub json: ::prost::alloc::string::String,
587}
588#[derive(serde::Serialize, serde::Deserialize)]
589#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
590pub struct RulesetPath {
591 #[prost(string, tag = "1")]
592 pub path: ::prost::alloc::string::String,
593}
594#[derive(serde::Serialize, serde::Deserialize)]
596#[derive(Clone, PartialEq, ::prost::Message)]
597pub struct RulesetForm {
598 #[prost(string, tag = "1")]
599 pub name: ::prost::alloc::string::String,
600 #[prost(string, tag = "2")]
601 pub rule: ::prost::alloc::string::String,
602 #[prost(string, tag = "3")]
603 pub label: ::prost::alloc::string::String,
604 #[prost(string, tag = "4")]
605 pub premise: ::prost::alloc::string::String,
606 #[prost(message, repeated, tag = "5")]
607 pub params: ::prost::alloc::vec::Vec<Param>,
608}
609#[derive(serde::Serialize, serde::Deserialize)]
611#[derive(Clone, PartialEq, ::prost::Message)]
612pub struct Rule {
613 #[prost(string, tag = "1")]
614 pub name: ::prost::alloc::string::String,
615 #[prost(string, tag = "2")]
616 pub label: ::prost::alloc::string::String,
617 #[prost(string, tag = "3")]
618 pub premise: ::prost::alloc::string::String,
619 #[prost(string, tag = "4")]
620 pub interval: ::prost::alloc::string::String,
621 #[prost(message, repeated, tag = "5")]
622 pub fixed: ::prost::alloc::vec::Vec<Fixed>,
623 #[prost(message, repeated, tag = "6")]
624 pub axes: ::prost::alloc::vec::Vec<Param>,
625 #[prost(bool, tag = "7")]
626 pub ranks_a_set: bool,
627 #[prost(bool, tag = "8")]
628 pub trades_options: bool,
629}
630#[derive(serde::Serialize, serde::Deserialize)]
631#[derive(Clone, PartialEq, ::prost::Message)]
632pub struct Rules {
633 #[prost(message, repeated, tag = "1")]
634 pub rules: ::prost::alloc::vec::Vec<Rule>,
635}
636#[derive(serde::Serialize, serde::Deserialize)]
638#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
639pub struct RiskModel {
640 #[prost(string, tag = "1")]
641 pub path: ::prost::alloc::string::String,
642 #[prost(bool, tag = "2")]
643 pub exists: bool,
644 #[prost(string, tag = "3")]
647 pub model_json: ::prost::alloc::string::String,
648 #[prost(string, optional, tag = "4")]
650 pub error: ::core::option::Option<::prost::alloc::string::String>,
651}
652#[derive(serde::Serialize, serde::Deserialize)]
662#[derive(Clone, Copy, PartialEq, ::prost::Message)]
663pub struct AfterTaxView {
664 #[prost(double, tag = "1")]
665 pub strategy_return: f64,
666 #[prost(double, tag = "2")]
667 pub benchmark_return: f64,
668 #[prost(double, tag = "3")]
671 pub excess: f64,
672 #[prost(double, tag = "4")]
673 pub strategy_tax: f64,
674 #[prost(double, tag = "5")]
675 pub benchmark_tax: f64,
676 #[prost(double, tag = "6")]
677 pub short_term_rate: f64,
678 #[prost(double, tag = "7")]
679 pub long_term_rate: f64,
680}
681#[derive(serde::Serialize, serde::Deserialize)]
687#[derive(Clone, Copy, PartialEq, ::prost::Message)]
688pub struct BookView {
689 #[prost(message, optional, tag = "1")]
690 pub metrics: ::core::option::Option<MetricsView>,
691 #[prost(double, tag = "2")]
694 pub diversification: f64,
695}
696#[derive(serde::Serialize, serde::Deserialize)]
702#[derive(Clone, PartialEq, ::prost::Message)]
703pub struct BreadthView {
704 #[prost(string, repeated, tag = "1")]
705 pub instruments: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
706 #[prost(message, repeated, tag = "2")]
709 pub correlations: ::prost::alloc::vec::Vec<CorrelationRow>,
710 #[prost(double, optional, tag = "3")]
711 pub mean_correlation: ::core::option::Option<f64>,
712 #[prost(double, optional, tag = "4")]
714 pub effective: ::core::option::Option<f64>,
715 #[prost(double, optional, tag = "5")]
718 pub overstatement: ::core::option::Option<f64>,
719}
720#[derive(serde::Serialize, serde::Deserialize)]
722#[derive(Clone, PartialEq, ::prost::Message)]
723pub struct ComparisonRowView {
724 #[prost(string, tag = "1")]
725 pub id: ::prost::alloc::string::String,
726 #[prost(string, tag = "2")]
727 pub subject: ::prost::alloc::string::String,
728 #[prost(string, tag = "3")]
729 pub kind: ::prost::alloc::string::String,
730 #[prost(string, tag = "4")]
731 pub strategy_name: ::prost::alloc::string::String,
732 #[prost(string, tag = "5")]
733 pub verdict: ::prost::alloc::string::String,
734 #[prost(string, tag = "6")]
735 pub recorded_at: ::prost::alloc::string::String,
736 #[prost(double, tag = "7")]
737 pub total_return: f64,
738 #[prost(double, tag = "8")]
739 pub excess_return: f64,
740 #[prost(double, optional, tag = "9")]
741 pub sharpe: ::core::option::Option<f64>,
742 #[prost(double, tag = "10")]
743 pub max_drawdown: f64,
744 #[prost(uint32, tag = "11")]
745 pub trades: u32,
746 #[prost(double, optional, tag = "12")]
747 pub win_rate: ::core::option::Option<f64>,
748 #[prost(double, optional, tag = "13")]
749 pub profit_factor: ::core::option::Option<f64>,
750 #[prost(bool, optional, tag = "14")]
752 pub stale: ::core::option::Option<bool>,
753}
754#[derive(serde::Serialize, serde::Deserialize)]
756#[derive(Clone, PartialEq, ::prost::Message)]
757pub struct ComparisonView {
758 #[prost(message, repeated, tag = "1")]
759 pub rows: ::prost::alloc::vec::Vec<ComparisonRowView>,
760 #[prost(message, repeated, tag = "2")]
761 pub curves: ::prost::alloc::vec::Vec<NamedCurveView>,
762 #[prost(double, optional, tag = "3")]
770 pub best_sharpe: ::core::option::Option<f64>,
771 #[prost(double, optional, tag = "4")]
772 pub expected_best_under_null: ::core::option::Option<f64>,
773 #[prost(bool, tag = "5")]
774 pub survived_deflation: bool,
775 #[prost(string, repeated, tag = "6")]
777 pub notes: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
778}
779#[derive(serde::Serialize, serde::Deserialize)]
782#[derive(Clone, PartialEq, ::prost::Message)]
783pub struct CorrelationRow {
784 #[prost(message, repeated, tag = "1")]
785 pub cells: ::prost::alloc::vec::Vec<OptionalDouble>,
786}
787#[derive(serde::Serialize, serde::Deserialize)]
790#[derive(Clone, Copy, PartialEq, ::prost::Message)]
791pub struct CurvePoint {
792 #[prost(int64, tag = "1")]
800 pub time: i64,
801 #[prost(double, tag = "2")]
802 pub value: f64,
803}
804#[derive(serde::Serialize, serde::Deserialize)]
806#[derive(Clone, PartialEq, ::prost::Message)]
807pub struct DivergenceView {
808 #[prost(string, tag = "1")]
809 pub what: ::prost::alloc::string::String,
810 #[prost(uint32, optional, tag = "2")]
811 pub at: ::core::option::Option<u32>,
812 #[prost(string, optional, tag = "3")]
813 pub when: ::core::option::Option<::prost::alloc::string::String>,
814 #[prost(double, tag = "4")]
815 pub recorded: f64,
816 #[prost(double, tag = "5")]
817 pub replayed: f64,
818 #[prost(double, tag = "6")]
821 pub relative: f64,
822}
823#[derive(serde::Serialize, serde::Deserialize)]
824#[derive(Clone, Copy, PartialEq, ::prost::Message)]
825pub struct DividendGapView {
826 #[prost(uint32, tag = "1")]
831 pub events: u32,
832 #[prost(double, tag = "2")]
833 pub strategy_income: f64,
834 #[prost(double, tag = "3")]
835 pub benchmark_income: f64,
836 #[prost(double, tag = "4")]
839 pub overstatement: f64,
840 #[prost(double, optional, tag = "5")]
848 pub corrected_excess: ::core::option::Option<f64>,
849 #[prost(bool, tag = "6")]
852 pub complete: bool,
853 #[prost(uint32, tag = "7")]
854 pub covered: u32,
855 #[prost(uint32, tag = "8")]
856 pub instruments: u32,
857}
858#[derive(serde::Serialize, serde::Deserialize)]
860#[derive(Clone, PartialEq, ::prost::Message)]
861pub struct FoldView {
862 #[prost(string, tag = "1")]
863 pub chose_on: ::prost::alloc::string::String,
864 #[prost(string, tag = "2")]
865 pub judged_on: ::prost::alloc::string::String,
866 #[prost(message, repeated, tag = "3")]
867 pub params: ::prost::alloc::vec::Vec<NamedNumber>,
868 #[prost(double, tag = "4")]
869 pub strategy_return: f64,
870 #[prost(double, tag = "5")]
871 pub benchmark_return: f64,
872 #[prost(uint32, tag = "6")]
873 pub trades: u32,
874 #[prost(bool, tag = "7")]
878 pub survived_deflation: bool,
879}
880#[derive(serde::Serialize, serde::Deserialize)]
881#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
882pub struct HistoryEntryView {
883 #[prost(string, tag = "1")]
884 pub id: ::prost::alloc::string::String,
885 #[prost(string, tag = "2")]
886 pub kind: ::prost::alloc::string::String,
887 #[prost(string, tag = "3")]
888 pub subject: ::prost::alloc::string::String,
889 #[prost(string, tag = "4")]
890 pub verdict: ::prost::alloc::string::String,
891 #[prost(string, tag = "5")]
892 pub recorded_at: ::prost::alloc::string::String,
893 #[prost(bool, optional, tag = "6")]
897 pub stale: ::core::option::Option<bool>,
898 #[prost(string, optional, tag = "7")]
901 pub agent: ::core::option::Option<::prost::alloc::string::String>,
902 #[prost(string, optional, tag = "8")]
904 pub origin: ::core::option::Option<::prost::alloc::string::String>,
905 #[prost(uint32, optional, tag = "9")]
907 pub trials: ::core::option::Option<u32>,
908 #[prost(uint32, tag = "10")]
910 pub attachments: u32,
911 #[prost(string, tag = "11")]
915 pub code_commit: ::prost::alloc::string::String,
916 #[prost(string, tag = "12")]
917 pub ruleset_hash: ::prost::alloc::string::String,
918 #[prost(string, tag = "13")]
921 pub stale_reason: ::prost::alloc::string::String,
922}
923#[derive(serde::Serialize, serde::Deserialize)]
926#[derive(Clone, PartialEq, ::prost::Message)]
927pub struct HistoryView {
928 #[prost(message, repeated, tag = "1")]
929 pub entries: ::prost::alloc::vec::Vec<HistoryEntryView>,
930 #[prost(message, repeated, tag = "2")]
931 pub unreadable: ::prost::alloc::vec::Vec<UnreadableView>,
932}
933#[derive(serde::Serialize, serde::Deserialize)]
940#[derive(Clone, PartialEq, ::prost::Message)]
941pub struct MemberView {
942 #[prost(string, tag = "1")]
943 pub instrument: ::prost::alloc::string::String,
944 #[prost(uint32, tag = "2")]
945 pub trades: u32,
946 #[prost(double, tag = "3")]
948 pub pnl: f64,
949 #[prost(double, optional, tag = "4")]
954 pub share: ::core::option::Option<f64>,
955 #[prost(bool, tag = "5")]
960 pub silent: bool,
961}
962#[derive(serde::Serialize, serde::Deserialize)]
963#[derive(Clone, Copy, PartialEq, ::prost::Message)]
964pub struct MetricsView {
965 #[prost(double, tag = "1")]
966 pub total_return: f64,
967 #[prost(double, tag = "2")]
968 pub cagr: f64,
969 #[prost(double, tag = "3")]
970 pub max_drawdown: f64,
971 #[prost(double, tag = "4")]
972 pub volatility: f64,
973 #[prost(double, optional, tag = "5")]
974 pub sharpe: ::core::option::Option<f64>,
975 #[prost(double, optional, tag = "6")]
976 pub sortino: ::core::option::Option<f64>,
977 #[prost(double, optional, tag = "7")]
978 pub calmar: ::core::option::Option<f64>,
979 #[prost(double, optional, tag = "8")]
984 pub psr: ::core::option::Option<f64>,
985 #[prost(uint32, tag = "9")]
986 pub trades: u32,
987}
988#[derive(serde::Serialize, serde::Deserialize)]
990#[derive(Clone, Copy, PartialEq, ::prost::Message)]
991pub struct MonthlyReturnView {
992 #[prost(int32, tag = "1")]
993 pub year: i32,
994 #[prost(uint32, tag = "2")]
995 pub month: u32,
996 #[prost(double, tag = "3")]
997 pub value: f64,
998}
999#[derive(serde::Serialize, serde::Deserialize)]
1001#[derive(Clone, PartialEq, ::prost::Message)]
1002pub struct NamedCurveView {
1003 #[prost(string, tag = "1")]
1004 pub name: ::prost::alloc::string::String,
1005 #[prost(message, repeated, tag = "2")]
1006 pub points: ::prost::alloc::vec::Vec<CurvePoint>,
1007}
1008#[derive(serde::Serialize, serde::Deserialize)]
1020#[derive(Clone, PartialEq, ::prost::Message)]
1021pub struct NamedNumber {
1022 #[prost(string, tag = "1")]
1023 pub name: ::prost::alloc::string::String,
1024 #[prost(double, tag = "2")]
1025 pub value: f64,
1026}
1027#[derive(serde::Serialize, serde::Deserialize)]
1028#[derive(Clone, Copy, PartialEq, ::prost::Message)]
1029pub struct OptionalDouble {
1030 #[prost(double, optional, tag = "1")]
1031 pub value: ::core::option::Option<f64>,
1032}
1033#[derive(serde::Serialize, serde::Deserialize)]
1035#[derive(Clone, PartialEq, ::prost::Message)]
1036pub struct OutcomeView {
1037 #[prost(string, tag = "1")]
1038 pub instrument: ::prost::alloc::string::String,
1039 #[prost(double, tag = "2")]
1040 pub strategy_return: f64,
1041 #[prost(double, tag = "3")]
1042 pub benchmark_return: f64,
1043 #[prost(double, tag = "4")]
1044 pub excess_return: f64,
1045 #[prost(double, tag = "5")]
1046 pub max_drawdown: f64,
1047 #[prost(uint32, tag = "6")]
1048 pub trades: u32,
1049}
1050#[derive(serde::Serialize, serde::Deserialize)]
1052#[derive(Clone, PartialEq, ::prost::Message)]
1053pub struct PanelView {
1054 #[prost(string, tag = "1")]
1059 pub id: ::prost::alloc::string::String,
1060 #[prost(string, tag = "2")]
1061 pub verdict: ::prost::alloc::string::String,
1062 #[prost(string, repeated, tag = "3")]
1063 pub reasons: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1064 #[prost(message, repeated, tag = "4")]
1065 pub recommendations: ::prost::alloc::vec::Vec<RecommendationView>,
1066 #[prost(uint32, tag = "5")]
1067 pub instruments: u32,
1068 #[prost(uint32, tag = "6")]
1069 pub total_trades: u32,
1070 #[prost(double, tag = "7")]
1071 pub mean_excess_return: f64,
1072 #[prost(uint32, tag = "8")]
1073 pub beat_benchmark: u32,
1074 #[prost(double, tag = "9")]
1075 pub mean_max_drawdown: f64,
1076 #[prost(message, optional, tag = "10")]
1077 pub breadth: ::core::option::Option<BreadthView>,
1078 #[prost(message, optional, tag = "11")]
1079 pub book: ::core::option::Option<BookView>,
1080 #[prost(double, tag = "12")]
1081 pub worst_max_drawdown: f64,
1082 #[prost(uint32, tag = "13")]
1083 pub trials: u32,
1084 #[prost(double, tag = "14")]
1085 pub best_sharpe: f64,
1086 #[prost(double, optional, tag = "15")]
1087 pub expected_best_under_null: ::core::option::Option<f64>,
1088 #[prost(bool, tag = "16")]
1089 pub survived_deflation: bool,
1090 #[prost(string, tag = "17")]
1091 pub in_sample: ::prost::alloc::string::String,
1092 #[prost(string, tag = "18")]
1093 pub out_of_sample: ::prost::alloc::string::String,
1094 #[prost(message, repeated, tag = "19")]
1095 pub selected_params: ::prost::alloc::vec::Vec<NamedNumber>,
1096 #[prost(message, repeated, tag = "20")]
1097 pub per_instrument: ::prost::alloc::vec::Vec<OutcomeView>,
1098 #[prost(string, repeated, tag = "21")]
1099 pub failures: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1100 #[prost(string, tag = "22")]
1101 pub dataset_version: ::prost::alloc::string::String,
1102 #[prost(string, tag = "23")]
1103 pub strategy_name: ::prost::alloc::string::String,
1104 #[prost(double, tag = "24")]
1105 pub starting_cash: f64,
1106 #[prost(double, tag = "25")]
1107 pub commission_bps: f64,
1108 #[prost(double, tag = "26")]
1109 pub slippage_bps: f64,
1110 #[prost(string, tag = "27")]
1111 pub engine: ::prost::alloc::string::String,
1112 #[prost(string, tag = "28")]
1114 pub universe: ::prost::alloc::string::String,
1115 #[prost(string, repeated, tag = "29")]
1118 pub notes: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1119}
1120#[derive(serde::Serialize, serde::Deserialize)]
1122#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
1123pub struct RecommendationView {
1124 #[prost(string, tag = "1")]
1125 pub severity: ::prost::alloc::string::String,
1126 #[prost(string, tag = "2")]
1127 pub finding: ::prost::alloc::string::String,
1128 #[prost(string, tag = "3")]
1129 pub action: ::prost::alloc::string::String,
1130 #[prost(string, tag = "4")]
1131 pub evidence: ::prost::alloc::string::String,
1132}
1133#[derive(serde::Serialize, serde::Deserialize)]
1135#[derive(Clone, PartialEq, ::prost::Message)]
1136pub struct RecordView {
1137 #[prost(oneof = "record_view::Of", tags = "1, 2, 3, 4")]
1138 pub of: ::core::option::Option<record_view::Of>,
1139}
1140pub mod record_view {
1142 #[derive(serde::Serialize, serde::Deserialize)]
1143 #[derive(Clone, PartialEq, ::prost::Oneof)]
1144 pub enum Of {
1145 #[prost(message, tag = "1")]
1146 Study(super::StudyView),
1147 #[prost(message, tag = "2")]
1148 Panel(super::PanelView),
1149 #[prost(message, tag = "3")]
1150 Walkforward(super::WalkForwardView),
1151 #[prost(message, tag = "4")]
1152 Reported(super::ReportedView),
1153 }
1154}
1155#[derive(serde::Serialize, serde::Deserialize)]
1160#[derive(Clone, PartialEq, ::prost::Message)]
1161pub struct ReplayView {
1162 #[prost(string, tag = "1")]
1166 pub outcome: ::prost::alloc::string::String,
1167 #[prost(bool, tag = "2")]
1171 pub holds: bool,
1172 #[prost(string, tag = "3")]
1173 pub detail: ::prost::alloc::string::String,
1174 #[prost(message, optional, tag = "4")]
1175 pub divergence: ::core::option::Option<DivergenceView>,
1176}
1177#[derive(serde::Serialize, serde::Deserialize)]
1181#[derive(Clone, PartialEq, ::prost::Message)]
1182pub struct ReportedView {
1183 #[prost(string, tag = "1")]
1184 pub id: ::prost::alloc::string::String,
1185 #[prost(string, tag = "2")]
1186 pub hypothesis: ::prost::alloc::string::String,
1187 #[prost(string, tag = "3")]
1188 pub claim: ::prost::alloc::string::String,
1189 #[prost(string, tag = "4")]
1190 pub instrument: ::prost::alloc::string::String,
1191 #[prost(string, tag = "5")]
1192 pub engine: ::prost::alloc::string::String,
1193 #[prost(string, tag = "6")]
1194 pub from: ::prost::alloc::string::String,
1195 #[prost(string, tag = "7")]
1196 pub to: ::prost::alloc::string::String,
1197 #[prost(string, tag = "8")]
1198 pub interval: ::prost::alloc::string::String,
1199 #[prost(string, tag = "9")]
1201 pub dataset: ::prost::alloc::string::String,
1202 #[prost(string, tag = "10")]
1203 pub strategy: ::prost::alloc::string::String,
1204 #[prost(string, tag = "11")]
1205 pub verdict: ::prost::alloc::string::String,
1206 #[prost(string, repeated, tag = "12")]
1207 pub reasons: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1208 #[prost(uint32, tag = "13")]
1209 pub trades: u32,
1210 #[prost(uint32, optional, tag = "14")]
1211 pub trials: ::core::option::Option<u32>,
1212 #[prost(double, optional, tag = "15")]
1214 pub total_return: ::core::option::Option<f64>,
1215 #[prost(double, optional, tag = "16")]
1216 pub excess_return: ::core::option::Option<f64>,
1217 #[prost(double, optional, tag = "17")]
1218 pub sharpe: ::core::option::Option<f64>,
1219 #[prost(double, optional, tag = "18")]
1220 pub max_drawdown: ::core::option::Option<f64>,
1221 #[prost(string, tag = "19")]
1222 pub recorded_at: ::prost::alloc::string::String,
1223 #[prost(string, tag = "20")]
1224 pub author: ::prost::alloc::string::String,
1225 #[prost(message, repeated, tag = "21")]
1227 pub attachments: ::prost::alloc::vec::Vec<Attachment>,
1228}
1229#[derive(serde::Serialize, serde::Deserialize)]
1231#[derive(Clone, PartialEq, ::prost::Message)]
1232pub struct StabilityView {
1233 #[prost(string, tag = "1")]
1234 pub axis: ::prost::alloc::string::String,
1235 #[prost(uint32, tag = "2")]
1236 pub distinct: u32,
1237 #[prost(double, tag = "3")]
1238 pub modal: f64,
1239 #[prost(double, tag = "4")]
1240 pub modal_share: f64,
1241}
1242#[derive(serde::Serialize, serde::Deserialize)]
1244#[derive(Clone, PartialEq, ::prost::Message)]
1245pub struct StudyView {
1246 #[prost(string, tag = "1")]
1251 pub id: ::prost::alloc::string::String,
1252 #[prost(string, tag = "2")]
1253 pub instrument: ::prost::alloc::string::String,
1254 #[prost(string, repeated, tag = "3")]
1263 pub instruments: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1264 #[prost(message, repeated, tag = "4")]
1266 pub members: ::prost::alloc::vec::Vec<MemberView>,
1267 #[prost(string, tag = "5")]
1268 pub verdict: ::prost::alloc::string::String,
1269 #[prost(string, repeated, tag = "6")]
1270 pub reasons: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1271 #[prost(uint32, tag = "7")]
1272 pub trials: u32,
1273 #[prost(uint32, tag = "8")]
1276 pub prior_trials: u32,
1277 #[prost(double, tag = "9")]
1278 pub best_sharpe: f64,
1279 #[prost(double, optional, tag = "10")]
1280 pub expected_best_under_null: ::core::option::Option<f64>,
1281 #[prost(bool, tag = "11")]
1282 pub survived_deflation: bool,
1283 #[prost(message, optional, tag = "12")]
1285 pub surface: ::core::option::Option<SurfaceView>,
1286 #[prost(string, tag = "13")]
1287 pub in_sample: ::prost::alloc::string::String,
1288 #[prost(string, tag = "14")]
1289 pub out_of_sample: ::prost::alloc::string::String,
1290 #[prost(message, repeated, tag = "15")]
1291 pub selected_params: ::prost::alloc::vec::Vec<NamedNumber>,
1292 #[prost(message, optional, tag = "16")]
1293 pub strategy: ::core::option::Option<MetricsView>,
1294 #[prost(message, optional, tag = "17")]
1295 pub benchmark: ::core::option::Option<MetricsView>,
1296 #[prost(double, tag = "18")]
1300 pub excess_return: f64,
1301 #[prost(message, optional, tag = "19")]
1307 pub dividend_gap: ::core::option::Option<DividendGapView>,
1308 #[prost(message, optional, tag = "20")]
1312 pub after_tax: ::core::option::Option<AfterTaxView>,
1313 #[prost(message, repeated, tag = "21")]
1317 pub strategy_curve: ::prost::alloc::vec::Vec<CurvePoint>,
1318 #[prost(message, repeated, tag = "22")]
1319 pub benchmark_curve: ::prost::alloc::vec::Vec<CurvePoint>,
1320 #[prost(message, repeated, tag = "23")]
1327 pub price: ::prost::alloc::vec::Vec<CandlePoint>,
1328 #[prost(message, repeated, tag = "24")]
1329 pub markers: ::prost::alloc::vec::Vec<TradeMarkerView>,
1330 #[prost(message, repeated, tag = "25")]
1339 pub alongside_charts: ::prost::alloc::vec::Vec<InstrumentChartView>,
1340 #[prost(message, repeated, tag = "26")]
1342 pub underwater: ::prost::alloc::vec::Vec<CurvePoint>,
1343 #[prost(message, repeated, tag = "27")]
1345 pub data_findings: ::prost::alloc::vec::Vec<
1346 super::super::market::v1::DataFindingView,
1347 >,
1348 #[prost(message, repeated, tag = "28")]
1350 pub trades: ::prost::alloc::vec::Vec<TradeRowView>,
1351 #[prost(message, repeated, tag = "29")]
1354 pub monthly: ::prost::alloc::vec::Vec<MonthlyReturnView>,
1355 #[prost(message, optional, tag = "30")]
1357 pub trades_detail: ::core::option::Option<TradesView>,
1358 #[prost(message, repeated, tag = "31")]
1364 pub recommendations: ::prost::alloc::vec::Vec<RecommendationView>,
1365 #[prost(string, tag = "32")]
1368 pub dataset_version: ::prost::alloc::string::String,
1369 #[prost(string, tag = "33")]
1370 pub strategy_name: ::prost::alloc::string::String,
1371 #[prost(double, tag = "34")]
1372 pub starting_cash: f64,
1373 #[prost(double, tag = "35")]
1374 pub commission_bps: f64,
1375 #[prost(double, tag = "36")]
1376 pub slippage_bps: f64,
1377 #[prost(string, tag = "37")]
1378 pub engine: ::prost::alloc::string::String,
1379}
1380#[derive(serde::Serialize, serde::Deserialize)]
1382#[derive(Clone, Copy, PartialEq, ::prost::Message)]
1383pub struct SurfaceCell {
1384 #[prost(double, tag = "1")]
1385 pub x: f64,
1386 #[prost(double, tag = "2")]
1387 pub y: f64,
1388 #[prost(double, tag = "3")]
1389 pub sharpe: f64,
1390 #[prost(bool, tag = "4")]
1392 pub selected: bool,
1393 #[prost(bool, tag = "5")]
1399 pub above_null: bool,
1400}
1401#[derive(serde::Serialize, serde::Deserialize)]
1412#[derive(Clone, PartialEq, ::prost::Message)]
1413pub struct SurfaceView {
1414 #[prost(string, tag = "1")]
1416 pub x_axis: ::prost::alloc::string::String,
1417 #[prost(string, tag = "2")]
1418 pub y_axis: ::prost::alloc::string::String,
1419 #[prost(double, repeated, tag = "3")]
1420 pub x_values: ::prost::alloc::vec::Vec<f64>,
1421 #[prost(double, repeated, tag = "4")]
1422 pub y_values: ::prost::alloc::vec::Vec<f64>,
1423 #[prost(message, repeated, tag = "5")]
1424 pub cells: ::prost::alloc::vec::Vec<SurfaceCell>,
1425 #[prost(double, optional, tag = "6")]
1428 pub null_bar: ::core::option::Option<f64>,
1429 #[prost(double, tag = "7")]
1430 pub best: f64,
1431 #[prost(string, repeated, tag = "8")]
1434 pub collapsed: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1435}
1436#[derive(serde::Serialize, serde::Deserialize)]
1438#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
1439pub struct TradeMarkerView {
1440 #[prost(int64, tag = "1")]
1441 pub time: i64,
1442 #[prost(string, tag = "2")]
1444 pub kind: ::prost::alloc::string::String,
1445 #[prost(string, tag = "3")]
1448 pub reason: ::prost::alloc::string::String,
1449 #[prost(string, tag = "4")]
1450 pub label: ::prost::alloc::string::String,
1451}
1452#[derive(serde::Serialize, serde::Deserialize)]
1461#[derive(Clone, PartialEq, ::prost::Message)]
1462pub struct TradeRowView {
1463 #[prost(string, tag = "1")]
1469 pub instrument: ::prost::alloc::string::String,
1470 #[prost(string, tag = "2")]
1471 pub opened: ::prost::alloc::string::String,
1472 #[prost(string, tag = "3")]
1474 pub closed: ::prost::alloc::string::String,
1475 #[prost(string, tag = "4")]
1476 pub direction: ::prost::alloc::string::String,
1477 #[prost(double, tag = "5")]
1478 pub quantity: f64,
1479 #[prost(double, tag = "6")]
1480 pub entry: f64,
1481 #[prost(double, optional, tag = "7")]
1484 pub exit: ::core::option::Option<f64>,
1485 #[prost(double, tag = "8")]
1486 pub pnl: f64,
1487 #[prost(double, tag = "9")]
1488 pub commission: f64,
1489 #[prost(double, optional, tag = "10")]
1493 pub held_days: ::core::option::Option<f64>,
1494 #[prost(string, tag = "11")]
1496 pub exit_reason: ::prost::alloc::string::String,
1497 #[prost(string, optional, tag = "12")]
1501 pub rule: ::core::option::Option<::prost::alloc::string::String>,
1502 #[prost(double, optional, tag = "13")]
1503 pub signal: ::core::option::Option<f64>,
1504 #[prost(string, optional, tag = "14")]
1505 pub regime: ::core::option::Option<::prost::alloc::string::String>,
1506 #[prost(double, optional, tag = "15")]
1507 pub asked: ::core::option::Option<f64>,
1508}
1509#[derive(serde::Serialize, serde::Deserialize)]
1515#[derive(Clone, Copy, PartialEq, ::prost::Message)]
1516pub struct TradesView {
1517 #[prost(uint32, tag = "1")]
1518 pub closed: u32,
1519 #[prost(uint32, tag = "2")]
1520 pub still_open: u32,
1521 #[prost(double, optional, tag = "3")]
1522 pub win_rate: ::core::option::Option<f64>,
1523 #[prost(double, optional, tag = "4")]
1524 pub profit_factor: ::core::option::Option<f64>,
1525 #[prost(double, optional, tag = "5")]
1526 pub expectancy: ::core::option::Option<f64>,
1527 #[prost(double, optional, tag = "6")]
1528 pub average_win: ::core::option::Option<f64>,
1529 #[prost(double, optional, tag = "7")]
1530 pub average_loss: ::core::option::Option<f64>,
1531 #[prost(double, optional, tag = "8")]
1534 pub average_holding_days: ::core::option::Option<f64>,
1535 #[prost(double, tag = "9")]
1542 pub fees_paid: f64,
1543 #[prost(double, tag = "10")]
1546 pub fees_fraction: f64,
1547 #[prost(uint32, tag = "11")]
1548 pub signal_exits: u32,
1549 #[prost(uint32, tag = "12")]
1550 pub stop_exits: u32,
1551}
1552#[derive(serde::Serialize, serde::Deserialize)]
1558#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
1559pub struct UnreadableView {
1560 #[prost(string, tag = "1")]
1561 pub id: ::prost::alloc::string::String,
1562 #[prost(string, tag = "2")]
1563 pub reason: ::prost::alloc::string::String,
1564}
1565#[derive(serde::Serialize, serde::Deserialize)]
1567#[derive(Clone, PartialEq, ::prost::Message)]
1568pub struct WalkForwardView {
1569 #[prost(string, tag = "1")]
1574 pub id: ::prost::alloc::string::String,
1575 #[prost(string, tag = "2")]
1576 pub instrument: ::prost::alloc::string::String,
1577 #[prost(string, tag = "3")]
1578 pub verdict: ::prost::alloc::string::String,
1579 #[prost(string, repeated, tag = "4")]
1580 pub reasons: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1581 #[prost(message, repeated, tag = "5")]
1582 pub recommendations: ::prost::alloc::vec::Vec<RecommendationView>,
1583 #[prost(message, repeated, tag = "6")]
1584 pub folds: ::prost::alloc::vec::Vec<FoldView>,
1585 #[prost(uint32, tag = "7")]
1586 pub folds_surviving_deflation: u32,
1587 #[prost(uint32, tag = "8")]
1590 pub folds_without_trades: u32,
1591 #[prost(message, repeated, tag = "9")]
1593 pub stability: ::prost::alloc::vec::Vec<StabilityView>,
1594 #[prost(message, optional, tag = "10")]
1595 pub strategy: ::core::option::Option<MetricsView>,
1596 #[prost(message, optional, tag = "11")]
1597 pub benchmark: ::core::option::Option<MetricsView>,
1598 #[prost(double, tag = "12")]
1599 pub excess_return: f64,
1600 #[prost(message, repeated, tag = "13")]
1601 pub strategy_curve: ::prost::alloc::vec::Vec<CurvePoint>,
1602 #[prost(message, repeated, tag = "14")]
1603 pub benchmark_curve: ::prost::alloc::vec::Vec<CurvePoint>,
1604 #[prost(message, repeated, tag = "15")]
1605 pub price: ::prost::alloc::vec::Vec<CandlePoint>,
1606 #[prost(message, repeated, tag = "16")]
1607 pub markers: ::prost::alloc::vec::Vec<TradeMarkerView>,
1608 #[prost(message, repeated, tag = "17")]
1609 pub underwater: ::prost::alloc::vec::Vec<CurvePoint>,
1610 #[prost(message, repeated, tag = "18")]
1612 pub data_findings: ::prost::alloc::vec::Vec<
1613 super::super::market::v1::DataFindingView,
1614 >,
1615 #[prost(message, repeated, tag = "19")]
1616 pub trades: ::prost::alloc::vec::Vec<TradeRowView>,
1617 #[prost(message, optional, tag = "20")]
1618 pub trades_detail: ::core::option::Option<TradesView>,
1619 #[prost(int64, tag = "21")]
1620 pub in_sample_days: i64,
1621 #[prost(int64, tag = "22")]
1622 pub step_days: i64,
1623 #[prost(bool, tag = "23")]
1624 pub anchored: bool,
1625 #[prost(string, tag = "24")]
1626 pub dataset_version: ::prost::alloc::string::String,
1627 #[prost(string, tag = "25")]
1628 pub strategy_name: ::prost::alloc::string::String,
1629 #[prost(double, tag = "26")]
1630 pub starting_cash: f64,
1631 #[prost(double, tag = "27")]
1632 pub commission_bps: f64,
1633 #[prost(double, tag = "28")]
1634 pub slippage_bps: f64,
1635 #[prost(string, tag = "29")]
1636 pub engine: ::prost::alloc::string::String,
1637}
1638#[derive(serde::Serialize, serde::Deserialize)]
1642#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
1643pub struct ReviewView {
1644 #[prost(string, tag = "1")]
1645 pub day: ::prost::alloc::string::String,
1646 #[prost(string, tag = "2")]
1647 pub markdown: ::prost::alloc::string::String,
1648 #[prost(string, tag = "3")]
1650 pub path: ::prost::alloc::string::String,
1651 #[prost(bool, tag = "4")]
1653 pub written_now: bool,
1654 #[prost(string, tag = "5")]
1658 pub json: ::prost::alloc::string::String,
1659}
1660#[derive(serde::Serialize, serde::Deserialize)]
1667#[derive(Clone, PartialEq, ::prost::Message)]
1668pub struct BarView {
1669 #[prost(string, tag = "1")]
1671 pub at: ::prost::alloc::string::String,
1672 #[prost(double, tag = "2")]
1673 pub open: f64,
1674 #[prost(double, tag = "3")]
1675 pub high: f64,
1676 #[prost(double, tag = "4")]
1677 pub low: f64,
1678 #[prost(double, tag = "5")]
1679 pub close: f64,
1680 #[prost(double, tag = "6")]
1681 pub volume: f64,
1682 #[prost(int64, tag = "7")]
1685 pub time: i64,
1686}
1687#[derive(serde::Serialize, serde::Deserialize)]
1688#[derive(Clone, PartialEq, ::prost::Message)]
1689pub struct BarsView {
1690 #[prost(string, tag = "1")]
1691 pub instrument: ::prost::alloc::string::String,
1692 #[prost(string, tag = "2")]
1693 pub interval: ::prost::alloc::string::String,
1694 #[prost(message, repeated, tag = "3")]
1695 pub bars: ::prost::alloc::vec::Vec<BarView>,
1696 #[prost(string, tag = "4")]
1700 pub zone: ::prost::alloc::string::String,
1701}
1702#[derive(serde::Serialize, serde::Deserialize)]
1707#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
1708pub struct RegimePointView {
1709 #[prost(string, tag = "1")]
1710 pub at: ::prost::alloc::string::String,
1711 #[prost(string, optional, tag = "2")]
1712 pub regime: ::core::option::Option<::prost::alloc::string::String>,
1713}
1714#[derive(serde::Serialize, serde::Deserialize)]
1715#[derive(Clone, PartialEq, ::prost::Message)]
1716pub struct RegimeView {
1717 #[prost(string, tag = "1")]
1718 pub instrument: ::prost::alloc::string::String,
1719 #[prost(string, tag = "2")]
1720 pub interval: ::prost::alloc::string::String,
1721 #[prost(uint32, tag = "3")]
1723 pub lookback: u32,
1724 #[prost(string, optional, tag = "4")]
1726 pub current: ::core::option::Option<::prost::alloc::string::String>,
1727 #[prost(message, repeated, tag = "5")]
1728 pub points: ::prost::alloc::vec::Vec<RegimePointView>,
1729 #[prost(map = "string, uint32", tag = "6")]
1731 pub shares: ::std::collections::HashMap<::prost::alloc::string::String, u32>,
1732}
1733#[derive(serde::Serialize, serde::Deserialize)]
1736#[derive(Clone, Copy, PartialEq, ::prost::Message)]
1737pub struct CandlePoint {
1738 #[prost(int64, tag = "1")]
1739 pub time: i64,
1740 #[prost(double, tag = "2")]
1741 pub open: f64,
1742 #[prost(double, tag = "3")]
1743 pub high: f64,
1744 #[prost(double, tag = "4")]
1745 pub low: f64,
1746 #[prost(double, tag = "5")]
1747 pub close: f64,
1748 #[prost(double, tag = "6")]
1751 pub volume: f64,
1752}
1753#[derive(serde::Serialize, serde::Deserialize)]
1759#[derive(Clone, PartialEq, ::prost::Message)]
1760pub struct InstrumentChartView {
1761 #[prost(string, tag = "1")]
1762 pub instrument: ::prost::alloc::string::String,
1763 #[prost(message, repeated, tag = "2")]
1764 pub price: ::prost::alloc::vec::Vec<CandlePoint>,
1765 #[prost(message, repeated, tag = "3")]
1766 pub markers: ::prost::alloc::vec::Vec<TradeMarkerView>,
1767}
1768#[derive(serde::Serialize, serde::Deserialize)]
1771#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
1772pub struct ResearchProblemView {
1773 #[prost(string, tag = "1")]
1775 pub path: ::prost::alloc::string::String,
1776 #[prost(uint32, tag = "2")]
1777 pub line: u32,
1778 #[prost(string, tag = "3")]
1780 pub severity: ::prost::alloc::string::String,
1781 #[prost(string, tag = "4")]
1782 pub message: ::prost::alloc::string::String,
1783 #[prost(string, tag = "5")]
1785 pub finding: ::prost::alloc::string::String,
1786}
1787#[derive(serde::Serialize, serde::Deserialize)]
1792#[derive(Clone, PartialEq, ::prost::Message)]
1793pub struct ProblemsView {
1794 #[prost(message, repeated, tag = "1")]
1795 pub problems: ::prost::alloc::vec::Vec<ResearchProblemView>,
1796}
1797#[derive(serde::Serialize, serde::Deserialize)]
1799#[derive(Clone, PartialEq, ::prost::Message)]
1800pub struct RankingRowView {
1801 #[prost(string, tag = "1")]
1802 pub id: ::prost::alloc::string::String,
1803 #[prost(string, tag = "2")]
1804 pub subject: ::prost::alloc::string::String,
1805 #[prost(string, tag = "3")]
1806 pub kind: ::prost::alloc::string::String,
1807 #[prost(string, tag = "4")]
1808 pub rule: ::prost::alloc::string::String,
1809 #[prost(string, tag = "5")]
1810 pub interval: ::prost::alloc::string::String,
1811 #[prost(string, tag = "6")]
1812 pub verdict: ::prost::alloc::string::String,
1813 #[prost(string, tag = "7")]
1816 pub conservative_verdict: ::prost::alloc::string::String,
1817 #[prost(double, tag = "8")]
1820 pub expectancy: f64,
1821 #[prost(string, tag = "9")]
1823 pub expectancy_costs: ::prost::alloc::string::String,
1824 #[prost(double, tag = "10")]
1826 pub total_return: f64,
1827 #[prost(double, tag = "11")]
1828 pub max_drawdown: f64,
1829 #[prost(uint32, tag = "12")]
1830 pub trades: u32,
1831 #[prost(string, repeated, tag = "13")]
1833 pub regimes: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1834 #[prost(uint32, optional, tag = "14")]
1836 pub search: ::core::option::Option<u32>,
1837 #[prost(string, tag = "15")]
1838 pub recorded_at: ::prost::alloc::string::String,
1839 #[prost(bool, optional, tag = "16")]
1840 pub stale: ::core::option::Option<bool>,
1841}
1842#[derive(serde::Serialize, serde::Deserialize)]
1847#[derive(Clone, PartialEq, ::prost::Message)]
1848pub struct Ranking {
1849 #[prost(message, repeated, tag = "1")]
1850 pub rows: ::prost::alloc::vec::Vec<RankingRowView>,
1851 #[prost(string, repeated, tag = "2")]
1853 pub notes: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1854}