# Crypto

This section contains 7 examples for Crypto using the `onetick-py`.<br />
\\\\
Each example is a self-contained script that can be run against the OneTick Cloud sample databases.

```default
# onetick-py WebAPI configuration for OneTick Cloud
import os
os.environ['OTP_WEBAPI'] = '1'
os.environ['OTP_HTTP_ADDRESS'] = 'https://rest.cloud.onetick.com'
os.environ['OTP_ACCESS_TOKEN_URL'] = 'https://cloud-auth.parent.onetick.com/realms/OMD/protocol/openid-connect/token'
os.environ['OTP_CLIENT_ID'] = '__FILL_IN__'
os.environ['OTP_CLIENT_SECRET'] = '__FILL_IN__'
```

## Crypto Trade Retrieval

Retrieving Trades from a Crypto Venue.<br />
\\\\
Unlike Equities and Futures, the Trade Size on a crypto venue is fractional.

```ipython3
import onetick.py as otp

data = otp.DataSource(db='BINANCE', tick_type='TRD')
data = data.limit(1000)
result = otp.run(data,
                 start=otp.dt(2026, 7, 28),
                 end=otp.dt(2026, 7, 29),
                 timezone='UTC',
                 symbols='BTCUSD')
result
```

```myst-ansi
                          Time                  EXCH_TIME     PRICE     SIZE  \
0   2026-07-28 00:00:00.145371 2026-07-28 00:00:00.144160  63686.99  0.00008   
1   2026-07-28 00:00:04.350446 2026-07-28 00:00:04.349603  63687.03  0.00130   
2   2026-07-28 00:00:04.383817 2026-07-28 00:00:04.382689  63687.03  0.00158   
3   2026-07-28 00:00:04.517794 2026-07-28 00:00:04.516315  63687.04  0.00008   
4   2026-07-28 00:00:05.096039 2026-07-28 00:00:05.094642  63687.04  0.00008   
..                         ...                        ...       ...      ...   
995 2026-07-28 11:18:21.409880 2026-07-28 11:18:21.408894  63456.00  0.00008   
996 2026-07-28 11:18:21.409888 2026-07-28 11:18:21.408894  63472.87  0.00001   
997 2026-07-28 11:18:33.822821 2026-07-28 11:18:33.821948  63480.00  0.00008   
998 2026-07-28 11:18:45.583787 2026-07-28 11:18:45.582047  63468.01  0.00008   
999 2026-07-28 11:18:45.584726 2026-07-28 11:18:45.583657  63480.01  0.00072   

    TRADE_VENUE BUYER SELLER AGGRESSOR_SIDE TRADE_TYPE TRADE_PERIOD BOOK_TYPE  \
0       BINANCE                           B                       -         0   
1       BINANCE                           S                       -         0   
2       BINANCE                           S                       -         0   
3       BINANCE                           B                       -         0   
4       BINANCE                           B                       -         0   
..          ...   ...    ...            ...        ...          ...       ...   
995     BINANCE                           B                       -         0   
996     BINANCE                           B                       -         0   
997     BINANCE                           B                       -         0   
998     BINANCE                           B                       -         0   
999     BINANCE                           S                       -         0   

    TRADE_ID  OMDSEQ DELETED_TIME  TICK_STATUS  
0     606647       0   1970-01-01            0  
1     606648       0   1970-01-01            0  
2     606649       0   1970-01-01            0  
3     606650       0   1970-01-01            0  
4     606651       0   1970-01-01            0  
..       ...     ...          ...          ...  
995   607642       0   1970-01-01            0  
996   607643       1   1970-01-01            0  
997   607644       0   1970-01-01            0  
998   607645       0   1970-01-01            0  
999   607646       0   1970-01-01            0  

[1000 rows x 15 columns]
```

## Crypto Quote Retrieval

Retrieving Quotes from a Crypto Venue.<br />
\\\\
Unlike Equities and Futures, the Bid and Ask Sizes on a crypto venue are fractional.

