One timing check I would add: moving WebRequest to OnTimer does not make it asynchronous. The same EA still waits for the response, so its local position management can be delayed too. I would test a deliberately slow API with a bounded timeout, then check how long management pauses and whether stale instructions are rejected when the response finally arrives. Broker-held stops and a local trailing rule are different protections during that pause.
Challenge Pre-Check: know before you risk. Your rules, tested against prop limits. Historical simulation, not a forecast.
The added paragraph now separates broker-held stops from local trailing management clearly. I would pair the slow-response test with a failed-response test: a timeout must not turn an old queued instruction into a fresh entry on the next timer event.
Arnold Holm
One timing check I would add: moving WebRequest to OnTimer does not make it asynchronous. The same EA still waits for the response, so its local position management can be delayed too. I would test a deliberately slow API with a bounded timeout, then check how long management pauses and whether stale instructions are rejected when the response finally arrives. Broker-held stops and a local trailing rule are different protections during that pause.