ZeroTouch Autopilot Guide

Everything you need to build your rules and understand what the bot does in your Interactive Brokers account. Read it once in full before activating your first rule; then use it as a reference.

In short
  • You build a rule: which options to buy or sell, when to open, when to close and with how much capital.
  • Autopilot executes it in your own IBKR account, every day, exactly as you wrote it.
  • It doesn't choose strategies for you or give opinions on them. The strategy and its results are yours.
  • IBKR decides margin and permissions: if it rejects an order, the bot shows you the reason.
  • Try every rule first on your paper account (starts with DU) before using it with real money.

1. Before you start

An Interactive Brokers account with US options permissions. IBKR sets the permission level: buying options needs the basic level; spreads, the iron condor and selling uncovered options need a margin account and higher levels.

US options market data (OPRA) at IBKR. Without data the bot sees no prices and doesn't trade.

A Windows 10 or 11 computer, on and online during market hours (9:30 to 16:00, New York).

TWS or IB Gateway open and connected. We recommend a second IBKR username just for the bot, so you can log in from your phone without disconnecting it: the steps are in the ZeroTouch setup guide (/en/help).

Your ZeroTouch installation code (sent by email).

2. Install, connect and start

Install ZeroTouch Autopilot with the installer we sent you and open it.

In the Settings tab enter: the IBKR account (U… live or DU… paper), the port (IB Gateway: 4001 live / 4002 paper; TWS: 7496 live / 7497 paper), the Client ID (default 27; it must differ from any other program connected to the same TWS or Gateway) and your installation code.

Click Save and then Test connection: you'll get a test email.

Click Start. The top bar should read Connected and the New York time.

You can tick 'Start the bot automatically when the program opens' so it starts on its own when you turn on the computer.

3. Concepts the wizard uses

Calls and puts, buying and selling

A call gains value when the price rises; a put gains value when the price falls. Buying an option: you pay a premium and the most you can lose is that premium. Selling an option: you collect the premium and take on the obligation; the loss can be much larger than what you collected if it isn't covered.

Strike, expiration, DTE and 0DTE

The strike is the exercise price. The expiration is the day the option expires. DTE is the days left until expiration. 0DTE = expires the same day (only on underlyings with daily expirations, such as SPY, QQQ or SPX).

Delta: the most practical way to choose the strike

Delta measures how much the option moves for each dollar of the underlying. In the wizard it's always written as a positive number, also for puts (a put with delta −0.30 is entered as 0.30).

Delta you enterWhich option it isHow it behaves
0.50At the money (ATM): the strike closest to the priceBalance between cost and movement
0.55 to 0.80In the money (ITM)Pricier, moves almost like the underlying
0.15 to 0.45Out of the money (OTM)Cheaper, moves less; if sold, more likely to expire worthless
0.05 to 0.15Far out of the moneyVery cheap; little movement

Credit and debit

If you collect more than you pay when opening, the position is a credit (for example a put credit spread). If you pay more than you collect, it's a debit (for example buying a put or a put debit spread). Profit and loss in % are measured on that opening credit or debit.

Mid price, natural price and bid/ask

The bid is what buyers pay and the ask is what sellers want. The mid price is in between. The natural price is the one that fills for sure: sell at the bid and buy at the ask. The bot starts every order at the mid price and steps toward the natural price.

Assignment, exercise and cash settlement

If you sold an option, IBKR may assign it (before or at expiration) and shares appear in your account. If you bought an option and it expires in the money, IBKR exercises it automatically and shares also appear: an exercised long put leaves you short 100 shares per contract; an exercised long call leaves you long 100.

The SPX, NDX and XSP indexes have no shares: they settle in cash at expiration and have no early assignment.

4. Strategies: how to enter each one

When you create a rule you choose a starting point: a template (put credit spread, iron condor, PMCC / diagonal, wheel) with default values, or 'Custom' to build it from scratch. On the Risk step the wizard tells you the name of the structure you built: use it to confirm it's what you wanted.

StructureLegs (in the wizard)What it's for
Single long call or put1 leg: buy call (or put) by delta, for example 0.50Betting on a rise (call) or a fall (put) with maximum loss = the premium
Short put (uncovered)1 leg: sell put by delta, for example 0.30Collecting premium with a neutral or bullish view. The loss can reach the strike x 100 per contract
Vertical spreadleg1 by delta; leg2 'X from another leg', Reference pata1, value 5 (lower for puts, higher for calls). Same expirationCapping the maximum loss. Buying the more valuable leg makes it a debit; selling it, a credit
Put credit spread (template)Sell put delta 0.30 at 30–45 days; buy put 5 points lowerNeutral or bullish view with capped maximum loss
Iron condor (template)Put credit spread + call credit spread, delta 0.16, 5-point wingsWhen you expect the price to stay in a range
Diagonalleg1 buys by delta at more days (e.g. 30–60); leg2 sells by delta at fewer days (e.g. 0–7). Different expiration and strikeSelling short options against a long one that covers them
CalendarLike the diagonal, with the same fixed strike on both legsProfiting from the short option losing value faster
PMCC (template)Buy call delta 0.80 at 300–540 days; sell call delta 0.30 at 25–45 days and roll itSimilar to a covered call, with less capital
Wheel (template)Sell cash-secured puts; if assigned, sell covered calls on those sharesCollecting premium while buying shares at a price that works for you
Vertical or diagonal: if both legs expire the same day it's a vertical spread, not a diagonal. A diagonal has different expirations. For example, buying the 750 put and selling the 745, both 0DTE, is a vertical put debit spread.

Example: 0DTE long put on QQQ

