Skip to main content

Subscription to Formulas

How subscription to formulas works

A user-defined formula subscription needs to be represented by a symbol starting with the prefix '='. Several rules:

  • In case of symbol division at least one (or both) of components need to be enclosed in brackets.

  • Brackets are allowed.

  • Numeric division needs to be enclosed in brackets.

  • Use braces or backslash to escape the following special characters: ‘!’, ‘:’, ‘;’, ‘|’, ‘&’, ‘*’, ‘?’, ‘+’, ‘(‘, ‘)’, ‘{‘, ‘}’, ‘<‘, ‘>;’, ‘~’, ‘,’, ‘“‘, ‘’’, ‘`’.

  • Escape the input string, if it starts with a lower-case character (from ‘a’ to ‘z’).

For example:

=AAPL[+]GOOG

=3[*]IBM-MSFT

=[(]AAPL[)]/GOOG

=[(]AAPL[+]GOOG[)]/[(]MSFT[+]NFLX[)]

=1/3[*]AAPL

Limitations

There are some limitations to formula components:

  • Only the simple math operations are allowed ('+', '-', '*', '/').

  • Brackets can be used with both expressions and symbols.

  • Besides the raw symbol(s), a time-based CandlePeriod has to be specified (a time based candle record used in QD can also be used here; in short, this method allows the time period to be set either in the record (Trade.1min AAPL) or in the symbol (Candle AAPL{=m})). Defined below are all the possible CandleType values to build a proper CandlePeriod from:

    • CandleType.SECOND("s", 1000L), for example =AAPL+GOOG{=2s}

    • CandleType.MINUTE("m", 60 * 1000L), for example =AAPL+GOOG{=3m}

    • CandleType.HOUR("h", 60 * 60 * 1000L), for example =AAPL+GOOG{=h}

    • CandleType.DAY("d", 24 * 60 * 60 * 1000L), for example =AAPL+GOOG{=10d}

    • CandleType.WEEK("w", 7 * 24 * 60 * 60 * 1000L), for example =AAPL+GOOG{=w}

    • CandleType.MONTH("mo", 30 * 24 * 60 * 60 * 1000L), for example =AAPL+GOOG{=3mo}

    • CandleType.YEAR("y", 365 * 24 * 60 * 60 * 1000L), , for example =AAPL+GOOG{=y}

  • In cases when schedule-related symbol attributes (CandleSession, CandleAlignment) are used all symbol components must have the same schedule.

  • Spread symbols are not allowed in formulas.

Candle aggregation rules:

  • All formula components must have a candle during particular day. In other words, a candle will be built only if all symbol’s components have at least one valid trade event.

  • Сount, volume, vwap, bidVolume, askVolume, implVolatility, openInterest are excluded from computations due to their uselessness in math operations.

Examples

Candlewebservice

https://tools.dxfeed.com/candledata?records=Candle&symbols==[(]AAPL[%2B]GOOG[)]/2%7B=d%7D&start=20220501-000000-0000&stop=20220505-000000-0000

qds-tool

java -Ddxscheme.wide=true -jar lib/qds-tools.jar connect localhost:7368 Trade.1hour "=AAPL\+GOOG" 20191212 -c history

Output

=Trade.1hour    EventSymbol     Time                    Sequence   Count   Open        High        Low         Close       Volume  VWAP   BidVolume AskVolume   ImpVolatility
Trade.1hour     =AAPL+GOOG      20191216-150000+0100    0          NaN     1633.7      1635.0019   1629.42     1631.76     NaN     NaN    NaN       NaN         NaN             EventFlags=SNAPSHOT_BEGIN
Trade.1hour     =AAPL+GOOG      20191216-140000+0100    0          NaN     1633.85     1634.29     1624.7401   1632.3501   NaN     NaN    NaN       NaN         NaN
Trade.1hour     =AAPL+GOOG      20191216-130000+0100    0          NaN     1631.48     1632.4899   1631.23     1632.0999   NaN     NaN    NaN       NaN         NaN
Trade.1hour     =AAPL+GOOG      20191216-120000+0100    0          NaN     1631.93     1632.28     1631.85     1632.13     NaN     NaN    NaN       NaN         NaN
Trade.1hour     =AAPL+GOOG      20191214-010000+0100    0          NaN     1624.2199   1624.35     1624.15     1624.35     NaN     NaN    NaN       NaN         NaN
Trade.1hour     =AAPL+GOOG      20191214-000000+0100    0          NaN     1625.14     1625.15     1622.93     1622.9301   NaN     NaN    NaN       NaN         NaN
Trade.1hour     =AAPL+GOOG      20191213-230000+0100    0          NaN     1625.03     1625.19     1622.83     1622.99     NaN     NaN    NaN       NaN         NaN
Trade.1hour     =AAPL+GOOG      20191213-220000+0100    0          NaN     1623.1      1624.79     1621.04     1624.5999   NaN     NaN    NaN       NaN         NaN
Trade.1hour     =AAPL+GOOG      20191213-210000+0100    0          NaN     1625.4001   1627.1      1621.22     1623.09     NaN     NaN    NaN       NaN         NaN
Trade.1hour     =AAPL+GOOG      20191213-200000+0100    0          NaN     1624.5275   1625.95     1622.75     1625.035    NaN     NaN    NaN       NaN         NaN
Trade.1hour     =AAPL+GOOG      20191213-190000+0100    0          NaN     1624.65     1625.23     1622.69     1624.35     NaN     NaN    NaN       NaN         NaN
Trade.1hour     =AAPL+GOOG      20191213-180000+0100    0          NaN     1622.32     1625.98     1621.49     1624.7107   NaN     NaN    NaN       NaN         NaN
Trade.1hour     =AAPL+GOOG      20191213-170000+0100    0          NaN     1617.6      1624.8399   1616.46     1622.41     NaN     NaN    NaN       NaN         NaN
Trade.1hour     =AAPL+GOOG      20191213-160000+0100    0          NaN     1620.8139   1627.8931   1616.82     1618.0279   NaN     NaN    NaN       NaN         NaN
Trade.1hour     =AAPL+GOOG      20191213-150000+0100    0          NaN     1618.534    1622.35     1616.37     1620.39     NaN     NaN    NaN       NaN         NaN
Trade.1hour     =AAPL+GOOG      20191213-140000+0100    0          NaN     1623.79     1625.64     1622.0442   1625.21     NaN     NaN    NaN       NaN         NaN
Trade.1hour     =AAPL+GOOG      20191213-130000+0100    0          NaN     1627.08     1627.32     1622.2      1623        NaN     NaN    NaN       NaN         NaN
Trade.1hour     =AAPL+GOOG      20191213-120000+0100    0          NaN     1632.12     1632.33     1629.21     1629.39     NaN     NaN    NaN       NaN         NaN
Trade.1hour     =AAPL+GOOG      20191213-000000+0100    0          NaN     1622.31     1624.39     1622.31     1624.39     NaN     NaN    NaN       NaN         NaN
Trade.1hour     =AAPL+GOOG      20191212-230000+0100    0          NaN     1621.94     1623.7      1621.94     1623.5      NaN     NaN    NaN       NaN         NaN
Trade.1hour     =AAPL+GOOG      20191212-220000+0100    0          NaN     1621.73     1623.4      1621.42     1623.14     NaN     NaN    NaN       NaN         NaN
Trade.1hour     =AAPL+GOOG      20191212-210000+0100    0          NaN     1616.23     1625.7      1613.53     1620.76     NaN     NaN    NaN       NaN         NaN
Trade.1hour     =AAPL+GOOG      20191212-200000+0100    0          NaN     1616.394    1618.065    1609.74     1615.8471   NaN     NaN    NaN       NaN         NaN
Trade.1hour     =AAPL+GOOG      20191212-190000+0100    0          NaN     1615.79     1618.9456   1614.83     1616.46     NaN     NaN    NaN       NaN         NaN
Trade.1hour     =AAPL+GOOG      20191212-180000+0100    0          NaN     1615.04     1617.53     1610.43     1615.46     NaN     NaN    NaN       NaN         NaN
Trade.1hour     =AAPL+GOOG      20191212-170000+0100    0          NaN     1623.4602   1623.99     1611.92     1615.1155   NaN     NaN    NaN       NaN         NaN
Trade.1hour     =AAPL+GOOG      20191212-160000+0100    0          NaN     1623.49     1628.3349   1620.27     1623.13     NaN     NaN    NaN       NaN         NaN
Trade.1hour     =AAPL+GOOG      20191212-150000+0100    0          NaN     1612.99     1625.13     1610.98     1623.02     NaN     NaN    NaN       NaN         NaN
Trade.1hour     =AAPL+GOOG      20191212-140000+0100    0          NaN     1612.65     1614.68     1611.67     1612.31     NaN     NaN    NaN       NaN         NaN
Trade.1hour     =AAPL+GOOG      20191212-130000+0100    0          NaN     1619.19     1619.28     1617.26     1617.43     NaN     NaN    NaN       NaN         NaN
Trade.1hour     =AAPL+GOOG      20191212-120000+0100    0          NaN     1616.23     1616.88     1616.23     1616.62     NaN     NaN    NaN       NaN         NaN
Trade.1hour     =AAPL+GOOG      20191212-110000+0100    0          NaN     1617.13     1617.36     1616.23     1616.23     NaN     NaN    NaN       NaN         NaN
Trade.1hour     =AAPL+GOOG      20191212-100000+0100    0          NaN     1617.89     1617.97     1617.17     1617.38     NaN     NaN    NaN       NaN         NaN
Trade.1hour     =AAPL+GOOG      20191212-010000+0100    0          NaN     1617.48     1617.53     1617.18     1617.53     NaN     NaN    NaN       NaN         NaN
Trade.1hour     =AAPL+GOOG      20191212-000000+0100    0          NaN     NaN         NaN         NaN         NaN         NaN     NaN    NaN       NaN         NaN             EventFlags=REMOVE_EVENT,SNAPSHOT_END

dxfeed-api

There is a sample called com.dxfeed.acs.sample.SpreadSymbolSubscriptionSample located in acs-api:

public static void main(String[] args) throws InterruptedException {
   if (args.length < 2) {
      System.out.println("Usage: 'java -cp acs-api\\lib\\* com.dxfeed.acs.sample.SpreadSymbolSubscriptionSample " +
         "<endpointAddress> <symbol>'");
      System.out.println("   <address> - endpoint address");
      System.out.println("   <symbol>  - symbol to request");
      System.exit(0);
   }
   String endpointAddress = args[0];
   String symbol = args[1];
   DXEndpoint endpoint = DXEndpoint.create().connect(endpointAddress);
   DXFeed feed = endpoint.getFeed();
   CountDownLatch eventLatch = new CountDownLatch(1);
   long fromTime = Timing.GMT.today().day_start - 10 * TimeUtil.DAY;
   CandleSymbol candleSymbol = CandleSymbol.valueOf(
      symbol,
      CandlePeriod.DAY // specify time based candle period
   );
   DXFeedTimeSeriesSubscription<Candle> sub = feed.createTimeSeriesSubscription(Candle.class);
   sub.addEventListener(events -> {
      System.out.println("Received: " + events);
      eventLatch.countDown();
   });
   sub.setFromTime(fromTime);
   sub.setSymbols(candleSymbol);
   eventLatch.await(5, TimeUnit.SECONDS);
}

Input parameters

localhost:7368 =AAPL+GOOG

Output

Received: [Candle{=AAPL+GOOG{=d}, eventTime=0, eventFlags=0x4, time=20191216-010000.000, sequence=0, count=0, open=1633.5, high=1636.28, low=1629.65, close=1635.2201, volume=NaN, vwap=NaN, bidVolume=NaN, askVolume=NaN, impVolatility=NaN, openInterest=NaN},Candle{=AAPL+GOOG{=d}, eventTime=0, eventFlags=0x0, time=20191213-010000.000, sequence=0, count=0, open=1619.41, high=1628.3931, low=1614.8, close=1622.98, volume=NaN, vwap=NaN, bidVolume=NaN, askVolume=NaN, impVolatility=NaN, openInterest=NaN},Candle{=AAPL+GOOG{=d}, eventTime=0, eventFlags=0x0, time=20191212-010000.000, sequence=0, count=0, open=1613.72, high=1628.3349, low=1607.821, close=1621.73, volume=NaN, vwap=NaN, bidVolume=NaN, askVolume=NaN, impVolatility=NaN, openInterest=NaN},Candle{=AAPL+GOOG{=d}, eventTime=0, eventFlags=0x0, time=20191211-010000.000, sequence=0, count=0, open=1619.65, high=1622.3, low=1611.17, close=1615.79, volume=NaN, vwap=NaN, bidVolume=NaN, askVolume=NaN, impVolatility=NaN, openInterest=NaN},Candle{=AAPL+GOOG{=d}, eventTime=0, eventFlags=0x0, time=20191210-010000.000, sequence=0, count=0, open=1610.1, high=1620.045, low=1601.9, close=1613.14, volume=NaN, vwap=NaN, bidVolume=NaN, askVolume=NaN, impVolatility=NaN, openInterest=NaN},Candle{=AAPL+GOOG{=d}, eventTime=0, eventFlags=0x0, time=20191209-010000.000, sequence=0, count=0, open=1608.04, high=1630.25, low=1602.75, close=1610.48, volume=NaN, vwap=NaN, bidVolume=NaN, askVolume=NaN, impVolatility=NaN, openInterest=NaN},Candle{=AAPL+GOOG{=d}, eventTime=0, eventFlags=0x8, time=20191206-010000.000, sequence=0, count=0, open=1600.92, high=1615.0, low=1600.74, close=1611.33, volume=NaN, vwap=NaN, bidVolume=NaN, askVolume=NaN, impVolatility=NaN, openInterest=NaN}]

Input parameters

localhost:7368 =AAPL/(GOOG)

Output

Received: [Candle{=AAPL/(GOOG){=d}, eventTime=0, eventFlags=0x4, time=20191216-010000.000, sequence=0, count=0, open=0.204202, high=0.2052616, low=0.204202, close=0.2052616, volume=NaN, vwap=NaN, bidVolume=NaN, askVolume=NaN, impVolatility=NaN, openInterest=NaN},Candle{=AAPL/(GOOG){=d}, eventTime=0, eventFlags=0x0, time=20191213-010000.000, sequence=0, count=0, open=0.2013873, high=0.204143, low=0.2013873, close=0.204143, volume=NaN, vwap=NaN, bidVolume=NaN, askVolume=NaN, impVolatility=NaN, openInterest=NaN},Candle{=AAPL/(GOOG){=d}, eventTime=0, eventFlags=0x0, time=20191212-010000.000, sequence=0, count=0, open=0.1989539, high=0.2010413, low=0.1989539, close=0.2010413, volume=NaN, vwap=NaN, bidVolume=NaN, askVolume=NaN, impVolatility=NaN, openInterest=NaN},Candle{=AAPL/(GOOG){=d}, eventTime=0, eventFlags=0x0, time=20191211-010000.000, sequence=0, count=0, open=0.1989947, high=0.201313, low=0.1989947, close=0.201313, volume=NaN, vwap=NaN, bidVolume=NaN, askVolume=NaN, impVolatility=NaN, openInterest=NaN},Candle{=AAPL/(GOOG){=d}, eventTime=0, eventFlags=0x0, time=20191210-010000.000, sequence=0, count=0, open=0.2002236, high=0.2002236, low=0.198991, close=0.1996639, volume=NaN, vwap=NaN, bidVolume=NaN, askVolume=NaN, impVolatility=NaN, openInterest=NaN},Candle{=AAPL/(GOOG){=d}, eventTime=0, eventFlags=0x0, time=20191209-010000.000, sequence=0, count=0, open=0.2017877, high=0.2017877, low=0.1980132, close=0.1986662, volume=NaN, vwap=NaN, bidVolume=NaN, askVolume=NaN, impVolatility=NaN, openInterest=NaN},Candle{=AAPL/(GOOG){=d}, eventTime=0, eventFlags=0x8, time=20191206-010000.000, sequence=0, count=0, open=0.200594, high=0.201929, low=0.200459, close=0.201929, volume=NaN, vwap=NaN, bidVolume=NaN, askVolume=NaN, impVolatility=NaN, openInterest=NaN}]