I'm querying trading candlesticks in my database.
Firstly I'm fetching rows that have been specifically filtered, once I've got these rows I want to find the 19 previous candles for each candle and apply an AVG function.
The only issue is that AVG function in the cursor block is taking an indefinite time to complete (it never completed even after hours).
What could it be?
DECLARE @candles_table TABLE
(
     [CandleStickBitmexSqlId] BIGINT INDEX IX0 NONCLUSTERED
    ,[TimestampSnapShotUtcCandleStick] DATETIME INDEX IX1 NONCLUSTERED
    ,[TimestampSnapShotUnixEpochCandleStick] FLOAT INDEX IX2 NONCLUSTERED
    ,[Symbol] NVARCHAR(450)
    ,[Open] FLOAT NOT NULL
    ,[High] FLOAT NOT NULL
    ,[Low] FLOAT NOT NULL
    ,[Close] FLOAT NOT NULL INDEX IX3 NONCLUSTERED
    ,[Trades] BIGINT NOT NULL
    ,[Volume] BIGINT 
    ,[Vwap] FLOAT 
    ,[LastSize] FLOAT 
    ,[Turnover] BIGINT
    ,[HomeNotional] FLOAT 
    ,[ForeignNotional] FLOAT 
    ,[IsReplacingMissingCandle] BIT
    ,[IsCandleCompleted] BIT
    ,[IsCandleGeneratedByLiveTrade] BIT
    ,[CandleStickTimeFrame] NVARCHAR(450)
    ,[CounterBatch] INT
    ,[UpperBollinger] FLOAT
    ,[LowerBollinger] FLOAT
    ,[BB_UPPER_PRECENT] FLOAT
    ,[BB_LOWER_PRECENT] FLOAT
    ,[BB_MA] FLOAT
    ,[CountPointsCalculated] INT
)
DECLARE @candles_table_resp TABLE
(
     [CandleStickBitmexSqlId] BIGINT INDEX IX0 NONCLUSTERED
    ,[TimestampSnapShotUtcCandleStick] DATETIME INDEX IX1 NONCLUSTERED
    ,[TimestampSnapShotUnixEpochCandleStick] FLOAT INDEX IX2 NONCLUSTERED
    ,[Symbol] NVARCHAR(450)
    ,[Open] FLOAT NOT NULL
    ,[High] FLOAT NOT NULL
    ,[Low] FLOAT NOT NULL
    ,[Close] FLOAT NOT NULL INDEX IX3 NONCLUSTERED
    ,[Trades] BIGINT NOT NULL
    ,[Volume] BIGINT 
    ,[Vwap] FLOAT 
    ,[LastSize] FLOAT 
    ,[Turnover] BIGINT
    ,[HomeNotional] FLOAT 
    ,[ForeignNotional] FLOAT 
    ,[IsReplacingMissingCandle] BIT
    ,[IsCandleCompleted] BIT
    ,[IsCandleGeneratedByLiveTrade] BIT
    ,[CandleStickTimeFrame] NVARCHAR(450)
    ,[CounterBatch] INT
    ,[UpperBollinger] FLOAT
    ,[LowerBollinger] FLOAT
    ,[BB_UPPER_PRECENT] FLOAT
    ,[BB_LOWER_PRECENT] FLOAT
    ,[BB_MA] FLOAT
    ,[CountPointsCalculated] INT
)
INSERT INTO @candles_table
SELECT
  *
