Skip to content

Crypto Trading

Cryptocurrency screening strategies.

Note: This library supports 3,108 cryptocurrency fields for comprehensive market analysis. All field references in this guide use validated field names from the TradingView API.

Overview

Screen cryptocurrencies by market cap, volume, price movement, and technical indicators.

Basic Crypto Screening

Large Cap Crypto

typescript
import { CryptoScreener, CryptoField } from 'tradingview-screener';

const crypto = new CryptoScreener();

crypto
  .where(CryptoField.MARKET_CAP.gt(1_000_000_000))
  .where(CryptoField.VOLUME_24H_IN_USD.gte(100_000_000))
  .select(
    CryptoField.NAME,
    CryptoField.PRICE,
    CryptoField.CHANGE_PERCENT,
    CryptoField.MARKET_CAP,
    CryptoField.VOLUME_24H_IN_USD
  )
  .sortBy(CryptoField.MARKET_CAP, false);

const results = await crypto.get();
console.table(results.data);

Top Gainers & Losers

Biggest Gainers

typescript
crypto
  .where(CryptoField.MARKET_CAP.gt(100_000_000))
  .where(CryptoField.CHANGE_PERCENT.gt(10))
  .where(CryptoField.VOLUME_24H_IN_USD.gte(10_000_000))
  .sortBy(CryptoField.CHANGE_PERCENT, false)
  .setRange(0, 20);

Biggest Losers

typescript
crypto
  .where(CryptoField.MARKET_CAP.gt(100_000_000))
  .where(CryptoField.CHANGE_PERCENT.lt(-10))
  .where(CryptoField.VOLUME_24H_IN_USD.gte(10_000_000))
  .sortBy(CryptoField.CHANGE_PERCENT, true)
  .setRange(0, 20);

Volume Analysis

High Volume Breakouts

typescript
crypto
  .where(CryptoField.VOLUME_24H_IN_USD.gte(50_000_000))
  .where(CryptoField.CHANGE_PERCENT.gt(5))
  .where(CryptoField.MARKET_CAP.gt(500_000_000))
  .sortBy(CryptoField.VOLUME_24H_IN_USD, false);

Volume Surge

Coins with unusual volume:

typescript
async function volumeSurge() {
  const crypto = new CryptoScreener();

  crypto
    .where(CryptoField.VOLUME_24H_IN_USD.gte(10_000_000))
    .where(CryptoField.MARKET_CAP.gt(100_000_000))
    .select(
      CryptoField.NAME,
      CryptoField.PRICE,
      CryptoField.CHANGE_PERCENT,
      CryptoField.VOLUME_24H_IN_USD
    )
    .sortBy(CryptoField.VOLUME_24H_IN_USD, false);

  return await crypto.get();
}

Market Cap Categories

Mid-Cap Gems

typescript
crypto
  .where(CryptoField.MARKET_CAP.between(100_000_000, 1_000_000_000))
  .where(CryptoField.CHANGE_1W_PERCENT.gt(15))
  .where(CryptoField.VOLUME_24H_IN_USD.gte(5_000_000))
  .sortBy(CryptoField.CHANGE_1W_PERCENT, false);

Small-Cap High Risk

typescript
crypto
  .where(CryptoField.MARKET_CAP.between(10_000_000, 100_000_000))
  .where(CryptoField.VOLUME_24H_IN_USD.gte(1_000_000))
  .where(CryptoField.CHANGE_PERCENT.gt(20))
  .sortBy(CryptoField.CHANGE_PERCENT, false);

Momentum Strategies

Strong Uptrend

typescript
async function cryptoMomentum() {
  const crypto = new CryptoScreener();

  crypto
    .where(CryptoField.CHANGE_PERCENT.gt(3))
    .where(CryptoField.CHANGE_1W_PERCENT.gt(10))
    .where(CryptoField.CHANGE_1M_PERCENT.gt(20))
    .where(CryptoField.MARKET_CAP.gt(100_000_000))
    .where(CryptoField.VOLUME_24H_IN_USD.gte(10_000_000))
    .select(
      CryptoField.NAME,
      CryptoField.PRICE,
      CryptoField.CHANGE_PERCENT,
      CryptoField.CHANGE_1W_PERCENT,
      CryptoField.CHANGE_1M_PERCENT
    )
    .sortBy(CryptoField.CHANGE_1M_PERCENT, false);

  return await crypto.get();
}

