Unusual Options Labels

A custom indicator created by James on TrendSpider. You can import this custom indicator into your TrendSpider account. Don't have TrendSpider? Create an account first, then import the custom indicator.

Chart featuring the Unusual Options Labels indicator

Source code

This indicator had been implemented by James in JavaScript on TrendSpider. Check out the developer documentation to learn more about JS on TrendSpider.

// This indicator was generated using AI. Please note that it has not passed any formal QA process.
// Use it for informational purposes only.

describe_indicator('Unusual Options Labels', 'price');

// Minimum cost basis to filter out small trades
const minimumCostBasis = input.number('Minimum Cost Basis', 100000, { min: 1, max: 5000000 });

async function fetchUnusualOptionsData() {
    try {
        // Fetch unusual options data
        const optionsData = await request.unusual_options(constants.ticker);
        if (!optionsData || optionsData.length === 0) {
            return {
                bullishSignals: Array(close.length).fill(null),
                bearishSignals: Array(close.length).fill(null),
                neutralSignals: Array(close.length).fill(null)
            }; // No data available
        }

        // Separate the trades by their tags (bullish, bearish, neutral) and cost basis range
        const bullishTrades = optionsData.filter(trade => trade.tags.includes('bullish') && trade.costBasis >= minimumCostBasis && trade.costBasis <= 5000000);
        const bearishTrades = optionsData.filter(trade => trade.tags.includes('bearish') && trade.costBasis >= minimumCostBasis && trade.costBasis <= 5000000);
        const neutralTrades = optionsData.filter(trade => trade.tags.includes('neutral') && trade.costBasis >= minimumCostBasis && trade.costBasis <= 5000000);

        // Land the signals onto the current candles
        const bullishSignals = land_points_onto_series(
            bullishTrades.map(item => item.timestamp),
            bullishTrades.map(() => 'Bullish'),
            time,
            'ge'
        );

        const bearishSignals = land_points_onto_series(
            bearishTrades.map(item => item.timestamp),
            bearishTrades.map(() => 'Bearish'),
            time,
            'ge'
        );

        const neutralSignals = land_points_onto_series(
            neutralTrades.map(item => item.timestamp),
            neutralTrades.map(() => 'Neutral'),
            time,
            'ge'
        );

        return { bullishSignals, bearishSignals, neutralSignals };

    } catch (error) {
        console.error("Error fetching or processing data:", error);
        return {
            bullishSignals: Array(close.length).fill(null),
            bearishSignals: Array(close.length).fill(null),
            neutralSignals: Array(close.length).fill(null)
        }; // Return empty series in case of error
    }
}

// Fetch the unusual options sentiment data
const { bullishSignals, bearishSignals, neutralSignals } = await fetchUnusualOptionsData();

// Paint the labels on the chart
paint(bullishSignals, {
    style: 'labels_above',
    color: 'green',
    backgroundColor: 'green',
    backgroundBorderRadius: 3,
    name: 'Bullish Signal'
});

paint(bearishSignals, {
    style: 'labels_below',
    color: 'red',
    backgroundColor: 'red',
    backgroundBorderRadius: 3,
    name: 'Bearish Signal'
});

paint(neutralSignals, {
    style: 'labels_above',
    color: 'gray',
    backgroundColor: 'gray',
    backgroundBorderRadius: 3,
    name: 'Neutral Signal'
});

// Register the signals for visual scripting
const buySignal = bullishSignals.map(signal => signal === 'Bullish');
const sellSignal = bearishSignals.map(signal => signal === 'Bearish');
const neutralSignal = neutralSignals.map(signal => signal === 'Neutral');

// Register for alerts or visual scripting usage
register_signal(buySignal, 'Bullish Unusual Options');
register_signal(sellSignal, 'Bearish Unusual Options');
register_signal(neutralSignal, 'Neutral Unusual Options');