āœ–

Home Forums Trading view Supertrend giving wrong signals at 9:15

Supertrend giving wrong signals at 9:15

  • Author
    Posts
    • šŸ“ Question Details

      I’m running a Supertrend based algo, but at market open (9:15), the signals are completely wrong for the first few minutes.

      After that, everything becomes normal.

      I’m generating my own 1-minute candles from ticks.

      Is this a data issue or something wrong with Supertrend calculation?

      And I am using Zerodha’s kite.trade

    • Supertrend depends on <strong data-start=”1096″ data-end=”1103″>ATR, and ATR needs historical candles.

      So, you have to pass both the historical and live data.

      Aggregate the data first and then pass in Supertrend function you will get the accurate value.
      Eg code below:

      def get_supertrend_input(symbol, live_candles):
          # Fetch historical 
          query = "GET HISTORICAL DATA"
          values = [symbol, "minute"]
          historical_candles = fetch_historical_data(query, values)
          # Merge
          all_candles = historical_candles + live_candles
          # Safety check
          if len(all_candles) < 15:  # minimum for ATR(10)
              return []
          return all_candles
      
      def run_supertrend(symbol, live_candles):
          candles = get_supertrend_input(symbol, live_candles)
          if not candles:
              return None
          result = compute_supertrend(candles, period=10, multiplier=3)
          if not result:
              return None
          return result[-1]  # latest signal
    • Yes, this happens because of candle instability at market open.

      At 9:15 the volatility is very high, candles move very fast, ATR is not stable initially that’s why this happens.

      So, the main fix is using only closed candles, wait for enough candles like 20 candles minimum and use proper ATR smoothing/alignment.

      After first few candles your super trend will be working great.

      Can refer the below code:

      def compute_supertrend(candles, period=10, multiplier=3):
          if len(candles) < period + 2:
              return []
          trs = []
          for i in range(1, len(candles)):
              h = candles[i]["high"]
              l = candles[i]["low"]
              pc = candles[i - 1]["close"]
              tr = max(
                  h - l,
                  abs(h - pc),
                  abs(l - pc)
              )
              trs.append(tr)
          if len(trs) < period:
              return []
          atr_vals = [sum(trs[:period]) / period]
      
          for i in range(period, len(trs)):
              atr = (
                  (atr_vals[-1] * (period - 1)) + trs[i]
              ) / period
              atr_vals.append(atr)
          atr = [None] * period + atr_vals
      
          final_upper = [None] * len(candles)
          final_lower = [None] * len(candles)
          supertrend = [None] * len(candles)
          direction = [None] * len(candles)
      
          result = []
          for i in range(len(candles)):
              if atr[i] is None:
                  result.append(None)
                  continue
              h = candles[i]["high"]
              l = candles[i]["low"]
              c = candles[i]["close"]
              hl2 = (h + l) / 2
              upper_band = hl2 + (multiplier * atr[i])
              lower_band = hl2 - (multiplier * atr[i])
              if final_upper[i - 1] is None:
                  final_upper[i] = upper_band
                  final_lower[i] = lower_band
              else:
                  prev_upper = final_upper[i - 1]
                  prev_lower = final_lower[i - 1]
                  prev_close = candles[i - 1]["close"]
                  final_upper[i] = (
                      upper_band
                      if upper_band < prev_upper or prev_close > prev_upper
                      else prev_upper
                  )
                  final_lower[i] = (
                      lower_band
                      if lower_band > prev_lower or prev_close < prev_lower
                      else prev_lower
                  )
      
              if supertrend[i - 1] is None:
                  if c <= final_upper[i]:
                      supertrend[i] = final_upper[i]
                      direction[i] = "SELL"
                  else:
                      supertrend[i] = final_lower[i]
                      direction[i] = "BUY"
              elif supertrend[i - 1] == final_upper[i - 1]:
      
                  if c <= final_upper[i]:
                      supertrend[i] = final_upper[i]
                      direction[i] = "SELL"
                  else:
                      supertrend[i] = final_lower[i]
                      direction[i] = "BUY"
              else:
      
                  if c >= final_lower[i]:
                      supertrend[i] = final_lower[i]
                      direction[i] = "BUY"
                  else:
                      supertrend[i] = final_upper[i]
                      direction[i] = "SELL"
      
              result.append({
                  "supertrend": round(supertrend[i], 2),
                  "signal": direction[i]
              })
      
          return result
      
      # Sample candles - reolace thsi with actual live candle data
      candles = [
          {"high": 101, "low": 99, "close": 100},
          {"high": 102, "low": 100, "close": 101},
          {"high": 103, "low": 101, "close": 102},
          {"high": 104, "low": 102, "close": 103},
          {"high": 105, "low": 103, "close": 104},
          {"high": 106, "low": 104, "close": 105},
          {"high": 107, "low": 105, "close": 106},
          {"high": 108, "low": 106, "close": 107},
          {"high": 109, "low": 107, "close": 108},
          {"high": 110, "low": 108, "close": 109},
          {"high": 111, "low": 109, "close": 110},
          {"high": 112, "low": 110, "close": 111},
          {"high": 113, "low": 111, "close": 112},
      ]
      
      result = compute_supertrend(candles)
      
      for row in result:
          print(row)
Viewing 2 reply threads
×

Start a Discussion

Get help from the AlgoDelta community.

×

Welcome Back!

Enter your email to sign in or create an account. No passwords needed.

ā³

Pending Approval

āš ļø

Delete This?

Are you sure you want to delete this? This action is permanent and cannot be undone.

Scroll to Top