Drawing DEX prices using OHLCV candle charts#
- This is an example notebook how to draw a price candle chart for Trading Strategy. 
- Please read how to set up your environment first. 
- We draw an OHLCV chart. Internally - trading-strategyis using Plotly framework for charting.
Getting started#
First, let’s create Trading Strategy oracle market data client. If you do not have an API key yet, you will be asked to create one.
[8]:
from tradingstrategy.client import Client
client = Client.create_jupyter_client()
Started Trading Strategy in Jupyter notebook environment, configuration is stored in /Users/moo/.tradingstrategy
Resolve trading pair metadata#
We look at BNB / BUSD trading pair on PancakeSwap DEX (version 2).
- To download the data we first need to download exchange and trading pair metadata, so that we can resolve symbolic exchange name and ticket information to the trading pair id 
- We may have duplicate trading pair with the same ticket and token symbol information. This is often the case for popular trading pairs as there are a lot of scam pairs around with the same symbol. We go around this by using the option - pick_by_highest_volwhich gives us the correct trading pair.
- Note that the blockchain native token of EVM chain is presented by its wrapped version on DEXes. E.g. BNB on BNB Chain becomes WBNB. 
[9]:
from pyarrow import Table
from tradingstrategy.chain import ChainId
from tradingstrategy.exchange import ExchangeUniverse
from tradingstrategy.pair import PandasPairUniverse, DEXPair
# Fetch all exchange names, slugs and addresses
exchange_universe: ExchangeUniverse = client.fetch_exchange_universe()
# Fetch all trading pairs across all exchanges
pair_table: Table = client.fetch_pair_universe()
pair_universe = PandasPairUniverse(pair_table.to_pandas())
pancake_v2 = exchange_universe.get_by_chain_and_slug(ChainId.bsc, "pancakeswap-v2")
pair: DEXPair = pair_universe.get_one_pair_from_pandas_universe(
    pancake_v2.exchange_id,
    "WBNB",
    "BUSD",
    pick_by_highest_vol=True)