Oversold/Overbought

Oversold Cryptos

Potential bounce candidates:

typescript
crypto
  .where(CryptoField.RELATIVE_STRENGTH_INDEX_14.lt(30))
  .where(CryptoField.MARKET_CAP.gt(100_000_000))
  .where(CryptoField.VOLUME_24H_IN_USD.gte(5_000_000))
  .sortBy(CryptoField.RELATIVE_STRENGTH_INDEX_14, true);

Overbought Warning

typescript
crypto
  .where(CryptoField.RELATIVE_STRENGTH_INDEX_14.gt(70))
  .where(CryptoField.MARKET_CAP.gt(500_000_000))
  .where(CryptoField.CHANGE_PERCENT.gt(5))
  .sortBy(CryptoField.RELATIVE_STRENGTH_INDEX_14, false);

Price Action Screening

Near All-Time Highs

typescript
crypto
  .where(CryptoField.PRICE.gte(CryptoField.ALL_TIME_HIGH.multiply(0.95)))
  .where(CryptoField.MARKET_CAP.gt(100_000_000))
  .where(CryptoField.VOLUME_24H_IN_USD.gte(10_000_000))
  .sortBy(CryptoField.CHANGE_PERCENT, false);

Recovering from Lows

typescript
crypto
  .where(CryptoField.PRICE.lte(CryptoField.WEEK_LOW_52.multiply(1.2)))
  .where(CryptoField.CHANGE_1W_PERCENT.gt(10))
  .where(CryptoField.MARKET_CAP.gt(50_000_000))
  .sortBy(CryptoField.CHANGE_1W_PERCENT, false);

DeFi Tokens

typescript
async function defiScreen() {
  const crypto = new CryptoScreener();

  crypto
    .where(CryptoField.SECTOR.eq('DeFi'))
    .where(CryptoField.MARKET_CAP.gt(50_000_000))
    .where(CryptoField.VOLUME_24H_IN_USD.gte(5_000_000))
    .select(
      CryptoField.NAME,
      CryptoField.PRICE,
      CryptoField.CHANGE_PERCENT,
      CryptoField.MARKET_CAP,
      CryptoField.VOLUME_24H_IN_USD
    )
    .sortBy(CryptoField.MARKET_CAP, false);

  return await crypto.get();
}

Live Crypto Monitor

Real-time crypto tracking:

typescript
async function liveCryptoMonitor() {
  const crypto = new CryptoScreener();

  crypto
    .where(CryptoField.MARKET_CAP.gt(1_000_000_000))
    .select(
      CryptoField.NAME,
      CryptoField.PRICE,
      CryptoField.CHANGE_PERCENT,
      CryptoField.VOLUME_24H_IN_USD
    )
    .sortBy(CryptoField.MARKET_CAP, false)
    .setRange(0, 15);

  for await (const data of crypto.stream({ interval: 30000 })) {
    if (data) {
      console.clear();
      console.log('=== Live Crypto Prices ===');
      console.log(`Updated: ${new Date().toLocaleTimeString()}\n`);

      data.data.forEach((coin, i) => {
        const emoji = coin.change_abs > 5 ? '🚀' :
                      coin.change_abs > 0 ? '📈' :
                      coin.change_abs > -5 ? '📉' : '💥';

        const change = coin.change_abs > 0 ? `+${coin.change_abs}%` : `${coin.change_abs}%`;
        const volume = (coin.volume_24h / 1e6).toFixed(1);

        console.log(
          `${emoji} ${(i + 1).toString().padStart(2)}. ` +
          `${coin.name.padEnd(20)} ` +
          `$${coin.close.toFixed(2).padStart(10)} ` +
          `${change.padStart(8)} ` +
          `Vol: $${volume}M`
        );
      });
    }
  }
}

Volatility Screening

High Volatility

typescript
crypto
  .where(CryptoField.VOLATILITY_MONTH.gt(0.5))
  .where(CryptoField.MARKET_CAP.gt(100_000_000))
  .where(CryptoField.VOLUME_24H_IN_USD.gte(10_000_000))
  .sortBy(CryptoField.VOLATILITY_MONTH, false);

Low Volatility (Stablecoins excluded)

typescript
crypto
  .where(CryptoField.VOLATILITY_MONTH.lt(0.2))
  .where(CryptoField.MARKET_CAP.gt(500_000_000))
  .where(CryptoField.SECTOR.ne('Stablecoin'))
  .sortBy(CryptoField.VOLATILITY_MONTH, true);

