Economic Pulse Net

Documentation & Integration

API access to the live Economic Pulse Net signal feed, and the MetaTrader 5 bridge that trades it. Version 1.

MetaTrader 5 bridge — the easy way to trade this feed

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

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.

Installing the MT5 bridge

  1. In MetaTrader 5 choose File → Open Data Folder. That opens your terminal folder.
  2. Copy the package into MQL5/ so you end up with MQL5/Experts/PulseSignalsBridge.mq5, MQL5/Include/Pulse/… and MQL5/Files/pulse-symbols.map.
  3. Open MetaEditor (F4), open Experts/PulseSignalsBridge.mq5 and press Compile (F7). It should report 0 errors.
  4. The one manual step MT5 requires: Tools → Options → Expert Advisors, tick “Allow Web request for listed URL” and add exactly:
    https://live.economicpulse.net
    Requests to a URL that is not on this list fail immediately — that is an MT5 security rule, not an API problem.
  5. Drag the EA onto one chart (any symbol — it is not tied to a chart) and enable Algo Trading.
  6. Paste your API key into the EA inputs and press OK.
  7. Run it once with DryRun = true so it logs what it would do without placing any trade. When every instrument resolves, set DryRun = false.
A hedging account is recommended. On a netting account you cannot hold two positions on one instrument, and the feed sometimes runs two.

Matching your broker's symbols

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:

  1. Typed into the EA — the ManualSymbolMap input. This wins over everything.
  2. Your override fileMQL5/Files/pulse-symbols.map.
  3. Our alias list — served on /v1/instruments.
  4. Built-in names — NAS100 → USTEC, NDX100, US100 · SP500 → US500, SPX500 · DOW → US30, DJ30, WS30 · GOLD → XAUUSD · WTI → USOIL, CL · GER40 → DE40, DAX40 · and so on.
  5. Prefix/suffix strippingEURUSD.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.

The settings that matter

SettingWhat it is for
APIKEYYour key. The EA will not start without it.
RISKMODEHow much to risk per trade: fixed lot, % of account balance, or a fixed money amount.
RiskPercent / FixedLot / RiskMoneyThe value for the mode you picked. Your deposit, balance and leverage are read automatically from the terminal — you never type them in.
PollSecondsLeave at 60. The feed refreshes once a minute; faster adds nothing.
MaxSignalAgeMinutesSkip a signal that is already old, so you never chase a stale entry.
MaxSlippagePointsHow much slippage the market order may accept.
MaxDeviationFromEntryPointsSkip a signal if price has already run this far from our entry (0 = off).
MaxOpenPositions / MaxLotsPerTradeHard caps, if you want them.
UseBrokerTP / ManageTrailingPlace target_1 as take-profit, and move the broker stop with trailing_stop. Leave both on.
ManualSymbolMap / SymbolMapFileSymbol overrides — see the section above.
DryRunLogs only, places no trades. Use this for your first run.
EnableNotificationsAlerts 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.

If something goes wrong

What you seeWhat 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 401Wrong or revoked API key.
HTTP 403Your address is not permitted for this key.
HTTP 429More than 240 requests/minute.
no broker symbol matched …Add the mapping — see the symbols section.
… is not fully tradableYour broker has that instrument read-only (common on indices).
WARNING: not a hedging accountNetting 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.

Base URL

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.

Authentication

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.

Endpoints

EndpointReturnsKey
/v1/healthEngine status, last signal time, number of positions runningnot required
/v1/positionsEvery position currently running — instrument, direction, entry, stop, target, identity, timing, risk in price terms, current stoprequired
/v1/signalsSame payload as /v1/positionsrequired
/v1/cycles/{id}The complete life of one cycle, with its net resultrequired
/v1/instrumentsInstrument universe and sizing guidancerequired
/v1/history?limit=50Recently completed positions (for testing)required
/v1/trades.csvFull historical feed as CSVrequired

Example request

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 notes

FieldMeaning
position_idUnique, never reused — the identity your system uses to make sure nothing is executed twice
signal_time_utcExact generation time, UTC
entryPrice when the signal was generated — execute at market
initial_stopInitial protective stop
target_1Take-profit level (typically 4.0 × risk)
r_priceOne unit of risk expressed in instrument price
trailing_stopCurrent stop level — it tightens as the position advances
revisionShort 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.

Client FAQ — operating the feed

The questions every integrating client asks, answered against how the feed actually behaves.

A. How often should /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.

B. How do I know a position has changed?

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.

C. How do I know a position has closed?

/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:

Practical note: remember the cycle_id alongside each position, so you can still look up the result after the position stops being listed.

D. Does /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.

E. What happens if the API is temporarily unavailable?

Recommended failure protocol:

  1. Never open a new position on stale data. If the feed fails, stop accepting new signals.
  2. Leave your last known stops in place. The levels only ever tighten, so the last value you received stays valid and protective.
  3. Retry with exponential backoff — 5 s, 15 s, 30 s, 60 s, then every 60 s.
  4. /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).
  5. If the outage passes your tolerance window (we suggest 5 minutes), manage the open positions manually at your broker and alert a human.

Codes to expect: 401 bad or missing key · 403 address not allowed · 429 rate limit (240/min) · 500 database unreadable.

F. What exactly does 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:

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.

G. How quickly does the trailing stop update?

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.

Access

API access is provided to approved clients under agreement. To request access, use the contact form.

Signals are published for information and execution support. Trading decisions and all account risk remain with the client. See the Signal Disclaimer.