```ipython3
import onetick.py as otp

data = otp.DataSource(db='BINANCE', tick_type='QTE')
data = data.limit(1000)
result = otp.run(data,
                 start=otp.dt(2026, 7, 28),
                 end=otp.dt(2026, 7, 29),
                 timezone='UTC',
                 symbols='BTCUSD')
result
```

```myst-ansi
                          Time  EXCH_TIME  BID_PRICE  BID_SIZE  ASK_PRICE  \
0   2026-07-28 00:00:00.005578 1970-01-01   63686.98   0.03223   63714.40   
1   2026-07-28 00:00:00.011008 1970-01-01   63686.98   0.03223   63686.99   
2   2026-07-28 00:00:00.141446 1970-01-01   63681.91   0.00099   63686.99   
3   2026-07-28 00:00:00.144103 1970-01-01   63682.16   0.03228   63686.99   
4   2026-07-28 00:00:00.145341 1970-01-01   63682.16   0.03228   63714.40   
..                         ...        ...        ...       ...        ...   
995 2026-07-28 00:11:57.949695 1970-01-01   63532.69   0.02221   63558.95   
996 2026-07-28 00:11:58.084374 1970-01-01   63532.69   0.02221   63566.55   
997 2026-07-28 00:11:58.370894 1970-01-01   63536.78   0.04423   63566.55   
998 2026-07-28 00:11:58.374133 1970-01-01   63536.95   0.02221   63566.55   
999 2026-07-28 00:11:58.419118 1970-01-01   63538.37   0.00099   63566.55   

     ASK_SIZE QUOTE_VENUE  OMDSEQ  
0     0.00319     BINANCE      18  
1     0.00008     BINANCE       0  
2     0.00008     BINANCE       1  
3     0.00008     BINANCE       1  
4     0.00319     BINANCE       0  
..        ...         ...     ...  
995   0.01555     BINANCE      14  
996   0.01555     BINANCE       0  
997   0.01555     BINANCE      48  
998   0.01555     BINANCE       3  
999   0.01555     BINANCE       3  

[1000 rows x 8 columns]
```

## Crypto Book Update Retrieval