Starting point Custom, underlying QQQ. Legs: one leg, put, buy, by delta 0.50, minimum and maximum days 0. Entry: the day and time you want. Exit: for example 50% profit, 50% loss and Close at time 15:45 (so it doesn't reach expiration). Assignment: Close everything. Capital: 1 contract.

Example: 0DTE vertical put spread

Leg1: put, buy, by delta 0.50, days 0 and 0. Leg2: put, sell, 'X from another leg', Reference pata1, value 5: for a put the bot places it 5 points lower, making a put debit spread (bearish). Leg2's days are turned off: it uses the same expiration as leg1.

The wing value is a distance: for puts the bot places it lower and for calls higher (away from the money), which is the normal wing. If you type the sign (+5 or −5) it's kept as is, and on the inside the strategy flips: for example, for puts +5 turns the bearish put debit spread into a bullish put credit spread. The wizard warns you and the Risk step shows whether it's credit or debit, bullish or bearish.

Example: put diagonal

Leg1: put, buy, by delta 0.60, days 30 to 60. Leg2: put, sell, by delta 0.30, days 0 to 0. In Rolls you can roll the long leg when it has, for example, 10 days left.

5. The wizard, step by step

There are 9 steps. Each step is checked before moving on: an error won't let you continue; a warning (in yellow) is shown once and you can continue by clicking Next again. Every option with a default value has its explanation next to it.

1. Underlying and starting point

Rule name, the ticker as it appears in IBKR (SPY, QQQ, AAPL, SPX…) and the template or Custom. An existing rule's structure isn't changed: for a different structure, create a new rule (you can use Duplicate).

2. Legs

Up to 4 legs. For each one: name, call or put, buy or sell, how the strike is chosen, value, minimum and maximum days to expiration, and quantity.

Strike methodWhat the bot doesWhen to use it
By deltaLooks for the option with the delta closest to the one you asked for. With 0DTE delta jumps a lot from one strike to the next: if your target falls between two strikes, it takes the closest. If the chain doesn't reach (all far, more than 0.07 away), it doesn't open that dayMost cases: it follows the price on its own
% of priceStrike at that % of the underlying's price (0 = the closest to the price; negative = below; positive = above)When you want a fixed distance in %
X from another legSame expiration as the Reference leg, X points lower (negative) or higher (positive)The wing of a spread
Fixed strikeAlways that exact strikeRarely: if the price moves away, it stops making sense or isn't quoted

Expiration: among the expirations that fall within your minimum and maximum days, the bot picks the one closest to the middle of the range. Example: 30 to 45 days → it looks for the one closest to 37.

Extra strikes (only for 'X from another leg'): if the exact wing strike isn't quoted, the bot waits up to 30 minutes and then may take at most that many strikes further away (default 1). If there's none either, it doesn't open that day.

Crossed call/put safeguard (since 0.6.5): the program won't let you save or activate the rule, and the bot won't open with it, if all legs are bought and of the same type and the name says the other (for example «PUT QQQ» with the leg left on call, the default), or if the signal points one way and the structure the other (high not exceeded, pullback from the high, EMA crossing down or price below VWAP with a bought call, or the reverse with a put). Fix it in step 2 by changing the Type. It isn't checked when the signal mixes directions or only uses RSI, gap or change, nor for wheels, condors, butterflies or structures with sold legs. In step 6, profit %, loss % and days fields left empty count as 0 (not used).

3. Risk

Shows the structure's name (for a vertical spread it also says whether it's a credit or debit spread and bullish or bearish: check it, a flipped sign in the width gives the opposite strategy) and whether the loss is capped, can reach the strike x 100 (uncovered short puts) or is unlimited (uncovered short calls). With uncovered short calls you must confirm it explicitly to continue. The maximum loss in dollars is computed with real prices in the preview.

4. When to open

Days of the week, the New York time window in which it tries to open ('Open from', between 09:35 and 15:30, and 'Open until'), the minimum days between openings, and how many positions of this rule can be open at once. Moving-average filter (optional): only opens if the price is above (or below) its N-day average; 0 = no filter.

The bot opens only once per enabled day. From the 'Open from' time it tries to open. If at that moment it can't because it already has the maximum open positions (or the 'every N days' days haven't passed yet), it keeps watching and opens as soon as it can: for example, if a position closes at a profit at 12:10. But only until the 'Open until' time: after that time it doesn't open that day, even if a position closes. Empty = until 15:30. The templates come with 'Open until' 13:00; you can extend it.

If the 'Open until' time arrives with the maximum open positions, the Log says so: 'the opening time limit arrived … it won't open today'.

If the opening attempt fails (no contract met the rule, empty bid/ask, not filled, rejected by IBKR), it doesn't repeat it that day: it tries again on the next enabled day. If you edit the rule after a failed attempt, it tries again that same day with the new rule (not if it already opened a position).

Repeat during the day (from version 0.7.9, option rules with a signal): 'Repeat during the day' = how many entries the rule can make on the same day (1 = one, as always) and 'Minutes between entries' = the minimum time between them. After an entry, it enters again when the signal stops being met and is met again (for example, price goes back above -1% from the open and then falls again). If it's met again before the required minutes, that time doesn't count and it waits for it to trigger again. The maximum open positions still applies: to have 3 entries open at once, set the maximum to 3. The Log reports each step: 'entry 2 of 3 today', 'no longer met', 'triggered again but N min are left'.

When you activate a rule that won't open at that moment, the Log says why: it already tried today, the time limit passed, it isn't an entry day, it has the maximum open, or it's waiting for the 'Open from' time.

'Do not open while an opposite position is open on the same stock' (checked by default): with a TSLA put open, from any rule, a TSLA call rule doesn't open until the put closes, and vice versa. When the opposite position closes, it can open that same day if the signal is met and it's within the time window. Unchecked, it can hold both. Neutral structures (condor, butterfly) don't block.

5. Entry signal (optional)

A switch: 'Don't use a signal' (the rule opens by days and time window, as always) or 'Use an entry signal'. With a signal, you pick a prebuilt one or build your own, and the bot opens the first time it's met within 'Open from' / 'Open until'. Everything is explained in the «Entry signals» section.

6. When to close

The position closes on whichever comes first: % profit, % loss, N days before expiration or closing time. 0 (or empty) = that exit isn't used. With no exit at all, the position stays until expiration (or until the rolls).

Close at time (no overnight)

You enter a New York time between 09:40 and 15:55 (for example 15:45) and choose when it applies:

OptionWhat it doesWhat it's for
Every day (no overnight)At that time it closes whatever is still open from the rule, every dayNever holding positions from one day to the next
Only on expiration dayOn other days it does nothing; on the day any leg expires, at that time it closes the whole positionNot reaching expiration: avoiding exercise or assignment by IBKR (recommended for 0DTE)

