Updated docs for #3267
This commit is contained in:
parent
e864db1843
commit
63dfe3669f
@ -324,62 +324,9 @@ class Awesomestrategy(IStrategy):
|
|||||||
!!! Note
|
!!! Note
|
||||||
If the data is pair-specific, make sure to use pair as one of the keys in the dictionary.
|
If the data is pair-specific, make sure to use pair as one of the keys in the dictionary.
|
||||||
|
|
||||||
### Additional data (DataProvider)
|
***
|
||||||
|
|
||||||
The strategy provides access to the `DataProvider`. This allows you to get additional data to use in your strategy.
|
### Additional data (informative_pairs)
|
||||||
|
|
||||||
All methods return `None` in case of failure (do not raise an exception).
|
|
||||||
|
|
||||||
Please always check the mode of operation to select the correct method to get data (samples see below).
|
|
||||||
|
|
||||||
#### Possible options for DataProvider
|
|
||||||
|
|
||||||
- `available_pairs` - Property with tuples listing cached pairs with their intervals (pair, interval).
|
|
||||||
- `ohlcv(pair, timeframe)` - Currently cached candle (OHLCV) data for the pair, returns DataFrame or empty DataFrame.
|
|
||||||
- `historic_ohlcv(pair, timeframe)` - Returns historical data stored on disk.
|
|
||||||
- `get_pair_dataframe(pair, timeframe)` - This is a universal method, which returns either historical data (for backtesting) or cached live data (for the Dry-Run and Live-Run modes).
|
|
||||||
- `orderbook(pair, maximum)` - Returns latest orderbook data for the pair, a dict with bids/asks with a total of `maximum` entries.
|
|
||||||
- `market(pair)` - Returns market data for the pair: fees, limits, precisions, activity flag, etc. See [ccxt documentation](https://github.com/ccxt/ccxt/wiki/Manual#markets) for more details on Market data structure.
|
|
||||||
- `runmode` - Property containing the current runmode.
|
|
||||||
|
|
||||||
#### Example: fetch live / historical candle (OHLCV) data for the first informative pair
|
|
||||||
|
|
||||||
``` python
|
|
||||||
if self.dp:
|
|
||||||
inf_pair, inf_timeframe = self.informative_pairs()[0]
|
|
||||||
informative = self.dp.get_pair_dataframe(pair=inf_pair,
|
|
||||||
timeframe=inf_timeframe)
|
|
||||||
```
|
|
||||||
|
|
||||||
!!! Warning "Warning about backtesting"
|
|
||||||
Be carefull when using dataprovider in backtesting. `historic_ohlcv()` (and `get_pair_dataframe()`
|
|
||||||
for the backtesting runmode) provides the full time-range in one go,
|
|
||||||
so please be aware of it and make sure to not "look into the future" to avoid surprises when running in dry/live mode).
|
|
||||||
|
|
||||||
!!! Warning "Warning in hyperopt"
|
|
||||||
This option cannot currently be used during hyperopt.
|
|
||||||
|
|
||||||
#### Orderbook
|
|
||||||
|
|
||||||
``` python
|
|
||||||
if self.dp:
|
|
||||||
if self.dp.runmode.value in ('live', 'dry_run'):
|
|
||||||
ob = self.dp.orderbook(metadata['pair'], 1)
|
|
||||||
dataframe['best_bid'] = ob['bids'][0][0]
|
|
||||||
dataframe['best_ask'] = ob['asks'][0][0]
|
|
||||||
```
|
|
||||||
|
|
||||||
!!! Warning
|
|
||||||
The order book is not part of the historic data which means backtesting and hyperopt will not work if this
|
|
||||||
method is used.
|
|
||||||
|
|
||||||
#### Available Pairs
|
|
||||||
|
|
||||||
``` python
|
|
||||||
if self.dp:
|
|
||||||
for pair, timeframe in self.dp.available_pairs:
|
|
||||||
print(f"available {pair}, {timeframe}")
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Get data for non-tradeable pairs
|
#### Get data for non-tradeable pairs
|
||||||
|
|
||||||
@ -404,6 +351,108 @@ def informative_pairs(self):
|
|||||||
It is however better to use resampling to longer time-intervals when possible
|
It is however better to use resampling to longer time-intervals when possible
|
||||||
to avoid hammering the exchange with too many requests and risk being blocked.
|
to avoid hammering the exchange with too many requests and risk being blocked.
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
### Additional data (DataProvider)
|
||||||
|
|
||||||
|
The strategy provides access to the `DataProvider`. This allows you to get additional data to use in your strategy.
|
||||||
|
|
||||||
|
All methods return `None` in case of failure (do not raise an exception).
|
||||||
|
|
||||||
|
Please always check the mode of operation to select the correct method to get data (samples see below).
|
||||||
|
|
||||||
|
#### Possible options for DataProvider
|
||||||
|
|
||||||
|
- [`available_pairs`](#available_pairs) - Property with tuples listing cached pairs with their intervals (pair, interval).
|
||||||
|
- [`current_whitelist()`](#current_whitelist) - Returns a current list of whitelisted pairs. Useful for accessing dynamic whitelists (ie. VolumePairlist)
|
||||||
|
- [`get_pair_dataframe(pair, timeframe)`](#get_pair_dataframepair-timeframe) - This is a universal method, which returns either historical data (for backtesting) or cached live data (for the Dry-Run and Live-Run modes).
|
||||||
|
- `historic_ohlcv(pair, timeframe)` - Returns historical data stored on disk.
|
||||||
|
- `market(pair)` - Returns market data for the pair: fees, limits, precisions, activity flag, etc. See [ccxt documentation](https://github.com/ccxt/ccxt/wiki/Manual#markets) for more details on Market data structure.
|
||||||
|
- `ohlcv(pair, timeframe)` - Currently cached candle (OHLCV) data for the pair, returns DataFrame or empty DataFrame.
|
||||||
|
- [`orderbook(pair, maximum)`](#orderbookpair-maximum) - Returns latest orderbook data for the pair, a dict with bids/asks with a total of `maximum` entries.
|
||||||
|
- `runmode` - Property containing the current runmode.
|
||||||
|
|
||||||
|
#### Example Usages:
|
||||||
|
|
||||||
|
#### *available_pairs*
|
||||||
|
|
||||||
|
``` python
|
||||||
|
if self.dp:
|
||||||
|
for pair, timeframe in self.dp.available_pairs:
|
||||||
|
print(f"available {pair}, {timeframe}")
|
||||||
|
```
|
||||||
|
|
||||||
|
#### *current_whitelist()*
|
||||||
|
Imagine you've developed a strategy that trades the `1m` timeframe using signals generated from a `1d` timeframe on the top 10 volume pairs by volume.
|
||||||
|
|
||||||
|
The strategy might look something like this:
|
||||||
|
|
||||||
|
*Scan through the top 10 pairs by volume using the `VolumePairList` every minute and use a 14 day ATR to buy and sell.*
|
||||||
|
|
||||||
|
Due to the limited available data, it's impossible to resample our `1m` candles into daily candles for use in the 14 day ATR. Most exchanges limit us to just 500 candles which effectively gives us around 1/3 of a daily candle. We need 14 days at least!
|
||||||
|
|
||||||
|
Since we can't resample our data we will have to use an informative pair; and since our whitelist will be dynamic we don't know which pair(s) to use.
|
||||||
|
|
||||||
|
This is where calling `self.dp.current_whitelist()` comes in handy.
|
||||||
|
|
||||||
|
```python
|
||||||
|
class SampleStrategy(IStrategy):
|
||||||
|
# strategy init stuff...
|
||||||
|
|
||||||
|
ticker_interval = '1m'
|
||||||
|
|
||||||
|
# more strategy init stuff..
|
||||||
|
|
||||||
|
def informative_pairs(self):
|
||||||
|
|
||||||
|
# get access to all pairs available in whitelist.
|
||||||
|
pairs = self.dp.current_whitelist()
|
||||||
|
# Assign tf to each pair so they can be downloaded and cached for strategy.
|
||||||
|
informative_pairs = [(pair, '1d') for pair in pairs]
|
||||||
|
return informative_pairs
|
||||||
|
|
||||||
|
def populate_indicators(self, dataframe, metadata):
|
||||||
|
# Get the informative pair
|
||||||
|
informative = self.dp.get_pair_dataframe(pair=metadata['pair'], timeframe='1d')
|
||||||
|
# Get the 14 day ATR.
|
||||||
|
atr = ta.ATR(informative, timeperiod=14)
|
||||||
|
# Assign the Daily atr to the 1 minute dataframe.
|
||||||
|
dataframe['daily_atr'] = atr
|
||||||
|
```
|
||||||
|
|
||||||
|
#### *get_pair_dataframe(pair, timeframe)*
|
||||||
|
|
||||||
|
``` python
|
||||||
|
# fetch live / historical candle (OHLCV) data for the first informative pair
|
||||||
|
if self.dp:
|
||||||
|
inf_pair, inf_timeframe = self.informative_pairs()[0]
|
||||||
|
informative = self.dp.get_pair_dataframe(pair=inf_pair,
|
||||||
|
timeframe=inf_timeframe)
|
||||||
|
```
|
||||||
|
|
||||||
|
!!! Warning "Warning about backtesting"
|
||||||
|
Be carefull when using dataprovider in backtesting. `historic_ohlcv()` (and `get_pair_dataframe()`
|
||||||
|
for the backtesting runmode) provides the full time-range in one go,
|
||||||
|
so please be aware of it and make sure to not "look into the future" to avoid surprises when running in dry/live mode).
|
||||||
|
|
||||||
|
!!! Warning "Warning in hyperopt"
|
||||||
|
This option cannot currently be used during hyperopt.
|
||||||
|
|
||||||
|
#### *orderbook(pair, maximum)*
|
||||||
|
|
||||||
|
``` python
|
||||||
|
if self.dp:
|
||||||
|
if self.dp.runmode.value in ('live', 'dry_run'):
|
||||||
|
ob = self.dp.orderbook(metadata['pair'], 1)
|
||||||
|
dataframe['best_bid'] = ob['bids'][0][0]
|
||||||
|
dataframe['best_ask'] = ob['asks'][0][0]
|
||||||
|
```
|
||||||
|
|
||||||
|
!!! Warning
|
||||||
|
The order book is not part of the historic data which means backtesting and hyperopt will not work if this
|
||||||
|
method is used.
|
||||||
|
|
||||||
|
***
|
||||||
### Additional data (Wallets)
|
### Additional data (Wallets)
|
||||||
|
|
||||||
The strategy provides access to the `Wallets` object. This contains the current balances on the exchange.
|
The strategy provides access to the `Wallets` object. This contains the current balances on the exchange.
|
||||||
@ -426,6 +475,7 @@ if self.wallets:
|
|||||||
- `get_used(asset)` - currently tied up balance (open orders)
|
- `get_used(asset)` - currently tied up balance (open orders)
|
||||||
- `get_total(asset)` - total available balance - sum of the 2 above
|
- `get_total(asset)` - total available balance - sum of the 2 above
|
||||||
|
|
||||||
|
***
|
||||||
### Additional data (Trades)
|
### Additional data (Trades)
|
||||||
|
|
||||||
A history of Trades can be retrieved in the strategy by querying the database.
|
A history of Trades can be retrieved in the strategy by querying the database.
|
||||||
|
Loading…
Reference in New Issue
Block a user