Retrieving Book Updates from a Crypto Venue.<br />
\\\\
Book Updates are provided as an L2 dataset, providing updates to Price Levels.<br />
\\\\
Basic retrieval is useful for counting order book changes.<br />
\\\\
To reconstruct the order book, order book aggregations like [`ob_snapshot_wide()`](https://docs.pip.distribution.sol.onetick.com/api/source/ob_snapshot_wide.html.md#onetick.py.Source.ob_snapshot_wide) should be used.

```ipython3
import onetick.py as otp

data = otp.DataSource(db='BINANCE', tick_type='PRL')
data = data.limit(1000)
result = otp.run(data,
                 start=otp.dt(2026, 7, 28),
                 end=otp.dt(2026, 7, 29),
                 timezone='UTC',
                 symbols='BTCUSD')
result
```

```myst-ansi
                          Time                  EXCH_TIME  BUY_SELL_FLAG  \
0   2026-07-28 00:00:00.000000 1970-01-01 00:00:00.000000              0   
1   2026-07-28 00:00:00.000000 1970-01-01 00:00:00.000000              0   
2   2026-07-28 00:00:00.000000 1970-01-01 00:00:00.000000              0   
3   2026-07-28 00:00:00.000000 1970-01-01 00:00:00.000000              0   
4   2026-07-28 00:00:00.000000 1970-01-01 00:00:00.000000              0   
..                         ...                        ...            ...   
995 2026-07-28 00:01:06.071861 2026-07-28 00:01:06.071349              1   
996 2026-07-28 00:01:07.272235 2026-07-28 00:01:07.271454              0   
997 2026-07-28 00:01:07.272235 2026-07-28 00:01:07.271454              0   
998 2026-07-28 00:01:07.272235 2026-07-28 00:01:07.271454              0   
999 2026-07-28 00:01:07.272235 2026-07-28 00:01:07.271454              1   

        PRICE     SIZE RECORD_TYPE  TICK_STATUS DELETED_TIME  OMDSEQ  
0        0.00  0.00000           Z            0   1970-01-01   91088  
1    63686.98  0.03223           C            0   1970-01-01   91089  
2    63681.91  0.00099           C            0   1970-01-01   91090  
3    63680.47  0.04853           C            0   1970-01-01   91091  
4    63676.83  0.00022           C            0   1970-01-01   91092  
..        ...      ...         ...          ...          ...     ...  
995  63718.84  0.00000           R            0   1970-01-01       6  
996  63693.00  0.00000           R            0   1970-01-01       1  
997  63680.73  0.00000           R            0   1970-01-01       2  
998  63676.63  0.04785           R            0   1970-01-01       3  
999  63711.05  0.01457           R            0   1970-01-01       4  

[1000 rows x 9 columns]
```

## Crypto Book Snapshot Retrieval

Retrieving a Book Snapshot at a Specified Time from a Crypto Venue.<br />
\\\\
To reconstruct the order book, the [`ob_snapshot_wide()`](https://docs.pip.distribution.sol.onetick.com/api/source/ob_snapshot_wide.html.md#onetick.py.Source.ob_snapshot_wide) aggregation is used.<br />
\\\\
As this is a crypto book, the `size_max_fractional_digits` attribute is set, allowing the book
to be reconstructed with size stored with up to 9 fractional digits.<br />
\\\\
[`ob_snapshot_wide()`](https://docs.pip.distribution.sol.onetick.com/api/source/ob_snapshot_wide.html.md#onetick.py.Source.ob_snapshot_wide) returns the book with Bid and Ask on the same row.

```ipython3
import onetick.py as otp

data = otp.DataSource(db='BINANCE', tick_type='PRL')
data = data.ob_snapshot_wide(size_max_fractional_digits=9)
data = data[['BID_PRICE', 'BID_SIZE', 'ASK_PRICE', 'ASK_SIZE', 'LEVEL']]
result = otp.run(data,
                 start=otp.dt(2026, 7, 28, 12),
                 end=otp.dt(2026, 7, 28, 12),
                 timezone='UTC',
                 symbols='BTCUSD')
result
```

```myst-ansi
                   Time  BID_PRICE  BID_SIZE  ASK_PRICE  ASK_SIZE  LEVEL
0   2026-07-28 12:00:00   63372.00   0.00008   63392.01   0.00008      1
1   2026-07-28 12:00:00   63366.05   0.02220   63396.00   0.00008      2
2   2026-07-28 12:00:00   63366.04   0.00100   63396.88   0.00076      3
3   2026-07-28 12:00:00   63364.00   0.00008   63399.00   0.00008      4
4   2026-07-28 12:00:00   63362.46   0.04722   63399.40   0.04762      5
..                  ...        ...       ...        ...       ...    ...
229 2026-07-28 12:00:00   32000.00   0.51281        NaN   0.00000    230
230 2026-07-28 12:00:00   30000.00   0.13842        NaN   0.00000    231
231 2026-07-28 12:00:00   23600.02   0.04238        NaN   0.00000    232
232 2026-07-28 12:00:00   19389.02   0.10057        NaN   0.00000    233
233 2026-07-28 12:00:00   18785.00   0.00368        NaN   0.00000    234

[234 rows x 6 columns]
```

## Crypto Book Snapshot Retrieval with Accumulative Values

Retrieving a Book Snapshot at a Specified Time from a Crypto Venue, outputting Accumulative Depth.<br />
\\\\
To reconstruct the order book, the [`ob_snapshot_wide()`](https://docs.pip.distribution.sol.onetick.com/api/source/ob_snapshot_wide.html.md#onetick.py.Source.ob_snapshot_wide) aggregation is used.<br />
\\\\
As this is a crypto book, the `size_max_fractional_digits` attribute is set.<br />
\\\\
[`ob_snapshot_wide()`](https://docs.pip.distribution.sol.onetick.com/api/source/ob_snapshot_wide.html.md#onetick.py.Source.ob_snapshot_wide) returns the book in a format with Bid and Ask on the same row.<br />
\\\\
Bid and Ask Value is calculated using `PRICE * SIZE`.<br />
\\\\
The Bid and Ask Sizes are used to calculate accumulative sizes across the book depth, computed with a
running sum aggregation across the levels.

```ipython3
import onetick.py as otp

data = otp.DataSource(db='BINANCE', tick_type='PRL')
data = data.ob_snapshot_wide(size_max_fractional_digits=9)

# Value per level = PRICE * SIZE
data['BID_VALUE'] = data['BID_PRICE'] * data['BID_SIZE']
data['ASK_VALUE'] = data['ASK_PRICE'] * data['ASK_SIZE']

# Accumulative sizes across the book depth
data = data.agg({'ACCUM_BID_SIZE': otp.agg.sum('BID_SIZE'),
                 'ACCUM_ASK_SIZE': otp.agg.sum('ASK_SIZE')},
                running=True, all_fields=True)

data = data[['BID_PRICE', 'BID_SIZE', 'ASK_PRICE', 'ASK_SIZE', 'LEVEL',
             'BID_VALUE', 'ASK_VALUE', 'ACCUM_BID_SIZE', 'ACCUM_ASK_SIZE']]
result = otp.run(data,
                 start=otp.dt(2026, 7, 28, 12),
                 end=otp.dt(2026, 7, 28, 12),
                 timezone='UTC',
                 symbols='BTCUSD')
result
```

```myst-ansi
                   Time  BID_PRICE  BID_SIZE  ASK_PRICE  ASK_SIZE  LEVEL  \
0   2026-07-28 12:00:00   63372.00   0.00008   63392.01   0.00008      1   
1   2026-07-28 12:00:00   63366.05   0.02220   63396.00   0.00008      2   
2   2026-07-28 12:00:00   63366.04   0.00100   63396.88   0.00076      3   
3   2026-07-28 12:00:00   63364.00   0.00008   63399.00   0.00008      4   
4   2026-07-28 12:00:00   63362.46   0.04722   63399.40   0.04762      5   
..                  ...        ...       ...        ...       ...    ...   
229 2026-07-28 12:00:00   32000.00   0.51281        NaN   0.00000    230   
230 2026-07-28 12:00:00   30000.00   0.13842        NaN   0.00000    231   
231 2026-07-28 12:00:00   23600.02   0.04238        NaN   0.00000    232   
232 2026-07-28 12:00:00   19389.02   0.10057        NaN   0.00000    233   
233 2026-07-28 12:00:00   18785.00   0.00368        NaN   0.00000    234   

        BID_VALUE    ASK_VALUE  ACCUM_BID_SIZE  ACCUM_ASK_SIZE  
0        5.069760     5.071361         0.00008         0.00008  
1     1406.726310     5.071680         0.02228         0.00016  
2       63.366040    48.181629         0.02328         0.00092  
3        5.069120     5.071920         0.02336         0.00100  
4     2991.975298  3019.079428         0.07058         0.04862  
..            ...          ...             ...             ...  
229  16409.919968          NaN        47.13080         6.48798  
230   4152.599970          NaN        47.26922         6.48798  
231   1000.168848          NaN        47.31160         6.48798  
232   1949.953741          NaN        47.41217         6.48798  
233     69.128800          NaN        47.41585         6.48798  

[234 rows x 10 columns]
```

## Crypto Book Snapshot Retrieval with Accumulative Values and Best Prices

Retrieving a Book Snapshot at a Specified Time from a Crypto Venue, outputting Accumulative Depth and Best Prices.<br />
\\\\
To reconstruct the order book, the [`ob_snapshot_wide()`](https://docs.pip.distribution.sol.onetick.com/api/source/ob_snapshot_wide.html.md#onetick.py.Source.ob_snapshot_wide) aggregation is used.<br />
\\\\
As this is a crypto book, the `size_max_fractional_digits` attribute is set.<br />
\\\\
[`ob_snapshot_wide()`](https://docs.pip.distribution.sol.onetick.com/api/source/ob_snapshot_wide.html.md#onetick.py.Source.ob_snapshot_wide) returns the book in a format with Bid and Ask on the same row.<br />
\\\\
Bid and Ask Value is calculated using `PRICE * SIZE`.<br />
\\\\
The Bid and Ask Sizes are used to calculate accumulative sizes across the book depth, computed with a
running sum aggregation across the levels.<br />
\\\\
The Bid and Ask Prices are used to return the Best Prices across the book depth, computed with a
running first aggregation across the levels.

```ipython3
import onetick.py as otp

data = otp.DataSource(db='BINANCE', tick_type='PRL')
data = data.ob_snapshot_wide(size_max_fractional_digits=9)

# Value per level = PRICE * SIZE
data['BID_VALUE'] = data['BID_PRICE'] * data['BID_SIZE']
data['ASK_VALUE'] = data['ASK_PRICE'] * data['ASK_SIZE']

# Accumulative sizes and best (first) prices across the book depth
data = data.agg({'ACCUM_BID_SIZE': otp.agg.sum('BID_SIZE'),
                 'ACCUM_ASK_SIZE': otp.agg.sum('ASK_SIZE'),
                 'BEST_BID_PRICE': otp.agg.first('BID_PRICE'),
                 'BEST_ASK_PRICE': otp.agg.first('ASK_PRICE')},
                running=True, all_fields=True)

data = data[['BID_PRICE', 'BID_SIZE', 'ASK_PRICE', 'ASK_SIZE', 'LEVEL',
             'BID_VALUE', 'ASK_VALUE', 'ACCUM_BID_SIZE', 'ACCUM_ASK_SIZE',
             'BEST_BID_PRICE', 'BEST_ASK_PRICE']]
result = otp.run(data,
                 start=otp.dt(2026, 7, 28, 12),
                 end=otp.dt(2026, 7, 28, 12),
                 timezone='UTC',
                 symbols='BTCUSD')
result
```

```myst-ansi
                   Time  BID_PRICE  BID_SIZE  ASK_PRICE  ASK_SIZE  LEVEL  \
0   2026-07-28 12:00:00   63372.00   0.00008   63392.01   0.00008      1   
1   2026-07-28 12:00:00   63366.05   0.02220   63396.00   0.00008      2   
2   2026-07-28 12:00:00   63366.04   0.00100   63396.88   0.00076      3   
3   2026-07-28 12:00:00   63364.00   0.00008   63399.00   0.00008      4   
4   2026-07-28 12:00:00   63362.46   0.04722   63399.40   0.04762      5   
..                  ...        ...       ...        ...       ...    ...   
229 2026-07-28 12:00:00   32000.00   0.51281        NaN   0.00000    230   
230 2026-07-28 12:00:00   30000.00   0.13842        NaN   0.00000    231   
231 2026-07-28 12:00:00   23600.02   0.04238        NaN   0.00000    232   
232 2026-07-28 12:00:00   19389.02   0.10057        NaN   0.00000    233   
233 2026-07-28 12:00:00   18785.00   0.00368        NaN   0.00000    234   

        BID_VALUE    ASK_VALUE  ACCUM_BID_SIZE  ACCUM_ASK_SIZE  \
0        5.069760     5.071361         0.00008         0.00008   
1     1406.726310     5.071680         0.02228         0.00016   
2       63.366040    48.181629         0.02328         0.00092   
3        5.069120     5.071920         0.02336         0.00100   
4     2991.975298  3019.079428         0.07058         0.04862   
..            ...          ...             ...             ...   
229  16409.919968          NaN        47.13080         6.48798   
230   4152.599970          NaN        47.26922         6.48798   
231   1000.168848          NaN        47.31160         6.48798   
232   1949.953741          NaN        47.41217         6.48798   
233     69.128800          NaN        47.41585         6.48798   

     BEST_BID_PRICE  BEST_ASK_PRICE  
0           63372.0        63392.01  
1           63372.0        63392.01  
2           63372.0        63392.01  
3           63372.0        63392.01  
4           63372.0        63392.01  
..              ...             ...  
229         63372.0        63392.01  
230         63372.0        63392.01  
231         63372.0        63392.01  
232         63372.0        63392.01  
233         63372.0        63392.01  

[234 rows x 12 columns]
```

## Crypto Book Depth Statistics to Trade a Specified Amount Across Time

Calculating Bid and Ask VWAP and other Statistics across time from a Crypto Venue.<br />
\\\\
To calculate Bid and Ask VWAP, the [`ob_summary()`](https://docs.pip.distribution.sol.onetick.com/api/source/ob_summary.html.md#onetick.py.Source.ob_summary) aggregation is used.<br />
\\\\
As this is a crypto book, the `size_max_fractional_digits` attribute is set.<br />
\\\\
The `max_depth_shares` attribute determines how much should be traded.<br />
\\\\
The `bucket_interval` attribute determines how often to output the resulting book metrics.

The returned `BID_VWAP` and `ASK_VWAP` can be used to calculate Effective Spread.<br />
\\\\
The returned `BID_SIZE` and `ASK_SIZE` identify if the liquidity is present.<br />
\\\\
The returned `BEST_ASK_PRICE` and `BEST_BID_PRICE` can be used to calculate the Price Skew together
with the `BID_VWAP` and `ASK_VWAP`.

```ipython3
import onetick.py as otp

data = otp.DataSource(db='BINANCE', tick_type='PRL')
data = data.ob_summary(size_max_fractional_digits=9,
                       bucket_interval=60,
                       max_depth_shares=0.5)
result = otp.run(data,
                 start=otp.dt(2026, 7, 28),
                 end=otp.dt(2026, 7, 29),
                 timezone='UTC',
                 symbols='BTCUSD')
result
```

```myst-ansi
                    Time  BID_SIZE      BID_VWAP  BEST_BID_PRICE  \
0    2026-07-28 00:01:00   0.22377  63496.083279        63704.61   
1    2026-07-28 00:02:00   0.20724  63431.012768        63661.82   
2    2026-07-28 00:03:00   0.21396  63430.612190        63659.39   
3    2026-07-28 00:04:00   0.21634  63456.893842        63676.17   
4    2026-07-28 00:05:00   0.23383  63463.745030        63684.12   
...                  ...       ...           ...             ...   
1435 2026-07-28 23:56:00   0.50000  63427.842243        63830.48   
1436 2026-07-28 23:57:00   0.50000  63454.580934        63844.64   
1437 2026-07-28 23:58:00   0.50000  63492.709298        63867.94   
1438 2026-07-28 23:59:00   0.50000  63480.813434        63883.77   
1439 2026-07-29 00:00:00   0.50000  63398.522961        63870.00   

      WORST_BID_PRICE  NUM_BID_LEVELS  ASK_SIZE      ASK_VWAP  BEST_ASK_PRICE  \
0            61456.58              27   0.21492  63941.122894        63729.88   
1            60501.70              27   0.19659  63922.769244        63691.04   
2            60501.70              29   0.19111  63926.366503        63687.06   
3            60501.70              29   0.19814  63926.443466        63701.86   
4            59985.88              34   0.21125  63926.795975        63715.60   
...               ...             ...       ...           ...             ...   
1435         61500.00             108   0.50000  64565.474223        63852.92   
1436         61500.00             108   0.50000  63911.337560        63865.15   
1437         61596.75             107   0.50000  63932.208524        63893.97   
1438         61500.00             110   0.50000  64286.294234        63910.23   
1439         61500.00             108   0.50000  64120.600046        63871.39   

      WORST_ASK_PRICE  NUM_ASK_LEVELS  
0            66042.64              27  
1            65999.89              26  
2            65994.78              28  
3            65960.17              28  
4            65938.23              30  
...               ...             ...  
1435         67217.67              79  
1436         63979.36              20  
1437         63951.99              14  
1438         66227.80              73  
1439         66171.01              75  

[1440 rows x 11 columns]
```
