Skip to main content

Special Functions

Relative options

When running requests in the OPTION category, it is possible to access any neighboring datapoint option by strike and with the same or opposite type (call vs put). There is a special function to specify how to choose such a relative option.

Parameter

Type

Default Value

Description

strikeIntervals

number

0

positive or negative integer:

0 - same strike

+1 - option with the closest strike that is greater

-1 - option with the closest strike that is less

+n - n'th strike in the greater prices' direction

-n - n'th strike in the lower prices' direction

isOpposite

boolean

false

false call => call, put => put

true call => put, put => call

Example. Search for a tradeable vertical spread

A vertical spread is an options trading strategy that involves the simultaneous buying and selling of options of the same type (i.e., either puts or calls) and expiry, but at different strike prices. The vertical term comes from the strike prices' position. Traders will use a vertical spread when they expect a moderate move in the underlying asset's price. Vertical spreads are mainly directional plays and can be tailored to reflect the trader's view, bearish or bullish, on the underlying asset.

Consider, we want to find a two strikes wide vertical spread with both legs tradable and delta at around .45, where tradable stands for leg open interest being greater than 100. We want these spreads to be sorted by spread price, that is the first leg's price minus the second one's price. For that query, we would format the request as follows:

{
    "instrumentCategory": "OPTION",
    "datapoints": [
        {
            "expr": "underlying.price"
        },
        {
            "expr": "strikePrice"
        },
        {
            "name": "secondLegStrikePrice",
            "expr": "strikePrice(option(strikeIntervals=2))"
        },
        {
            "name": "spreadPrice",
            "expr": "price-price(option(strikeIntervals=2))"
        },
        {
            "expr": "greeks.delta"
        },
        {
            "expr": "openInterest"
        },
        {
            "name": "secondLegDelta",
            "expr": "greeks.delta(option(strikeIntervals=2))"
        },
        {
            "name": "secondLegOpenInterest",
            "expr": "openInterest(option(strikeIntervals=2))"
        }
    ],
    "filters": [
        {
            "datapoint": 4,
            "alternatives": [
                {
                    "predicate": "[]",
                    "args": [
                        "0.43",
                        "0.45"
                    ]
                }
            ]
        },
        {
            "datapoint": 6,
            "alternatives": [
                {
                    "predicate": "[]",
                    "args": [
                        "0.43",
                        "0.45"
                    ]
                }
            ]
        },
        {
            "datapoint": 5,
            "alternatives": [
                {
                    "predicate": ">",
                    "args": [
                        "100"
                    ]
                }
            ]
        },
        {
            "datapoint": 7,
            "alternatives": [
                {
                    "predicate": ">",
                    "args": [
                        "100"
                    ]
                }
            ]
        }
    ],
    "sorters": [
        {
            "datapoint": 3,
            "reversed": true
        }
    ],
    "options": {
        "snapshotSize": 100,
        "allAsOutputs": true
    }
}

And the result might look like:

symbol

underlying.price

strikePrice

secondLegStrikePrice

spreadPrice

greeks.delta

openInterest

secondLegDelta

secondLegOpenInterest

.SPY220617C476

464.7

476

478

0.65

0.446

389

0.431176

1241

.SPX220218C4710

4649.27

4710

4720

0.96

0.445457

235

0.434049

163

.QQQ220617C406

391.52

406

408

2.34

0.444805

508

0.432029

838

.SPXW220121C4700

4649.27

4700

4710

6.5

0.445454

786

0.430869

273

.SPX220121C4700

4649.27

4700

4710

8.09

0.444977

17749

0.430869

273

.TSLA240119C1900

1063.38

1900

1950

9.49

0.440436

1105

0.430127

827

.SPXW220218C4710

4649.27

4710

4720

33.36

0.445756

149

0.434049

163

Scanner results filtering by index constituent symbols

It's possible to narrow down the Scanner results to a list of symbols constituting a public index, like the S&P 500, Russel 2000, etc.

Use a special inList predicate to achieve such filtering. This predicate accepts one or many index names as arguments and narrows down the result set to the list of symbols from any index. For example, the following request returns only symbols that are part of the S&P 500, Russel 2000, or both indices:

{
  "instrumentCategory": "UNDERLYING",
  "datapoints": [
    {
      "expr": "symbol"
    }
  ],
  "filters": [
    {
      "datapoint": 0,
      "alternatives": [
        {
          "predicate": "inList",
          "args": ["SP500", "Russell2000"]
        }
      ]
    }
  ]
}

To retrieve a full list of supported indices, use the IPF request with ipf?help=lists. For a list of index constituent symbols, use IPF request with ipf?lists=LISTNAME syntax. For example, ipf?lists=SP500 returns symbols for the S&P 500 index constituents.

Note

Use demo/demo credentials to check IPF examples.

Crossover detection

Crossover function

A crossover is an event where an indicator and a price, or multiple indicators overlap and cross each other. In technical analysis, crossovers confirm patterns and trends, such as reversals and breakouts. The dxFeed Scanner supports crossover analysis for equities indicators with a special cross function. First, this function takes two parameters, either two indicators cross (ind1, ind2) or an indicator and a constant cross (ind1, c). Then, it returns the provided indicators’ latest crossover timestamp.

An example of a crossover function for alligator lips and linear regression technical indicators:

cross(
   ind1 = alligatorLips(candleCount=100, candlePeriod="1d", session="all"),
   ind2 = linearRegressionStatic(candleCount=100, candlePeriod="1d", session="all")
)

An example of a crossover function for alligator jaw and a constant:

cross(
   ind = alligatorJaw(candleCount=100, candlePeriod="1d", session="all"),
   c = 100.0
)

Defining crossover search depth

For most datapoints, crossover search depth is based on the candle count indicator parameter. However, not all indicators specify the search depth. For example, vwap indicator contains the optional parameter takeCount, which defines the search depth. The query results in an error if a parameter is required but not specified. Conversely, if you provide an unrequired parameter, it gets ignored. To check the exact requirements of a particular datapoint, please refer to the datapoints documentation, available at /docs/datapoints/ endpoint.

Use the lowest candleCount parameter available if they don't match.

An example of a crossover function with takeCount parameter specified:

cross(
  ind = vwap(candleCount=3, candlePeriod="1d", session="all"),
  c = 100.0,
  takeCount = 100
)