Why "simple" MQL4/MQL5 requests expand: repainting removal, panels, and the hidden decision set
If you develop for clients — or you are a trader commissioning tools — you have met this request: "Remove the repainting from my indicator. Should be quick, right?" One line, priced by the requester at one day of work. After 13+ years of MQL4/MQL5 client projects, we can say the one-line requests are the ones that expand — because a one-line request prices the idea, not the build. They hide one of two things: a set of decisions nobody has stated yet, or a contradiction that makes the simple version impossible.
The repainting request contradicts itself
A repainting indicator revises its own past. It evaluates the candle that is still forming, draws a signal, and then moves or deletes that signal when the candle closes differently. Scroll back through history and you only see the survivors — clean arrows before every major move. That is the "accuracy" on past bars.
Now read the request again: remove the repainting, but keep the accuracy shown on history. Those are the same property. The impressive historical signals exist precisely because the indicator was allowed to revise them.
The non-repainting version has to commit — evaluate closed candles only and never touch a printed signal again:
The cost of that honesty: signals arrive later, some disappear entirely, and the historical chart suddenly looks ordinary — because it now shows what the trader would actually have gotten live. So the real deliverable is not a patch. It is a behavior change the client has to accept before any code is written. In most of these projects, that conversation is the work.
The panel that is not cosmetic
Second archetype: "just add a panel to my EA" — buttons, colors, status displays. It sounds like a paint job.
MQL4 and MQL5 give you no real user-interface framework. The closest thing — the Standard Library's panel and button classes — is a thin wrapper over chart objects. Every button is still an object the program must create, position, redraw, and respond to through OnChartEvent(). A panel is a second program grafted onto the trading program, with its own state to manage: What happens when the user switches timeframe and the chart rebuilds? After a terminal restart in the middle of an open trade? When a button is clicked while the EA is mid-OrderSend()?
Every additional button, toggle, and color multiplies the states that have to be handled and tested. An untested button on a funded account is a defect with a live position attached — which is why an honestly quoted panel looks expensive next to the "it's just visual" expectation.
The decision set inside every one-liner
Even requests with no contradiction still carry decisions the sentence never states:
- "Close all my trades at 5pm" — whose 5pm (server or local, and DST)? All trades or only this EA's magic number? Partial closes on illiquid symbols? What if the terminal is offline at 5pm?
- "Add a trailing stop" — every tick or closed bars? The broker's minimum stop distance clamps what you send. Does the trail survive a restart?
- "Make the lot size 1% risk" — pip value per symbol, broker lot min/step/max, where the stop distance comes from, margin check.
- "Push alert when price crosses a level" — once per event or every tick? MetaQuotes ID configured? A terminal running 24/5? Duplicates after restart?
- "Add a news filter" — MT4 has no built-in economic calendar; which events count; feed time zone vs. broker time; behavior when the feed is down.
The alert case shows how small the deciding detail is. "Alert me" without a latch fires on every tick that satisfies the condition:
Nobody writes "one alert per bar, please" in a one-line request. Somebody still has to decide it. Every decision on these lists gets answered — deliberately, because someone asked, or accidentally, because the developer guessed. On a demo chart an accidental answer is a quirk; on a funded account it is a live defect.
What this means on both sides of the request
If you take client work: the clarifying questions are the service, and quoting a one-liner without asking any prices the guesswork into the client's account. If you commission tools: bring the intent, not just the mechanism. "I want to be flat before the New York close because I can't watch the market after that" answers half of the hidden decisions before they are asked.


