pub struct ProfitFactor { /* private fields */ }Expand description
Rolling Profit Factor.
Input is treated as a per-period return (or a per-trade P&L). Over the trailing window:
gross_profit = Σ max(0, r) over window
gross_loss = Σ max(0, −r) over window
PF = gross_profit / gross_lossPF > 1 means the strategy made more than it lost in the window.
§Unbounded output
With no losing returns the gross loss is zero and the indicator returns
f64::INFINITY. This is not an edge case to be discovered in production:
any period-bar window without a single down bar produces it, which on a
trending instrument happens routinely. The value is correct – the ratio
really is unbounded – but it propagates, and inf - inf is NaN, so a
caller feeding this into further arithmetic should test for it.
f64::is_finite is the guard.
A flat window, with neither gains nor losses, is break-even and returns
1.0 – the same value the ratio takes when gross profit equals gross loss.
It used to return 0.0, which is also what a window of nothing but losses
returns; the two are opposite states and were indistinguishable.
Each update is O(period).
§Example
use wickra_core::{Indicator, ProfitFactor};
let mut pf = ProfitFactor::new(20).unwrap();
let mut last = None;
for i in 0..40 {
last = pf.update((f64::from(i) * 0.2).sin() * 0.01);
}
assert!(last.is_some());Implementations§
Trait Implementations§
Source§impl Clone for ProfitFactor
impl Clone for ProfitFactor
Source§fn clone(&self) -> ProfitFactor
fn clone(&self) -> ProfitFactor
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for ProfitFactor
impl Debug for ProfitFactor
Source§impl Indicator for ProfitFactor
impl Indicator for ProfitFactor
Source§fn update(&mut self, input: f64) -> Option<f64>
fn update(&mut self, input: f64) -> Option<f64>
None if there is no value for this input. Read moreSource§fn reset(&mut self)
fn reset(&mut self)
Source§fn warmup_period(&self) -> usize
fn warmup_period(&self) -> usize
None output can be produced.Auto Trait Implementations§
impl Freeze for ProfitFactor
impl RefUnwindSafe for ProfitFactor
impl Send for ProfitFactor
impl Sync for ProfitFactor
impl Unpin for ProfitFactor
impl UnsafeUnpin for ProfitFactor
impl UnwindSafe for ProfitFactor
Blanket Implementations§
Source§impl<T> BatchExt for Twhere
T: Indicator,
impl<T> BatchExt for Twhere
T: Indicator,
Source§fn batch(&mut self, inputs: &[Self::Input]) -> Vec<Option<Self::Output>>
fn batch(&mut self, inputs: &[Self::Input]) -> Vec<Option<Self::Output>>
None during warmup) per input.Source§impl<T> BatchNanExt for T
impl<T> BatchNanExt for T
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more