You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
201 lines
8.4 KiB
201 lines
8.4 KiB
{-# LANGUAGE OverloadedStrings #-} |
|
|
|
module Test.RoboCom.Indicators |
|
( |
|
unitTests |
|
) where |
|
|
|
import Test.Tasty |
|
import Test.Tasty.SmallCheck as SC |
|
import Test.Tasty.QuickCheck as QC |
|
import Test.Tasty.HUnit |
|
|
|
import qualified Data.Text as T |
|
import ATrade.Types |
|
import Data.Time.Clock |
|
import Data.Time.Calendar |
|
|
|
import ATrade.RoboCom.Indicators |
|
|
|
unitTests = testGroup "RoboCom.Indicators" [ |
|
testEma, |
|
testRsi, |
|
testRsi2, |
|
testAtr, |
|
testCci, |
|
testBbandUpper, |
|
testPercentRank |
|
] |
|
|
|
newbar b = Bar { barSecurity = T.pack "", barTimestamp = UTCTime (fromGregorian 1970 1 1) 0, barOpen = 0, barHigh = 0, barLow = 0, barClose = b, barVolume = 0} |
|
assertEqualWithEpsilon eps one two = assertBool ("|" ++ show one ++ " - " ++ show two ++ "| < " ++ show eps) $ abs (one - two) < eps |
|
|
|
testEma = testCase "EMA calculation" $ assertEqualWithEpsilon 1 (ema 4 bars) 1256.19 |
|
where |
|
bars = reverse [1243.0, 1226.3, 1231.5, 1249, 1257.4, 1246.2, 1242.5, 1245.1, 1256.1, 1248.5, 1245, 1267.1] |
|
|
|
testRsi = testCase "RSI calculation" $ assertEqualWithEpsilon 0.1 (rsi 2 bars) 96.94 |
|
where |
|
bars = reverse [1, 3, 5, 7, 4, 2, 7, 4, 2, 12, 13, 11, 15, 32] |
|
|
|
testRsi2 = testCase "RSI calculation" $ assertEqualWithEpsilon 1 (rsi 6 bars) 18.11 |
|
where |
|
bars = reverse [1156.2, 1158.8, 1158.3, 1160.3, 1160.9, 1159.8, 1163.0, 1156.3, 1156.0, 1155.3, 1153.8, |
|
1156.2, 1154.1, 1155.9, 1158.1, 1155.8, 1155.9, 1154.5, 1149.8, 1146.5, 1152.1, 1154.0, 1150.2, 1139.5, 1132.6] |
|
|
|
testAtr = testCase "ATR calculation" $ assertEqualWithEpsilon 0.1 (atr 14 bars) 1.32 |
|
where |
|
bars = reverse [bar 48.70 47.79 48.16, |
|
bar 48.72 48.14 48.61, |
|
bar 48.90 48.39 48.75, |
|
bar 48.87 48.37 48.63, |
|
bar 48.82 48.24 48.74, |
|
bar 49.05 48.64 49.03, |
|
bar 49.20 48.94 49.07, |
|
bar 49.35 48.86 49.32, |
|
bar 49.92 49.50 49.91, |
|
bar 50.19 49.87 50.13, |
|
bar 50.12 49.20 49.53, |
|
bar 49.66 48.90 49.50, |
|
bar 49.88 49.43 49.75, |
|
bar 50.19 49.73 50.03, |
|
bar 50.36 49.26 50.31, |
|
bar 50.57 50.09 50.52, |
|
bar 50.65 50.30 50.41, |
|
bar 50.43 49.21 49.34, |
|
bar 49.63 48.98 49.37, |
|
bar 50.33 49.61 50.23, |
|
bar 50.29 49.20 49.24, |
|
bar 50.17 49.43 49.93, |
|
bar 49.32 48.08 48.43, |
|
bar 48.50 47.64 48.18, |
|
bar 48.32 41.55 46.57, |
|
bar 46.80 44.28 45.41, |
|
bar 47.80 47.31 47.77, |
|
bar 48.39 47.20 47.72, |
|
bar 48.66 47.90 48.62, |
|
bar 48.79 47.73 47.85 ] |
|
bar h l c = Bar { barSecurity = "", barTimestamp = UTCTime (fromGregorian 1970 1 1) 0, barOpen = 0, barHigh = h, barLow = l, barClose = c, barVolume = 0} |
|
|
|
testCci = testCase "CCI calculation" $ do |
|
assertEqualWithEpsilon 0.1 (cci 12 bars) 212.39 |
|
where |
|
bars = reverse [ |
|
bar 195.2900000 194.3900000 195.1200000, |
|
bar 195.2100000 194.7200000 195.0600000, |
|
bar 195.8800000 195.0000000 195.7600000, |
|
bar 196.3000000 195.6600000 196.0600000, |
|
bar 196.4900000 195.8400000 196.0000000, |
|
bar 196.6000000 195.9700000 196.5500000, |
|
bar 197.0500000 196.5400000 196.7000000, |
|
bar 196.8200000 196.3000000 196.4700000, |
|
bar 196.4800000 196.0500000 196.2000000, |
|
bar 196.3700000 195.8900000 196.1500000, |
|
bar 196.8500000 196.0600000 196.5500000, |
|
bar 196.7100000 196.2000000 196.7100000, |
|
bar 196.9900000 196.4600000 196.5100000, |
|
bar 196.5900000 195.8400000 195.9700000, |
|
bar 196.2800000 195.4500000 195.6700000, |
|
bar 195.6300000 194.0000000 194.0000000, |
|
bar 194.6500000 193.3300000 194.4500000, |
|
bar 194.5100000 194.0000000 194.0500000, |
|
bar 193.7700000 192.3800000 193.0900000, |
|
bar 193.5000000 192.5600000 192.9700000, |
|
bar 193.9500000 192.7600000 193.8400000, |
|
bar 194.5000000 193.7600000 194.2600000, |
|
bar 194.8700000 193.8800000 194.6800000, |
|
bar 194.7800000 194.1100000 194.4900000, |
|
bar 194.7300000 194.1300000 194.2700000, |
|
bar 194.8300000 194.1200000 194.6700000, |
|
bar 195.1200000 193.8800000 193.8900000, |
|
bar 194.2800000 193.7700000 194.0200000, |
|
bar 194.1600000 193.8000000 194.0300000, |
|
bar 194.0100000 193.4500000 193.8000000, |
|
bar 193.9900000 193.6500000 193.9100000, |
|
bar 194.9000000 193.5700000 194.1600000, |
|
bar 194.2000000 193.1500000 193.4500000, |
|
bar 193.8900000 193.1800000 193.4700000, |
|
bar 194.1000000 193.1000000 193.1300000, |
|
bar 193.8500000 193.1000000 193.8500000, |
|
bar 194.9200000 194.1500000 194.1700000, |
|
bar 194.7000000 193.9500000 194.6100000, |
|
bar 195.2000000 194.5000000 194.5200000, |
|
bar 195.6800000 194.5200000 195.5200000, |
|
bar 195.7500000 195.0700000 195.2700000, |
|
bar 195.4000000 194.7100000 194.9000000, |
|
bar 195.1600000 193.9400000 194.0600000, |
|
bar 194.1900000 193.3300000 193.3800000, |
|
bar 193.8200000 193.2000000 193.7200000, |
|
bar 193.6900000 193.2500000 193.6600000, |
|
bar 194.1700000 193.3700000 194.0800000, |
|
bar 194.4300000 193.7600000 194.1900000, |
|
bar 194.4200000 194.0100000 194.3100000, |
|
bar 194.3600000 193.8300000 194.2900000, |
|
bar 194.3500000 193.5100000 193.9400000, |
|
bar 194.2500000 193.7500000 194.1200000, |
|
bar 194.1700000 193.8000000 193.8400000, |
|
bar 194.2700000 193.8000000 193.8000000, |
|
bar 197.1400000 195.5600000 196.6100000, |
|
bar 197.0400000 196.5500000 197.0000000, |
|
bar 198.6900000 196.8500000 198.6800000, |
|
bar 199.4700000 198.5600000 199.4300000, |
|
bar 201.7100000 199.4300000 199.8900000, |
|
bar 200.1500000 199.1100000 200.1300000, |
|
bar 200.7300000 199.1200000 199.7100000, |
|
bar 200.5000000 199.6000000 200.3800000, |
|
bar 201.9500000 200.2500000 201.9500000, |
|
bar 204.0000000 201.8900000 203.2000000, |
|
bar 203.9900000 203.0700000 203.5800000, |
|
bar 206.7000000 203.5000000 205.6500000, |
|
bar 206.5000000 204.8900000 206.5000000, |
|
bar 206.5000000 204.5500000 206.0000000, |
|
bar 206.1000000 203.2500000 203.6600000, |
|
bar 205.4400000 203.5000000 205.1200000, |
|
bar 205.9100000 203.7000000 204.2800000, |
|
bar 205.9600000 204.1300000 205.9600000, |
|
bar 208.0000000 204.0600000 206.8300000, |
|
bar 207.5600000 206.5300000 207.2300000, |
|
bar 209.3500000 207.1000000 208.9700000, |
|
bar 209.8000000 208.8200000 209.7000000, |
|
bar 209.9700000 209.0500000 209.4200000, |
|
bar 209.7300000 209.2800000 209.6600000, |
|
bar 211.7700000 209.6600000 211.2300000, |
|
bar 211.3000000 210.0000000 210.4900000, |
|
bar 211.1000000 210.4500000 211.0000000, |
|
bar 211.0000000 209.6200000 210.0100000, |
|
bar 210.2300000 209.6600000 210.1000000, |
|
bar 210.5600000 209.1600000 209.5000000, |
|
bar 209.9100000 209.0900000 209.7100000, |
|
bar 210.1900000 209.2900000 210.0500000, |
|
bar 210.3000000 209.8000000 209.8600000, |
|
bar 210.0200000 208.8900000 209.3100000, |
|
bar 210.0800000 209.2100000 209.9700000, |
|
bar 209.9500000 209.0900000 209.0900000, |
|
bar 210.9600000 209.1200000 210.1900000, |
|
bar 210.6500000 209.4000000 210.3700000, |
|
bar 212.2600000 210.3000000 210.9800000, |
|
bar 211.4500000 210.0000000 210.4800000, |
|
bar 210.6900000 209.7300000 210.0300000, |
|
bar 210.3200000 209.8400000 210.0700000, |
|
bar 210.4000000 210.0000000 210.3200000, |
|
bar 210.4000000 210.2000000 210.3300000, |
|
bar 211.0000000 210.2800000 210.4200000, |
|
bar 210.5000000 210.0100000 210.3400000, |
|
bar 210.6000000 210.0700000 210.5400000, |
|
bar 211.1200000 210.3200000 211.0400000, |
|
bar 211.1700000 210.7300000 211.0200000, |
|
bar 211.1500000 210.7500000 210.7600000, |
|
bar 217.8000000 210.8000000 216.3500000, |
|
bar 219.2000000 215.8200000 219.0400000, |
|
bar 220.8400000 218.2600000 220.4400000, |
|
bar 221.5000000 220.0500000 220.0500000 |
|
] |
|
bar h l c = Bar { barSecurity = "", barTimestamp = UTCTime (fromGregorian 1970 1 1) 0, barOpen = 0, barHigh = h, barLow = l, barClose = c, barVolume = 0} |
|
|
|
testBbandUpper = testCase "Bollinger bands (upper) calculation" $ assertEqualWithEpsilon 0.1 (bbandUpper 5 1.5 bars) 1764.12 |
|
where |
|
bars = reverse [1750.0, 1749.99, 1761.0, 1771.0, 1758.94, 1759.36, 1758.55, 1760.0, 1751.0, 1756.80, 1748.15, 1722.90, 1726] |
|
|
|
testPercentRank = testCase "PercentRank calculation" $ assertEqualWithEpsilon 0.01 (percentRank 10 bars) 0.9 |
|
where |
|
bars = reverse [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
|
|
|