Explore more topics
NexusTrade guide

Build and backtest ETH 12/26 EMA regime

Use faster exponential averages to define an Ethereum trend regime.

As of 2026-10-10

Jump to a section

TL;DR

The ETH 12/26 EMA rule lost 17.05% in its 2024 backtest, with 54.12% maximum drawdown. It enters with 95% of buying power when the shorter average exceeds the longer one and returns to cash when that state ends. Crypto fills cost 0.7% of notional. The displayed holding comparisons are SPY and BTC. Inspect actual trades and preserve the original result before testing a separate variant.

Completed 2024 backtest

ETH 12/26 EMA regime: completed 2024 backtest with SPY and BTC buy and hold25.3K7K2024-01-012024-12-31
ETH 12/26 EMA regime 2024-12-31, 21:00:00 UTC
8,294.97
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
ETH 12/26 EMA regimeSPY buy and holdBTC buy and holdHistorical simulation
Show the table · 11 rows, 2 columns

Scroll sideways to compare all columns. Select a heading to sort.

StatusCOMPLETE
Backtest return-17.05%
Reported maximum drawdown54.12%
SPY buy-and-hold return25.30%
BTC buy-and-hold return119.27%
Total recorded trading fees$1680.65
Engine closed-trade count28
Starting capital$10000.00
Ending portfolio value$8294.97
Ending cash$8294.97
Ending position value$0.00

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.

Follow the example

Step 1 of 3

Read this pair's entry and exit

Read this pair’s entry condition, purchase amount and exit in the saved rules below.

Entry
Saved rule: EMA(12, Day) > EMA(26, Day) AND position value = 0
Exit
Saved rule: EMA(12, Day) <= EMA(26, Day) AND position value > 0
Allocation
Saved rule: 95% of buying power per entry; sell 100% of held units on exit
Pair
Saved rule: ETH-USD
What you should see

The plain-language purpose matches the saved rules below. Keep the rule, purchase size and exit together when creating your version.

ETH 12/26 EMA regime: completed 2024 backtest with SPY and BTC buy and hold25.3K7K2024-01-012024-12-31
ETH 12/26 EMA regime 2024-12-31, 21:00:00 UTC
8,294.97
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
ETH 12/26 EMA regimeSPY buy and holdBTC buy and holdHistorical simulation
Completed 2024 historical simulation. The plotted observations and comparison series are preserved.
Step 2 of 3

Completed 2024 backtest

Explore the completed 2024 simulation shown near the top. Compare its recorded return and drawdown with the plotted benchmarks, then follow the captured fills. The original history, fees and execution assumptions remain available.

What you should see

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: authored process map
Authored task map. It describes what to inspect; it is not an account screenshot or a measured result.
Step 3 of 3

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.

What you should see

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.

Inspect the recorded trades

  1. Jan 01, 2024

    Pair

    ETH-USD

    Side

    Buy

    Units (rounded)

    4.12681033

    Submitted price

    $2302.02

    Filled price

    $2302.02

    Fee

    $66.50

  2. Jan 04, 2024

    Pair

    ETH-USD

    Side

    Sell

    Units (rounded)

    4.09792266

    Submitted price

    $2238.17

    Filled price

    $2238.17

    Fee

    $64.20

  3. Jan 04, 2024

    Pair

    ETH-USD

    Side

    Sell

    Units (rounded)

    0.02888767

    Submitted price

    $2278.08

    Filled price

    $2278.08

    Fee

    $0.46

  4. Jan 10, 2024

    Pair

    ETH-USD

    Side

    Buy

    Units (rounded)

    3.81189322

    Submitted price

    $2394.13

    Filled price

    $2394.13

    Fee

    $63.88

  5. Jan 22, 2024

    Pair

    ETH-USD

    Side

    Sell

    Units (rounded)

    3.78520997

    Submitted price

    $2336.33

    Filled price

    $2336.33

    Fee

    $61.90

  6. Jan 23, 2024

    Pair

    ETH-USD

    Side

    Sell

    Units (rounded)

    0.02668325

    Submitted price

    $2190.11

    Filled price

    $2190.11

    Fee

    $0.41

  7. Feb 06, 2024

    Pair

    ETH-USD

    Side

    Buy

    Units (rounded)

    3.68756775

    Submitted price

    $2384.57

    Filled price

    $2384.57

    Fee

    $61.55

  8. Mar 18, 2024

    Pair

    ETH-USD

    Side

    Sell

    Units (rounded)

    3.66175477

    Submitted price

    $3565.98

    Filled price

    $3565.98

    Fee

    $91.40

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.

