# Crypto Signal Scanner: Breakout, MA Cross, Supertrend (`cryptoretirement/crypto-perp-technical-signal-scanner`) Actor

Scan the top Bybit USDT perpetuals in one run for Donchian breakouts, 50/200 golden and death crosses, Supertrend flips and volatility breakouts. Closed bars only, 15m to daily. No API keys.

- **URL**: https://apify.com/cryptoretirement/crypto-perp-technical-signal-scanner.md
- **Developed by:** [Craig Armstrong](https://apify.com/cryptoretirement) (community)
- **Categories:** Developer tools
- **Features:** Limited permissions
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 symbol scanneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Crypto Signal Scanner: Breakout, MA Cross, Supertrend

One run scans the **top Bybit USDT perpetuals by 24h turnover** (or your own list) and tells you which ones just fired a **Donchian breakout**, a **50/200 golden or death cross**, a **Supertrend flip** or a **volatility breakout**. Four classic checks, computed on closed bars only, on the 15-minute, 1-hour, 4-hour or daily timeframe. Built on Bybit's public market data. No API keys, no login.

Checking four indicators across dozens of charts by hand is slow, and screener sites rarely expose the result as data. This Actor returns one flat JSON row per symbol, for alert feeds, watchlists, dashboards, bots and AI agents.

### What you get

One row per symbol, symbols with the most signals first.

| Field | Example |
|---|---|
| `symbol`, `exchange`, `timeframe` | `SOLUSDT`, `bybit`, `240` |
| `price`, `barTime` | Close and open time of the last closed bar |
| `turnover24hUsd` | `325411464` |
| `signals` | `["golden_cross", "vol_breakout_up"]`; empty when nothing fired |
| `signalCount` | `2` |
| `donchian` | `signal` (`up`, `down` or `null`), `barsAgo`, `channelHigh`, `channelLow` |
| `maCross` | `signal` (`golden`, `death` or `null`), `barsAgo`, `sma50`, `sma200`, `fastAboveSlow` |
| `supertrend` | `signal` (`up`, `down` or `null`), `barsAgo`, current `direction` and `level` |
| `volBreakout` | `signal` (`up`, `down` or `null`), `ratio`, `moveRecentPct` |
| `aboveSma200`, `atr14` | Trend side and 14-bar average true range |
| `snapshotTime` | When the run looked |

Possible values in `signals`: `donchian_breakout_up`, `donchian_breakout_down`, `golden_cross`, `death_cross`, `supertrend_flip_up`, `supertrend_flip_down`, `vol_breakout_up`, `vol_breakout_down`.

The key-value store record `SUMMARY` holds a count per signal type and any skipped symbols.

#### How the four signals are defined

- **Donchian breakout:** the bar closes above the highest high of the prior 30 bars and above the 200-bar simple moving average (`up`), or below the lowest low of the prior 30 bars and below the 200-bar average (`down`).
- **MA cross:** the 50-bar simple moving average crosses above the 200-bar average (`golden`) or below it (`death`).
- **Supertrend flip:** Supertrend with ATR length 10 and multiplier 3 changes direction on the bar.
- **Volatility breakout:** over the last 40 bars, realised volatility of the recent 20 is more than twice that of the earlier 20. The direction is the sign of the price move over the recent 20.

Donchian, MA cross and Supertrend are reported when they fired on one of the last `lookbackBars` closed bars, with `barsAgo` saying which (`0` = the latest closed bar). The volatility breakout is a state of the current 40-bar window.

### Input

| Field | Default | Notes |
|---|---|---|
| `symbols` | empty | Bybit USDT perpetuals to scan, up to 200. A bare coin name like `BTC` is read as `BTCUSDT`. Empty = the top `topN` by turnover |
| `topN` | `30` | 1 to 200. Used when `symbols` is empty |
| `timeframe` | `240` | `15`, `60`, `240` (minutes) or `D` |
| `lookbackBars` | `3` | 1 to 20 |
| `onlyWithSignals` | `false` | Return only symbols with at least one signal. Every scanned symbol is charged either way |
| `proxy` | Apify residential, AU | Bybit refuses US datacenter IPs, so the bars are fetched through this proxy |

### Typical uses

- **Signal alerts:** schedule once per bar (for example every 4 hours) with `onlyWithSignals: true` and `lookbackBars: 1`; connect the dataset to Slack, Telegram or a webhook with an Apify integration.
- **Watchlist triage:** scan the top 100 on the daily timeframe and sort by `signalCount`.
- **Agents and bots:** call it from an AI agent or MCP client; the output is JSON with stable field names.

### Notes and limits

- The bar still forming is ignored, so a signal never disappears after it is reported.
- A symbol needs about 205 closed bars of history on the chosen timeframe; newer listings are skipped and listed in `SUMMARY`.
- The universe is every Bybit USDT perpetual, which includes a few tokenised stock and commodity contracts.
- Prices are Bybit linear-perpetual prices. Indicator values on other exchanges differ slightly.
- Signals are indicator events. They are not trade recommendations and come with no performance claim.
- Data and analytics only, not financial advice.

### Cost

Pay per event, no subscription. You pay only for the symbols a run scans.

| Event | Price |
|---|---|
| Scan start, once per run | $0.005 |
| Symbol scanned | $0.001 |

The default scan of the top 30 costs $0.035. The top 200 costs about 20 cents.

### Run it from code

```bash
curl -X POST "https://api.apify.com/v2/acts/cryptoretirement~crypto-perp-technical-signal-scanner/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"topN":30,"timeframe":"240","onlyWithSignals":true}'
```

The response is the dataset as a JSON array. The API menu on this page has ready-made snippets for JavaScript, Python and MCP clients.

### More Actors for traders and bots

- [Crypto Session Box Levels & Liquidity Sweep Detector](https://apify.com/cryptoretirement/crypto-session-box-liquidity-sweep-detector): prior-day and session boxes, wick setups and liquidity sweeps.
- [Forex News Filter & Economic Calendar](https://apify.com/cryptoretirement/forex-news-filter-economic-calendar): this week's economic events and a high-impact news window check for bots.
- [Crypto Perp Funding Rate Scanner](https://apify.com/cryptoretirement/crypto-perp-funding-rate-scanner): funding rates, annualised yield and cross-exchange spreads on 5 exchanges.
- [Crypto Exchange New Listing Announcements](https://apify.com/cryptoretirement/crypto-exchange-new-listings): new coin and perpetual listings from 6 exchanges, with an alert flag.
- [Solana Token Rug Check + Coin Score](https://apify.com/cryptoretirement/solana-token-rug-check-and-score): rug gates, a honeypot sell test and a 0-100 score for any Solana token.
- [DEX Pool Health Score](https://apify.com/cryptoretirement/dex-pool-health-score): health and rug-risk score for any liquidity pool on 100+ networks.
- [YouTube Most Replayed Clip Finder](https://apify.com/cryptoretirement/youtube-most-replayed-clip-finder): the most replayed moments of any video as ready-to-cut clips.

# Actor input Schema

## `symbols` (type: `array`):

Bybit USDT perpetuals to scan, e.g. BTCUSDT (a bare coin name like BTC is read as BTCUSDT). Leave empty to scan the top perpetuals by 24h turnover. Up to 200.

## `topN` (type: `integer`):

Used when Symbols is empty.

## `timeframe` (type: `string`):

Bar size the signals are computed on.

## `lookbackBars` (type: `integer`):

1 = only signals on the latest closed bar. Each signal reports how many bars ago it fired.

## `onlyWithSignals` (type: `boolean`):

Every scanned symbol is charged, whether or not it is returned.

## `proxy` (type: `object`):

Bybit refuses US datacenter IPs (where Apify runs), so the price data is fetched through this proxy. Tested working: Apify residential proxy, country AU.

## Actor input object example

```json
{
  "topN": 30,
  "timeframe": "240",
  "lookbackBars": 3,
  "onlyWithSignals": false,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "AU"
  }
}
```

# Actor output Schema

## `results` (type: `string`):

One item per symbol: price, the list of signals fired, and the detail of each check (Donchian breakout, 50/200 MA cross, Supertrend, volatility breakout).

## `summary` (type: `string`):

snapshotTime, timeframe, symbols scanned, how many had signals, a count per signal type and any skipped symbols.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "AU"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("cryptoretirement/crypto-perp-technical-signal-scanner").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "AU",
    } }

# Run the Actor and wait for it to finish
run = client.actor("cryptoretirement/crypto-perp-technical-signal-scanner").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "AU"
  }
}' |
apify call cryptoretirement/crypto-perp-technical-signal-scanner --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cryptoretirement/crypto-perp-technical-signal-scanner"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/X5znkxEkMVBNi6cet/builds/Ww1UdtnXHUqsLaLJb/openapi.json
