PineForge v0.13.1-379-g9b50973
Deterministic PineScript v6 backtest runtime — C ABI reference
Loading...
Searching...
No Matches
exit_lifecycle.cpp
Go to the documentation of this file.
2
3#include "../../engine_internal.hpp"
5
6#include <cmath>
7
9
10std::optional<exit_legs::Operation> select_exit_suspension(
11 const exit_legs::Lifecycle& lifecycle, const ExitSuspensionContext& context) {
12 if (context.open_slice_this_bar || !context.standing) return std::nullopt;
13 const auto& prices = lifecycle.prices();
14 const bool has_trail = !std::isnan(prices.trail_points) || !std::isnan(prices.trail_price);
15 if (std::isnan(prices.stop_price) && std::isnan(prices.limit_price) && !has_trail)
16 return std::nullopt;
18 std::vector<exit_legs::Leg> retire;
19 if (has_trail) {
20 window.best = window.prefix = context.prior_best;
21 double activation = prices.trail_price;
22 if (!std::isnan(prices.trail_points)) {
23 const double ticks = trail_points_to_ticks(prices.trail_points);
25 context.direction > 0
26 ? context.position_entry_price + ticks * context.tick
27 : context.position_entry_price - ticks * context.tick,
28 context.tick);
29 }
30 if (std::isfinite(activation) && std::isfinite(context.open)
31 && (context.direction > 0 ? context.open >= activation : context.open <= activation)) {
32 retire.push_back(exit_legs::Leg::Trail);
33 }
34 }
35 return exit_legs::Suspend{{exit_legs::Leg::Stop, exit_legs::Leg::Limit}, {}, window,
36 retire};
37}
38
40 exit_legs::Frame cause) {
41 if (lifecycle.dormant()) return exit_legs::CancelDeferredActivation{};
42 return exit_legs::Suspend{{exit_legs::Leg::Stop, exit_legs::Leg::Limit},
43 exit_legs::Barrier{cause}, {}, {}};
44}
45
47 const exit_legs::Lifecycle& lifecycle) {
48 if (lifecycle.pending_replacement())
49 return lifecycle.suspension()->replacement->revival_definition;
50 return lifecycle.definition(lifecycle.target().incarnation);
51}
52
54 const double original = lifecycle.original_stop();
55 return std::isfinite(original) ? original : lifecycle.prices().stop_price;
56}
57
58std::optional<exit_legs::Operation> select_exit_completion(
59 const exit_legs::Lifecycle& lifecycle, exit_legs::Frame completed) {
60 if (completed.domain == exit_legs::Domain::RawTicks
61 || completed.phase != exit_legs::Phase::AfterMargin) {
62 return std::nullopt;
63 }
64 const auto target = lifecycle.release_barrier();
65 if (!target) return std::nullopt;
66 return exit_legs::CompleteBarrier{completed, target};
67}
68
69} // namespace pineforge::compat::pine
std::optional< Barrier > release_barrier() const
Definition definition(uint64_t incarnation) const
const std::optional< Suspension > & suspension() const
exit_legs::Operation select_pair_hold(const exit_legs::Lifecycle &, exit_legs::Frame)
double trail_points_to_ticks(double trail_points)
double snap_trail_level_to_tick_grid(double price, double mintick)
double select_margin_revival_stop(const exit_legs::Lifecycle &)
std::optional< exit_legs::Operation > select_exit_completion(const exit_legs::Lifecycle &, exit_legs::Frame completed)
exit_legs::Definition select_replacement_revival_definition(const exit_legs::Lifecycle &)
std::optional< exit_legs::Operation > select_exit_suspension(const exit_legs::Lifecycle &, const ExitSuspensionContext &)
std::variant< BindOwner, Suspend, StageReplacement, CancelDeferredActivation, Restore, CompleteBarrier, Observe, Cancel > Operation