Appendix: IQFeed
IQFeed is the feed AmiBroker’s own documentation reaches for when it wants to recommend something. It appears in the “unlimited backfill” class in the Knowledge Base, it supports the Analysis-window mass-backfill procedure, and both the Interactive Brokers page and a 2026 forum reply from AmiBroker’s author point readers towards it when backfill speed or feed reliability is the problem.
It also has one loudly documented characteristic that shapes everything you build on it: it is an unfiltered feed. AmiBroker states this in capitals. Every print DTN receives is passed through, including the ones that never represented a tradeable price, and dealing with that is part of the job.
What is required
Section titled “What is required”- An IQFeed subscription from DTN, with the exchange entitlements for the markets you want.
- The IQFeed client installed and running on the same machine. AmiBroker talks to the local IQFeed Connection Manager / IQConnect, never to DTN’s servers directly.
- AmiBroker with the IQFeed plugin, which ships with the program.
- A database created with the IQFeed plugin as its data source, with the base interval and mixed EOD/intraday setting chosen at creation time.
Selecting it in AmiBroker
Section titled “Selecting it in AmiBroker”The documented one-time setup, from File -> New database:
| Setting | Documented value |
|---|---|
| Data source | DTN IQFeed Data Plug-in |
| Local data storage | Enable |
| Base time interval | 1-minute |
| Number of bars to load | 100000 |
| Intraday Settings | tick Allow mixed EOD/Intraday data |
The mixed EOD/intraday box is the one people skip and then regret. With it enabled, one database holds both true end-of-day bars and intraday bars: intraday modes drop the EOD bars on the fly, and daily mode prefers a real EOD bar over a time-compressed one, falling back to compression when no EOD bar exists for that day. Without it, the documented remedy for wanting long daily history and intraday charts is to run two separate databases — which is what the eSignal, myTrack and DDE pages all tell you to do as well.
The plugin’s Configure dialog holds the setting that must match your subscription:
the number of symbols. From AmiBroker 6.42 it also offers an option to
consolidate unbundled ticks — ticks that share the same TickID — and a Symbol
guide entry on its context menu.
Tick, 5-second and 15-second base intervals are Professional-edition features. On a Standard licence the finest base interval available is one minute, regardless of what IQFeed sends.
Backfill behaviour, and two pages that disagree
Section titled “Backfill behaviour, and two pages that disagree”IQFeed is in the class of sources AmiBroker calls unlimited-backfill, and it supports the Wait for backfill option in the Analysis window. That combination makes the documented mass-backfill procedure available:
- Open the Formula Editor, type
Buy = 1;, and chooseTools -> Send to Analysis. - In the Analysis window set Apply to: All symbols and Range: 1 recent bar.
- Turn on Wait for backfill from the Settings drop-down.
- Press Scan.
The run iterates over every symbol, requests a backfill for each, and waits for the data before moving on. At the end, every symbol is backfilled. This is worth contrasting with Interactive Brokers, where the same trick does nothing and a different, sequential procedure is required.
Now the disagreement. AmiBroker’s IQFeed setup pages and its data-sources catalogue state different things about how much history you get:
| Source | What it states |
|---|---|
h_iqfeed.html and iqfeed.html |
100000 one-minute bars gets “maximum history (8 months) available from IQFeed” |
h_quotes.html, self-dated 2 March 2023 |
500 symbols; tick, 5-second, 15-second, 1-minute and up; 100+ days of tick data, 10 years of 1-minute data, 20+ years of EOD |
Ten years and eight months are not a rounding difference. The setup pages read like the older text — they are the same pages that link a 2000s-era client download — and the catalogue page at least dates itself. Neither is a current statement from DTN.
Symbol limits and the per-symbol ceiling
Section titled “Symbol limits and the per-symbol ceiling”Two separate limits, and they bite for different reasons.
Subscription symbol limit. AmiBroker’s guidance is explicit: the total number of symbols in your IQFeed database must not exceed your IQFeed subscription limit, which is documented as 500 by default. Set the plugin’s symbol count to match. The general real-time symbol rule applies here as everywhere — exceeding the limit forces a rotation for every new symbol, each rotation triggering a fresh backfill and a fresh stream, and vendors may act against accounts that do this at scale.
The IQConnect per-symbol ceiling. AmiBroker states that you cannot use more than 5 million ticks or bars per symbol, attributing the limit to IQConnect. On one-minute bars that is a very long way away. On tick data for a liquid US name it is reachable inside a few months, and it will stop you long before any of AmiBroker’s own limits do.
Subscription and entitlement implications
Section titled “Subscription and entitlement implications”- Exchange fees are charged on top of the base subscription. AmiBroker’s IQFeed page says so directly, and it lists real-time US futures, equity options and international futures as separately priced additions.
- Your subscription determines your symbol limit, and that limit is a hard constraint on how many instruments you can stream and therefore on how large a continuously refreshed screen can be.
- Professional or non-professional status changes exchange fees, as with every redistributor.
No prices are quoted in this appendix, and there is a specific reason beyond the general policy: AmiBroker’s own two pages give different monthly figures for the same base service. Where a vendor’s own reseller documentation contradicts itself, the only responsible instruction is to get the number from DTN.
The unfiltered feed
Section titled “The unfiltered feed”AmiBroker’s IQFeed page states, in capitals, that no tick is filtered out and that you may therefore see a lot of bad ticks. This is not a criticism of DTN — passing everything through is a legitimate design choice, and it is the only one that lets a downstream tool make its own decisions — but it does mean the raw database contains prints that no chart should show.
Filtering bad prints is your job, not the feed’s
Section titled “Filtering bad prints is your job, not the feed’s”Because the feed is unfiltered by design, something downstream has to decide what counts as a bad print. You have three places to do it, in increasing order of effort.
- The plug-in’s own settings. Open
Tools -> Plugins, select the IQFeed plug-in and clickConfigure. Read what the build you actually have installed offers, rather than what a description written somewhere else says it offers. Plug-in options change between builds, andTools -> Pluginsis the documented place to see which build is loaded. - A quality scan written in AFL. Find the suspect prints yourself and look at them before deciding anything. That is what the rest of this lesson does, and it is the part that transfers to every other feed you will ever use.
- The Quote Editor. For a handful of prints in a symbol you actually trade, editing or deleting the bad quote by hand is faster and safer than any rule.
Finding candidate bad prints
Section titled “Finding candidate bad prints”Produce a shortlist of bars in an intraday database that behave like bad prints, so that a human can look at them. Not a cleaning tool — a question generator.
The formula
Section titled “The formula”Complete runnable AFL
// outlier-print-scan.afl// Part 18 - Appendix: IQFeed//// Finds CANDIDATE bad prints in an intraday database fed by an unfiltered// source. AmiBroker's own IQFeed documentation states, in capitals, that the// feed is unfiltered and that no tick is removed, so a database built from it// will contain prints that never represented a tradeable price.//// Run it as an EXPLORATION over the watch list you actually trade or study.//// WHAT THIS IS NOT:// - It is not a cleaning tool. It produces a list to look at, not a list to// delete. Deciding what to do with a suspect bar is Part 19's subject.// - It is not proof of anything. A genuine news gap and a bad print have the// same shape at this resolution. Every row is a question, not a verdict.//// DELIBERATE LOOK-AHEAD - read this before reusing any of this code:// The "reverted" test below reads the NEXT bar, using Ref( Close, 1 ). In a// trading rule that would be look-ahead bias and would invalidate every// result. Here it is correct and necessary, because a bad print is defined// by what the market did immediately afterwards: the price came straight// back. This formula audits stored history; it must never be pasted into a// Buy/Sell rule.//// Assumptions:// - Intraday database. On end-of-day data the thresholds are far too tight// and every earnings gap will be flagged.// - The first Lookback bars of each symbol produce no verdict, because the// volatility baseline does not exist yet.
_SECTION_BEGIN( "Outlier print scan" );
// ---------------------------------------------------------------------------// Parameters// ---------------------------------------------------------------------------Lookback = Param( "Volatility lookback (bars)", 20, 5, 200, 1 );JumpMultiple = Param( "Jump, in ATRs", 8, 2, 40, 0.5 );RevertShare = Param( "Reverted if it retraces", 0.7, 0.1, 1.0, 0.05 );
// ---------------------------------------------------------------------------// The volatility baseline// ---------------------------------------------------------------------------// ATR is measured on the bar BEFORE the suspect bar. Measuring it on the same// bar would let the bad print inflate the yardstick used to judge it, which is// how naive outlier filters end up finding nothing.Baseline = Ref( ATR( Lookback ), -1 );
// Guard against a zero or Null baseline, which happens on the opening bars of// a symbol and on instruments that have not moved at all in the lookback.HasBaseline = NOT IsNull( Baseline ) AND Baseline > 0;
// ---------------------------------------------------------------------------// The three symptoms// ---------------------------------------------------------------------------// 1. A close-to-close jump that is large relative to recent range.Jump = Abs( Close - Ref( Close, -1 ) );JumpScore = IIf( HasBaseline, Jump / Baseline, 0 );
// 2. A bar whose own high-low range is large relative to recent range. A single// stray tick inside an otherwise quiet minute produces this without moving// the close at all.BarRange = High - Low;RangeScore = IIf( HasBaseline, BarRange / Baseline, 0 );
// 3. The price came back. This is what separates a bad print from news.Retrace = Abs( Ref( Close, 1 ) - Ref( Close, -1 ) );Reverted = Nz( Retrace < ( 1 - RevertShare ) * Jump, 0 );
Suspect = HasBaseline AND ( JumpScore > JumpMultiple OR RangeScore > JumpMultiple );
// ---------------------------------------------------------------------------// Report// ---------------------------------------------------------------------------Filter = Suspect;
AddColumn( DateTime(), "Bar", formatDateTime );AddColumn( Open, "Open", 1.4 );AddColumn( High, "High", 1.4 );AddColumn( Low, "Low", 1.4 );AddColumn( Close, "Close", 1.4 );AddColumn( Volume, "Volume", 1.0 );AddColumn( JumpScore, "Jump (ATRs)", 1.1 );AddColumn( RangeScore, "Range (ATRs)", 1.1 );AddColumn( Reverted, "Reverted", 1.0 );
_SECTION_END();How it works
Section titled “How it works”The scan measures three symptoms and reports a bar when any of the first two fires.
The volatility baseline is ATR() measured on the bar before the suspect bar,
via Ref( ATR( Lookback ), -1 ). Measuring it on the same bar would let a bad print
inflate the very yardstick used to judge it, which is why naive outlier filters
routinely find nothing.
Symptom one is a close-to-close jump that is large in units of that baseline. Symptom two is a bar whose own high-to-low range is large in the same units; a single stray tick inside an otherwise quiet minute produces this without moving the close at all, so the two tests catch different defects.
Symptom three is that the price came straight back, which is what distinguishes a bad print from news. It is reported as a column rather than used as a filter, because a genuine spike that reverses and a bad print that reverses look identical here.
Key functions
Section titled “Key functions”ATR( period )— average true range, the volatility yardstick.Ref( array, shift )— the array displaced in time. Negative looks back, positive looks forward.IIf( condition, a, b )— element-wise choice, used here to substitute zero where no baseline exists.Nz( x, valueifnull )— turns aNullcomparison into a definite answer.Param( name, default, min, max, step )— exposes the thresholds in the Parameters dialog so you can tune them against your own data without editing the formula.
Expected result
Section titled “Expected result”Test it
Section titled “Test it”Introduce a known defect and confirm the scan finds it. Use the Quote Editor on a
symbol that is fully backfilled — remembering the documented restrictions: one-minute
bars or higher, no backfill running, and the last three bars cannot be edited because
the plugin caches them. Change one closing price to something absurd, re-run the
scan, and confirm the bar appears with a large Jump (ATRs) and Reverted equal to 1.
Then put it back.
Common errors
Section titled “Common errors”- Hundreds of rows on end-of-day data. The thresholds assume intraday volatility. On daily bars an eight-ATR move is an ordinary earnings gap.
- No rows at all on a symbol you know is dirty. The lookback may be short enough
that the baseline itself is contaminated. Increase
Volatility lookback. - Every opening bar flagged. Overnight gaps are close-to-close jumps by definition. Either accept them as noise in this report or exclude the first bar of each session before drawing conclusions.
Extension
Section titled “Extension”Add a column holding the ratio of the bar’s volume to the median volume of the lookback window. A large price excursion on a tiny volume is a much stronger candidate for a bad print than the same excursion on heavy volume, and the ratio separates them without any additional data.
What is verified, and what is not
Section titled “What is verified, and what is not”Verified from official AmiBroker pages, retrieved 31 August 2026: the requirement
for a running local IQFeed client; the documented Database Settings values; the mixed
EOD/intraday requirement; the plugin Configure symbol-count field and the 6.42
unbundled-tick consolidation option; IQFeed’s membership of the unlimited-backfill
class and its support for Wait for backfill; the 500-symbol default subscription
limit; the 5-million-ticks-or-bars-per-symbol IQConnect ceiling; the statement that
the feed is unfiltered; and the compatibility chart entry showing IQFeed working in
both the 32-bit and 64-bit builds.
Not verified, and stated as such:
- Actual current history depth. AmiBroker’s own pages say eight months in one place and ten years in another, and the more generous figure comes from a page that dates itself to March 2023.
- Current subscription structure, symbol limits above the default, and per-exchange fees. These are DTN’s, they change, and AmiBroker’s two pages disagree about the base fee.
- Which IQFeed plug-in build ships with your installation, and what its
Configuredialog offers. Read both fromTools -> Plugins. Plug-in builds are revised between AmiBroker releases and the User’s Guide does not track them, so this course states no build numbers and no per-build feature lists.
The Level A path
Section titled “The Level A path”To learn the unfiltered-feed problem without an unfiltered feed: run the outlier
print scan over free end-of-day data with a much larger Jump, in ATRs threshold —
try 15 or 20. Free end-of-day sources have their own defects, and the scan is the same
tool. You will find unadjusted splits, which produce enormous single-day moves that
never reverse, and that contrast teaches the difference between a data defect and a
real event better than any explanation.
To learn the mass-backfill workflow without a subscription: the Analysis window
procedure is worth practising on a local database, where Wait for backfill is
documented as having no effect. Write Buy = 1;, apply to all symbols, one recent
bar, press Scan, and watch the run iterate. You are practising the mechanics; on a
plugin-fed database the same run additionally waits for data.
To learn the streaming experience without streaming: Tools -> Bar Replay on any
intraday history you can obtain — including intraday files accumulated day by day
through the free downloader described in the last lesson of this part. Playback
truncates the data for every symbol at the playback position, in charts and in
Analysis alike, so the experience of watching bars form is genuine even though the
data is old.
To learn the diagnostics without a plugin: the capability probe in the eSignal and other feeds appendix runs on any database and reports exactly which real-time fields your setup populates — which, on a local database, is none of them. That is the correct answer, and seeing it is how you learn to read the probe.
Check your understanding
Sources for this lesson
7 verified · checked 2026-08-31
- 01AmiBroker User's Guide — How to use AmiBroker with IQFeedamibroker.com/guide/h_iqfeed.html2026-08-31
- 02AmiBroker — IQFeed data plug-inamibroker.com/iqfeed.html2026-08-31
- 03AmiBroker User's Guide — How to get quotes from various markets§ Real-time data tableamibroker.com/guide/h_quotes.html2026-08-31
- 04AmiBroker User's Guide — How to work with Real-Time data pluginsamibroker.com/guide/h_rtsource.html2026-08-31
- 05AmiBroker User's Guide — Database Settings windowamibroker.com/guide/w_dbsettings.html2026-08-31
- 06AmiBroker User's Guide — Plugins windowamibroker.com/guide/w_plugins.html2026-08-31
- 07AmiBroker Knowledge Base — Do not exceed real-time symbol limitamibroker.com/kb/2016/04/18/do-not-exceed-real-time-symbol-limit2026-08-31
Every technical claim on this page was checked against the official AmiBroker documentation on the date shown. Where the course disagrees with folklore, the source is how you can tell which one to trust.