After the closing time the rule opens nothing more that day. 'Open until' must be at least 15 minutes before the closing time, so it doesn't open and close right away (without 'Open until', which means 15:30, the closing time must be 15:45 or later, up to 15:55). The closing order starts on that time's check (within 5 seconds) and is executed like any close: a limit order that moves toward the natural price in 4 steps of 10 seconds and, if it doesn't fill, at market. On early-close market days it moves up to 15 minutes before the close.

With open positions the bot checks every 5 seconds. Profit is measured at mid price (what you see in the Panel), wide quotes or not: as soon as it's reached, the closing order goes out from mid toward natural, but never worse than the price of your profit %, so it only fills at that profit or more. It doesn't go to market: if it doesn't fill, it stays at that price while the mid price stays above; if it falls, it's cancelled and the bot keeps watching. The loss stop is confirmed with 2 checks in a row (about 5 seconds) and isn't evaluated with a bid/ask wider than 30% of the mid price: so a stray quote doesn't take you out. Since version 0.7.17, a stop or trailing close goes straight to the natural price (bid) and, if it doesn't fill in 5 seconds, at market: in a fast drop, getting out fast is worth more than half the spread.

FLEX stop: the stop that waits

Below the loss % is 'FLEX stop: don't close at a loss before' (since Autopilot 0.6.2). With a New York time (for example 15:30), the loss stop does not close before that time, every day: if at the open the position is already below your stop (for example after an overnight drop), the bot doesn't close it and gives it time to bounce. From that time on, if the loss is still larger than the stop, it closes (with the same 15-second confirmation). Profit-taking, days to expiration and the closing time work the same. Empty = the stop works all day, as always.

ExampleWithout FLEX stopWith FLEX stop 15:30
You paid $3,000, 50% stop. It opens with the option at $1,000 and by 11:00 it's back to $3,400Closes at 09:30 at -$2,000Waits: at 15:30 it's in profit and doesn't close on the stop
You paid $3,000, 50% stop. It opens at $1,000 and at 15:30 it's still at $800Closes at 09:30 at -$2,000Closes at 15:30 at -$2,200

It goes between 09:31 and 15:55, needs a loss %, and if the closing time is 'every day' it must be before that time. On early-close days it doesn't go past the day's limit. While it waits, the Log writes once a day: 'FLEX STOP … is past the 50% stop, but it does not close before 15:30 (NY)'.

While it waits, the loss can be larger than your stop. It's a rule decision: test it first (for example with a backtest on QuantConnect).

Trailing: let the gain run

In rules where all legs are bought (long calls or puts) there are two more fields (since Autopilot 0.7.3): 'Trailing: activate at % profit' and 'Trailing: % drop from high'. When the position reaches that % profit, the bot tracks the highest value it reaches (at mid price) and closes it if it falls that % from that high. 0 in 'activate' = active from the open. 0 and 0 = no trailing.

