Instead of writing your own integration, install our MT5 Expert Advisor (the “bridge”). It connects to this API with your key and keeps your account in step with the live feed automatically. It is provided to approved clients on request — see Access.
What it does
trailing_stop — the real stop — so it tightens as the trade advances.target_1 as your take-profit.Everything the EA sends and receives is described further down this page — the EA is simply a client of this API, so the same rules apply.
MQL5/ so you end up with MQL5/Experts/PulseSignalsBridge.mq5, MQL5/Include/Pulse/… and MQL5/Files/pulse-symbols.map.Experts/PulseSignalsBridge.mq5 and press Compile (F7). It should report 0 errors.https://live.economicpulse.netRequests to a URL that is not on this list fail immediately — that is an MT5 security rule, not an API problem.
DryRun = true so it logs what it would do without placing any trade. When every instrument resolves, set DryRun = false.Brokers name instruments differently. GOLD here may be XAUUSD there, NAS100 may be USTEC, SP500 may be US500. The EA resolves every instrument in this order:
ManualSymbolMap input. This wins over everything.MQL5/Files/pulse-symbols.map./v1/instruments.EURUSD.a, EURUSDm, XAUUSD.pro all match automatically.You only need to set the instruments that fail. Type them straight into the EA, separated by semicolons:
DOW=US30; GOLD=XAUUSD; EURUSD=EURUSD.a; NAS100=USTEC
Or put the same lines in pulse-symbols.map (one per line, # for comments). Find a broker's exact name in Market Watch → right-click → Symbols. If an instrument cannot be resolved, the EA skips it and says why — it never guesses.
| Setting | What it is for |
|---|---|
APIKEY | Your key. The EA will not start without it. |
RISKMODE | How much to risk per trade: fixed lot, % of account balance, or a fixed money amount. |
RiskPercent / FixedLot / RiskMoney | The value for the mode you picked. Your deposit, balance and leverage are read automatically from the terminal — you never type them in. |
PollSeconds | Leave at 60. The feed refreshes once a minute; faster adds nothing. |
MaxSignalAgeMinutes | Skip a signal that is already old, so you never chase a stale entry. |
MaxSlippagePoints | How much slippage the market order may accept. |
MaxDeviationFromEntryPoints | Skip a signal if price has already run this far from our entry (0 = off). |
MaxOpenPositions / MaxLotsPerTrade | Hard caps, if you want them. |
UseBrokerTP / ManageTrailing | Place target_1 as take-profit, and move the broker stop with trailing_stop. Leave both on. |
ManualSymbolMap / SymbolMapFile | Symbol overrides — see the section above. |
DryRun | Logs only, places no trades. Use this for your first run. |
EnableNotifications | Alerts and push notifications on entries, exits and API failures. |
Position size is worked out from your broker's own tick value and lot step: lots = risk ÷ (stop distance in points × point value), rounded down to the lot step, clamped to the broker's minimum and maximum, then margin-checked before it is sent.
| What you see | What it means |
|---|---|
WebRequest is not allowed (error 4014 / 4060) | The API URL is not on MT5's allowed list — see step 4 of the install above. |
HTTP 401 | Wrong or revoked API key. |
HTTP 403 | Your address is not permitted for this key. |
HTTP 429 | More than 240 requests/minute. |
no broker symbol matched … | Add the mapping — see the symbols section. |
… is not fully tradable | Your broker has that instrument read-only (common on indices). |
WARNING: not a hedging account | Netting account — one position per instrument only. |
The EA shows a live status panel on the chart: connection state, last successful poll, how many positions it holds, and any failure count. The Experts tab keeps the full log.
https://live.economicpulse.net/v1
Encrypted (TLS) only. This is what you enter in your trading software or script — it is a data feed, not a page you browse to.
Every endpoint except /v1/health requires your API key, sent with each request:
Authorization: Bearer <your-api-key>
Keys are issued per client and stored only as a fingerprint on our side. Never share your key — requests are logged by key and address, and a key in use from many locations is treated as a breach and switched off.
| Endpoint | Returns | Key |
|---|---|---|
/v1/health | Engine status, last signal time, number of positions running | not required |
/v1/positions | Every position currently running — instrument, direction, entry, stop, target, identity, timing, risk in price terms, current stop | required |
/v1/signals | Same payload as /v1/positions | required |
/v1/cycles/{id} | The complete life of one cycle, with its net result | required |
/v1/instruments | Instrument universe and sizing guidance | required |
/v1/history?limit=50 | Recently completed positions (for testing) | required |
/v1/trades.csv | Full historical feed as CSV | required |
curl -H "Authorization: Bearer <your-api-key>" \
https://live.economicpulse.net/v1/positions
{
"generated_utc": "2026-09-11T10:16:00Z",
"count": 33,
"positions": [{
"position_id": 5010,
"cycle_id": 2370,
"instrument": "AVAX",
"side": "BUY",
"signal_time_utc": "2026-09-11T09:42:23Z",
"entry": 7.386,
"initial_stop": 7.326619272549948,
"target_1": 7.623522909800209,
"r_price": 0.059380727450052184,
"trailing_stop": 7.32661927
}]
}
| Field | Meaning |
|---|---|
position_id | Unique, never reused — the identity your system uses to make sure nothing is executed twice |
signal_time_utc | Exact generation time, UTC |
entry | Price when the signal was generated — execute at market |
initial_stop | Initial protective stop |
target_1 | Take-profit level (typically 4.0 × risk) |
r_price | One unit of risk expressed in instrument price |
trailing_stop | Current stop level — it tightens as the position advances |
revision | Short fingerprint of the position's changeable fields. Identical between two polls = nothing changed. Added in API v1.1.0 |
Sizing: size = your risk per unit ÷ (r_price × your broker's value per point). You control your own risk per unit; the feed supplies the levels.
The questions every integrating client asks, answered against how the feed actually behaves.
/v1/positions be polled?Our engine refreshes once every 60 seconds — it re-reads the market and recalculates every stop on that cycle. Polling faster therefore returns identical data.
Each response carries generated_utc — the exact time that snapshot was taken. Each position also carries a short revision token: a fingerprint of its changeable fields. If revision is unchanged between two polls, nothing about that position has changed. If it differs, re-read the position and act on the difference.
There is no separate per-position last_updated field; revision plus generated_utc are how change is detected.
/v1/positions returns only positions that are still running. When one closes it disappears from that list — there is no push event, the feed is pull-only. So:
position_ids you saw. An id that was present and is now absent has closed./v1/cycles/{cycle_id} for the outcome: state (fully_closed or partially_complete_remainder_running), net_result_r, and per position status, close_price, close_time_utc, result_r./v1/history?limit=N lists recently completed positions.Practical note: remember the cycle_id alongside each position, so you can still look up the result after the position stops being listed.
/v1/signals contain new signals only?No. /v1/signals is an alias of /v1/positions: it returns the complete current state of every running position, not only the new ones. To identify genuinely new signals, compare position_ids against the set you already hold, or take entries whose signal_time_utc is later than your previous poll.
Recommended failure protocol:
/v1/health needs no key — use it to separate “our side is down” from “your key is wrong” (401) or “you are over quota” (429).Codes to expect: 401 bad or missing key · 403 address not allowed · 429 rate limit (240/min) · 500 database unreadable.
trailing_stop mean?It is the actual stop level to hold at your broker right now — not an informational figure. It is the same level our engine uses to decide the position is finished: if price reaches it, we record that position closed at that level (status SL). Two properties matter:
trailing_stop equals the initial stop.So keep your broker stop in step: whenever trailing_stop changes, move your broker stop to the new value. If you do not, our record will show a close at the trailing stop while your position is still open at the broker.
At most once per 60-second cycle, and only when the position has advanced by a full step. With the current settings:
In practice a position’s stop changes a handful of times over its life, not continuously. Poll every 60 s and you will see every change.
API access is provided to approved clients under agreement. To request access, use the contact form.