Position Open and Close Signals
Position Open and Close Signals let you replace a strategy's normal entry and exit timing with an uploaded CSV of exact timestamps, so a Backtick run can be driven by signals from outside tradeSteward instead of by the position's own timing rules.
What this feature does
Every Backtick position normally opens and closes according to its own settings: an entry window, a target DTE or exit time, stop rules, and so on. Position Open and Close Signals bypass that timing and instead open and close positions at the exact timestamps you supply in a CSV file. This is a Backtick Premium feature.
Uploading a signals file is the only way to backtest a When Triggered strategy: a position whose entry window is set to trigger externally rather than on a schedule. Without signals attached, a backtest made up entirely of When Triggered positions is blocked from queueing with the message: "All positions in this backtest are When-Triggered but no position open/close signals are defined. Upload a signals file or change to a Bot Settings entry to run the backtest." Attaching signals satisfies that requirement, because the engine now has something to trigger on.
Where to find it
Look for Position Open and Close Signals in the Backtick Test Settings card, on both /backtick/manage and SweepTick (/backtick/sweeptick). The Manage position open and close signals link is disabled until you've added a position (a core position, on SweepTick) because the modal needs to know which position names exist in the backtick to validate the CSV against them.
The two CSV formats
The modal offers two accepted layouts, each with a downloadable starter template. Pick whichever matches the data you already have.
Format 1: By Position Open/Close
Use this when you want direct control over the exact timestamp that opens and closes each position. One row can open, close, or do both.
| Column | Required? | Notes |
|---|---|---|
Open Timestamp | Either this or Close Timestamp | When the row opens a position |
Open Quantity | Optional | Overrides quantity for this open |
Close Timestamp | Either this or Open Timestamp | When the row closes a position |
Close Quantity | Optional | Overrides quantity for this close |
Position Name | Optional | Blank applies the row to every position in the backtick; named targets one position |
Format 2: TradingView Signals
Use this when you already export signal rows from TradingView and want those opens and closes to drive the backtick directly.
| Column | Required? | Notes |
|---|---|---|
Trade # | Required | TradingView's trade number (also accepts "Trade number" / "Trade num") |
Date and time | Required | The signal's timestamp |
Signal | Required | Must be open or close (case-insensitive) |
Position size (qty) | Optional | Quantity for this row |
Position Name | Optional | Blank applies the row to every position in the backtick; named targets one position |
Timestamp rules
Both formats accept the same timestamp grammar:
- Date:
YYYY-MM-DD - Separator: a space or
Tbetween date and time - Time:
HH:MMorHH:MM:SSin 24-hour form, or 12-hour with anAM/PMmarker; seconds default to:00when omitted - Optional suffix:
Z,UTC,ET,EST, orEDT - A timestamp with no suffix is interpreted as US Eastern wall-clock time; the preview always shows times back in ET
- Every timestamp must fall inside regular trading hours, 9:30:01 AM to 4:14:59 PM ET. Anything outside that window is rejected
- A file is capped at 5,000 data rows
Examples that all parse correctly: 2026-03-10 09:35, 2026-03-10 09:35:00, 2026-03-10 9:35 AM, 2026-03-10 4:14:59pm EST, 2026-03-10T13:35:00Z.
Uploading and applying a file
- Drop or browse. Drag a
.csvfile onto the dropzone, or click to browse for one. The modal validates it immediately and reports the first error it finds: an unrecognized column set, a bad timestamp, an out-of-hours timestamp, an invalidSignalvalue, or too many rows. - Choose which signals to apply. Once the file parses, pick Use all signals, Only open signals, or Only close signals. This lets you import a file that has both opens and closes but apply just one side.
- Preview the normalized rows. The modal shows the first 10 rows exactly as they'll be stored, with timestamps normalized to a canonical form. If any row's
Position Namedoesn't match a position in the backtick, a warning lists the unmatched names. The upload isn't blocked, but that row won't apply to anything. - Apply Position Signals. This stages the normalized CSV on the backtick you're editing; it's written to the database the next time you save the backtick or click Create & Run, the same way the rest of your Test Settings are.
Once a file is applied, the settings card shows a summary of what's loaded, and the modal's Current import section confirms Position open and close signals are already loaded. Applying a new file replaces the current one. There's no merge.
Remove current signals is confirmation-guarded and takes effect right away. Unlike Apply, it doesn't wait for your next save. Removed signals can't be recovered; you'd need to re-upload the CSV.
Using signals with SweepTick
SweepTick accepts a signals file with one extra rule: every row's Position Name must be left blank. A SweepTick run clones your core position into many renamed iterations, so a name typed into the CSV can never match any of them. The modal and the server both reject a named row outright rather than letting it silently apply to nothing. A blank name already means "apply to every position," which is exactly what a sweep needs: the same signals drive every iteration.
This is what makes it possible to sweep a When Triggered strategy, which was previously blocked from SweepTick entirely.
If you build a sweep by seeding from an existing backtest or bot that already has signals attached, those signals carry over automatically only when both are true: you have Backtick Premium, and every row in the source file has a blank Position Name. Otherwise the signals are dropped, and the sweep's Settings removed for SweepTick notice lists them alongside anything else that didn't carry over.