tests/test_c1_c2_c3_computation.py:47: in test_c1_c2_c3_computation_matches_chart_rendering
    chart_path = cmf_service.render_chart(
        cmf_service = <rtrader.services.cmf_service.CMFService object at 0x12cc8efc0>
        symbol     = 'ETHD'
        test_date  = datetime.date(2025, 8, 1)
rtrader/services/cmf_service.py:901: in render_chart
    analysis = analyse_volume_trend_for_day(
        _          = [5.62, 5.63, 5.57, 5.59, 5.69, 5.69, ...]
        _resolve_trading_window = <function CMFService.render_chart.<locals>._resolve_trading_window at 0x12c993740>
        analyse_volume_trend_for_day = <function analyse_volume_trend_for_day at 0x1239dec00>
        analysis   = VolumeTrendAnalysis(session_day=datetime.date(2025, 7, 31), times=[datetime.datetime(2025, 7, 31, 13, 30, tzinfo=TzInf...'daily_rsi_value': None, 'daily_rsi_condition': False, 'daily_rsi_detail': 'daily_rsi14=n/a', 'is_trending_up': False})
        analysis_by_day = {datetime.date(2025, 7, 30): VolumeTrendAnalysis(session_day=datetime.date(2025, 7, 30), times=[datetime.datetime(2025...daily_rsi_value': None, 'daily_rsi_condition': False, 'daily_rsi_detail': 'daily_rsi14=n/a', 'is_trending_up': False})}
        analysis_time_to_close = {datetime.datetime(2025, 7, 31, 13, 30, tzinfo=TzInfo(0)): 5.62, datetime.datetime(2025, 7, 31, 13, 45, tzinfo=TzInfo(...tetime(2025, 7, 31, 14, 1, tzinfo=TzInfo(0)): 5.57, datetime.datetime(2025, 7, 31, 14, 2, tzinfo=TzInfo(0)): 5.59, ...}
        analysis_time_to_volume = {datetime.datetime(2025, 7, 31, 13, 30, tzinfo=TzInfo(0)): 300.0, datetime.datetime(2025, 7, 31, 13, 45, tzinfo=TzInfo...time(2025, 7, 31, 14, 1, tzinfo=TzInfo(0)): 100.0, datetime.datetime(2025, 7, 31, 14, 2, tzinfo=TzInfo(0)): 510.0, ...}
        bars       = [{'close': 5.74, 'high': 5.74, 'low': 5.74, 'open': 5.74, ...}, {'close': 5.67, 'high': 5.67, 'low': 5.67, 'open': 5.6...': 5.7, 'high': 5.7, 'low': 5.7, 'open': 5.7, ...}, {'close': 5.71, 'high': 5.71, 'low': 5.71, 'open': 5.71, ...}, ...]
        bucket_bars_by_session = <function bucket_bars_by_session at 0x1239deca0>
        chart_end  = datetime.datetime(2025, 8, 1, 16, 0, tzinfo=zoneinfo.ZoneInfo(key='America/New_York'))
        chart_start = datetime.datetime(2025, 8, 1, 9, 15, tzinfo=zoneinfo.ZoneInfo(key='America/New_York'))
        close_value = 5.825
        cmf_float  = 0.2652973898160034
        cmf_map    = {datetime.datetime(2025, 7, 31, 9, 30, tzinfo=zoneinfo.ZoneInfo(key='America/New_York')): 0.0, datetime.datetime(2025,...ca/New_York')): 0.0, datetime.datetime(2025, 7, 31, 10, 2, tzinfo=zoneinfo.ZoneInfo(key='America/New_York')): 0.0, ...}
        cmf_val    = 0.2652973898160034
        cmf_value  = 0.2652973898160034
        day_buckets = {datetime.date(2025, 7, 30): [(datetime.datetime(2025, 7, 30, 16, 0, tzinfo=zoneinfo.ZoneInfo(key='America/New_York'))...time(2025, 7, 31, 10, 32, tzinfo=zoneinfo.ZoneInfo(key='America/New_York')), 5.69, -0.06487889273356401, 1314.0), ...]}
        day_cmf_values = [0.0, 0.0, 0.0, 0.0, -0.09063444108761329, -0.06487889273356401, ...]
        days       = 1
        end        = datetime.datetime(2025, 8, 1, 16, 0, tzinfo=zoneinfo.ZoneInfo(key='America/New_York'))
        fetch_end  = datetime.datetime(2025, 8, 1, 16, 5, tzinfo=zoneinfo.ZoneInfo(key='America/New_York'))
        full_cmf_timestamps = [datetime.datetime(2025, 7, 31, 13, 30, tzinfo=TzInfo(0)), datetime.datetime(2025, 7, 31, 13, 45, tzinfo=TzInfo(0)), d...atetime.datetime(2025, 7, 31, 14, 28, tzinfo=TzInfo(0)), datetime.datetime(2025, 7, 31, 14, 32, tzinfo=TzInfo(0)), ...]
        full_cmf_values = [0.0, 0.0, 0.0, 0.0, -0.09063444108761329, -0.06487889273356401, ...]
        full_market_hours_cmf_for_chart = {datetime.datetime(2025, 7, 31, 9, 30, tzinfo=zoneinfo.ZoneInfo(key='America/New_York')): 0.0, datetime.datetime(2025,...ca/New_York')): 0.0, datetime.datetime(2025, 7, 31, 10, 2, tzinfo=zoneinfo.ZoneInfo(key='America/New_York')): 0.0, ...}
        full_market_hours_cmf_times_for_chart = [datetime.datetime(2025, 7, 31, 9, 30, tzinfo=zoneinfo.ZoneInfo(key='America/New_York')), datetime.datetime(2025, 7, 3...ey='America/New_York')), datetime.datetime(2025, 7, 31, 10, 32, tzinfo=zoneinfo.ZoneInfo(key='America/New_York')), ...]
        grouped_records = defaultdict(<class 'list'>, {datetime.date(2025, 7, 30): [{'symbol': 'ETHD', 'timestamp': datetime.datetime(2025, 7, 3...Info(0)), 'open': 6.51, 'high': 6.51, 'low': 6.51, 'close': 6.51, 'volume': 133.0, 'vwap': 6.51, 'trade_count': 1.0}]})
        in_hours_records = [{'close': 6.1, 'high': 6.1, 'low': 6.1, 'open': 6.1, ...}, {'close': 6.12, 'high': 6.12, 'low': 6.12, 'open': 6.12, .....21, 'high': 6.21, 'low': 6.21, 'open': 6.21, ...}, {'close': 6.21, 'high': 6.21, 'low': 6.21, 'open': 6.21, ...}, ...]
        indicator_annotations = {}
        output_path = None
        points     = [(datetime.datetime(2025, 7, 31, 9, 30, tzinfo=zoneinfo.ZoneInfo(key='America/New_York')), 5.62, 0.0, 300.0), (datetim...etime(2025, 7, 31, 10, 32, tzinfo=zoneinfo.ZoneInfo(key='America/New_York')), 5.69, -0.06487889273356401, 1314.0), ...]
        record     = {'close': 5.825, 'high': 5.825, 'low': 5.825, 'open': 5.825, ...}
        records    = [{'close': 6.11, 'high': 6.11, 'low': 6.11, 'open': 6.11, ...}, {'close': 6.1, 'high': 6.1, 'low': 6.1, 'open': 6.1, .....08, 'high': 6.08, 'low': 6.08, 'open': 6.08, ...}, {'close': 6.12, 'high': 6.12, 'low': 6.12, 'open': 6.12, ...}, ...]
        rsi_override = None
        self       = <rtrader.services.cmf_service.CMFService object at 0x12cc8efc0>
        session_day = datetime.date(2025, 8, 1)
        start      = datetime.datetime(2025, 7, 30, 16, 0, tzinfo=zoneinfo.ZoneInfo(key='America/New_York'))
        symbol     = 'ETHD'
        ts         = datetime.datetime(2025, 7, 31, 19, 59, tzinfo=TzInfo(0))
        ts_ny      = datetime.datetime(2025, 7, 31, 15, 59, tzinfo=zoneinfo.ZoneInfo(key='America/New_York'))
        updated_day_cmf = [0.0, 0.0, 0.0, 0.0, -0.09063444108761329, -0.06487889273356401, ...]
        volume_value = 2100.0
        window_minutes = 30
rtrader/indicators/volume_trend.py:546: in analyse_volume_trend_for_day
    ) = service._analyze_volume_clusters_for_day(
        buyer_volume = 66.5
        buyer_volumes = [82.0, 50.0, 280.0081466395112, 900.0, 253.0, 900.0, ...]
        clone      = {'close': 6.55, 'high': 6.55, 'low': 6.55, 'open': 6.55, ...}
        close_value = 6.55
        closes     = [6.1, 6.12, 6.14, 6.16, 6.21, 6.21, ...]
        cmf_fetcher = <function analyse_volume_trend_for_day.<locals>.<lambda> at 0x12c9927a0>
        cmf_provider = None
        day_cmf    = [0.0, 0.0, 0.6024096385542169, 0.16233766233766234, 0.13468013468013468, 0.08385744234800839, ...]
        day_records = [{'close': 6.1, 'high': 6.1, 'low': 6.1, 'open': 6.1, ...}, {'close': 6.12, 'high': 6.12, 'low': 6.12, 'open': 6.12, .....21, 'high': 6.21, 'low': 6.21, 'open': 6.21, ...}, {'close': 6.21, 'high': 6.21, 'low': 6.21, 'open': 6.21, ...}, ...]
        high_value = 6.55
        highs      = [6.1, 6.12, 6.14, 6.16, 6.21, 6.21, ...]
        low_value  = 6.55
        lows       = [6.1, 6.12, 6.13, 6.16, 6.21, 6.21, ...]
        normalized_records = [{'close': 6.1, 'high': 6.1, 'low': 6.1, 'open': 6.1, ...}, {'close': 6.12, 'high': 6.12, 'low': 6.12, 'open': 6.12, .....21, 'high': 6.21, 'low': 6.21, 'open': 6.21, ...}, {'close': 6.21, 'high': 6.21, 'low': 6.21, 'open': 6.21, ...}, ...]
        open_session_minutes = 45
        open_value = 6.55
        opens      = [6.1, 6.12, 6.13, 6.16, 6.21, 6.21, ...]
        raw_cmf    = [0.0, 0.0, 0.6024096385542169, 0.16233766233766234, 0.13468013468013468, 0.08385744234800839, ...]
        record     = {'close': 6.55, 'high': 6.55, 'low': 6.55, 'open': 6.55, ...}
        seller_volume = 66.5
        seller_volumes = [82.0, 50.0, 119.99185336048879, 900.0, 253.0, 900.0, ...]
        service    = <rtrader.services.cmf_service.CMFService object at 0x12cc8efc0>
        session_day = datetime.date(2025, 8, 1)
        symbol     = 'ETHD'
        symbol_key = 'ETHD'
        times      = [datetime.datetime(2025, 8, 1, 13, 30, tzinfo=TzInfo(0)), datetime.datetime(2025, 8, 1, 13, 33, tzinfo=TzInfo(0)), dat... datetime.datetime(2025, 8, 1, 13, 46, tzinfo=TzInfo(0)), datetime.datetime(2025, 8, 1, 13, 47, tzinfo=TzInfo(0)), ...]
        timestamp  = datetime.datetime(2025, 8, 1, 20, 0, tzinfo=TzInfo(0))
        volumes    = [164.0, 100.0, 400.0, 1800.0, 506.0, 1800.0, ...]
        window_minutes = 30
rtrader/services/cmf_service.py:5236: in _analyze_volume_clusters_for_day
    cmf_30d_2h_value = self._compute_multi_timeframe_cmf(
        DM_spot    = <class 'rtrader.prediction.algo.dm_spot.DM_spot'>
        KMeans     = <class 'sklearn.cluster._kmeans.KMeans'>
        _base_diagnostics = <function CMFService._analyze_volume_clusters_for_day.<locals>._base_diagnostics at 0x12cc889a0>
        _direction_label = <function CMFService._analyze_volume_clusters_for_day.<locals>._direction_label at 0x12cc885e0>
        analysis_index_set = {16, 17, 18, 19, 20, 21, ...}
        analysis_indices = [16, 17, 18, 19, 20, 21, ...]
        analysis_volumes = array([[ 200.],
       [ 200.],
       [1600.],
       [3385.],
       [ 200.],
       [2202.],
       [ 100.],
      ...100.],
       [ 300.],
       [ 200.],
       [ 400.],
       [ 200.],
       [ 500.],
       [ 200.],
       [ 200.]])
        avg_cluster_price = 6.303333333333334
        avg_price  = 6.315531914893618
        baseline   = 2920.0
        cache_key  = ('ETHD', '2025-08-01', '30d/2H')
        cached_entry = None
        candidate_idx = np.int64(59)
        candidate_indices = [19, 40, 66]
        candidate_pos = 59
        candidate_value = -0.4517795637198622
        cluster_centers = array([ 248.90909091, 1995.6       , 3192.5       ])
        cluster_count = 3
        cluster_labels = array([0, 0, 1, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
       1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype=int32)
        cluster_prices = [6.25, 6.28, 6.38]
        cluster_prices_after_cmf_start = [6.25, 6.28, 6.38]
        cluster_volumes = [3385.0, 3000.0, 2375.0]
        cmf_30d_2h_condition = False
        cmf_30d_2h_detail = 'cmf_30d_2h=n/a'
        cmf_30d_2h_value = None
        cmf_array  = array([[ 0.36531848],
       [ 0.37393133],
       [ 0.23938059],
       [ 0.02666937],
       [ 0.02662078],
       [...534371],
       [-0.10304391],
       [-0.1027491 ],
       [-0.03863017],
       [-0.01493068],
       [-0.01529312]])
        cmf_centers = array([-0.41963634, -0.06750618,  0.32621013])
        cmf_cluster_indices = [34, 40, 58]
        cmf_direction = <Series_Direction.UP: 1>
        cmf_float_series = [0.0, 0.0, 0.6024096385542169, 0.16233766233766234, 0.13468013468013468, 0.08385744234800839, ...]
        cmf_idx    = 93
        cmf_indices = (16, 17, 18, 19, 20, 21, ...)
        cmf_kmeans = KMeans(n_clusters=3, n_init=10, random_state=42)
        cmf_labels = array([2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], dtype=int32)
        cmf_numeric = (0.3653184757188059, 0.37393133396661693, 0.2393805851389399, 0.02666937078537748, 0.026620780403866593, -0.07666620923105073, ...)
        cmf_start_index = 16
        cmf_value  = -0.16065521410808067
        day_cmf    = [0.0, 0.0, 0.6024096385542169, 0.16233766233766234, 0.13468013468013468, 0.08385744234800839, ...]
        day_prices = [6.1, 6.12, 6.14, 6.16, 6.21, 6.21, ...]
        day_volumes = [164.0, 100.0, 400.0, 1800.0, 506.0, 1800.0, ...]
        diagnostics = {'checklist_items': [], 'checklist_table': '', 'cluster_volumes': [3385.0, 3000.0, 2375.0], 'cmf_cluster_indices': [34, 40, 58], ...}
        diff_ratio = 0.3458904109589041
        end_candidate = datetime.datetime(2025, 8, 1, 20, 0, tzinfo=TzInfo(0))
        end_time   = datetime.datetime(2025, 8, 1, 16, 0, tzinfo=zoneinfo.ZoneInfo(key='America/New_York'))
        first_volume = 3385.0
        high_volume_label = 2
        idx        = 93
        idx_segment = array([50, 51, 52, 53, 54, 55, 56, 57, 58, 59])
        index_array = array([30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46,
       47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59])
        index_segments = [array([30, 31, 32, 33, 34, 35, 36, 37, 38, 39]), array([40, 41, 42, 43, 44, 45, 46, 47, 48, 49]), array([50, 51, 52, 53, 54, 55, 56, 57, 58, 59])]
        is_trending_up = False
        kmeans     = KMeans(n_clusters=3, n_init=10, random_state=42)
        last_idx   = 93
        last_price_value = 6.55
        last_volume = 2375.0
        localized_times = [datetime.datetime(2025, 8, 1, 9, 30, tzinfo=zoneinfo.ZoneInfo(key='America/New_York')), datetime.datetime(2025, 8, 1,...(key='America/New_York')), datetime.datetime(2025, 8, 1, 9, 47, tzinfo=zoneinfo.ZoneInfo(key='America/New_York')), ...]
        marker_indices = [34, 40, 58]
        max_volume = 3385.0
        mean_volume = 2920.0
        min_cluster_label = 0
        min_volume = 2375.0
        now_ny     = datetime.datetime(2026, 6, 27, 7, 33, 45, 364746, tzinfo=zoneinfo.ZoneInfo(key='America/New_York'))
        np         = <module 'numpy' from '/Users/cao/.pyenv/versions/3.12.12/lib/python3.12/site-packages/numpy/__init__.py'>
        numeric_value = -0.015293118096856415
        position_in_range = 0.5470085470085475
        price_direction = <Series_Direction.DOWN: 2>
        price_entry = 6.55
        price_max_from_start = 6.48
        price_min_from_start = 6.09
        price_range_from_start = 0.39000000000000057
        price_value = 6.55
        price_within_avg_buffer = True
        prices_from_cmf_start = [6.31, 6.375, 6.33, 6.25, 6.25, 6.2, ...]
        regular_session_indices = [0, 1, 2, 3, 4, 5, ...]
        segment_means = [-0.5294376260573674, -0.37217765191317154, -0.3572937354030752]
        selected_cluster_index = None
        selected_cluster_price = None
        selected_cluster_volume = None
        selected_pairs = [(30, -0.357476486019579), (31, -0.3583247819394561), (32, -0.5207975986277873), (33, -0.5997530864197531), (34, -0.7213215859030837), (35, -0.6178867924528302), ...]
        self       = <rtrader.services.cmf_service.CMFService object at 0x12cc8efc0>
        session_day = datetime.date(2025, 8, 1)
        session_day_str = '2025-08-01'
        session_day_value = datetime.date(2025, 8, 1)
        session_start_dt = datetime.datetime(2025, 8, 1, 9, 30, tzinfo=zoneinfo.ZoneInfo(key='America/New_York'))
        simple_direction_down = True
        simple_direction_up = False
        sorted_indices = [19, 40, 66]
        sorted_pairs = [(19, 3385.0), (40, 3000.0)]
        symbol     = 'ETHD'
        time_span_hours = 4.3
        times      = [datetime.datetime(2025, 8, 1, 13, 30, tzinfo=TzInfo(0)), datetime.datetime(2025, 8, 1, 13, 33, tzinfo=TzInfo(0)), dat... datetime.datetime(2025, 8, 1, 13, 46, tzinfo=TzInfo(0)), datetime.datetime(2025, 8, 1, 13, 47, tzinfo=TzInfo(0)), ...]
        top_indices = [19, 40, 66]
        total_count = 94
        total_points = 94
        total_price = 593.6600000000001
        trough_index = 58
        trough_value = -0.4517795637198622
        valid_cmf_entries = [(16, 0.3653184757188059), (17, 0.37393133396661693), (18, 0.2393805851389399), (19, 0.02666937078537748), (20, 0.026620780403866593), (21, -0.07666620923105073), ...]
        value_array = array([-0.35747649, -0.35832478, -0.5207976 , -0.59975309, -0.72132159,
       -0.61788679, -0.62258555, -0.64268199, ...271871, -0.29592451, -0.3012159 , -0.29886456,
       -0.37016575, -0.39037698, -0.37637494, -0.45177956, -0.42153187])
        value_segment = array([-0.33398458, -0.33271871, -0.29592451, -0.3012159 , -0.29886456,
       -0.37016575, -0.39037698, -0.37637494, -0.45177956, -0.42153187])
        value_segments = [array([-0.35747649, -0.35832478, -0.5207976 , -0.59975309, -0.72132159,
       -0.61788679, -0.62258555, -0.64268199,...71871, -0.29592451, -0.3012159 , -0.29886456,
       -0.37016575, -0.39037698, -0.37637494, -0.45177956, -0.42153187])]
        volume_direction = <Series_Direction.DOWN: 2>
        window_minutes = 30
rtrader/services/cmf_service.py:2991: in _compute_multi_timeframe_cmf
    bars = self._fetch_bars(symbol, start_ny, end_ny, timeframe=timeframe or self.timeframe)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        buffer_days = 3
        end        = datetime.datetime(2025, 8, 1, 16, 0, tzinfo=zoneinfo.ZoneInfo(key='America/New_York'))
        end_ny     = datetime.datetime(2025, 8, 1, 16, 0, tzinfo=zoneinfo.ZoneInfo(key='America/New_York'))
        lookback   = 30
        lookback_days = 30
        self       = <rtrader.services.cmf_service.CMFService object at 0x12cc8efc0>
        start_ny   = datetime.datetime(2025, 6, 29, 16, 0, tzinfo=zoneinfo.ZoneInfo(key='America/New_York'))
        symbol     = 'ETHD'
        timeframe  = '2H'
rtrader/services/cmf_service.py:5992: in _fetch_bars
    result = list(source)
             ^^^^^^^^^^^^
        _cache_key = ('ETHD', '2025-06-29 16:00', '2025-08-01 16:00', '2H')
        best_result = []
        cached     = None
        end        = datetime.datetime(2025, 8, 1, 16, 0, tzinfo=zoneinfo.ZoneInfo(key='America/New_York'))
        end_ny     = datetime.datetime(2025, 8, 1, 16, 0, tzinfo=zoneinfo.ZoneInfo(key='America/New_York'))
        feed       = 'iex'
        feeds_to_try = ['iex', 'sip']
        self       = <rtrader.services.cmf_service.CMFService object at 0x12cc8efc0>
        source     = <rtrader.replay_framework.sources.AlpacaHistoricalSource object at 0x12cc740b0>
        start      = datetime.datetime(2025, 6, 29, 16, 0, tzinfo=zoneinfo.ZoneInfo(key='America/New_York'))
        start_ny   = datetime.datetime(2025, 6, 29, 16, 0, tzinfo=zoneinfo.ZoneInfo(key='America/New_York'))
        symbol     = 'ETHD'
        tf         = '2H'
        tf_lower   = '2h'
        timeframe  = '2H'
        use_fmp    = False
rtrader/replay_framework/sources.py:375: in __iter__
    for bar in self._fetch():
               ^^^^^^^^^^^^^
        self       = <rtrader.replay_framework.sources.AlpacaHistoricalSource object at 0x12cc740b0>
rtrader/replay_framework/sources.py:211: in _fetch
    response = client.get_stock_bars(request)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        attempt    = 0
        client     = <alpaca.data.historical.stock.StockHistoricalDataClient object at 0x12cc9a5d0>
        get_alpaca_key_manager = <function get_alpaca_key_manager at 0x12c68fe20>
        key_manager = <rtrader.utils.alpaca_key_manager.AlpacaKeyManager object at 0x12cc980b0>
        last_error = None
        max_retries = 3
        request    = {   'adjustment': None,
    'asof': None,
    'currency': None,
    'end': datetime.datetime(2025, 8, 1, 20, 0),
    '... 29, 20, 0),
    'symbol_or_symbols': 'ETHD',
    'timeframe': <alpaca.data.timeframe.TimeFrame object at 0x12cc9b830>}
        request_kwargs = {'end': datetime.datetime(2025, 8, 1, 16, 0, tzinfo=zoneinfo.ZoneInfo(key='America/New_York')), 'feed': 'iex', 'start'...etime.datetime(2025, 6, 29, 16, 0, tzinfo=zoneinfo.ZoneInfo(key='America/New_York')), 'symbol_or_symbols': 'ETHD', ...}
        response   = None
        self       = <rtrader.replay_framework.sources.AlpacaHistoricalSource object at 0x12cc740b0>
/Users/cao/.pyenv/versions/3.12.12/lib/python3.12/site-packages/alpaca/data/historical/stock.py:87: in get_stock_bars
    raw_bars = self._get_marketdata(
        request_params = {   'adjustment': None,
    'asof': None,
    'currency': None,
    'end': datetime.datetime(2025, 8, 1, 20, 0),
    '... 29, 20, 0),
    'symbol_or_symbols': 'ETHD',
    'timeframe': <alpaca.data.timeframe.TimeFrame object at 0x12cc9b830>}
        self       = <alpaca.data.historical.stock.StockHistoricalDataClient object at 0x12cc9a5d0>
/Users/cao/.pyenv/versions/3.12.12/lib/python3.12/site-packages/alpaca/common/rest.py:393: in _get_marketdata
    response = self.get(path=path, data=params)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        actual_limit = 10000
        d          = defaultdict(<class 'list'>, {})
        limit      = None
        no_sub_key = False
        page_limit = 10000
        page_size  = 10000
        page_token = None
        params     = {'end': '2025-08-01T20:00:00+00:00', 'feed': <DataFeed.IEX: 'iex'>, 'limit': 10000, 'page_token': None, ...}
        path       = '/stocks/bars'
        self       = <alpaca.data.historical.stock.StockHistoricalDataClient object at 0x12cc9a5d0>
        total_items = 0
/Users/cao/.pyenv/versions/3.12.12/lib/python3.12/site-packages/alpaca/common/rest.py:225: in get
    return self._request("GET", path, data, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        data       = {'end': '2025-08-01T20:00:00+00:00', 'feed': <DataFeed.IEX: 'iex'>, 'limit': 10000, 'page_token': None, ...}
        kwargs     = {}
        path       = '/stocks/bars'
        self       = <alpaca.data.historical.stock.StockHistoricalDataClient object at 0x12cc9a5d0>
/Users/cao/.pyenv/versions/3.12.12/lib/python3.12/site-packages/alpaca/common/rest.py:131: in _request
    return self._one_request(method, url, opts, retry)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        api_version = None
        base_url   = <BaseURL.DATA: 'https://data.alpaca.markets'>
        data       = {'end': '2025-08-01T20:00:00+00:00', 'feed': <DataFeed.IEX: 'iex'>, 'limit': 10000, 'page_token': None, ...}
        headers    = {'APCA-API-KEY-ID': 'AKPSRCFPYXA451NUGGEO', 'APCA-API-SECRET-KEY': 'xlXam2VrFow35mZzii8tKpf5gnYLq4EjSGWmtZO7', 'User-Agent': 'APCA-PY/0.43.2'}
        method     = 'GET'
        opts       = {'allow_redirects': False, 'headers': {'APCA-API-KEY-ID': 'AKPSRCFPYXA451NUGGEO', 'APCA-API-SECRET-KEY': 'xlXam2VrFow3...'params': {'end': '2025-08-01T20:00:00+00:00', 'feed': <DataFeed.IEX: 'iex'>, 'limit': 10000, 'page_token': None, ...}}
        path       = '/stocks/bars'
        retry      = 3
        self       = <alpaca.data.historical.stock.StockHistoricalDataClient object at 0x12cc9a5d0>
        url        = 'https://data.alpaca.markets/v2/stocks/bars'
        version    = 'v2'
/Users/cao/.pyenv/versions/3.12.12/lib/python3.12/site-packages/alpaca/common/rest.py:195: in _one_request
    response = self._session.request(method, url, **opts)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        method     = 'GET'
        opts       = {'allow_redirects': False, 'headers': {'APCA-API-KEY-ID': 'AKPSRCFPYXA451NUGGEO', 'APCA-API-SECRET-KEY': 'xlXam2VrFow3...'params': {'end': '2025-08-01T20:00:00+00:00', 'feed': <DataFeed.IEX: 'iex'>, 'limit': 10000, 'page_token': None, ...}}
        retry      = 3
        self       = <alpaca.data.historical.stock.StockHistoricalDataClient object at 0x12cc9a5d0>
        url        = 'https://data.alpaca.markets/v2/stocks/bars'
/Users/cao/.pyenv/versions/3.12.12/lib/python3.12/site-packages/requests/sessions.py:592: in request
    resp = self.send(prep, **send_kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        allow_redirects = False
        auth       = None
        cert       = None
        cookies    = None
        data       = None
        files      = None
        headers    = {'APCA-API-KEY-ID': 'AKPSRCFPYXA451NUGGEO', 'APCA-API-SECRET-KEY': 'xlXam2VrFow35mZzii8tKpf5gnYLq4EjSGWmtZO7', 'User-Agent': 'APCA-PY/0.43.2'}
        hooks      = None
        json       = None
        method     = 'GET'
        params     = {'end': '2025-08-01T20:00:00+00:00', 'feed': <DataFeed.IEX: 'iex'>, 'limit': 10000, 'page_token': None, ...}
        prep       = <PreparedRequest [GET]>
        proxies    = {}
        req        = <Request [GET]>
        self       = <requests.sessions.Session object at 0x12c9fd280>
        send_kwargs = {'allow_redirects': False, 'cert': None, 'proxies': OrderedDict(), 'stream': False, ...}
        settings   = {'cert': None, 'proxies': OrderedDict(), 'stream': False, 'verify': True}
        stream     = None
        timeout    = None
        url        = 'https://data.alpaca.markets/v2/stocks/bars'
        verify     = None
/Users/cao/.pyenv/versions/3.12.12/lib/python3.12/site-packages/requests/sessions.py:749: in send
    r.content
        adapter    = <requests.adapters.HTTPAdapter object at 0x12cc9a4b0>
        allow_redirects = False
        elapsed    = 0.2761521339416504
        history    = []
        hooks      = {'response': []}
        kwargs     = {'cert': None, 'proxies': OrderedDict(), 'stream': False, 'timeout': None, ...}
        r          = <Response [200]>
        request    = <PreparedRequest [GET]>
        self       = <requests.sessions.Session object at 0x12c9fd280>
        start      = 1782560025.365483
        stream     = False
/Users/cao/.pyenv/versions/3.12.12/lib/python3.12/site-packages/requests/models.py:904: in content
    self._content = b"".join(self.iter_content(CONTENT_CHUNK_SIZE)) or b""
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        self       = <Response [200]>
/Users/cao/.pyenv/versions/3.12.12/lib/python3.12/site-packages/requests/models.py:822: in generate
    yield from self.raw.stream(chunk_size, decode_content=True)
        chunk_size = 10240
        self       = <Response [200]>
/Users/cao/.pyenv/versions/3.12.12/lib/python3.12/site-packages/urllib3/response.py:1250: in stream
    yield from self.read_chunked(amt, decode_content=decode_content)
        amt        = 10240
        decode_content = True
        self       = <urllib3.response.HTTPResponse object at 0x12cc77100>
/Users/cao/.pyenv/versions/3.12.12/lib/python3.12/site-packages/urllib3/response.py:1418: in read_chunked
    self._update_chunk_length()
        amt        = 10240
        chunk      = b'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03l\xd2=N\xc40\x10\x05\xe0\xbbL\x9dD3\xb6g\xfcS\x83\xb4\x07\xd8\n*\xa0\xa1@ \x...k\xf4]8\x1f|3\xac\xc8\xben\x8e\xac\x83\xc4Vx\x19D\x9f\xad\xbd\x83\xf4\x85\x88\xc3\xf6l\xd9 \xb1W\xe4\n\x00\x00\xff\xff'
        decode_content = True
        decoded    = b'{"bars":{"ETHD":[{"c":15.7,"h":15.7,"l":15.68,"n":4,"o":15.68,"t":"2025-06-30T12:00:00Z","v":1198,"vw":15.693356},{"...5.336671},{"c":15.595,"h":15.595,"l":15.3,"n":14,"o":15.31,"t":"2025-07-01T18:00:00Z","v":6408,"vw":15.520157},{"c":15'
        self       = <urllib3.response.HTTPResponse object at 0x12cc77100>
/Users/cao/.pyenv/versions/3.12.12/lib/python3.12/site-packages/urllib3/response.py:1333: in _update_chunk_length
    line = self._fp.fp.readline()  # type: ignore[union-attr]
           ^^^^^^^^^^^^^^^^^^^^^^
        self       = <urllib3.response.HTTPResponse object at 0x12cc77100>
/Users/cao/.pyenv/versions/3.12.12/lib/python3.12/socket.py:720: in readinto
    return self._sock.recv_into(b)
           ^^^^^^^^^^^^^^^^^^^^^^^
        b          = <memory at 0x12c8fbd00>
        self       = <socket.SocketIO object at 0x12cc943d0>
/Users/cao/.pyenv/versions/3.12.12/lib/python3.12/ssl.py:1251: in recv_into
    return self.read(nbytes, buffer)
           ^^^^^^^^^^^^^^^^^^^^^^^^^
        __class__  = <class 'ssl.SSLSocket'>
        buffer     = <memory at 0x12c8fbd00>
        flags      = 0
        nbytes     = 8192
        self       = <ssl.SSLSocket [closed] fd=-1, family=2, type=1, proto=0>
        view       = <released memory at 0x12c8fbc40>
/Users/cao/.pyenv/versions/3.12.12/lib/python3.12/ssl.py:1103: in read
    return self._sslobj.read(len, buffer)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
E   Failed: Timeout (>60.0s) from pytest-timeout.
        buffer     = <memory at 0x12c8fbd00>
        len        = 8192
        self       = <ssl.SSLSocket [closed] fd=-1, family=2, type=1, proto=0>
