Your code is based on the update rate of your skin (default is 1000 milliseconds or once per second) and uses 4000 updates to approximate 1 hour (3600 seconds). This skin update timing will not always be 1 hour when Rainmeter takes longer than 1 second to complete an update or if you change the Update value in the [Rainmeter] section to a different value. That's why using 4000 instead of 3600, achieves you goal of refresh approximately once per hour.
Using a Modulo formula will work but is not as accurate as using a Time measure to control actions. Using a simple Time measure is a better solution, in my opinion, because it is not dependent on system activity and responds based on actual time measurements.
This code will refresh when the hour changes as long as the skin does not have updates disabled; Update=-1 in [Rainmeter].
Yep. I put a lot of thought into that very point. My final decision was for the actual activity of the skin to meter the update rather than the clock.
The reason I decided that was simply due to the fact that the skin is basically an activity monitor, e.g. a netin skin. So in that view the activity seemed like the more logical way to handle the refresh rather than what time it is/was.
But your solution remains a great way of mitigating or handling a periodic refresh.