Example: you paid $1,500, trailing 100 / 50What the bot does
The premium rises to $2,400 (+60%) and comes back to $1,000Not activated (it didn't reach +100%): the rest of the rule applies
The premium reaches $3,000 (+100%)It activates; the Log writes 'TRAILING … active'
It keeps going to $6,000 and drops to $3,000 (50% off the high)Closes with about +$1,500; reason 'trailing 100% (maximo +300%)'

It can be used together with the % profit (it closes on whichever comes first) or alone. The close is confirmed like the stop: 2 checks in a row (about 5 seconds), or on the first one if the value already dropped twice your % (with an 8% drop, if it already fell 16%). The order goes straight to the natural price (bid) and, if it doesn't fill in 5 seconds, at market (since version 0.7.17; before it was 15 seconds of confirmation and 4 steps of 10 seconds). In Results the reason counts as 'trailing'.

You see it in the Panel (since 0.7.4), Trailing column: 'waits for +100%' while it hasn't reached the activate %; 'ON +72% → +55%' when active (the highest profit it reached and the profit % where it closes). The Log writes when it activates, each new high in +25-point steps and, if you change the rule with the position open, the new values and the new closing point. The change applies on the next check: the high is kept and, if it was active, it stays active.

The option trailing is managed by the bot: it needs the program open and connected. With the computer off it doesn't close.

Price used to measure (stop only): Executable (default) measures with what it would cost to close at that moment; Mid price triggers earlier, but closing pays the bid-ask spread.

Near the profit target or the stop, the Log writes an EXIT line every minute with the % at mid, the executable % and each leg's bid/ask: so you always know why it closed or why not yet.

In a position where all legs are long, the maximum loss is what you paid: a stop of 100% or more never acts earlier. If you want to cut earlier, use for example 50%.
With 0DTE you can't use 'N days before expiration' (the leg already opens with 0 days). If neither the profit nor the loss is hit and you didn't set a closing time, the position reaches expiration and in-the-money options are exercised or assigned: see step 8. To avoid it, use 'Close at time' (for example 15:45).
In the wheel, the closing time closes the open options; shares you already hold from an assignment aren't sold by time.

7. Rolls and minimum strike

Rolling a leg = closing it and opening the same one further out in time, in a single order. You can roll at N days to expiration and, on short legs, at X% profit. If IBKR rejects the roll, the position stays as it was and it's retried the next day.

Minimum strike (wheel only): off by default. When on, the covered call is never sold below what the shares cost you.

8. Assignments

OptionWhat the bot does when shares appear from one of its legs
Close everythingCloses what's left of the position and sells or buys back the shares at market
Flatten and continueSells or buys back the shares and replaces the leg that left (PMCC, diagonals)
WheelSells covered calls on the shares; if they're called away, goes back to selling puts
Only alertTouches nothing: it alerts you and the shares stay in the account
With 'Only alert', a long put expiring in the money leaves you short 100 shares per contract the next day, and the bot doesn't touch them. If you don't want shares in the account, choose 'Close everything'.

Shares appear in the account on the business day after expiration: the bot flattens them as soon as it sees them.

9. Capital

Fixed contracts: always that quantity per position. % of capital: opens as many units as fit with that % of the account value at risk (the combination's maximum loss), counting what this rule already has open. For structures with no maximum loss (something sold uncovered) the risk is estimated at 20% of the underlying's price x 100 per short contract: for those, use fixed contracts.

10. Summary and preview

The rule in words: read all of it. 'Preview with today's chain' builds the order it would send today with real IBKR prices (strikes, expiration, delta, bid/ask, net, risk and units) without sending it. It also shows in dollars how much you make or lose per unit with your exit, and warns you if the stop is beyond the maximum loss (then it never triggers). The bot must be started and connected. Tick 'Activate the rule when saving' so it starts trading it.

6. Entry signals

The entry signal is optional and is chosen in step 5 of the wizard. Without a signal, the rule opens by days and time window, as always. With a signal, between 'Open from' and 'Open until' the bot checks the signal on every check (every 5 seconds while it waits for it) and opens the first time it's met. If it isn't met before 'Open until', it doesn't open that day and the Log says so.

The signal combines with any strategy: for example, 'RSI oversold' with a put credit spread, or 'Low volatility' with an iron condor. The signal decides when to open; the strategy, what to open.

Prebuilt signals

The two prebuilt fade signals combine 'not exceeded', 'Pullback (%)' and 'Change since today's open (%)': the day's low (or high) holds for 30 minutes without being exceeded, price has already moved 0.4% away from that extreme and, in addition, the day is inside a band relative to the open: for the call, below the open but by no more than 0.75%; for the put, above the open but by no more than 1%. A new extreme resets the pullback to 0. You change the minutes, the % and the band.

Up to Autopilot 0.6.0 the prebuilt fade signals used dollars ($1 pullback and a first move of no more than $1.25). Rules saved with that signal don't change. That version can still be built by hand with 'Pullback ($)' and 'First move ($)': the first move discards an extreme if price had already gone further since it was set, so it doesn't enter when price comes back toward an extreme from hours earlier.

They are typical combinations, with starting values you can change. They are tools: they are not a recommendation and haven't been tested by ZeroTouch.

SignalCondition (starting values)Often used to
RSI oversold5-minute RSI(14) below 30Look for a bounce after a fast drop
RSI overbought5-minute RSI(14) above 70Look for a pullback after a fast rise
Bullish moving-average cross9 EMA crosses above the 21 EMA (5 minutes)Follow a trend change up
Bearish moving-average cross9 EMA crosses below the 21 EMA (5 minutes)Follow a trend change down
Opening-range breakout upPrice above the 9:30-10:00 highFollow the morning momentum
Opening-range breakout downPrice below the 9:30-10:00 lowFollow the morning momentum
Opening gap downOpen 0.3% or more below the previous closeFollow or fade a gap
Opening gap upOpen 0.3% or more above the previous closeFollow or fade a gap
Down dayPrice 0.5% or more below the previous closeEnter on down days
Up dayPrice 0.5% or more above the previous closeEnter on up days
Price above VWAPPrice above the day's VWAPFilter in favor of buyers
Price below VWAPPrice below the day's VWAPFilter in favor of sellers
Daily uptrendPrice above its 50-day averageTrade only with the trend
Daily downtrendPrice below its 50-day averageTrade only with the trend
Low volatility (VIX)VIX below 20Sell premium in a calm market
High volatility (VIX)VIX above 25Sell premium further out or buy protection
Fade of the day's highThe day's high hasn't been exceeded for 30 min or more, price has pulled back 0.4% or more from it, and the change since today's open is above 0% and at or below 1%A put at the highs when the day is only slightly up from the open
Fade of the day's lowThe day's low hasn't been broken for 30 min or more, price has bounced 0.4% or more from it, and the change since today's open is at or above -0.75% and below 0%A call at the lows when the day is only slightly down from the open

Your own signal

With 'Add condition' you build up to 6 conditions and choose whether all or any must be met. Each condition comes from this menu:

ConditionWhat you chooseHow it's measured
RSITimeframe (1, 5, 15 min or daily), period, below/above, valueWilder's RSI on closed bars
Moving-average cross (EMA)Timeframe, fast and slow average, crosses above/below, above/below'Crosses' is met on the bar of the cross; 'above/below' looks at the position
Price vs moving averageTimeframe, period, above/belowIntraday: EMA; daily: simple average of previous closes
Opening rangeMinutes (5 to 120), breaks the high/lowHigh and low from 9:30; only after those minutes
Opening gap (%)At or above / at or below X%The day's open vs the previous close; once a day
Day change (%)At or above / at or below X%Current price vs the previous close (includes the gap)
Another ticker's day change (%)Ticker (e.g. QQQ), at or above / at or below / below / above X%The same, but for another ticker: to look at the market. Example: a TSLA put with 'QQQ below 0.5' doesn't open while QQQ is up 0.5% or more. Price once a minute
Change since today's open (%)At or above / at or below / below / above X%Current price vs today's open (first 1-minute bar). Two conditions make a band: '>= -0.75' and '< 0'
Price vs VWAPAbove/belowThe day's VWAP from 1-minute bars
VIXBelow/above a valueVIX price (needs the CBOE indexes package at IBKR)
PriceBelow/above a valueThe underlying's current price
Near ($) the day's high/lowNear the high or the low, X dollars or lessDistance between the current price and today's high (or low)
Day's high/low not exceeded (min)The high or the low, N minutes (1 to 300)How long since price last made a new high (or low) for the day
Pullback ($) from the day's high/lowFrom the high or from the low, X dollars or moreHow far price moved away from today's high (or low): if it makes a new extreme, the pullback goes back to 0
Pullback (%) from the day's high/lowFrom the high or from the low, X% or moreSame as the dollar one, but in % of the extreme: the same number asks for the same move on stocks of different prices (0.4% is ~$0.88 on a $220 stock and ~$2.88 on a $720 one)
First move ($) off the day's high/lowOff the high or off the low: never moved more than X dollarsThat this is the first time price moves off the extreme: if since it was set price already went further than X, that extreme is discarded until a new one is made

Data and details

Price conditions (range breakout, day change, price vs VWAP or vs an average, price) compare the current price with the level, without waiting for the bar to close. RSI and crosses use closed bars: a bar in progress changes several times a minute and would give signals that later disappear.

The bot uses IBKR 1-minute bars, closed ones only (a bar in progress doesn't count); 5 and 15-minute bars are built by joining the 1-minute ones from 9:30. RSI, crosses and 1/5/15-minute averages also use the previous day's bars, so they have data from the open. The gap, the opening range and VWAP use only today's. Bars are requested from IBKR once a minute per underlying.

In the Log: while the rule is waiting, 'SIGNAL …: not met yet (detail). It keeps watching until HH:MM' (once a day); when it's met, 'SIGNAL …: met (detail)' and it opens; if it isn't met in time, 'SIGNAL …: it wasn't met today before HH:MM'. The preview says whether the signal is met at that moment.

A signal guarantees nothing: it only decides when to enter according to what you chose. Seconds pass between the signal and the fill and the price can move (see «Execution timing»). If you want to test a combination before using it with real money, you can backtest it on QuantConnect or use a paper (DU) account.

7. Stock rules (stocks module)

With the stocks module, the wizard has one more starting point: 'Stocks'. The rule buys shares (long) of the ticker you choose, with the same entry conditions as option rules (days, time window, moving-average filter, signals). Not for indices (SPX, NDX, XSP). Short selling comes as another module.

Stock templates

With 'Stocks' the wizard offers three templates or 'Free' (since Autopilot 0.7.2). Each one sets the entry and the exit; everything can be changed afterwards.

TemplateEntryExit
RSI(2) bounce with trailingDaily RSI(2) below 5 and price above the 200-day average; buys from 10:00 to 10:30SL 6%, trailing 4% from +4%, sells after 10 days at 15:50
RSI(2) bounce with fixed TPThe same entryTP 5%, SL 5%, sells after 5 days at 15:50
Daily 9/21 moving-average crossThe 9-day EMA crosses above the 21-day (daily closes); buys from 10:00 to 10:30SL 8%, trailing 6% from +6%, sells after 30 days at 15:50

They come from QuantConnect backtests (2019–2026, 1-minute bars, IBKR commission and slippage) on two different groups of stocks.

Size

A fixed number of shares, a dollar amount (it buys the whole shares that fit at the purchase price) or a % of the account value. The purchase is a limit order from the mid price that moves toward the ask in 6 steps of 20 seconds; if it doesn't fill, it doesn't buy and retries at the next entry.

When to sell: protection stays at IBKR

As soon as the purchase fills, the bot leaves the sell orders placed at IBKR, in an OCA group (when one executes, IBKR cancels or reduces the others) and GTC (they carry over from day to day). They work even with the computer off or without internet.

ExitOrder at IBKRComment
TP +X%Limit sellAt the TP price or better
SL -X%Stop (or stop limit outside regular hours)Always in place, except with SL FLEX
Trailing X%Trailing stopFollows the high. With 'from +Y%' the program places it when the position reaches +Y% (it must be open that day)
SL FLEX from hh:mmDay stop, active from that timeNot in place overnight: each day the program places it in the morning (it must be open that day). Optional: a wider safety stop, always in place
Forced exitSent by the programEvery day at a time (no overnight) or after N calendar days at a time: cancels the protection and sells (limit at the bid; market after 20 s; from 15:55 to 15:58 straight to market)

Outside regular hours (optional per rule): the TP and stops also execute in pre and post market, as a limit with a margin (1% by default). Liquidity may be low outside regular hours.

A stock position can stay open for weeks. On the Dashboard it shows as '+N TICKER (shares)', with its value, the result and the days since the purchase. 'Close now' cancels the protection and sells.

What the bot does if you touch something in TWS

If you sell the shares in TWS, the bot marks the position 'closed outside the bot' and cancels its protection orders (so it doesn't end up short). If you sell part of them, the position continues with the rest and its protection is redone for that quantity. If you cancel a protection order in TWS, it alerts you and does not place it again.

Shares from these rules are kept apart from option rules: an assignment is still detected by the change in shares without counting the stock rules' shares, and your own shares are not touched.

It never sells more shares than the account holds for that position, and never sends a sale while a protection order is still live at IBKR. If the program closes in the middle of a close, when it comes back it redoes the protection with the account's real quantity.

8. How to build a rule step by step

Autopilot is for people who already know how to trade options: what each leg buys or sells, how much it can lose, what happens at expiration, margin and assignments. The program executes exactly what you enter, mistakes included. If you don't understand a step, don't activate the rule.

This section puts in order how to enter a rule with a signal and the most common mistakes. The numbers in the examples show how to enter it: they are not a recommendation and haven't been tested by ZeroTouch for your account.

1. Write the rule in one sentence before opening the wizard

For example: “I buy 1 AMD call 1 to 3 days to expiration, delta 0.50, when the day's low has held for 30 minutes, price has bounced 0.4% from that low and the day is below the open but by no more than 0.75%. I enter between 11:00 and 13:00. I close at 75% profit or 30% loss, otherwise at 15:45 on expiration day.” If you can't write it this completely, it isn't ready to be entered yet.

2. Structure and legs

Call or put, buy or sell: a long call is bullish and a long put is bearish. In a spread, step 3 says whether it's a credit or a debit and bullish or bearish: it has to match what you intended (a flipped sign in the width gives the opposite strategy). Strike by delta follows the price (0.50 = near the money). The minimum and maximum days to expiration (for example 1 to 3) pick the expiration closest to the middle of that range.

3. Time window and number of entries

'Open from' and 'Open until' are the window in which the signal can open. If the idea only holds at one moment of the day, the window has to be short: for an opening gap you look at at 9:45, set 'Open from' 09:45 and 'Open until' 09:50. With a long window, the signal can be met hours later for another reason and open something that wasn't your idea.

The bot opens once per enabled day. 'Maximum open positions' and 'Minimum days between entries' limit how often it enters. If you have a call rule and a put rule on the same stock, decide whether you want 'Do not open while an opposite position is open' (checked by default): checked, while one is open the other waits.

4. The signal: each condition, with its unit and its side

Unit. Each condition's name starts with its unit: 'Pullback ($)' asks for dollars and 'Pullback (%)' for a % of the day's high or low. The same number is not the same thing: 0.4 in (%) is about $0.88 on a $220 stock; 0.4 in ($) is 40 cents. To use the same rule on stocks of different prices, use (%).

Side. After choosing the type, check the comparison. For a call on a bounce off the low, every extreme condition has to say 'low' (not broken, pullback from the low); for a put at the high, 'high'. Mixing sides gives a signal that is almost never met or that enters the wrong way. When you change the type, the wizard keeps the side you had, but check it anyway.

Band. Two 'Change since today's open (%)' conditions with 'all conditions' make a band: '>= -0.75' and '< 0' = the day is below the open, but by no more than 0.75%. For the put, '> 0' and '<= 1'. Don't confuse it with 'Day change (%)', which is measured against the previous close and therefore includes the gap.

'All conditions' requires all of them at the same time; 'any of the conditions', any one. For a signal with confirmation it's almost always 'all'.

ConditionComparisonValue
Day's high/low not exceeded (min)Low30
Pullback (%) from the day's high/lowFrom the low0.4
Change since today's open (%)At or above-0.75
Change since today's open (%)Below0

That is how the example in point 1 is entered (it's the 'Fade of the day's low' prebuilt signal). For the put at the high: high, from the high, above 0 and at or below 1.

5. Exits

The profit % and the loss % are measured on what you paid (or received) when opening. With 1 to 3 day expirations, decide whether you want to hold overnight: 'Close at time' with 'Only on expiration day' keeps the position open on the previous days and closes it at that time on the day it expires; 'Every day' closes it each day. In a position where everything is bought, a stop of 100% or more doesn't act before expiration.

6. Capital

To start, fixed contracts: you know exactly how much goes in. With '% of capital' the quantity changes with the account value.

7. Read the whole summary and look at the preview

The summary states the rule in words and has to say the same as your sentence from point 1. That's where the typical mistakes show: 'call' where you meant 'put', 'from the high' where you meant 'from the low', dollars where you meant %, a stop different from what you intended. The preview builds the order it would send today with real prices and says whether the signal is met at that moment.

8. Test it on the paper account (DU)

Activate it first on an IBKR paper account (starts with DU). In the Log, the SIGNAL lines say what's missing for it to be met. OPENING alerts say what it bought or sold (“buy 1 call AMD 540 expiring …”), how much it paid or received and the maximum risk; CLOSE alerts give the result in dollars (PROFIT or LOSS) and the reason.

9. Several rules at once

Each rule is independent: with several active they can open on the same day and add up risk. Add up the maximum loss of all those that can be open at the same time and make sure your account can bear it. Use an IBKR account only for Autopilot (see “Your account: what the bot touches and what it doesn't”).

If you want to test an idea with data first

A combination can be tested with historical options data, for example on QuantConnect. It's best to set aside one period to build the rule and a later one to verify it: a rule fitted to a single period often doesn't repeat. A past result doesn't ensure the future.

9. What the bot does each day

With open positions or orders in progress it checks every 5 seconds (exits, rolls and orders), with real-time prices. With nothing open it checks every 30 seconds (entries).

It sends new orders between 09:35 and 15:55 New York time (on early-close days, until 5 minutes before the close). Exception: a profit-target or stop close goes out from 09:30, as soon as the market opens, on the same check in which it's met (if the position comes from the previous day, a strong open can be taken right away; with a FLEX stop, the stop waits until its time). At that time bid/ask spreads are often wide: if they exceed 30% of the mid price, the bot waits for them to normalize.

Each order is a single combo order with all the legs. It starts at the mid price and steps toward the natural price: an opening in 6 steps of 20 seconds (2 minutes); a close or roll in 4 steps of 10 seconds. Exception: a stop or trailing close starts at natural and goes to market after 5 seconds.

An opening never goes to market: if it doesn't fill at the natural price, it's abandoned and retried on the next enabled day. A close or roll that doesn't fill at the natural price goes to market (in under a minute). From 15:55 to 15:58 every close (stop, time, days, Close now) goes straight to market, and a limit close that is still unfilled switches to market; from 15:58 nothing is sent. On early-close days: 5 and 2 minutes before that close.

On expiration day, a position made only of bought legs, all at least 2% out of the money and with no buyer (bid 0 or 0.01), is not closed by stop, time or days: it is left to expire worthless (closing it would only cost commission and there is no possible assignment). In the Log: 'SE DEJA VENCER …' (left to expire).

There are never two live orders at the same time for the same thing. Orders are day orders: at the close the ones still live are cancelled; a pending close or roll continues the next day.

If an order partially fills, the filled part is recorded as a position and the order continues with the rest.

If IBKR rejects an order (margin, permissions, etc.), the reason is recorded in the Log exactly as IBKR gives it.

10. Execution timing: what to expect

This section explains, for each situation, when the bot finds out and how long execution can take. Read it before using Autopilot with real money.

SituationWhen the bot detects itHow it sends the orderHow long it can take
Entry (between 'Open from' and 'Open until')On the first check from that time: up to 30 s later (5 s if positions are already open). If it couldn't open, as soon as it can, until 'Open until'Limit at mid price stepping toward natural in 6 steps of 20 sUp to about 2 minutes. If it doesn't fill, it doesn't open that day (never at market)
Entry with a signalOn the check in which the signal is met, within the time window (check every 5 s while waiting for it)Same as any openingPrice conditions (breakout, change, VWAP, average, price): up to 5 s. RSI and crosses: at the bar close + up to 5 s. Plus up to about 2 minutes of order
Profit targetOn the next check (every 5 s), from 09:30Limit stepping toward natural in 4 steps of 10 s and, if not filled, at marketUsually under 1 minute
Loss stop2 checks in a row (about 5 s), from 09:30 (with a FLEX stop, from its time)Limit at natural (bid) and, if not filled in 5 s, at marketAbout 5 s of confirmation + 5 to 10 s of order
Trailing (options)2 checks in a row (about 5 s) once activated; on the first one if it already dropped twice your %Limit at natural (bid) and, if not filled in 5 s, at marketUp to 5 s of confirmation + 5 to 10 s of order
Close at days to expirationOn the first check of that daySame as the profit targetUnder 1 minute
Time exit (Close at time)On that time's check (within 5 s)Same as the profit targetUnder 1 minute
RollOn the check after it's metA single order; 4 steps of 10 s and then at marketUnder 1 minute. If IBKR rejects it, it's retried the next day
Assignment or exerciseWhen IBKR shows the shares (usually the next business day)Shares at market (per the step 8 option)At the market open
From 15:55 to 15:58—Opens nothing; closes go straight to marketSeconds
After 15:58—Sends no ordersWhatever wasn't closed by the rule reaches expiration
In option rules, the bot doesn't leave profit-target, stop or trailing orders resting at IBKR in advance (in stock rules it does: see «Stock rules»): it sends them when it detects the condition is met. So in very fast moves: the fill price may differ from your rule's level (slippage); a spike shorter than one check, or that reverses before the order fills, may not be captured; and a limit order, especially an opening, may not fill. This happens to any system that doesn't have the order sent beforehand, and even with the order sent it often doesn't fill.

The stop and the trailing wait 2 checks in a row (about 5 seconds) so a stray quote doesn't take you out, and their order goes out at natural to fill right away. Even so, in a very fast drop the closing price can be worse than your rule's level.

Exits aren't evaluated while any leg has a bid/ask wider than 30% of its mid price (it sometimes happens at the open or in illiquid options): the bot waits until it normalizes.

Each open leg uses one IBKR real-time market data line. IBKR gives 100 lines by default: plenty for most, but keep it in mind with many 4-leg rules open at once.

The times in this table are the program's operating targets; they may vary slightly with your computer, your connection, the market data and IBKR's systems.

By strategy

StrategyWhat to keep in mind about timing
0DTE (single long option, vertical spreads)Price moves very fast: the seconds between the condition and the fill matter. If neither profit nor loss is hit and you didn't set a closing time, the position reaches the close and expires: use 'Close at time' (for example 15:45) or choose the step 8 option carefully
Credit spreads and iron condor (30–45 days)Exits are measured with 'Executable' (the cost to buy back). With wide bid/ask the bot waits; the stop doesn't trigger on a stray quote
PMCC and diagonalsRolls go in a single order. If IBKR rejects a roll, the position stays as it was and it's retried the next day
WheelShares from an assignment appear the next day; the covered call is sold on the check after they appear
SPX, NDX and XSP indexesThey settle in cash at expiration: no shares and no early assignment

11. The dashboard, rules and log

Dashboard: account value, open P&L, what was closed today (like IBKR's «Realized P&L», with the total since the first trade as a reference), active rules, open positions and today's closed ones. The Results tab shows the history: by day (with the cumulative) and by rule, for today, the week, the month or all. With the 'Close now' button you close the selected position (it asks for confirmation; the order starts at mid, moves toward natural and ends at market); that rule won't open again that day. If you close a position from TWS, the bot treats it as closed ('closed outside the bot') and sends no share orders. It updates every few seconds and instantly with each opening, close or roll; a rule you save or activate is picked up by the bot right away.

ColumnWhat it is
ResultWhat the trade made at the execution prices, before commissions. Open ones are valued at each leg's mid price. IBKR shows its «Unrealized P&L» with its own reference (mark) price and with commissions added to the cost: that's why it can differ by a few dollars; compare with the Net column
CommissionsAs reported by IBKR for that position's orders (opening, close and rolls). They arrive a few seconds after each execution: until then it shows «-»
NetResult minus commissions
Open priceThe net per unit at opening: positive = debit (you paid), negative = credit (you received)
AmountWhat you paid (debit) or received (credit) at opening, for all units
% P&LThe result over what was paid or received: it's the number the bot compares with your profit and loss %
TP / SLAt how many dollars of result it closes for profit and for loss, per the rule's %
Trailing'-' no trailing; 'waits for +100%' until it reaches the activate %; 'ON +72% → +55%' active: the highest profit it reached → the profit % where it closes
DTEDays to expiration of the leg that expires first (0 = expires today)

Results (since 0.6.4): at the top, how many closed, won and lost trades the period has. By rule: closed, won, lost, % won, losses by stop and by time/expiration, average win and loss in %, return % (net over what was paid or received) and net, sorted by net: so you see which rule earns most and which loses. The «Losses of the period» table shows each losing trade with open, close, duration, reason, % P&L, the most in favor and against while it was open and the underlying at entry and exit; double-click for the detail with the legs and the signal that opened it. «Export closed (CSV)» saves all of the period's trades to analyze them.

Rules: New rule, Edit, Duplicate, Activate / deactivate and Delete. When you select a rule you see it in words below and, if it has errors, which ones. Clicking the Name, Underlying or Status header sorts the list (again, reversed), and 'Hide inactive' hides inactive rules (those that still have open positions stay visible). The order and the checkbox are saved.

ActionWhat happens
DeactivateOpens no new positions, but the open ones keep being managed (exits and rolls) until they close
Edit with open positionsYou can change entry, exit, rolls and capital; not the legs, until they close
DeleteOnly a rule with no open positions
Pause (Settings)Doesn't open, close or manage; only checks the account and reports. Positions stay as they are

Log: everything the bot does (orders sent, repriced, filled, rejected, openings, closes, rolls, assignments, expirations, pauses and errors). It's also kept in %APPDATA%\ZeroTouchAutopilot\eventos.log and sent to ZeroTouch so we can see what happened if there's a problem.

12. Your account: what the bot touches and what it doesn't

The bot only manages the positions and orders it opened. Your own options, shares and orders are left alone.

If the account has more contracts of the same kind than the bot's, the extra ones are ignored and you're alerted once.

On an assignment of one of the bot's legs, only the change in shares that assignment produced is flattened, not the shares you already had.

On start, the bot cancels only its own pending orders.

13. Power, internet or restarts

While the computer is off, offline or the program is closed, the bot doesn't manage anything: positions stay at IBKR as they are, with no exits or stops.

When it's back, it reconnects, checks the account and continues. If an opening filled while the program was closed, it adopts it as a position; if something closed or expired in the meantime, it records it.

The ZeroTouch panel keeps the periods without signal during market hours: that shows whether the program was running.

If the program wasn't running at the close on the day legs expired (since 0.6.7): to know whether they expired in the money it uses that day's closing price from IBKR; if IBKR doesn't provide it, it goes by the account's shares (no new shares means they expired out of the money). It never uses the next day's price. If it asks you for a decision about shares, «apply» only works with the shares that actually changed in the account: it never buys or sells shares that aren't there.

Email alertWho sends itWhen
No connection to IBKR: the bot cannot manage your positionsThe program (0.6.7)More than 5 minutes without IB Gateway / TWS, or with IB Gateway disconnected from IBKR's servers, with open positions
URGENT: positions expire today and the bot has no connectionThe program (0.6.7)From 3:15 pm if it is still disconnected and legs expire that day
The program did not check for X minutes / was not running at the closeThe program (0.6.7)When it comes back after 5 minutes or more without running (computer asleep), or the next day if it wasn't running at the close with positions
Your Autopilot is not responding and has open positionsThe ZeroTouch server15 minutes without signals during market hours with open positions (computer off or asleep, no internet): the program can't alert, the server does
URGENT: your Autopilot is still not respondingThe ZeroTouch serverFrom 3:15 pm if there are still no signals
While Autopilot is open it asks Windows not to let the computer go to sleep on its own (the screen can still turn off). It doesn't prevent you from putting it to sleep manually, a laptop sleeping when you close the lid (in Settings → Power choose «Do nothing» when closing the lid) or Windows Update restarting it: set active hours so it doesn't restart during market hours.

14. License and plans

Autopilot is licensed by modules: options and stocks (long). Each module sets how many rules of its kind you can have active at once: 1, up to 5 or unlimited. The counter is on the Rules tab and on the Dashboard ('Active rules: options 3 of 5 · stocks 1 of 1').

With two modules, the most expensive one is full price and the other gets the additional-module discount. The discount you had when you signed up stays; discounts do not stack.

From My account you add a module or more rules (you pay the part for the days left in the period and it activates on payment) or remove a module or lower the rules (applies from the next renewal; on the annual plan, not mid-year). The program picks up the change on its own, without reinstalling.

The free trial lasts 30 days and is requested for the IBKR paper account (the one starting with DU) or for the real account. If you requested it for paper and set a real account (U…), the program doesn't start and explains how to continue: log in to IB Gateway with Paper Trading, enter the DU… account and port 4002 (or request the trial for the real account). Each IBKR account gets one trial. To continue after the 30 days, get a license with the same email and keep using the same rules.

If the license expires (after the grace period), the bot stays paused until payment is recorded.

15. Log alerts and errors

What you see in the LogWhat it meansWhat to do
TRAILING … active / new high / the rule changedThe option trailing activated, reached a new high or took the rule's new valuesNothing: it's informational. The closing point is in the line and in the Trailing column
This is a TRIAL version…The code is a trial and the account set is a real one (U…)Log in to IB Gateway with Paper Trading, enter the DU… account and port 4002; for the real account, get a license
NO CONTRACTNo contract meets the rule today (expiration, delta or quote)Check days and delta in the preview; retried on the next day
NO WINGThe wing strike isn't quoted, not even within the extra strikesRaise 'extra strikes' or use another width
NO BID/ASKSome leg has no bid/ask at that momentNothing: retried on the next enabled day
NO CAPITALNot even one unit fits with the chosen % of capitalRaise the % or use fixed contracts
NOT FILLEDThe opening didn't fill even at the natural priceNothing: retried on the next enabled day
Order rejected by IBKRIBKR didn't accept the order (margin, permissions, data)Read the reason and check it at IBKR
ROLL NOT DONEThe roll couldn't be doneThe position stays as it was; retried tomorrow
More active rules than your license allowsYou have more active rules than your plan allowsDeactivate one or upgrade the plan
SHARES … without an assignment of the bot'sShares that aren't the bot's changedNothing: the bot doesn't touch them
The bot is waiting for your decision: …The account's shares changed differently from what the bot's legs explainCheck at IBKR. If the account has no new shares, choose «leave it»; «apply» never trades shares that aren't there
Rule with crossed call/put: does not openThe name or the signal doesn't match the leg typeEdit the rule and fix the Type in step 2
No connection to IBKR / URGENTThe bot can't trade and there are open positionsCheck IB Gateway / TWS and internet, or close manually at IBKR
The program did not check for X minutesThe computer went to sleep, the internet dropped or IB Gateway frozeCheck the positions; set Windows so it never sleeps
Prices: … no complete price from IB (yellow on the panel)IBKR isn't sending bid and ask for that contract. Most common cause: the IBKR phone app, TWS or the Portal open with the bot's same username (while another session is open, IBKR cuts the bot's prices)Close that other session (Log out). If it lasts 2 minutes, the bot reconnects to IB on its own (like Stop / Start)
Data: IBKR did not answer the … barsIBKR didn't send that ticker's bars within 15 secondsNothing: that ticker's rules wait and they are requested again in 1 minute; the rest keeps going. If it repeats, check there's no other session open with the same username

16. Frequently asked questions

Does Autopilot guarantee profits?

No. It executes the rules you define; the outcome depends on the strategy, the parameters and the market.

Why didn't it open today?

Check the Log: it gives the reason (day or time outside the rule, maximum open positions until the 'Open until' time, 'every N days', moving-average filter, no contract, no bid/ask, not filled or rejected by IBKR).

Can I make it open only on a market condition (RSI, gap, VIX…)?

Yes: in step 5, 'Use an entry signal'. Pick a prebuilt signal or build your own; the rule opens the first time it's met within the time window. See «Entry signals».

Which delta do I use to buy the option closest to the money?

0.50 is the strike closest to the price (ATM). For one just in the money, 0.55. You can also use '% of price' at 0.

Can I change a rule that has open positions?

Yes: entry, exit, rolls and capital. Not the legs, until the positions close. The bot picks up the changes on the next check, without restarting.

Can I use Autopilot and trade manually in the same account?

Yes. The bot only touches its own. Avoid manually trading the same contracts the bot has open.

What happens at expiration with a long option that ended in the money?

IBKR exercises it automatically and shares appear the next day. With 'Close everything' the bot flattens them; with 'Only alert' they stay in the account. To keep it from getting there, set 'Close at time' in the exit.

I don't want to hold positions from one day to the next (overnight)

In the 'When to close' step, enter a time in 'Close at time' (for example 15:45) and choose 'every day (no overnight)'. At that time the bot closes whatever is still open from that rule, and opens nothing new that day.

17. Help

In the program's Log tab: 'Send log to support' for a problem or question, and 'Suggestion or bug' to tell us an idea or something the program did differently from what it says. It's sent with the program's log (account numbers are masked) and you follow it in My account, at zerotouchbots.com.