PineForge v0.13.1-379-g9b50973
Deterministic PineScript v6 backtest runtime — C ABI reference
Loading...
Searching...
No Matches
order_birth.hpp
Go to the documentation of this file.
1#pragma once
2#include <cmath>
3#include <cstdint>
4#include <limits>
5#include <stdexcept>
6
7namespace pineforge {
8
9// Geometry supplied by the dispatcher, never inferred from equal OHLC prices.
11enum class BirthCursorPosition : int32_t { None, Point, Segment };
12enum class OrderBirthCause : int32_t {
13 Unattributed, // manually constructed records; no event is asserted
14 DirectCommand, // native API call outside a chart evaluation
17};
18
20public:
21 BirthCursor() = default;
28 BirthCursorDomain domain() const { return domain_; }
29 BirthCursorPosition position() const { return position_; }
30 int index() const { return index_; }
31 int count() const { return count_; }
32 bool first_point() const { return position_ == BirthCursorPosition::Point && index_ == 0; }
33 bool terminal_point() const {
34 return position_ == BirthCursorPosition::Point && index_ + 1 == count_;
35 }
36 int following_segment() const { return terminal_point() ? -1 : index_; }
37private:
39 int index, int count) {
44 throw std::invalid_argument("invalid order-birth dispatch cursor");
45 BirthCursor out;
46 out.domain_ = domain; out.position_ = position;
47 out.index_ = index; out.count_ = count;
48 return out;
49 }
52 int index_ = -1;
53 int count_ = 0;
54};
55
56// Immutable value: fields have no setters. Replacement constructs a new value;
57// copy/move of an order preserves the complete receipt. A grouped callback may
58// cover an actual contiguous fill-event interval; it does not invent one fill.
60public:
61 OrderBirth() = default;
62 static OrderBirth direct_command(int bar, int64_t timestamp) {
64 }
67 }
69 double price, uint64_t first_fill,
70 uint64_t last_fill, uint64_t evaluation_ordinal) {
71 if (bar < 0 || cursor.domain() == BirthCursorDomain::None || !std::isfinite(price)
73 throw std::invalid_argument("invalid order-birth fill evaluation");
75 out.cursor_ = cursor; out.cursor_price_ = price;
76 out.first_fill_ = first_fill; out.last_fill_ = last_fill;
77 out.evaluation_ordinal_ = evaluation_ordinal;
78 return out;
79 }
80 OrderBirthCause cause() const { return cause_; }
81 bool from_fill() const { return cause_ == OrderBirthCause::FillEvaluation; }
82 bool at_terminal_fill() const { return from_fill() && cursor_.terminal_point(); }
83 int bar() const { return bar_; }
84 int64_t timestamp() const { return timestamp_; }
85 const BirthCursor& cursor() const { return cursor_; }
86 double cursor_price() const { return cursor_price_; }
87 uint64_t first_fill() const { return first_fill_; }
88 uint64_t last_fill() const { return last_fill_; }
89 uint64_t evaluation_ordinal() const { return evaluation_ordinal_; }
90private:
91 static OrderBirth ordinary(OrderBirthCause cause, int bar, int64_t timestamp) {
92 OrderBirth out;
93 out.cause_ = cause; out.bar_ = bar; out.timestamp_ = timestamp;
94 return out;
95 }
97 int bar_ = -1;
98 int64_t timestamp_ = 0;
99 BirthCursor cursor_;
100 double cursor_price_ = std::numeric_limits<double>::quiet_NaN();
101 uint64_t first_fill_ = 0;
102 uint64_t last_fill_ = 0;
103 uint64_t evaluation_ordinal_ = 0;
104};
105
106} // namespace pineforge
static BirthCursor segment(BirthCursorDomain domain, int index, int count)
BirthCursorDomain domain() const
BirthCursorPosition position() const
static BirthCursor point(BirthCursorDomain domain, int index, int count)
int following_segment() const
bool terminal_point() const
uint64_t first_fill() const
bool at_terminal_fill() const
static OrderBirth direct_command(int bar, int64_t timestamp)
static OrderBirth chart_evaluation(int bar, int64_t timestamp)
static OrderBirth fill_evaluation(int bar, int64_t timestamp, BirthCursor cursor, double price, uint64_t first_fill, uint64_t last_fill, uint64_t evaluation_ordinal)
int64_t timestamp() const
OrderBirthCause cause() const
uint64_t evaluation_ordinal() const
double cursor_price() const
const BirthCursor & cursor() const
uint64_t last_fill() const