print(f"PancakeSwap v2 is {pancake_v2}")
print(f"We have trading pair {pair}")
PancakeSwap v2 is <Exchange PancakeSwap v2 at 0xca143ce32fe78f1f7019d7d551a6402fc5350c73 on Binance Smart Chain>
We have trading pair <Pair #1364760 WBNB - BUSD (0x58f876857a02d6762e0101bb5c46a8c1ed44dc16) at exchange #1187 on binance>
Fetch price data feed#
- We then downlaod OHLCV data using Trading Strategy oracle’s real-time API endpoint 
- The data is internally delivered as JSONL, but this is abstracted way by - trading-strategyPython client library
- Any price of non-dollar pairs, e.g. AAVE/ETH, is pre-converted to US dollars by Trading Strategy exchange rate rules 
[10]:
import pandas as pd
from tradingstrategy.timebucket import TimeBucket
candles: pd.DataFrame = client.fetch_candles_by_pair_ids(
    {pair.pair_id},
    TimeBucket.d1,
    progress_bar_description=f"Download data for {pair.get_ticker()}"
)
Inspect OHCLV data#
- You can manually inspect OHCLV trading dataframes. 
- Easiest way to do this is to use IPython - display()function to render dataframes as table.
[11]:
# Display latest 14 days of WBNB-BUSD data
display(candles.iloc[-14:])
| pair_id | timestamp | open | high | low | close | buy_volume | sell_volume | start_block | end_block | exchange_rate | buys | sells | avg | volume | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| timestamp | |||||||||||||||
| 2022-11-23 | 1364760 | 2022-11-23 | 266.261026 | 299.841244 | 264.315010 | 297.825673 | 2.729343e+07 | 2.228333e+07 | 23288796 | 23317233 | 1.0 | 21300.0 | 24550.0 | NaN | 4.957676e+07 | 
| 2022-11-24 | 1364760 | 2022-11-24 | 297.822293 | 302.814980 | 292.549276 | 300.091218 | 9.670815e+06 | 9.369412e+06 | 23317237 | 23345600 | 1.0 | 16895.0 | 16145.0 | NaN | 1.904023e+07 | 
| 2022-11-25 | 1364760 | 2022-11-25 | 300.087669 | 304.630323 | 293.529879 | 300.225753 | 9.101830e+06 | 9.063683e+06 | 23345606 | 23373804 | 1.0 | 16136.0 | 14800.0 | NaN | 1.816551e+07 | 
| 2022-11-26 | 1364760 | 2022-11-26 | 300.225295 | 316.787367 | 300.139182 | 311.051139 | 1.072095e+07 | 9.386321e+06 | 23373806 | 23402018 | 1.0 | 15987.0 | 15941.0 | NaN | 2.010727e+07 | 
| 2022-11-27 | 1364760 | 2022-11-27 | 311.050841 | 316.365007 | 306.025563 | 306.773434 | 9.036277e+06 | 9.531502e+06 | 23402024 | 23430502 | 1.0 | 15283.0 | 14602.0 | NaN | 1.856778e+07 | 
| 2022-11-28 | 1364760 | 2022-11-28 | 306.773488 | 308.490684 | 289.239530 | 293.141829 | 1.015980e+07 | 1.179148e+07 | 23430504 | 23458977 | 1.0 | 17488.0 | 14359.0 | NaN | 2.195128e+07 | 
| 2022-11-29 | 1364760 | 2022-11-29 | 293.141677 | 306.658445 | 289.679437 | 295.772926 | 6.853360e+06 | 6.512749e+06 | 23458979 | 23487565 | 1.0 | 16409.0 | 15357.0 | NaN | 1.336611e+07 | 
| 2022-11-30 | 1364760 | 2022-11-30 | 295.772956 | 305.356409 | 293.931451 | 300.922936 | 9.490703e+06 | 8.836190e+06 | 23487568 | 23516178 | 1.0 | 19505.0 | 17381.0 | NaN | 1.832689e+07 | 
| 2022-12-01 | 1364760 | 2022-12-01 | 300.924183 | 301.409985 | 290.616758 | 291.678394 | 9.108918e+06 | 1.030238e+07 | 23516180 | 23544574 | 1.0 | 20378.0 | 17129.0 | NaN | 1.941129e+07 | 
| 2022-12-02 | 1364760 | 2022-12-02 | 291.681450 | 293.328217 | 286.174944 | 292.979351 | 1.483278e+07 | 1.458857e+07 | 23544576 | 23572636 | 1.0 | 22339.0 | 18104.0 | NaN | 2.942134e+07 | 
| 2022-12-03 | 1364760 | 2022-12-03 | 292.979907 | 293.566933 | 289.695106 | 290.307121 | 5.278060e+06 | 5.676123e+06 | 23572640 | 23600811 | 1.0 | 16711.0 | 14991.0 | NaN | 1.095418e+07 | 
| 2022-12-04 | 1364760 | 2022-12-04 | 290.306878 | 294.650247 | 288.330343 | 292.470853 | 4.900642e+06 | 4.552601e+06 | 23600814 | 23628935 | 1.0 | 17466.0 | 13406.0 | NaN | 9.453243e+06 | 
| 2022-12-05 | 1364760 | 2022-12-05 | 292.470940 | 297.145499 | 286.615769 | 287.910945 | 5.476807e+06 | 6.183128e+06 | 23628937 | 23657267 | 1.0 | 17560.0 | 13305.0 | NaN | 1.165994e+07 | 
| 2022-12-06 | 1364760 | 2022-12-06 | 287.909748 | 292.217899 | 287.497567 | 289.707345 | 2.083389e+06 | 1.794518e+06 | 23657271 | 23667239 | 1.0 | 4735.0 | 3841.0 | NaN | 3.877908e+06 | 
Draw candle chart#
- Display the price chart using OHLCV candles 
- We have a shortcut function for this, but you can as well construct Plotly chart by hand 
[12]:
from tradingstrategy.charting.candle_chart import visualise_ohlcv
figure = visualise_ohlcv(
    candles,
    chart_name=f"{pair.base_token_symbol} - {pair.quote_token_symbol} price chart",
    y_axis_name=f"$ {pair.base_token_symbol} price",
)
display(figure)
Dark theme for the price chart#
- You can update Plotly figure settings to change its colour theme. 
[13]:
figure.update_layout(template="plotly_dark")
display(figure)
Unlabeled chart#
We can create a chart without any labels as well.
[14]:
figure = visualise_ohlcv(
    candles,
    chart_name=None,
    y_axis_name=None,
    volume_axis_name=None,
)
display(figure)
Further reading#
For more advanced charting, trade-executor Python library provides charts that plot out a trading strategy performance (as opposite to vanilla price chart).