The off-by-one pattern behind error 4002
An array with five elements has indexes 0, 1, 2, 3, and 4. A loop using i <= ArraySize(values) eventually requests index 5 and crosses the boundary. The correct upper condition is i < ArraySize(values).
The same mistake appears in indicator buffers when code assumes rates_total is a valid index. It is a count, so the oldest valid element is rates_total minus 1.
| Pattern | Unsafe | Guard |
|---|---|---|
| Dynamic array loop | i <= ArraySize(data) | i < ArraySize(data) |
| Last element | data[ArraySize(data)] | data[ArraySize(data)-1] after size > 0 |
| Indicator series | close[rates_total] | close[rates_total-1] after rates_total > 0 |
