81using CloseDecision = std::variant<std::monostate, CloseNow, CloseNextOpen>;
96 configuration_.limit = limit;
102 const std::optional<CloseCause>&
due_cause()
const {
return due_cause_; }
108 return active() || (configuration_.count_pooc_full_close && budget_.transfer());
115 void metadata(
const std::string& key,
double value) {
120 const bool enabled = std::isfinite(value) && value > 0.0;
121 if (key ==
"intraday_cap_skip_noop_market_fills")
122 configuration_.skip_noop_market = enabled;
123 else if (key ==
"intraday_cap_defer_pooc_close")
124 configuration_.defer_pooc_close = enabled;
125 else if (key ==
"intraday_cap_count_pooc_full_close_fills")
126 configuration_.count_pooc_full_close = enabled;
129 return !(session.size() >= 9 && session[4] ==
'-'
146 void decline(uint64_t incarnation) { budget_.decline(incarnation); }
148 uint64_t incarnation, uint64_t latest_fill)
const {
149 return configuration_.count_pooc_full_close
150 && budget_.can_inherit(
risk_day(clock), c.
bar, incarnation, latest_fill)
164 const auto result = budget_.admit_matched_attempt(
165 day, configuration_.limit, context.
bar,
166 configuration_.count_pooc_full_close ? attempt.
incarnation : 0,
176 budget_.expire_transfer();
179 return active() && configuration_.count_pooc_full_close && full
184 uint64_t fill,
const std::vector<ContinuationCandidate>& candidates) {
186 for (
const auto& candidate : candidates) {
188 || candidate.is_long == (before ==
Side::Long))
continue;
190 selected = &candidate;
192 budget_.count_committed_close(
risk_day(clock), configuration_.limit,
197 int64_t cycle,
Prices prices) {
199 if (side ==
Side::Flat) { budget_.latch();
return {}; }
200 const uint64_t action = next_action_++;
202 "Close Position (Max number of filled orders in one day)"};
203 if (configuration_.defer_pooc_close && ordinary(c)
222 budget_.expire_transfer();
223 if (due_cause_ && bar > due_cause_->trigger_bar) due_cause_.reset();
237 CapConfiguration configuration_;
238 IntradayOrderBudget budget_;
239 std::optional<CloseCause> due_cause_;
240 uint64_t next_action_ = 1;
void decline(uint64_t incarnation)
const CapConfiguration & configuration() const
CapAttachment attachment() const
void metadata(const std::string &key, double value)
AttemptOrigin origin(const CapClock &clock, const Calculation &c, uint64_t incarnation, uint64_t latest_fill) const
void after_immediate_close_attempt()
static constexpr uint64_t schema_version
DirectCloseRouting direct_close_routing(const Calculation &c, bool full) const
void ordinary_open(int bar)
static OrderRiskDay risk_day(const CapClock &clock)
static bool uses_chart_clock(const std::string &session)
Admission pre_dispatch(const CapClock &clock, const Calculation &context, const MatchedAttempt &attempt, uint64_t latest_fill)
uint64_t next_action() const
IntradayCap(CapAttachment attachment=CapAttachment::None)
const IntradayOrderBudget & budget() const
const std::optional< CloseCause > & due_cause() const
void committed_close(const CapClock &clock, const Calculation &c, Side before, uint64_t fill, const std::vector< ContinuationCandidate > &candidates)
bool legacy_limit_is_zero() const
void outcome(FillOutcome outcome, AttemptOrigin origin)
CloseDecision post_dispatch(const Admission &admission, const Calculation &c, const MatchedAttempt &attempt, Side side, int64_t cycle, Prices prices)
IntradayCap & operator=(int limit)
Placement placement(const CapClock &clock)
std::variant< std::monostate, CloseNow, CloseNextOpen > CloseDecision
int64_t session_trading_day_index(int64_t ms, const std::string &tz, const std::string &session)
Broker trading-day ordinal on the unmerged symbol session clock.
int hhmm_to_minutes(const std::string &hhmm)
std::optional< QuotaTrigger > trigger
bool count_pooc_full_close
broker::PositionCloseRequest request
broker::PositionCloseRequest request