FROM
(
    SELECT 
     MyT2.[CandleStickBitmexSqlId] 
    ,MyT2.[TimestampSnapShotUtcCandleStick] 
    ,MyT2.[TimestampSnapShotUnixEpochCandleStick] 
    ,MyT2.[Symbol] 
    ,MyT2.[Open] 
    ,MyT2.[High] 
    ,MyT2.[Low] 
    ,MyT2.[Close] 
    ,MyT2.[Trades]
    ,MyT2.[Volume]
    ,MyT2.[Vwap] 
    ,MyT2.[LastSize] 
    ,MyT2.[Turnover] 
    ,MyT2.[HomeNotional] 
    ,MyT2.[ForeignNotional] 
    ,MyT2.[IsReplacingMissingCandle] 
    ,MyT2.[IsCandleCompleted] 
    ,MyT2.[IsCandleGeneratedByLiveTrade] 
    ,MyT2.[CandleStickTimeFrame] 
    ,ROW_NUMBER() OVER(ORDER BY MyT2.[CandleStickTimeFrame] DESC) AS [CounterBatch] 
    ,MyT2.[UpperBollinger] 
    ,MyT2.[LowerBollinger]
    ,CAST(((([High]*100)/MyT2.[UpperBollinger] )-100) AS decimal(10,4)) AS BB_UPPER_PRECENT
    ,CAST(((([Low]*100*-1)/MyT2.[LowerBollinger])+100) AS decimal(10,4)) AS BB_LOWER_PRECENT 
    ,MyT2.[BB_MA]
    ,MyT2.[CountPointsCalculated]
    FROM (
        SELECT
             [CandleStickBitmexSqlId] 
            ,[TimestampSnapShotUtcCandleStick] 
            ,[TimestampSnapShotUnixEpochCandleStick] 
            ,[Symbol] 
            ,[Open] 
            ,[High] 
            ,[Low] 
            ,[Close] 
            ,[Trades]
            ,[Volume]
            ,[Vwap] 
            ,[LastSize] 
            ,[Turnover] 
            ,[HomeNotional] 
            ,[ForeignNotional] 
            ,[IsReplacingMissingCandle] 
            ,[IsCandleCompleted] 
            ,[IsCandleGeneratedByLiveTrade] 
            ,[CandleStickTimeFrame] 
            ,NULL AS [CounterBatch]
            ,AVG([Close]) OVER (ORDER BY [CandleStickTimeFrame] DESC ROWS BETWEEN 0 FOLLOWING AND 19 FOLLOWING) + (STDEV([Close]) OVER (ORDER BY [CandleStickTimeFrame] DESC ROWS BETWEEN 0 FOLLOWING AND 19 FOLLOWING) * 2) AS UpperBollinger
            ,AVG([Close]) OVER (ORDER BY [CandleStickTimeFrame] DESC ROWS BETWEEN 0 FOLLOWING AND 19 FOLLOWING) - (STDEV([Close]) OVER (ORDER BY [CandleStickTimeFrame] DESC ROWS BETWEEN 0 FOLLOWING AND 19 FOLLOWING) * 2) AS LowerBollinger 
            ,NULL AS [BB_UPPER_PRECENT] 
            ,NULL AS [BB_LOWER_PRECENT] 
            ,AVG([Close]) OVER (ORDER BY [CandleStickTimeFrame] DESC ROWS BETWEEN 0 FOLLOWING AND 19 FOLLOWING) AS [BB_MA] 
            ,COUNT([Close]) OVER(ORDER BY [CandleStickTimeFrame] DESC ROWS BETWEEN 0 FOLLOWING AND 19 FOLLOWING) AS [CountPointsCalculated]
        FROM [bitmex].[CandleStickBitmexSql]
        WHERE CandleStickTimeFrame like 'min5' 
        AND  
        '2021-03-16 19:00:00.000' <= TimestampSnapShotUtcCandleStick 
        AND 
        TimestampSnapShotUtcCandleStick <= '2021-04-01 17:15:00.000'
    ) AS MyT2
    WHERE 
    [CountPointsCalculated] >= 20 
    AND 
    ( 
    [LOW] < [LowerBollinger] 
    )       
) AS MyT3
ORDER BY MyT3.[TimestampSnapShotUtcCandleStick] DESC
SELECT * FROM @candles_table_resp
SELECT * FROM @candles_table
DECLARE @c_CandleStickBitmexSqlId BIGINT 
DECLARE @c_TimestampSnapShotUtcCandleStick DATETIME 
DECLARE @c_TimestampSnapShotUnixEpochCandleStick FLOAT 
DECLARE @c_Symbol NVARCHAR(450)
DECLARE @c_Open FLOAT 
DECLARE @c_High FLOAT 
DECLARE @c_Low FLOAT 
DECLARE @c_Close FLOAT 
DECLARE @c_Trades BIGINT 
DECLARE @c_Volume BIGINT 
DECLARE @c_Vwap FLOAT 
DECLARE @c_LastSize FLOAT 
DECLARE @c_Turnover BIGINT
DECLARE @c_HomeNotional FLOAT 
DECLARE @c_ForeignNotional FLOAT 
DECLARE @c_IsReplacingMissingCandle BIT
DECLARE @c_IsCandleCompleted BIT
DECLARE @c_IsCandleGeneratedByLiveTrade BIT
DECLARE @c_CandleStickTimeFrame NVARCHAR(450)
DECLARE @c_CounterBatch INT
DECLARE @c_UpperBollinger FLOAT
DECLARE @c_LowerBollinger FLOAT
DECLARE @c_BB_UPPER_PRECENT FLOAT
DECLARE @c_BB_LOWER_PRECENT FLOAT
DECLARE @c_BB_MA FLOAT
DECLARE @c_CountPointsCalculated INT
DECLARE db_cursor CURSOR FOR 
SELECT
     [CandleStickBitmexSqlId] 
    ,[TimestampSnapShotUtcCandleStick] 
    ,[TimestampSnapShotUnixEpochCandleStick] 
    ,[Symbol] 
    ,[Close] 
    ,[CandleStickTimeFrame] 
    ,[CounterBatch] 
