Skip to content

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.

  1. An IQFeed subscription from DTN, with the exchange entitlements for the markets you want.
  2. 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.
  3. AmiBroker with the IQFeed plugin, which ships with the program.
  4. A database created with the IQFeed plugin as its data source, with the base interval and mixed EOD/intraday setting chosen at creation time.

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:

  1. Open the Formula Editor, type Buy = 1;, and choose Tools -> Send to Analysis.
  2. In the Analysis window set Apply to: All symbols and Range: 1 recent bar.
  3. Turn on Wait for backfill from the Settings drop-down.
  4. 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.

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.

  • 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.

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 click Configure. 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, and Tools -> Plugins is 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.

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.

Complete runnable AFL

outlier-print-scan.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();

Download outlier-print-scan.afl87 lines

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.

  • 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 a Null comparison 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.

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.

  • 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.

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.

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 Configure dialog offers. Read both from Tools -> 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.

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

Question 1. AmiBroker's IQFeed setup page says 100000 one-minute bars gets "maximum history (8 months)". Its data-sources page says 10 years of 1-minute data. What is the right way to treat this?
Show the answer and why

Answer: Treat both as dated, confirm with DTN, and measure what actually arrives

Neither page is a current statement from the vendor — one links a 2000s-era client download, the other dates itself to March 2023. Where official documentation contradicts itself, the resolution is the vendor plus your own measurement, not a preference between two stale figures.

Question 2. You create an IQFeed database, add 200 symbols, and immediately run an exploration over all of them. It reports almost nothing. What is the most likely cause?
Show the answer and why

Answer: Backfill is on demand and per symbol, and the run did not wait for it

Backfill is triggered by first access to a symbol. Without "Wait for backfill" the Analysis run does not pause for the data, so a first pass analyses empty or very short arrays and reports a clean, meaningless result. The other three would produce different symptoms.

Question 3. You read a claim that a newer IQFeed plug-in build adds a bad-tick filter. What is the responsible way to act on it? Select all that apply.
Show the answer and why

Answer: Confirm the build you are actually running in Tools -> Plugins, Get the claim from the vendor rather than from a second-hand description, Remember that any incoming-stream filter leaves bad prints already stored in your database untouched

Plug-in builds are revised between AmiBroker releases and the User's Guide does not track them, so the only reliable statement about your installation comes from Tools -> Plugins. A second-hand feature description is not evidence. And no filter applied to the incoming stream can repair history that is already in the database — that is a separate job for a quality scan and the Quote Editor.

Question 4. Why does the outlier scan measure ATR on the previous bar rather than the current one?
Baseline = Ref( ATR( Lookback ), -1 );
Show the answer and why

Answer: So the suspect bar cannot inflate the yardstick used to judge it

ATR includes the current bar's range. A single enormous print would raise the baseline enough to make itself look ordinary — the reason naive outlier filters often report nothing at all. Shifting the baseline back one bar removes the contamination.

Sources for this lesson

7 verified · checked 2026-08-31

  1. 01AmiBroker User's Guide — How to use AmiBroker with IQFeedamibroker.com/guide/h_iqfeed.html2026-08-31
  2. 02AmiBroker — IQFeed data plug-inamibroker.com/iqfeed.html2026-08-31
  3. 03AmiBroker User's Guide — How to get quotes from various markets§ Real-time data tableamibroker.com/guide/h_quotes.html2026-08-31
  4. 04AmiBroker User's Guide — How to work with Real-Time data pluginsamibroker.com/guide/h_rtsource.html2026-08-31
  5. 05AmiBroker User's Guide — Database Settings windowamibroker.com/guide/w_dbsettings.html2026-08-31
  6. 06AmiBroker User's Guide — Plugins windowamibroker.com/guide/w_plugins.html2026-08-31
  7. 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.