Usually you would fetch data from your smart contract directly. Want to read the time of the latest trade? Just call MyContract.methods.latestTradeTime().call() which fetches the data from an Ethereum node like Infura into your Dapp. But what if you need hundreds of different data points? That would result in hundreds of data fetches to the node, each time requiring an RTT making your Dapp slow and inefficient. One workaround might be a fetcher call function inside your contract that returns multiple data at once. This is not always ideal though.

And then you might be interested in historical data as well. You want to know not only the last trade time, but the times for all trades that you ever did yourself. Use the create-eth-app subgraph package, read the documentation and adapt it to your own contracts. If you are looking for popular smart contracts, there may even already be a subgraph. Check out the subgraph explorer.