can this code actually ditect order block?
//+------------------------------------------------------------------+
//|                                                      OrderBlock.mq5 |
//|                        Copyright 2024, MetaQuotes Software Corp. |
//|                                       https://www.mql5.com        |
//+------------------------------------------------------------------+
#property strict

input int LookBackBars = 50; // Number of bars to look back for order blocks

// Structure to store order block information
struct OrderBlock {
   datetime time;
   double price;
   bool isBullish;
};

OrderBlock orderBlocks[];

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit() {
   ArrayResize(orderBlocks, 0);
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
}

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() {
   DetectOrderBlocks();
   DrawOrderBlocks();
}

//+------------------------------------------------------------------+
//| Function to detect order blocks                                  |
//+------------------------------------------------------------------+
void DetectOrderBlocks() {
   int totalBars = Bars(NULL, 0); // Get the total number of bars
   int start = totalBars - LookBackBars - 1;
   int end = totalBars - 2;

   for (int i = start; i <= end; i++) {
      double high = iHigh(NULL, 0, i);
      double low = iLow(NULL, 0, i);
      double open = iOpen(NULL, 0, i);
      double close = iClose(NULL, 0, i);

      // Detect bullish order block
      if ((close > open) && (close == high)) {
         OrderBlock ob;
         ob.time = iTime(NULL, 0, i);
         ob.price = high;
         ob.isBullish = true;
         ArrayResize(orderBlocks, ArraySize(orderBlocks) + 1);
         orderBlocks[ArraySize(orderBlocks) - 1] = ob;
      }

      // Detect bearish order block
      if ((close < open) && (close == low)) {
         OrderBlock ob;
         ob.time = iTime(NULL, 0, i);
         ob.price = low;
         ob.isBullish = false;
         ArrayResize(orderBlocks, ArraySize(orderBlocks) + 1);
         orderBlocks[ArraySize(orderBlocks) - 1] = ob;
      }
   }
}

//+------------------------------------------------------------------+
//| Function to draw order blocks                                    |
//+------------------------------------------------------------------+
void DrawOrderBlocks() {
   for (int i = 0; i < ArraySize(orderBlocks); i++) {
      OrderBlock ob = orderBlocks[i];
      color blockColor = ob.isBullish ? clrGreen : clrRed;
      string name = "OrderBlock_" + IntegerToString(i);

      // Calculate the price levels for the rectangle
      double priceHigh;
      double priceLow;

      if (ob.isBullish) {
         priceHigh = ob.price;
         priceLow = ob.price - (10 * Point);
      } else {
         priceHigh = ob.price + (10 * Point);
         priceLow = ob.price;
      }

      // Calculate the end time for the rectangle
      datetime endTime = ob.time + PeriodSeconds();

      // Draw rectangle for order block
      ObjectCreate(0, name, OBJ_RECTANGLE, 0, ob.time, priceLow, endTime, priceHigh);
      ObjectSetInteger(0, name, OBJPROP_COLOR, blockColor);
      ObjectSetInteger(0, name, OBJPROP_STYLE, STYLE_SOLID);
      ObjectSetInteger(0, name, OBJPROP_WIDTH, 2);
   }
}