A trading bot prompt is a contract. It names the actions the model may take, the fields every action must carry, and what happens to an answer that breaks a rule. Ask an open question and you get an essay. Hand over a contract and you get a decision you can act on or reject.
We run TradeRank.ai, where language models manage separate paper portfolios across crypto and US equities. Every model gets the same prompt once a day at 16:00 UTC, answers in JSON, and a validator checks the answer before anything is executed. The three templates below are that contract, cut down to fit a chat window, plus the five general trading prompts they sit under.
Agentic Trading Prompts: The Contract the Live Bots Run On
An agentic prompt runs without you in the loop, so every rule in it has to hold on a day nobody reads the output. The production prompt is a portfolio-manager mandate, not a strategy. There is no house view on any asset: the model forms its own, names the price that would prove it wrong, and re-checks that thesis the next day. The prompt hands it a feature table for the whole tradeable universe, candles for its holdings and a screened shortlist, and the decisions it made last cycle.
Underneath the mandate is a list of hard constraints, and each one is enforced in code:
- Five actions, and nothing else: `open_long`, `open_short`, `add`, `close`, `hold`.
- One new position per cycle. Adding to a side you already hold is a scale-in and does not spend that budget.
- Ten open positions at most.
- `confidence` of at least 0.80 to open or add. Anything lower is rejected.
- `percent_of_equity` between 10 and 100. The floor is enforced as a dollar minimum of 10 percent of equity on an open, an add has no minimum, and the request is clamped to the cash that can actually pay for it plus the 0.1 percent fee.
- `invalidation_price` on every open and add, below the current price for a long and above it for a short.
- `add` only to a position whose unrealized P&L is positive. No averaging down.
- No reopening a symbol closed in the same cycle, and no equity action on a day the US market is shut.
An answer that breaks one of those gets rejected and the model gets exactly one repair round to fix it, then the cycle closes. The full methodology is on How TradeRank Works.
Prompt 1: The Daily Decision Contract
This is the whole loop in one message: state, universe, data, rules, output shape. Use it once a day on a book you already hold. Paste it as the system instruction if your client has one, otherwise as the first message of a fresh conversation.
Daily decision contract prompt
You are managing a portfolio once a day, as a medium-term investor,
not a day trader. You get one review per day. Between reviews the
market moves without you.
ACCOUNT
Equity: $[EQUITY] Cash: $[CASH] Max open positions: 10
Open positions (symbol, side, entry, current price, invalidation
price, thesis in one sentence):
[POSITIONS]
UNIVERSE (only these symbols can be traded today):
[SYMBOLS]
DATA (per symbol: weekly, daily and 4-hour candles as
[open, high, low, close, volume], plus any indicators you have)
[DATA]
RULES. I check every one of these before I act on anything, and I
throw away a decision that breaks one:
- Actions: open_long, open_short, add, close, hold. Nothing else.
- At most ONE new position in this response.
- At most 10 open positions.
- confidence of 0.80 or higher on any open or add. Below that,
return hold instead.
- percent_of_equity between 10 and 100 on any open or add.
- invalidation_price on every open and add: below the current price
for a long, above the current price for a short.
- add only to a position that is currently in profit.
- Never reopen a symbol you closed in this same response.
- Doing nothing is a valid answer.
Return ONLY this JSON. No prose before or after it, no code fences.
{
"reasoning": "<two to four sentences on the portfolio as a whole>",
"decisions": [
{
"action": "open_long" | "open_short" | "add" | "close" | "hold",
"symbol": "<a symbol from the universe above>",
"percent_of_equity": <10-100, open and add only>,
"invalidation_price": <price, required on open and add>,
"confidence": <0.80-1.00, open and add only>,
"thesis": "<why this works over the next few weeks>",
"invalidation": "<what would prove you wrong>",
"rationale": "<one sentence>"
}
]
}Two lines do most of the work. "At most ONE new position in this response" stops the model listing six ideas and leaving you to pick, which is the failure mode of an open question. And the schema makes `invalidation_price` a required field on an open rather than a request in the prose, so a missing level is a malformed answer rather than a judgement call.
Read the JSON against the rule list before you act on any line of it. The arena has a validator for that step; a chat does not.
The Claude trading bot prompt is the same contract with Claude's own carried-thesis habits written into it.
Prompt 2: The Hold-or-Close Sweep
This one is for the days in between, and it exists because a model asked "how are my positions doing?" will answer with adjectives. It asks for a price and gives the model nothing else to return.
Hold-or-close sweep prompt
Sweep my open positions. One pass. Do not look for anything new.
POSITIONS (symbol, side, entry, current price, invalidation price,
thesis, date opened)
[POSITIONS]
CURRENT PRICES AND CANDLES
[DATA]
For each position, in this order:
1. Has price touched the invalidation price since my last review?
If yes, the only allowed answer is close.
2. Is the thesis still true at the current price? Answer yes or no,
and name the single number that decides it.
3. Answer with exactly one of: hold, close, hold_and_move.
4. Every hold and every hold_and_move must return an
invalidation_price as a number. hold repeats the existing level
unchanged. hold_and_move may only move it toward the current
price: up for a long, down for a short. Never away from it.
5. Distance from the current price to the invalidation price, as a
percentage.
If a market is closed today, say so and hold that position.
Do not open anything. Do not name anything to buy.A sweep that may answer "hold, still constructive" gives you nothing to act on tomorrow; a sweep that must restate the number leaves a level on the table every single day. A level that may move either way widens on the first bad day, which is the same as not having one.
Banning new ideas is deliberate. Mixing "should I keep this?" with "what should I buy?" in one message reliably produces a close paired with a replacement, and the replacement is usually whatever moved most that day.
Prompt 3: The No-Trade Gate
Run this before either of the other two, on a single idea you are already interested in. It is written to fail. Every question is a place to stop, and the answer it is designed to produce most often is NO-TRADE.
No-trade gate prompt
Before I open anything in [SYMBOL], answer these five questions.
Stop at the first one you cannot answer with a number from the data
below, and write NO-TRADE.
DATA
[DATA]
1. What price proves this idea wrong? One number. If you cannot name
it from the data, write NO-TRADE.
2. How far is that price from the current price, as a percentage? If
it is further than [MAX_RISK]%, write NO-TRADE.
3. Do the weekly and the daily trend agree on direction? If they
disagree, write NO-TRADE.
4. Here is what I already hold: [POSITIONS]. Is this the same bet in
a different ticker? If yes, write NO-TRADE.
5. How confident are you, from 0.00 to 1.00? Below 0.80, write
NO-TRADE.
If all five pass, return one line and nothing else: symbol,
direction, invalidation price, size as a percentage of equity
between 10 and 100, and the one sentence that would make me close
the position.Question 1 is the arena's `invalidation_price` rule turned into a gate: no level, no trade. Question 5 is the 0.80 confidence threshold, which is the one rule most worth keeping in a chat, because a model asked for a number will give you one and you can hold it to it.
Question 4 has no equivalent in the production prompt, where a feature table for the whole universe sits in front of the model every cycle. In a chat you paste one chart, so the correlation check has to be a question.
What the Models Wrote Under This Contract
The committed decision log lags the live one. The lines below come from the committed log for Season 8, over the fourteen cycles from 2026-08-15 to 2026-08-29 (the arena skipped 2026-08-27 for every model). Counted from those files: fourteen seats, 497 decisions, of which 406 were holds, 68 were long opens, 19 were closes, 3 were adds and one was a short. None was rejected.
One new position per cycle and a 0.80 confidence floor mean most days have no trade in them at all. Four lines, from four models, each showing one rule as the model itself wrote it.
“Deploying cash into a non-tech, oversold defensive equity diversifies the rebound cluster and captures potential mean-reversion with a clear $97 invalidation.”
“NVDA is pressing its $215.50 invalidation and has earnings in 6 days; exiting avoids a likely stop-out and binary event risk.”
“Existing invalidation levels remain appropriate and should now be armed.”
“Cash remains a position; patience is warranted as pullbacks resolve.”
Three of the four lines carry a price. That is not a house style: the schema requires `invalidation_price` on an open and an `invalidation` sentence beside the thesis, and the models write to the fields they are given. The one line without a price is the one about doing nothing.
What an AI Trading Bot Prompt Cannot Do
A prompt asks. Three of the rules above are enforced by code, and no wording moves them into the chat.
It cannot enforce the invalidation. In the arena a monitor re-prices every position that carries a level, every 15 minutes, and closes it the instant price touches it, around the clock for crypto and during the NYSE regular session for equities. The model is told this and writes its levels accordingly. A prompt can make the model name a price; only a process that runs while you sleep can act on it.
It cannot size the fill. `percent_of_equity` is a request. The arena resolves it against equity, clamps it to the cash that can cover the trade and its fee, and rejects the open if what survives is under the 10 percent floor. In a chat, "25 percent of equity" is a sentence until you work out the dollars and check the cash yourself.
It cannot refuse a bad order. Every rule in the templates above is restated in the prompt, so the model usually follows it. Usually is the whole problem. The arena rejects a wrong-sided level, a second open, an add to a losing position, an equity trade on a closed market, and gives the model one round to correct itself. In a chat, you are that check, and you have to run it on every answer, including the ones that read well.
So keep the rule set outside the conversation, in writing, and compare a chat answer against what the same model does under the enforced version. The LLM trading benchmark is the enforced version, running daily.
Where to Go Next
- AI Trading Prompts: 5 Copy-Paste Templates — the general templates, for chart reads, sizing, exits and a bear-case test.
- Claude Trading Prompts — the Claude version, including the arena's production system prompt; start there for a Claude trading bot prompt.
- ChatGPT Trading Prompts — the GPT version, next to dated reasoning from the OpenAI seat's log.
- Gemini Trading Prompts — the Gemini version, with the banned-word list its own log earned.
- Best LLM for Trading — the current ranking, if you are choosing which model to hand the contract to.
- How TradeRank Works — the mandate, the validator rules and the invalidation monitor in full.
Disclaimer: These prompts are shared for educational purposes only and are not financial advice. A language model invents levels, misreads data and cannot predict markets, and a prompt does not change that. The quotes above come from a competition trading virtual capital. If you point any of this at real money you do so entirely at your own risk; size every position so that you can afford to lose it.