@@ -16,7 +16,7 @@ import Functora.Money
16
16
import Functora.Prelude
17
17
18
18
newtype Rsi = Rsi
19
- { unRsi :: Ratio Natural
19
+ { unRsi :: Double
20
20
}
21
21
deriving stock
22
22
( Eq ,
@@ -59,13 +59,15 @@ mkRsiConduit mkCandle (RsiPeriod natPer) =
59
59
C. yield
60
60
( c2,
61
61
-- Loss
62
- if p1 >= p2
63
- then p1 - p2
64
- else 0 ,
62
+ via @ Rational @ (Ratio Natural ) @ Double
63
+ $ if p1 >= p2
64
+ then p1 - p2
65
+ else 0 ,
65
66
-- Gain
66
- if p1 <= p2
67
- then p2 - p1
68
- else 0
67
+ via @ Rational @ (Ratio Natural ) @ Double
68
+ $ if p1 <= p2
69
+ then p2 - p1
70
+ else 0
69
71
)
70
72
pure True
71
73
_ ->
@@ -74,23 +76,23 @@ mkRsiConduit mkCandle (RsiPeriod natPer) =
74
76
.| ( do
75
77
seed <- C. take intPer
76
78
when (length seed == intPer) $ do
77
- let initAvgLoss = sum (fmap snd3 seed) / ratPer
78
- let initAvgGain = sum (fmap thd3 seed) / ratPer
79
+ let initAvgLoss = sum (fmap snd3 seed) / dblPer
80
+ let initAvgGain = sum (fmap thd3 seed) / dblPer
79
81
flip loopM (initAvgLoss, initAvgGain)
80
82
$ \ (prevAvgLoss, prevAvgGain) -> do
81
83
mcandle <- C. await
82
84
case mcandle of
83
85
Nothing -> pure $ Right ()
84
86
Just (c, loss, gain) -> do
85
- let nextAvgLoss = (prevAvgLoss * (ratPer - 1 ) + loss) / ratPer
86
- let nextAvgGain = (prevAvgGain * (ratPer - 1 ) + gain) / ratPer
87
+ let nextAvgLoss = (prevAvgLoss * (dblPer - 1 ) + loss) / dblPer
88
+ let nextAvgGain = (prevAvgGain * (dblPer - 1 ) + gain) / dblPer
87
89
let rs = nextAvgGain / nextAvgLoss
88
90
let rsi = Rsi $ 100 - (100 / (1 + rs))
89
91
C. yield (c, rsi)
90
92
pure $ Left (nextAvgLoss, nextAvgGain)
91
93
)
92
94
where
93
- ratPer = from @ Natural @ ( Ratio Natural ) natPer
95
+ dblPer = unsafeFrom @ Natural @ Double natPer
94
96
intPer =
95
97
case unsafeFrom @ Natural @ Int natPer of
96
98
x | x < 2 -> error $ " Bad RSI period " <> inspect natPer
0 commit comments