TL;DR
The BTC RSI strategy gained 1.85% in its January to December 2024 backtest, versus SPY's 25.30% and BTC holding's 119.27%. Its reported maximum drawdown was 25.82%, with $1,756.33 in recorded trading fees on a $10,000 start. It enters below RSI 30 and exits at RSI 55, using 95% of buying power. These viewed development dates and captured fills provide an example to inspect, not an unseen test.
Follow the example
Read this pair's entry and exit
Inspect the exact pair, indicator windows, position guard and allocation below. Weekly accumulation has a purchase cadence and no invented sale rule.
- Entry
- Saved rule: RSI(14, Day) < 30 AND position value = 0
- Exit
- Saved rule: RSI(14, Day) >= 55 AND position value > 0
- Allocation
- Saved rule: 95% of buying power per entry; sell 100% of held units on exit
- Pair
- Saved rule: BTC-USD
The full saved condition/action book with fractional units and an explicit Cryptocurrency target.
- BTC RSI mean reversion 2024-12-31, 21:00:00 UTC
- 10,185.24
- SPY buy and hold 2024-12-31, 21:00:00 UTC
- 12,530.29
- BTC buy and hold 2024-12-31, 21:00:00 UTC
- 21,926.92
Completed 2024 backtest
This saved algorithm completed a Day backtest from 2024-01-01 through 2024-12-31, with $10000.00 starting capital. The chart includes all 744 exported history points. Compare the strategy with SPY and BTC buy and hold. Each benchmark invests the full $10000.00 starting balance over the same 2024 period. SPY follows its trading sessions; BTC includes weekends. This algorithm follows its own allocation and entry/exit rules, with 0.7% of traded notional charged on each fill. Explore cash and position values to see how capital was deployed.
The exact stored history shown here, with its source's period, comparisons and limits. Opening the walkthrough does not rerun it.
Preview this strategy in Aurora
Review the provided strategy request without changing its pair or sizing. Ask for a draft preview before any saved candidate or paid test.
An inspectable candidate. New dates or a changed rule define another experiment, not the published result.
Choose a step to follow the example. Opening a request lets you review it; it does not submit a job or change your account.
The algorithm
Entry
RSI(14, Day) < 30 AND position value = 0
Exit
RSI(14, Day) >= 55 AND position value > 0
Allocation
95% of buying power per entry; sell 100% of held units on exit
Pair
BTC-USD
Execution
Market; fractional units enabled
Starting capital
$10,000; no additional deposits
Show the table · 6 rows, 2 columns
| Decision | Saved rule |
|---|---|
| Entry | RSI(14, Day) < 30 AND position value = 0 |
| Exit | RSI(14, Day) >= 55 AND position value > 0 |
| Allocation | 95% of buying power per entry; sell 100% of held units on exit |
| Pair | BTC-USD |
| Execution | Market; fractional units enabled |
| Starting capital | $10,000; no additional deposits |
No matching rows. Clear the filter to see all records.
Buy Bitcoin when 14-day RSI is below 30 and exit when RSI recovers to 55.
This example trades BTC-USD as a spot Cryptocurrency asset. The saved rules were read back and verified with automated trading off.
Create the same strategy
Ask Aurora to build the rules above, review the preview, then save the draft with automated trading off. Confirm the Cryptocurrency pair, allocation and entry and exit conditions in the saved rules.
In the native Strategies editor, use Buy and Sell actions with the same Cryptocurrency pair. Add the indicator and position-value conditions shown above. The weekly accumulation example uses a single Buy rule with a seven-day DaysSinceOrder condition.
Create, test and iterate in Aurora
Read the optional iteration outline
Start this worked example in the NexusTrade app. Review the filled-in request, open it in Aurora, then send it when ready. Continue in the same conversation through these steps.
Create the exact strategy
Ask: "Review BTC RSI mean reversion. Entry: RSI(14, Day) < 30 AND position value = 0. Exit: RSI(14, Day) >= 55 AND position value > 0. Show the resolved rules and selectors before saving." The request includes this example's complete draft.
Run the 2024 development comparison
Ask: "Backtest the saved rules from January 1 through December 31, 2024, daily, starting with $10,000. Keep the displayed fees and capture detailed events." Compare the strategy with SPY and BTC buy and hold. Use SPY as the backtest baseline and a separate BTC buy-and-hold backtest with matching dates and starting capital.
Explain what happened
Ask: "Explain one entry signal and its Filled orders using the recorded indicator values, comparisons, allocation, prices, quantity and fees. Then follow the largest drawdown through trades, cash and holdings."
Create one variant, then test unseen dates
Ask: "Change only the entry allocation from 95% to 75% of buying power. Show the rule diff and compare both candidates on the 2024 development period with every other setting fixed." After choosing, freeze the rules and select another test period you have not inspected. The displayed 2024 results already make 2024 a viewed development period. Keep any later revisions in a new research cycle.
Create and backtest with Python
Use the Python SDK route
Python SDK 1.42.0. Save the runner below as run_btc_rsi_reversion.py.
Install and download
python3 -m pip install nexustrade==1.42.0
export NEXUSTRADE_API_KEY="YOUR_API_KEY"
curl --fail --output btc_rsi_reversion.py https://nexustrade.io/seo/strategy-examples/btc-rsi-reversion.py
Create, test and inspect
from btc_rsi_reversion import create_btc_rsi_reversion, backtest_btc_rsi_reversion
book = create_btc_rsi_reversion()
completed = backtest_btc_rsi_reversion()
print(completed["result"])
Run
python3 run_btc_rsi_reversion.py
Python strategy and backtest functions
View complete Python SDK functions
The backtest function submits the 2024 test with SPY as its benchmark, records events and waits for the result. Use a new request key when changing rules, dates or fees.
import nexustrade as nt
def create_btc_rsi_reversion():
asset = nt.crypto_asset("BTC-USD")
return nt.portfolio(
"Public SEO crypto example - BTC RSI mean reversion",
[
nt.strategy(
"Enter BTC RSI mean reversion",
((nt.RSI(asset, 14, "Day") < nt.Value(30)) & (nt.PositionValue(asset) == nt.Value(0))),
nt.buy(asset, 95, "percent of buying power")
),
nt.strategy(
"Exit BTC RSI mean reversion",
((nt.RSI(asset, 14, "Day") >= nt.Value(55)) & (nt.PositionValue(asset) > nt.Value(0))),
nt.sell(asset, 100, "percent of current positions")
),
],
initial_value=10000,
supports_crypto=True,
supports_fractional_shares=True,
alerts_enabled=False,
dividend_policy='cash',
)
def backtest_btc_rsi_reversion(client=None):
client = client or nt.NexusTradeClient.from_environment()
operation = client.create_backtest(
nt.backtest(
create_btc_rsi_reversion(),
start_date="2024-01-01", end_date="2024-12-31",
interval="Day", baseline_symbol="SPY",
initial_value=10000, generate_events=True,
dividend_policy="cash",
fee_config={"Stock": {"type": "percent", "amount": 0.1},
"Cryptocurrency": {"type": "percent", "amount": 0.7},
"Option": {"type": "dollars", "amount": 0.65}},
),
idempotency_key="explore-btc-rsi-reversion-2024-spy-v1",
)
return client.wait_for_backtest(operation["id"])
# Build locally: book = create_btc_rsi_reversion()
# Run and inspect: completed = backtest_btc_rsi_reversion(); print(completed["result"])
Create and backtest with TypeScript
Use the TypeScript SDK route
TypeScript SDK 1.42.0. Save the runner below as run-btc-rsi-reversion.ts.
Install and download
npm install nexustrade@1.42.0
npm install --save-dev tsx
export NEXUSTRADE_API_KEY="YOUR_API_KEY"
curl --fail --output btc-rsi-reversion.ts https://nexustrade.io/seo/strategy-examples/btc-rsi-reversion.ts
Create, test and inspect
import { createBtcRsiReversion, backtestBtcRsiReversion } from "./btc-rsi-reversion";
async function main() {
const book = createBtcRsiReversion();
const completed = await backtestBtcRsiReversion();
console.log(completed.result);
}
main().catch((error: unknown) => {
console.error(error);
process.exitCode = 1;
});
Run
npx tsx run-btc-rsi-reversion.ts
TypeScript strategy and backtest functions
View complete TypeScript SDK functions
The same rules, dates and fees are used in both SDKs. The backtest function keeps its request key across retries.
import * as nt from "nexustrade";
export function createBtcRsiReversion() {
const asset = nt.cryptoAsset("BTC-USD");
return nt.portfolio(
"Public SEO crypto example - BTC RSI mean reversion",
[
nt.strategy(
"Enter BTC RSI mean reversion",
nt.and(nt.lt(nt.RSI(asset, 14, "Day"), nt.Value(30)), nt.eq(nt.PositionValue(asset), nt.Value(0))),
nt.buy(asset, 95, "percent of buying power")
),
nt.strategy(
"Exit BTC RSI mean reversion",
nt.and(nt.gte(nt.RSI(asset, 14, "Day"), nt.Value(55)), nt.gt(nt.PositionValue(asset), nt.Value(0))),
nt.sell(asset, 100, "percent of current positions")
),
],
{ initialValue: 10000, supportsCrypto: true, supportsFractionalShares: true, alertsEnabled: false, dividendPolicy: "cash" }
);
}
export async function backtestBtcRsiReversion(client = new nt.NexusTradeClient()) {
const operation = await client.createBacktest(
nt.backtest(createBtcRsiReversion(), {
startDate: "2024-01-01", endDate: "2024-12-31",
interval: "Day", baselineSymbol: "SPY",
initialValue: 10000, generateEvents: true,
dividendPolicy: "cash",
feeConfig: {
Stock: { type: "percent", amount: 0.1 },
Cryptocurrency: { type: "percent", amount: 0.7 },
Option: { type: "dollars", amount: 0.65 },
},
}),
{ idempotencyKey: "explore-btc-rsi-reversion-2024-spy-v1" }
);
if (typeof operation.id !== "string") throw new Error("Missing backtest ID");
return client.waitForBacktest(operation.id);
}
// Build locally: const book = createBtcRsiReversion();
// Run and inspect: const completed = await backtestBtcRsiReversion(); console.log(completed.result);
Completed 2024 backtest
- BTC RSI mean reversion 2024-12-31, 21:00:00 UTC
- 10,185.24
- SPY buy and hold 2024-12-31, 21:00:00 UTC
- 12,530.29
- BTC buy and hold 2024-12-31, 21:00:00 UTC
- 21,926.92
Show the table · 11 rows, 2 columns
Scroll sideways to compare all columns. Select a heading to sort.
| Status | COMPLETE |
| Backtest return | 1.85% |
| Reported maximum drawdown | 25.82% |
| SPY buy-and-hold return | 25.30% |
| BTC buy-and-hold return | 119.27% |
| Total recorded trading fees | $1756.33 |
| Engine closed-trade count | 29 |
| Starting capital | $10000.00 |
| Ending portfolio value | $10185.24 |
| Ending cash | $10120.41 |
| Ending position value | $64.82 |
No matching rows. Clear the filter to see all records.
This saved algorithm completed a Day backtest from 2024-01-01 through 2024-12-31, with $10000.00 starting capital. The chart includes all 744 exported history points.
Compare the strategy with SPY and BTC buy and hold. Each benchmark invests the full $10000.00 starting balance over the same 2024 period. SPY follows its trading sessions; BTC includes weekends. This algorithm follows its own allocation and entry/exit rules, with 0.7% of traded notional charged on each fill. Explore cash and position values to see how capital was deployed.
Inspect the recorded trades
2024-01-18T21:00:00.000Z
PairBTC-USD
SideBuy
Units0.2329625314444338
Submitted price$40779.09
Filled price$40779.09
Fee$66.50
2024-01-26T14:30:00.000Z
PairBTC-USD
SideSell
Units0.23133179372432278
Submitted price$41127.78
Filled price$41127.78
Fee$66.60
2024-01-26T21:00:00.000Z
PairBTC-USD
SideSell
Units0.0016307377201110196
Submitted price$41979.10
Filled price$41979.10
Fee$0.48
2024-03-19T13:30:00.000Z
PairBTC-USD
SideBuy
Units0.14870588624092418
Submitted price$63558.95
Filled price$63558.95
Fee$66.16
2024-03-25T13:30:00.000Z
PairBTC-USD
SideSell
Units0.1476649450372377
Submitted price$67046.90
Filled price$67046.90
Fee$69.30
2024-03-25T20:00:00.000Z
PairBTC-USD
SideSell
Units0.0010336546152606683
Submitted price$71160.50
Filled price$71160.50
Fee$0.51
2024-03-26T13:30:00.000Z
PairBTC-USD
SideSell
Units0.000007286588425805705
Submitted price$70730.99
Filled price$70730.99
Fee$0.00
2024-04-02T13:30:00.000Z
PairBTC-USD
SideBuy
Units0.15141574217494566
Submitted price$64849.37
Filled price$64849.37
Fee$68.73
Recorded rows in source order; spacing does not represent elapsed time.
Show the table · 8 rows, 7 columns
Scroll sideways to compare all columns. Select a heading to sort.
| 2024-01-18T21:00:00.000Z | BTC-USD | Buy | 0.2329625314444338 | $40779.09 | $40779.09 | $66.50 |
| 2024-01-26T14:30:00.000Z | BTC-USD | Sell | 0.23133179372432278 | $41127.78 | $41127.78 | $66.60 |
| 2024-01-26T21:00:00.000Z | BTC-USD | Sell | 0.0016307377201110196 | $41979.10 | $41979.10 | $0.48 |
| 2024-03-19T13:30:00.000Z | BTC-USD | Buy | 0.14870588624092418 | $63558.95 | $63558.95 | $66.16 |
| 2024-03-25T13:30:00.000Z | BTC-USD | Sell | 0.1476649450372377 | $67046.90 | $67046.90 | $69.30 |
| 2024-03-25T20:00:00.000Z | BTC-USD | Sell | 0.0010336546152606683 | $71160.50 | $71160.50 | $0.51 |
| 2024-03-26T13:30:00.000Z | BTC-USD | Sell | 0.000007286588425805705 | $70730.99 | $70730.99 | $0.00 |
| 2024-04-02T13:30:00.000Z | BTC-USD | Buy | 0.15141574217494566 | $64849.37 | $64849.37 | $68.73 |
No matching rows. Clear the filter to see all records.
Follow the Filled events by pair, side and time. Compare the submitted price, filled price, fractional quantity and fee. This table shows up to eight orders from the captured excerpt (42 Filled events).
For a percentage fee, multiply the traded notional by 0.007. To follow a position, start with a purchase and inspect subsequent sale quantities, remaining holdings and cash flows. For the weekly accumulation example, follow each purchase and the resulting position value.
Understand this entry with Aurora
BTC-USD 14 day RSI < constant
Left value29.9515<Right value30ResultTrueBTC-USD position value = constant
Left value0=Right value0ResultTrue
Show the table · 2 rows, 5 columns
Scroll sideways to compare all columns. Select a heading to sort.
| BTC-USD 14 day RSI < constant | 29.9515 | < | 30 | True |
| BTC-USD position value = constant | 0 | = | 0 | True |
No matching rows. Clear the filter to see all records.
At 2024-12-19T21:00:00.000Z, the recorded rule was: 14 Day BTC-USD RSI < Constant 30 and Position market value (BTC-USD) = Constant 0. Its overall result was true. Read the individual comparisons below, then ask Aurora to explain how they led to the action.
The signal requested 95 percent of buying power at a submitted price of 96,216.6016. 1 captured Filled order shares this timestamp; Aurora receives those fields with the signal.
Inspect the original signal record
View captured signal JSON
{
"eventType": "BuySignal",
"event": {
"eventType": "BuySignal",
"timestamp": "2024-12-19T21:00:00.000Z",
"signals": [
{
"conditionName": "14 Day BTC-USD RSI < Constant 30 and Position market value (BTC-USD) = Constant 0",
"audit": {
"type": "minimal",
"results": {
"0.1": {
"isTrue": true,
"lhsValue": 0,
"rhsValue": 0,
"lhsError": null,
"rhsError": null,
"comparison": "equal"
},
"0.0": {
"isTrue": true,
"lhsValue": 29.951496945960045,
"rhsValue": 30,
"lhsError": null,
"rhsError": null,
"comparison": "lessThan"
}
},
"failuresOnly": false
},
"isTrue": true,
"actionName": "Buy",
"actionMetadata": {
"buyOrSell": {
"targetAsset": {
"name": "BTC-USD",
"symbol": "BTC-USD",
"type": "Cryptocurrency",
"underlyingSymbol": null,
"optionType": null,
"expirationDate": null,
"strikePrice": null,
"multiplier": null
},
"allocation": {
"type": "percent of buying power",
"amount": 95
},
"price": 96216.6015625,
"orderType": "Market Order"
}
},
"orderExecution": {
"type": "Market"
}
}
]
},
"timestamp": 1734642000000
}Explore a drawdown period
Show the table · 2 rows, 4 columns
Scroll sideways to compare all columns. Select a heading to sort.
| 2024-04-15T13:30:00.000Z | $11130.79 | $471.77 | $10659.02 |
| 2024-08-05T13:30:00.000Z | $8257.30 | $446.91 | $7810.40 |
No matching rows. Clear the filter to see all records.
The largest decline between exported snapshots was 25.82%, from $11130.79 at 2024-04-15T13:30:00.000Z to $8257.30 at 2024-08-05T13:30:00.000Z. The reported maximum drawdown is 25.82%. Explore the trades and holdings around those dates.
Test another version
Change one rule or choose a different date range, then compare the resulting curve and trade events with this saved experiment. Explore which trades, fees and periods explain the difference.
No comments yet.