Multi-Timeframe Analysis

typescript
async function multiTimeframeAnalysis() {
  const crypto = new CryptoScreener();

  crypto
    .where(CryptoField.MARKET_CAP.gt(100_000_000))
    .select(
      CryptoField.NAME,
      CryptoField.PRICE,
      CryptoField.CHANGE_PERCENT,
      CryptoField.CHANGE_1W_PERCENT,
      CryptoField.CHANGE_1M_PERCENT
    )
    .sortBy(CryptoField.CHANGE_1M_PERCENT, false);

  const results = await crypto.get();

  // Find consistent performers across all timeframes
  const consistent = results.data.filter(coin =>
    coin.change_percent > 0 &&
    coin.change_1w_percent > 0 &&
    coin.change_1m_percent > 0
  );

  return {
    all: results.data,
    consistent,
  };
}

Crypto Alert System

typescript
async function cryptoAlerts(thresholds: {
  gainAlert: number;
  lossAlert: number;
}) {
  const crypto = new CryptoScreener();

  crypto
    .where(CryptoField.MARKET_CAP.gt(100_000_000))
    .select(
      CryptoField.NAME,
      CryptoField.PRICE,
      CryptoField.CHANGE_PERCENT,
      CryptoField.VOLUME_24H_IN_USD
    );

  for await (const data of crypto.stream({ interval: 60000 })) {
    if (data) {
      const bigMovers = data.data.filter(
        coin => Math.abs(coin.change_abs) >= thresholds.gainAlert
      );

      if (bigMovers.length > 0) {
        console.log(`\n🚨 ALERT ${new Date().toLocaleTimeString()}`);

        bigMovers.forEach(coin => {
          const direction = coin.change_abs > 0 ? '📈 UP' : '📉 DOWN';
          console.log(
            `${direction}: ${coin.name} ` +
            `${coin.change_abs > 0 ? '+' : ''}${coin.change_abs.toFixed(2)}% ` +
            `@ $${coin.close.toFixed(2)}`
          );
        });
      }
    }
  }
}

// Usage: Alert on 10%+ moves
await cryptoAlerts({ gainAlert: 10, lossAlert: 10 });

Portfolio Tracker

typescript
async function trackCryptoPortfolio(holdings: Record<string, number>) {
  const symbols = Object.keys(holdings);
  const crypto = new CryptoScreener();

  crypto
    .where(CryptoField.SYMBOL.isin(symbols))
    .select(
      CryptoField.NAME,
      CryptoField.PRICE,
      CryptoField.CHANGE_PERCENT,
      CryptoField.MARKET_CAP
    );

  for await (const data of crypto.stream({ interval: 60000 })) {
    if (data) {
      console.clear();
      console.log('=== Crypto Portfolio ===');
      console.log(`Updated: ${new Date().toLocaleTimeString()}\n`);

      let totalValue = 0;
      let totalChange = 0;

      data.data.forEach(coin => {
        const amount = holdings[coin.symbol];
        const value = coin.close * amount;
        const dayPnL = value * (coin.change_abs / 100);

        totalValue += value;
        totalChange += dayPnL;

        console.log(
          `${coin.name.padEnd(15)} ` +
          `${amount.toString().padStart(8)} @ $${coin.close.toFixed(2).padStart(10)} ` +
          `= $${value.toFixed(2).padStart(12)} ` +
          `(${coin.change_abs > 0 ? '+' : ''}${coin.change_abs.toFixed(2)}%)`
        );
      });

      console.log('\n' + '='.repeat(70));
      console.log(
        `Total Value: $${totalValue.toFixed(2)} ` +
        `Day P/L: ${totalChange > 0 ? '+' : ''}$${totalChange.toFixed(2)} ` +
        `(${(totalChange / totalValue * 100).toFixed(2)}%)`
      );
    }
  }
}

// Usage
await trackCryptoPortfolio({
  'BTC': 0.5,
  'ETH': 5.0,
  'SOL': 100,
});

Best Practices

  1. High Volatility: Expect large price swings
  2. 24/7 Market: No trading hours, continuous monitoring
  3. Liquidity: Check 24h volume before trading
  4. Market Cap: Larger caps are generally safer
  5. Stop Losses: Essential due to volatility
  6. Diversification: Don't overconcentrate

Next Steps

Released under the MIT License.