16#define PINEFORGE_HAS_EXPLICIT_PINE_CAP_V1 1
17#define PINEFORGE_HAS_EXPLICIT_PINE_EXECUTION_ADAPTER_V1 1
18#define PINEFORGE_HAS_NATIVE_LOWERING_V1 1
308 double limit_price = std::numeric_limits<double>::quiet_NaN(),
309 double stop_price = std::numeric_limits<double>::quiet_NaN(),
310 double qty = std::numeric_limits<double>::quiet_NaN(),
311 const std::string& comment = {},
312 const std::string& oca_name = {},
int oca_type = 0,
314 void strategy_close(
const std::string&
id,
const std::string& comment = {},
315 double qty = std::numeric_limits<double>::quiet_NaN(),
316 double qty_percent = std::numeric_limits<double>::quiet_NaN(),
317 bool immediately =
false);
318 void strategy_close(
const std::string&
id,
const std::string& comment,
319 double qty,
double qty_percent,
bool immediately,
320 std::uint64_t callsite_token);
322 void strategy_exit(
const std::string&
id,
const std::string& from_entry,
323 double limit_price,
double stop_price,
324 double trail_points = std::numeric_limits<double>::quiet_NaN(),
325 double trail_offset = std::numeric_limits<double>::quiet_NaN(),
326 double trail_price = std::numeric_limits<double>::quiet_NaN(),
327 double qty_percent = 100.0,
const std::string& comment = {},
328 double qty = std::numeric_limits<double>::quiet_NaN(),
329 const std::string& oca_name = {},
330 double profit_ticks = std::numeric_limits<double>::quiet_NaN(),
331 double loss_ticks = std::numeric_limits<double>::quiet_NaN());
333 const std::string& from_entry,
334 const std::string& comment = {});
337 void strategy_order(
const std::string&
id,
bool is_long,
double qty,
338 double limit_price = std::numeric_limits<double>::quiet_NaN(),
339 double stop_price = std::numeric_limits<double>::quiet_NaN(),
340 const std::string& oca_name = {},
int oca_type = 0);
356 int* close_only,
int* partition) const;
359 double* trail_activation) const;
366 const std::
string& input_tf) override;
367#ifdef PINEFORGE_HAS_AUX_SECURITY_FEED_V1
393 double qty = std::numeric_limits<double>::quiet_NaN();
424 guard_native_mutation(
"set_margin_call_enabled");
446 guard_native_mutation(
"set_realtime_tail");
472 guard_native_mutation(
"set_probe_suppress_tail_logic");
489 return adapter_.chart_day_key(timestamp_ms);
493 return adapter_.cap.due_cause().has_value();
499 host_.config_.default_qty_type =
static_cast<int>(value);
503 return static_cast<QtyType>(host_.config_.default_qty_type);
515 host_.config_.commission_type =
static_cast<int>(value);
519 return static_cast<CommissionType>(host_.config_.commission_type);
531 host_.adapter_.set_risk_direction(value);
540 class SourceIdLedgerView {
547 return present_ == other.present_;
550 return !(*
this == other);
554 bool present_ =
false;
558 const double units = host_ ? host_->adapter_.source_unclosed_qty_for(
id) : 0.0;
560 result.present_ = units > 0.0;
561 result.value_.
second = units;
567 explicit SourceIdLedgerView(
const PineStrategyHost* host) noexcept : host_(host) {}
588 scheduler_.fixture_publish_source_series(bar, new_history_slot);
591 return pine_time_close(current_bar_.timestamp, script_tf_, syminfo_.session,
592 syminfo_.timezone, script_tf_);
599 const std::string& timezone,
600 std::int64_t bar_ms)
const {
604 const std::string& timezone,
605 std::int64_t bar_ms)
const {
609 const std::string& timezone,
610 std::int64_t bar_ms)
const {
620 const std::string& input_tf,
bool lookahead_on,
621 bool gaps_on =
false,
bool heikinashi =
false);
630 const std::string& input_tf);
660 static std::uint64_t adapter_terminal_receipt_high_water(
const NativeStrategyHost&)
noexcept;
661 std::uint64_t adapter_broker_fill_event_sequence() const noexcept {
662 return broker_fill_event_seq_;
664 void scheduler_prepare_script_run(
const std::vector<Bar>&,
665 bool static_eligible,
int expected_script_bars,
666 bool script_bar_geometry);
667 void scheduler_configure_security_evaluators();
668 bool scheduler_uses_aux_security_feed() const noexcept;
669 void scheduler_prepare_security_sequence(const
std::vector<
Bar>&);
684 bool declare_security_sites_to_kernel();
687 bool security_sites_kernel_routed() const noexcept;
688 void init_security_eval_states_for_run(const
std::
string& effective_input_tf);
689 void prepare_historical_security_lookahead_projections(
690 const
Bar* input_bars,
int n_input, const
std::
string& effective_input_tf);
691 void clear_historical_security_lookahead_projections();
692 bool scheduler_feed_security_input(const
Bar&,
std::int64_t next_input_ms,
693 bool calling_bar_complete,
694 bool defer_boundary_gate);
695 void scheduler_publish_security_boundary();
696 void scheduler_feed_deferred_security_input(const
Bar&,
std::int64_t next_input_ms);
697 void scheduler_feed_aux_security(
int chart_index);
698 void scheduler_feed_deferred_aux_security(
int chart_index);
699 void scheduler_finish_security_sequence();
704 void pine_feed_security_eval_state(SecurityEvalState& state, const
Bar& input_bar,
705 bool calling_bar_complete = false);
717 void prune_pine_security_states();
728 bool security_input_precedes_range_start(
const SecurityEvalState& state,
729 int64_t input_ts)
const;
730#ifdef PINEFORGE_HAS_AUX_SECURITY_FEED_V1
734 bool aux_security_traded_between(int64_t from_ms, int64_t to_ms)
const;
739 void publish_security_eval_state_at_calling_boundary(SecurityEvalState& state);
740 void scheduler_record_range_end(
const Bar&);
744 void scheduler_mark_report_point(std::int64_t script_bar_ts);
745 void scheduler_record_broker_hash();
746 void capture_script_continuation_hash();
747 void scheduler_update_session_state(
748 const Bar&, std::optional<std::int64_t> next_script_open_ms);
749 void scheduler_set_session_bar_state(
bool in_session,
750 bool intraday_is_last_bar);
751 execution::AccountEffectProjection adapter_project_flatten(
752 double price,
const std::string&
id,
const std::string& comment,
753 std::uint64_t incarnation)
const;
754 void adapter_label_bracket_trades(
755 const native_order::ExecutionAppliedEvent&,
bool from_bracket);
756 bool adapter_has_open_entry_id(
const std::string&)
const;
757 void scheduler_publish_source_bar(
const Bar&,
bool first_tick,
758 bool advance_source_index =
true);
759 void scheduler_publish_suppressed_tail(
const Bar&);
760 double compute_liquidation_price()
const;
761 void project_short_seed_report_rows(
const native_order::ExecutionAppliedEvent&);
762 bool scheduler_coof_enabled() const noexcept {
return config_.calc_on_order_fills; }
767 void record_applied_range_end();
768#ifdef PINEFORGE_HAS_AUX_SECURITY_FEED_V1
769 void clear_aux_security_chart_ranges();
770 void prepare_aux_security_chart_ranges(
const Bar*,
int,
const std::string&);
771 std::int64_t aux_security_calling_close_ms()
const;
772 void feed_aux_security_for_chart_bar(
int);
773 void feed_deferred_aux_security_for_chart_bar(
int);
782 : adapter_(&adapter) {}
784 return adapter_ && adapter_->cap.due_cause().has_value();
814#ifdef PINEFORGE_HAS_AUX_SECURITY_FEED_V1
949 std::numeric_limits<double>::quiet_NaN();
953 std::numeric_limits<double>::quiet_NaN();
959 std::numeric_limits<double>::quiet_NaN();
The public native host: an abstract subclass of BacktestEngine with no PineScript on it.
FixtureCommissionTypeSlot & operator=(CommissionType value) noexcept
FixtureCommissionTypeSlot(PineStrategyHost &host) noexcept
FixtureQtyTypeSlot(PineStrategyHost &host) noexcept
FixtureQtyTypeSlot & operator=(QtyType value) noexcept
FixtureRiskDirectionSlot(PineStrategyHost &host) noexcept
FixtureRiskDirectionSlot & operator=(int value) noexcept
SourceCloseObligationView(const PineExecutionAdapter &adapter) noexcept
bool pending() const noexcept
bool operator==(const const_iterator &other) const noexcept
bool operator!=(const const_iterator &other) const noexcept
const value_type * operator->() const noexcept
friend class SourceIdLedgerView
const_iterator find(const std::string &id) const noexcept
const_iterator end() const noexcept
friend class PineStrategyHost
void validate_security_timeframes(const std::string &input_tf)
int observe_pending_count_v1() const override
compat::pine::Calculation fixture_cap_calculation() const
void register_security_eval(int sec_id, const std::string &requested_tf, const std::string &input_tf, bool lookahead_on, bool gaps_on=false, bool heikinashi=false)
FixtureCommissionTypeSlot fixture_commission_type_slot() noexcept
Series< double > & _src_volume_
bool set_realtime_tail(bool on, int horizon_bars) override
void attach_pine_execution_adapter()
void strategy_cancel_all()
void set_syminfo_session(const std::string &)
PineExecutionAdapter adapter_
std::vector< Bar > aux_security_bars_
std::optional< NativeMarginDecision > resolve_margin_requirement(const NativeMarginRequirementView &) const final
std::optional< double > resolve_margin_call_units(const NativeMarginCallView &) const final
const Series< double > & get_input_source(const std::string &key, const Series< double > &fallback) const
void set_pine_risk_direction(int)
void prepare_native_begin(const NativeBeginArgs &) final
BarTime fixture_chart_time(std::int64_t timestamp_ms) const
bool & _src_series_active_
compat::pine::CapClock fixture_cap_clock() const
std::uint64_t source_callback_count_
void strategy_entry(const std::string &id, bool is_long, double limit_price=std::numeric_limits< double >::quiet_NaN(), double stop_price=std::numeric_limits< double >::quiet_NaN(), double qty=std::numeric_limits< double >::quiet_NaN(), const std::string &comment={}, const std::string &oca_name={}, int oca_type=0, int qty_type=-1)
void enable_pine_intraday_cap()
Series< double > & _src_hlcc4_
const PendingIntentView & pending_intent_view() const noexcept
double excursion_trail_offset_ticks_
friend class PineScheduler
const std::vector< FixtureIntentRow > & source_pending_view() const
void set_pine_risk_max_intraday_filled_orders(int)
int pending_order_count() const
void on_native_tick(const Bar &, const NativeTickContext &) final
bool excursion_margin_fill_only_
ClosedLotExcursion closed_lot_excursion(const ClosedLotExcursionFacts &) const final
Series< double > & _src_open_
SourceCloseObligationView position_close_obligation_
const Series< double > & source_input_series(const std::string &key, const Series< double > &fallback) const
bool security_history_publication_replay_
Series< double > & _src_hl2_
int pending_order_effective_levels(int index, double *stop, double *limit, double *trail_activation) const
bool historical_security_lookahead_projection_active_
bool fixture_cap_due_pending() const noexcept
int observe_pending_effective_levels(int, double *, double *, double *) const override
bool set_aux_security_feed(const Bar *bars, int n, const std::string &input_tf) override
double observe_trail_best_price_v1() const override
void strategy_order(const std::string &id, bool is_long, double qty, double limit_price=std::numeric_limits< double >::quiet_NaN(), double stop_price=std::numeric_limits< double >::quiet_NaN(), const std::string &oca_name={}, int oca_type=0)
bool excursion_level_fill_
bool margin_call_enabled_
Series< double > & _src_low_
bool fixture_intraday_cap_latched()
void configure_pine_strategy(const PineStrategyConfig &)
void set_pine_risk_max_position_size(double)
FixtureQtyTypeSlot fixture_default_qty_type_slot() noexcept
int64_t security_calling_close_ms_
bool is_last_tick() const noexcept
bool excursion_priced_fill_
void set_pine_risk_max_cons_loss_days(int)
void strategy_exit_cancel_bracket(const std::string &exit_id, const std::string &from_entry, const std::string &comment={})
int observe_pending_level_resolved(int) const override
FixtureRiskDirectionSlot fixture_risk_direction_slot() noexcept
bool pine_session_ispremarket(const std::string &session, const std::string &timezone, std::int64_t bar_ms) const
bool owns_lot_excursions() const noexcept final
std::vector< std::size_t > aux_security_chart_begin_
bool pine_session_ismarket(const std::string &session, const std::string &timezone, std::int64_t bar_ms) const
int64_t security_range_start_ms_
const Series< double > & source_series(const std::string &) const
void apply_realtime_tail_horizon(const Bar *bars, int n, bool script_bar_geometry)
bool probe_suppress_tail_logic() const
bool margin_call_enabled() const
void hash_source_extension(BrokerStateHashSink &sink) const final
void strategy_close_all()
void on_native_applied(const native_order::ExecutionAppliedEvent &, const NativeDecisionContext &) final
double excursion_trail_raw_price_
std::vector< admission::Field > market_admission_fields() const
PineStrategyHost(compat::pine::CapAttachment cap=compat::pine::CapAttachment::None)
bool excursion_margin_prefix_
int security_lower_tf_sub_bar_index(int sec_id) const
int pending_order_level_resolved(int index) const
int observe_last_bar_dual_entry_path_v1() const override
int pine_last_bar_index() const
std::int64_t fixture_chart_day_key(std::int64_t timestamp_ms) const noexcept
void on_native_run_begin() final
std::uint64_t broker_state_hash_projection() const override
StrategyOverrides override_
int64_t security_first_chart_bar_ms_
Series< double > & _src_close_
void strategy_cancel(const std::string &id)
bool security_range_start_na_warmup_
PineStrategyConfig config_
std::vector< FixtureIntentRow > source_pending_view_cache_
bool margin_check_allowed(const NativeMarginCheckPoint &) const final
void fixture_publish_source_series(const Bar &bar, bool new_history_slot)
std::optional< double > resolve_anchored_level(const NativeAnchoredLevelView &) const final
void hash_host_extension(BrokerStateHashSink &) const override
void register_security_lower_tf_eval(int sec_id, const std::string &requested_tf, const std::string &input_tf)
void freeze_script_position_view()
std::uint64_t fixture_applied_receipt_count() const
Series< double > & _src_hlc3_
bool security_series_slot_is_new(int) const noexcept
bool chart_ema_na_warmup_
bool realtime_tail() const
PineStrategyConfig & fixture_configuration() noexcept
bool excursion_range_end_projection_
int last_bar_dual_entry_path() const
void strategy_exit(const std::string &id, const std::string &from_entry, double limit_price, double stop_price, double trail_points=std::numeric_limits< double >::quiet_NaN(), double trail_offset=std::numeric_limits< double >::quiet_NaN(), double trail_price=std::numeric_limits< double >::quiet_NaN(), double qty_percent=100.0, const std::string &comment={}, double qty=std::numeric_limits< double >::quiet_NaN(), const std::string &oca_name={}, double profit_ticks=std::numeric_limits< double >::quiet_NaN(), double loss_ticks=std::numeric_limits< double >::quiet_NaN())
double prev_chart_close() const
int source_last_bar_index_
void on_native_input(const Bar &, const NativeInputContext &) final
int64_t time_close() const
double live_position_size() const override
bool excursion_margin_call_
bool source_aux_security_feed_enabled() const override
void set_pine_risk_max_intraday_loss(double, bool)
int short_seed_collision_role_v1(native_order::RequestHandle) const noexcept
void strategy_close(const std::string &id, const std::string &comment={}, double qty=std::numeric_limits< double >::quiet_NaN(), double qty_percent=std::numeric_limits< double >::quiet_NaN(), bool immediately=false)
bool history_advances_new_bar() const noexcept
void set_margin_call_enabled(bool enabled)
std::map< int, PineSecurityEvalState > pine_security_states_
int pine_bar_index() const
void on_native_bar_open(const Bar &, const NativeDecisionContext &) final
bool source_prepare_failed_
bool historical_security_lookahead_projection_
bool set_probe_suppress_tail_logic(bool on) override
bool is_first_tick() const noexcept
void set_pine_risk_max_drawdown(double, bool)
double margin_liquidation_price() const
int realtime_tail_horizon_bars_
bool probe_suppress_tail_logic_
MarketAdmissionJournal & market_admission_journal()
double precommit_held_units_
Series< double > & _src_ohlc4_
NativePrecommitVerdict validate_execution_precommit(const NativePrecommitView &) const final
void clear_script_position_view()
const bool & is_last_tick_
bool pine_session_ispostmarket(const std::string &session, const std::string &timezone, std::int64_t bar_ms) const
void source_aux_security_input_view(const Bar *&, int &) const override
void on_native_bar(const Bar &, const NativeDecisionContext &) final
int observe_probe_fill_qty(int, double, double *, int *, int *) const override
bool source_configuration_captured_
const PineStrategyConfig & fixture_configuration() const noexcept
void set_syminfo_metadata(const std::string &, double) override
void set_strategy_override(const StrategyOverrides &)
SourceIdLedgerView source_id_ledger_view() const noexcept
std::string aux_security_input_tf_
virtual void on_source_bar(const Bar &)=0
Series< double > & _src_high_
int observe_pending_copy_v1(int, pf_pending_order_v1_t *) const override
std::vector< std::size_t > aux_security_chart_end_
bool adapter_core_sizes_default_opening(bool is_long) const
native_order::ExecutionTerms resolve_execution_terms(const NativeExecutionTermsFacts &) const final
int probe_fill_qty(int index, double fill_price, double *qty, int *close_only, int *partition) const
double signed_position_size() const
void on_native_recalculate(const Bar &, const NativeDecisionContext &, NativeCalculationReason, const native_order::ExecutionAppliedEvent *) final
friend class PineExecutionAdapter
void source_stream_entry_comment(const PyramidEntry &, std::string &) const override
NativeCalculationReason
Why the kernel is asking the host to calculate.
NativePrecommitVerdict
The host is consulted before generic opening-margin admission.
constexpr char kSourceSecurityDomain[]
PineStrategyHost::FixtureIntentRow FixtureIntentRow
PineStrategyHost::FixtureIntentKind FixtureIntentKind
PineStrategyHost PineNativeHost
bool pine_session_ispostmarket(const std::string &session, const std::string &tz, int64_t bar_ms)
admission::Draft MarketAdmissionDraft
bool pine_session_ispremarket(const std::string &session, const std::string &tz, int64_t bar_ms)
bool pine_session_ismarket(const std::string &session, const std::string &tz, int64_t bar_ms)
admission::Journal MarketAdmissionJournal
int64_t pine_time_close(int64_t bar_ms, const std::string &tf, const std::string &session, const std::string &tz, const std::string &chart_tf, const std::string &syminfo_tz=std::string())
Ephemeral read-only facts of one anchored-leg materialization (L7b), offered to the host exactly once...
Borrowed begin-call facts.
Read-only owning-value facts for one candidate.
Accepted input facts presented before the generic consumer aggregates the bar into its script interva...
Ephemeral factual view of one kernel-issued liquidation before its units are fixed.
Ephemeral factual view of one kernel check point, offered to the host before the check runs.
Ephemeral factual view of the numbers the kernel is about to compare, at one check point,...
Ephemeral factual view of one prepared execution before any physical effect.
One accepted realtime print before native matching at its current decision point.
One committed execution: the definition, the cursor, the resolved price and units,...
bool calling_bar_complete
std::vector< HistoricalSecurityProjection > historical_projections
int lower_tf_input_aggregation_ratio
bool calling_close_completes_partial
int64_t last_published_label
std::vector< DeferredAuxBar > deferred_aux
bool calling_open_latches_first
bool historical_projection_dispatched
std::vector< Bar > lower_tf_input_buffer
bool first_bucket_published
int lower_tf_sub_bar_index
int publish_gate_tf_seconds
bool lower_tf_array_requested
std::size_t historical_projection_cursor
double frozen_market_transaction_units
double paired_flat_market_transaction_qty
double affordability_placement_equity
std::uint64_t incarnation
double default_stop_placement_equity
double default_stop_sizing_price
double frozen_market_own_units
MarketAdmissionDraft market_admission
std::int64_t paired_flat_market_peer_seq
double frozen_default_qty
double default_stop_placement_qty
bool over_pyramiding_cap_at_placement
double default_stop_placement_signal_close