FROM @candles_table
OPEN db_cursor  
FETCH NEXT FROM db_cursor 
INTO 
 @c_CandleStickBitmexSqlId
,@c_TimestampSnapShotUtcCandleStick
,@c_TimestampSnapShotUnixEpochCandleStick
,@c_Symbol
,@c_Close
,@c_CandleStickTimeFrame   
,@c_CounterBatch
WHILE @@FETCH_STATUS = 0  
BEGIN 
    
      --INSERT INTO @candles_table_resp
      SELECT TOP (19) 
        *
        ,@c_CounterBatch AS [CounterBatch]
        --********** THE FOLLOWING AVG FUNCTIONS ARE BLOCKING/SLOWING THE QUERY ***************** 
        ,AVG(csbitmex.[Close]) OVER (ORDER BY csbitmex.[CandleStickTimeFrame] DESC ROWS BETWEEN 0 FOLLOWING AND 19 FOLLOWING) + (STDEV(csbitmex.[Close]) OVER (ORDER BY csbitmex.[CandleStickTimeFrame] DESC ROWS BETWEEN 0 FOLLOWING AND 19 FOLLOWING) * 2) AS [UpperBollinger]
        ,AVG([Close]) OVER (ORDER BY [CandleStickTimeFrame] DESC ROWS BETWEEN 0 FOLLOWING AND 19 FOLLOWING) - (STDEV([Close]) OVER (ORDER BY [CandleStickTimeFrame] DESC ROWS BETWEEN 0 FOLLOWING AND 19 FOLLOWING) * 2) AS [LowerBollinger] 
        --,NULL AS [UpperBollinger] 
        --,NULL AS [LowerBollinger] 
        ,NULL AS [BB_UPPER_PRECENT] 
        ,NULL AS [BB_LOWER_PRECENT] 
        ,NULL AS [BB_MA] 
        ,NULL AS [CountPointsCalculated] 
      FROM [bitmex].[CandleStickBitmexSql] AS csbitmex
      WHERE 
      TimestampSnapShotUtcCandleStick < @c_TimestampSnapShotUtcCandleStick
      AND 
      [Symbol] LIKE 'XBTUSD' 
      AND 
      [CandleStickTimeFrame] LIKE 'min5' 
      ORDER BY TimestampSnapShotUtcCandleStick DESC 
    FETCH NEXT FROM db_cursor 
    INTO 
     @c_CandleStickBitmexSqlId
    ,@c_TimestampSnapShotUtcCandleStick
    ,@c_TimestampSnapShotUnixEpochCandleStick
    ,@c_Symbol
    ,@c_Close
    ,@c_CandleStickTimeFrame  
    ,@c_CounterBatch
END 
CLOSE db_cursor  
DEALLOCATE db_cursor
SELECT
     [CandleStickBitmexSqlId]
    ,[TimestampSnapShotUtcCandleStick] 
    ,[TimestampSnapShotUnixEpochCandleStick] 
    ,[Symbol] 
    ,[Open] 
    ,[High] 
    ,[Low] 
    ,[Close] 
    ,[Trades] 
    ,[Volume] 
    ,[Vwap] 
    ,[LastSize] 
    ,[Turnover] 
    ,[HomeNotional] 
    ,[ForeignNotional] 
    ,[IsReplacingMissingCandle] 
    ,[IsCandleCompleted] 
    ,[IsCandleGeneratedByLiveTrade] 
    ,[CandleStickTimeFrame] 
    ,[CounterBatch] 
    ,[UpperBollinger] 
    ,[LowerBollinger] 
    ,[BB_UPPER_PRECENT] 
    ,[BB_LOWER_PRECENT] 
    ,[BB_MA] 
    ,[CountPointsCalculated] 
FROM @candles_table_resp AS tcr
ORDER BY 
tcr.CounterBatch,
tcr.TimestampSnapShotUtcCandleStick DESC 

