10 const auto& value = *evidence_;
11 if (value.position_cycle <= 0 || value.entry_bar < 0
12 || (value.direction != 1 && value.direction != -1)
13 || !std::isfinite(value.cursor_price)) {
14 throw std::invalid_argument(
"invalid Pine exit placement evidence");
19 return evidence_ && !std::isnan(evidence_->stop_level)
20 && (evidence_->direction > 0 ? evidence_->cursor_price <= evidence_->stop_level
21 : evidence_->cursor_price >= evidence_->stop_level);
25 return evidence_ && !evidence_->limit_continuation
26 && !std::isnan(evidence_->limit_level)
27 && (evidence_->direction > 0 ? evidence_->cursor_price >= evidence_->limit_level
28 : evidence_->cursor_price <= evidence_->limit_level);
32 return evidence_ && evidence_->limit_continuation
37 int owner_entry_bar)
const {
38 const int first = owner_entry_bar;
43 double stop,
double limit,
50 const bool limit_marketable = !std::isnan(limit)
53 std::optional<LimitContinuation> continuation;
55 if (!context.
magnifier && historical_reach
57 && context.
recalc_leg == 0 && (!std::isnan(stop) || !std::isnan(limit))
81 && (std::isnan(stop) || stop < context.
bar.
low)) {
87 stop, limit, continuation});
bool continues_at_later_open() const noexcept
bool holds_limit() const noexcept
ExitLegActivationBounds resolve(std::int64_t owner_cycle, int owner_entry_bar) const
bool holds_stop() const noexcept
const std::optional< ExitPlacementEvidence > & evidence() const noexcept
ExitActivationPolicy()=default
bool historical_cascade_reach(HistoricalBirthReach reach) noexcept
ExitActivationPolicy select_exit_activation(const ExitActivationRequest &request, double stop, double limit, const ExitActivationContext &context)
std::uint64_t market_recalc_fill
std::uint64_t market_recalc_incarnation
std::string_view first_lot_id
bool after_first_open_fill
std::uint64_t current_fill
std::uint64_t first_lot_incarnation
HistoricalBirthReach birth_reach
std::string_view from_entry
std::string_view oca_name