Jan 01, 2024ETH-USDBuy4.12681033$2302.02$2302.02$66.50
Jan 04, 2024ETH-USDSell4.09792266$2238.17$2238.17$64.20
Jan 04, 2024ETH-USDSell0.02888767$2278.08$2278.08$0.46
Jan 10, 2024ETH-USDBuy3.81189322$2394.13$2394.13$63.88
Jan 22, 2024ETH-USDSell3.78520997$2336.33$2336.33$61.90
Jan 23, 2024ETH-USDSell0.02668325$2190.11$2190.11$0.41
Feb 06, 2024ETH-USDBuy3.68756775$2384.57$2384.57$61.55
Mar 18, 2024ETH-USDSell3.66175477$3565.98$3565.98$91.40

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 (41 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.

The algorithm

  1. Entry

    EMA(12, Day) > EMA(26, Day) AND position value = 0

  2. Exit

    EMA(12, Day) <= EMA(26, Day) AND position value > 0

  3. Allocation

    95% of buying power per entry; sell 100% of held units on exit

  4. Pair

    ETH-USD

  5. Execution

    Market; fractional units enabled

  6. Starting capital

    $10,000; no additional deposits

Show the table · 6 rows, 2 columns
DecisionSaved rule
EntryEMA(12, Day) > EMA(26, Day) AND position value = 0
ExitEMA(12, Day) <= EMA(26, Day) AND position value > 0
Allocation95% of buying power per entry; sell 100% of held units on exit
PairETH-USD
ExecutionMarket; fractional units enabled
Starting capital$10,000; no additional deposits

This example trades ETH-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.

Plan a separate variant and later test

Review the optional next experiment

After reviewing the recorded example, use the prepared request above for the original rules. This optional plan covers a separate variant and a later test.

  1. 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 instead of Aurora

Python SDK 1.42.0. Save the runner below as run_eth_ema_regime.py.

Install and download

Shell
python3 -m pip install nexustrade==1.42.0
export NEXUSTRADE_API_KEY="YOUR_API_KEY"
curl --fail --output eth_ema_regime.py https://nexustrade.io/seo/strategy-examples/eth-ema-regime.py

Create, test and inspect

Python
from eth_ema_regime import create_eth_ema_regime, backtest_eth_ema_regime

book = create_eth_ema_regime()
completed = backtest_eth_ema_regime()
print(completed["result"])

Run

Shell
python3 run_eth_ema_regime.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.

Python
import nexustrade as nt


def create_eth_ema_regime():
    asset = nt.crypto_asset("ETH-USD")
    return nt.portfolio(
        "Public SEO crypto example - ETH 12/26 EMA regime",
        [
            nt.strategy(
                "Enter ETH 12/26 EMA regime",
                ((nt.EMA(asset, 12, "Day") > nt.EMA(asset, 26, "Day")) & (nt.PositionValue(asset) == nt.Value(0))),
                nt.buy(asset, 95, "percent of buying power")
            ),
            nt.strategy(
                "Exit ETH 12/26 EMA regime",
                ((nt.EMA(asset, 12, "Day") <= nt.EMA(asset, 26, "Day")) & (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_eth_ema_regime(client=None):
    client = client or nt.NexusTradeClient.from_environment()
    operation = client.create_backtest(
        nt.backtest(
            create_eth_ema_regime(),
            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-eth-ema-regime-2024-spy-v1",
    )
    return client.wait_for_backtest(operation["id"])


# Build locally: book = create_eth_ema_regime()
# Run and inspect: completed = backtest_eth_ema_regime(); print(completed["result"])

Create and backtest with TypeScript

Use the TypeScript SDK instead of Aurora

TypeScript SDK 1.42.0. Save the runner below as run-eth-ema-regime.ts.

Install and download

Shell
npm install nexustrade@1.42.0
npm install --save-dev tsx
export NEXUSTRADE_API_KEY="YOUR_API_KEY"
curl --fail --output eth-ema-regime.ts https://nexustrade.io/seo/strategy-examples/eth-ema-regime.ts

Create, test and inspect

TypeScript
import { createEthEmaRegime, backtestEthEmaRegime } from "./eth-ema-regime";

async function main() {
  const book = createEthEmaRegime();
  const completed = await backtestEthEmaRegime();
  console.log(completed.result);
}

main().catch((error: unknown) => {
  console.error(error);
  process.exitCode = 1;
});

Run

Shell
npx tsx run-eth-ema-regime.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.

TypeScript
import * as nt from "nexustrade";

export function createEthEmaRegime() {
  const asset = nt.cryptoAsset("ETH-USD");
  return nt.portfolio(
    "Public SEO crypto example - ETH 12/26 EMA regime",
    [
      nt.strategy(
          "Enter ETH 12/26 EMA regime",
          nt.and(
              nt.gt(nt.EMA(asset, 12, "Day"), nt.EMA(asset, 26, "Day")),
              nt.eq(nt.PositionValue(asset), nt.Value(0))
          ),
          nt.buy(asset, 95, "percent of buying power")
      ),
      nt.strategy(
          "Exit ETH 12/26 EMA regime",
          nt.and(
              nt.lte(nt.EMA(asset, 12, "Day"), nt.EMA(asset, 26, "Day")),
              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 backtestEthEmaRegime(client = new nt.NexusTradeClient()) {
  const operation = await client.createBacktest(
    nt.backtest(createEthEmaRegime(), {
      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-eth-ema-regime-2024-spy-v1" }
  );
  if (typeof operation.id !== "string") throw new Error("Missing backtest ID");
  return client.waitForBacktest(operation.id);
}

// Build locally: const book = createEthEmaRegime();
// Run and inspect: const completed = await backtestEthEmaRegime(); console.log(completed.result);

Understand this entry with Aurora

  1. ETH-USD 12 day EMA > ETH-USD 26 day EMA

    Left value2,575.7114>Right value2,554.3853ResultTrue
  2. ETH-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.

ETH-USD 12 day EMA > ETH-USD 26 day EMA2,575.7114>2,554.3853True
ETH-USD position value = constant0=0True

At 2024-11-07T14:30:00.000Z, the recorded rule was: 12 Day ETH-USD EMA > 26 Day ETH-USD EMA and Position market value (ETH-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 2,817.71. 1 captured Filled order shares this timestamp; Aurora receives those fields with the signal.

Inspect the original signal record

View captured signal JSON
JSON
{
  "eventType": "BuySignal",
  "event": {
    "eventType": "BuySignal",
    "timestamp": "2024-11-07T14:30:00.000Z",
    "signals": [
      {
        "conditionName": "12 Day ETH-USD EMA > 26 Day ETH-USD EMA and Position market value (ETH-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": 2575.711390978228,
              "rhsValue": 2554.385281777304,
              "lhsError": null,
              "rhsError": null,
              "comparison": "greaterThan"
            }
          },
          "failuresOnly": false
        },
        "isTrue": true,
        "actionName": "Buy",
        "actionMetadata": {
          "buyOrSell": {
            "targetAsset": {
              "name": "ETH-USD",
              "symbol": "ETH-USD",
              "type": "Cryptocurrency",
              "underlyingSymbol": null,
              "optionType": null,
              "expirationDate": null,
              "strikePrice": null,
              "multiplier": null
            },
            "allocation": {
              "type": "percent of buying power",
              "amount": 95
            },
            "price": 2817.7099609375,
            "orderType": "Market Order"
          }
        },
        "orderExecution": {
          "type": "Market"
        }
      }
    ]
  },
  "timestamp": 1730989800000
}

Explore a drawdown period

Scale: 0 to 15.35K USD · zero baseline

Portfolio value

  • 2024-03-11T13:30:00.000Z$15346.30
  • 2024-11-07T14:30:00.000Z$7041.43

Scale: 0 to 401.25 USD · zero baseline

Cash

  • 2024-03-11T13:30:00.000Z$401.25
  • 2024-11-07T14:30:00.000Z$307.29

Scale: 0 to 14.95K USD · zero baseline

Position value

  • 2024-03-11T13:30:00.000Z$14945.05
  • 2024-11-07T14:30:00.000Z$6734.14
Show the table · 2 rows, 4 columns

Scroll sideways to compare all columns. Select a heading to sort.

2024-03-11T13:30:00.000Z$15346.30$401.25$14945.05
2024-11-07T14:30:00.000Z$7041.43$307.29$6734.14

Follow the decline from Mar 11, 2024 to Nov 07, 2024. The table retains the recorded portfolio, cash and position values. The engine reported maximum drawdown of 54.12%.

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.

Exact captured fill fields

  1. 2024-01-01T14:30:00.000Z

    Pair

    ETH-USD

    Side

    Buy

    Units

    4.126810331534147

    Submitted price

    $2302.02

    Filled price

    $2302.02

    Fee

    $66.50

  2. 2024-01-04T14:30:00.000Z

    Pair

    ETH-USD

    Side

    Sell

    Units

    4.097922659213407

    Submitted price

    $2238.17

    Filled price

    $2238.17

    Fee

    $64.20

  3. 2024-01-04T21:00:00.000Z

    Pair

    ETH-USD

    Side

    Sell

    Units

    0.028887672320739632

    Submitted price

    $2278.08

    Filled price

    $2278.08

    Fee

    $0.46

  4. 2024-01-10T14:30:00.000Z

    Pair

    ETH-USD

    Side

    Buy

    Units

    3.811893222968371

    Submitted price

    $2394.13

    Filled price

    $2394.13

    Fee

    $63.88

  5. 2024-01-22T21:00:00.000Z

    Pair

    ETH-USD

    Side

    Sell

    Units

    3.7852099704075926

    Submitted price

    $2336.33

    Filled price

    $2336.33

    Fee

    $61.90

  6. 2024-01-23T14:30:00.000Z

    Pair

    ETH-USD

    Side

    Sell

    Units

    0.026683252560778303

    Submitted price

    $2190.11

    Filled price

    $2190.11

    Fee

    $0.41

  7. 2024-02-06T21:00:00.000Z

    Pair

    ETH-USD

    Side

    Buy

    Units

    3.6875677464586283

    Submitted price

    $2384.57

    Filled price

    $2384.57

    Fee

    $61.55

  8. 2024-03-18T13:30:00.000Z

    Pair

    ETH-USD

    Side

    Sell

    Units

    3.6617547722334183

    Submitted price

    $3565.98

    Filled price

    $3565.98

    Fee

    $91.40

Recorded rows in source order; spacing does not represent elapsed time.

Inspect full UTC times and exact fractional quantities

Scroll sideways to compare all columns. Select a heading to sort.

2024-01-01T14:30:00.000ZETH-USDBuy4.126810331534147$2302.02$2302.02$66.50
2024-01-04T14:30:00.000ZETH-USDSell4.097922659213407$2238.17$2238.17$64.20
2024-01-04T21:00:00.000ZETH-USDSell0.028887672320739632$2278.08$2278.08$0.46
2024-01-10T14:30:00.000ZETH-USDBuy3.811893222968371$2394.13$2394.13$63.88
2024-01-22T21:00:00.000ZETH-USDSell3.7852099704075926$2336.33$2336.33$61.90
2024-01-23T14:30:00.000ZETH-USDSell0.026683252560778303$2190.11$2190.11$0.41
2024-02-06T21:00:00.000ZETH-USDBuy3.6875677464586283$2384.57$2384.57$61.55
2024-03-18T13:30:00.000ZETH-USDSell3.6617547722334183$3565.98$3565.98$91.40

Exact drawdown measurement

Read the exact snapshot timestamps and measurement comparison

The largest decline between exported snapshots was 54.12%, from $15346.30 at 2024-03-11T13:30:00.000Z to $7041.43 at 2024-11-07T14:30:00.000Z. The reported maximum drawdown is 54.12%. Explore the trades and holdings around those dates.

Continue exploring

Discussion

Sign in or create a free account to join the discussion.

No comments yet.

Aurora · AI research assistant

Try this in Aurora

Edit the request, then open it in Aurora. You choose when to send it.