Skip to content

Commit bbb870f

Browse files
authored
Merge pull request #419 from coding-kitties/fix/417-granularity-order-missing-timeframes
fix: add missing TimeFrame members to granularity_order
2 parents a2d5595 + 901795e commit bbb870f

2 files changed

Lines changed: 102 additions & 1 deletion

File tree

investing_algorithm_framework/infrastructure/services/backtesting/vector_backtest_service.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -513,15 +513,25 @@ def get_most_granular_ohlcv_data_source(data_sources):
513513
"""
514514
granularity_order = {
515515
TimeFrame.ONE_MINUTE: 1,
516+
TimeFrame.TWO_MINUTE: 2,
517+
TimeFrame.THREE_MINUTE: 3,
518+
TimeFrame.FOUR_MINUTE: 4,
516519
TimeFrame.FIVE_MINUTE: 5,
520+
TimeFrame.TEN_MINUTE: 10,
517521
TimeFrame.FIFTEEN_MINUTE: 15,
522+
TimeFrame.TWENTY_MINUTE: 20,
523+
TimeFrame.THIRTY_MINUTE: 30,
518524
TimeFrame.ONE_HOUR: 60,
519525
TimeFrame.TWO_HOUR: 120,
520526
TimeFrame.FOUR_HOUR: 240,
527+
TimeFrame.SIX_HOUR: 360,
528+
TimeFrame.EIGHT_HOUR: 480,
521529
TimeFrame.TWELVE_HOUR: 720,
522530
TimeFrame.ONE_DAY: 1440,
531+
TimeFrame.THREE_DAY: 4320,
523532
TimeFrame.ONE_WEEK: 10080,
524-
TimeFrame.ONE_MONTH: 43200
533+
TimeFrame.ONE_MONTH: 43200,
534+
TimeFrame.ONE_YEAR: 525600,
525535
}
526536

527537
most_granular = None
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
from unittest import TestCase
2+
3+
from investing_algorithm_framework.domain.models.data.data_source import (
4+
DataSource,
5+
)
6+
from investing_algorithm_framework.domain.models.data.data_type import (
7+
DataType,
8+
)
9+
from investing_algorithm_framework.domain.models.time_frame import TimeFrame
10+
from investing_algorithm_framework.infrastructure.services.backtesting \
11+
.vector_backtest_service import VectorBacktestService
12+
13+
14+
class TestGetMostGranularOhlcvDataSource(TestCase):
15+
"""Test that get_most_granular_ohlcv_data_source handles all TimeFrame
16+
members, including SIX_HOUR, EIGHT_HOUR, THREE_DAY that were previously
17+
missing (GitHub issue #417)."""
18+
19+
def _make_source(self, time_frame):
20+
return DataSource(
21+
identifier=f"TEST/{time_frame.value}",
22+
data_type=DataType.OHLCV,
23+
symbol="BTC/EUR",
24+
time_frame=time_frame,
25+
market="BITVAVO",
26+
)
27+
28+
def test_six_hour_does_not_raise(self):
29+
sources = [
30+
self._make_source(TimeFrame.ONE_DAY),
31+
self._make_source(TimeFrame.SIX_HOUR),
32+
]
33+
result = VectorBacktestService.get_most_granular_ohlcv_data_source(
34+
sources
35+
)
36+
self.assertEqual(result.time_frame, TimeFrame.SIX_HOUR)
37+
38+
def test_eight_hour_does_not_raise(self):
39+
sources = [
40+
self._make_source(TimeFrame.ONE_DAY),
41+
self._make_source(TimeFrame.EIGHT_HOUR),
42+
]
43+
result = VectorBacktestService.get_most_granular_ohlcv_data_source(
44+
sources
45+
)
46+
self.assertEqual(result.time_frame, TimeFrame.EIGHT_HOUR)
47+
48+
def test_three_day_does_not_raise(self):
49+
sources = [
50+
self._make_source(TimeFrame.ONE_WEEK),
51+
self._make_source(TimeFrame.THREE_DAY),
52+
]
53+
result = VectorBacktestService.get_most_granular_ohlcv_data_source(
54+
sources
55+
)
56+
self.assertEqual(result.time_frame, TimeFrame.THREE_DAY)
57+
58+
def test_thirty_minute_does_not_raise(self):
59+
sources = [
60+
self._make_source(TimeFrame.ONE_HOUR),
61+
self._make_source(TimeFrame.THIRTY_MINUTE),
62+
]
63+
result = VectorBacktestService.get_most_granular_ohlcv_data_source(
64+
sources
65+
)
66+
self.assertEqual(result.time_frame, TimeFrame.THIRTY_MINUTE)
67+
68+
def test_most_granular_among_all_new_timeframes(self):
69+
"""SIX_HOUR < EIGHT_HOUR < TWELVE_HOUR in granularity rank."""
70+
sources = [
71+
self._make_source(TimeFrame.TWELVE_HOUR),
72+
self._make_source(TimeFrame.EIGHT_HOUR),
73+
self._make_source(TimeFrame.SIX_HOUR),
74+
]
75+
result = VectorBacktestService.get_most_granular_ohlcv_data_source(
76+
sources
77+
)
78+
self.assertEqual(result.time_frame, TimeFrame.SIX_HOUR)
79+
80+
def test_ordering_preserved(self):
81+
"""Verify 4h is more granular than 6h which is more granular
82+
than 8h."""
83+
sources = [
84+
self._make_source(TimeFrame.EIGHT_HOUR),
85+
self._make_source(TimeFrame.SIX_HOUR),
86+
self._make_source(TimeFrame.FOUR_HOUR),
87+
]
88+
result = VectorBacktestService.get_most_granular_ohlcv_data_source(
89+
sources
90+
)
91+
self.assertEqual(result.time_frame, TimeFrame.FOUR_HOUR)

0 commit comments

Comments
 (0)