parent
8e9384e8e6
commit
2a1368d508
@ -160,17 +160,17 @@ This filter allows freqtrade to ignore pairs until they have been listed for at
|
|||||||
|
|
||||||
Offsets an incoming pairlist by a given `offset` value.
|
Offsets an incoming pairlist by a given `offset` value.
|
||||||
|
|
||||||
As an example it can be used in conjunction with `VolumeFilter` to remove the top X volume pairs. Or to split
|
As an example it can be used in conjunction with `VolumeFilter` to remove the top X volume pairs. Or to split a larger pairlist on two bot instances.
|
||||||
a larger pairlist on two bot instances.
|
|
||||||
|
|
||||||
Example to remove the first 10 pairs from the pairlist:
|
Example to remove the first 10 pairs from the pairlist, and takes the next 20 (taking items 10-30 of the initial list):
|
||||||
|
|
||||||
```json
|
```json
|
||||||
"pairlists": [
|
"pairlists": [
|
||||||
// ...
|
// ...
|
||||||
{
|
{
|
||||||
"method": "OffsetFilter",
|
"method": "OffsetFilter",
|
||||||
"offset": 10
|
"offset": 10,
|
||||||
|
"number_assets": 20
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
```
|
```
|
||||||
|
@ -19,6 +19,7 @@ class OffsetFilter(IPairList):
|
|||||||
super().__init__(exchange, pairlistmanager, config, pairlistconfig, pairlist_pos)
|
super().__init__(exchange, pairlistmanager, config, pairlistconfig, pairlist_pos)
|
||||||
|
|
||||||
self._offset = pairlistconfig.get('offset', 0)
|
self._offset = pairlistconfig.get('offset', 0)
|
||||||
|
self._number_pairs = pairlistconfig.get('number_assets', 0)
|
||||||
|
|
||||||
if self._offset < 0:
|
if self._offset < 0:
|
||||||
raise OperationalException("OffsetFilter requires offset to be >= 0")
|
raise OperationalException("OffsetFilter requires offset to be >= 0")
|
||||||
@ -36,7 +37,9 @@ class OffsetFilter(IPairList):
|
|||||||
"""
|
"""
|
||||||
Short whitelist method description - used for startup-messages
|
Short whitelist method description - used for startup-messages
|
||||||
"""
|
"""
|
||||||
return f"{self.name} - Offseting pairs by {self._offset}."
|
if self._number_pairs:
|
||||||
|
return f"{self.name} - Taking {self._number_pairs} Pairs, starting from {self._offset}."
|
||||||
|
return f"{self.name} - Offsetting pairs by {self._offset}."
|
||||||
|
|
||||||
def filter_pairlist(self, pairlist: List[str], tickers: Dict) -> List[str]:
|
def filter_pairlist(self, pairlist: List[str], tickers: Dict) -> List[str]:
|
||||||
"""
|
"""
|
||||||
@ -50,5 +53,9 @@ class OffsetFilter(IPairList):
|
|||||||
self.log_once(f"Offset of {self._offset} is larger than " +
|
self.log_once(f"Offset of {self._offset} is larger than " +
|
||||||
f"pair count of {len(pairlist)}", logger.warning)
|
f"pair count of {len(pairlist)}", logger.warning)
|
||||||
pairs = pairlist[self._offset:]
|
pairs = pairlist[self._offset:]
|
||||||
|
if self._number_pairs:
|
||||||
|
pairs = pairs[:self._number_pairs]
|
||||||
|
|
||||||
self.log_once(f"Searching {len(pairs)} pairs: {pairs}", logger.info)
|
self.log_once(f"Searching {len(pairs)} pairs: {pairs}", logger.info)
|
||||||
|
|
||||||
return pairs
|
return pairs
|
||||||
|
@ -470,12 +470,16 @@ def test_VolumePairList_refresh_empty(mocker, markets_empty, whitelist_conf):
|
|||||||
"BTC", ['ETH/BTC', 'TKN/BTC']),
|
"BTC", ['ETH/BTC', 'TKN/BTC']),
|
||||||
# VolumePairList with no offset = unchanged pairlist
|
# VolumePairList with no offset = unchanged pairlist
|
||||||
([{"method": "VolumePairList", "number_assets": 20, "sort_key": "quoteVolume"},
|
([{"method": "VolumePairList", "number_assets": 20, "sort_key": "quoteVolume"},
|
||||||
{"method": "OffsetFilter", "offset": 0}],
|
{"method": "OffsetFilter", "offset": 0, "number_assets": 0}],
|
||||||
"USDT", ['ETH/USDT', 'NANO/USDT', 'ADAHALF/USDT', 'ADADOUBLE/USDT']),
|
"USDT", ['ETH/USDT', 'NANO/USDT', 'ADAHALF/USDT', 'ADADOUBLE/USDT']),
|
||||||
# VolumePairList with offset = 2
|
# VolumePairList with offset = 2
|
||||||
([{"method": "VolumePairList", "number_assets": 20, "sort_key": "quoteVolume"},
|
([{"method": "VolumePairList", "number_assets": 20, "sort_key": "quoteVolume"},
|
||||||
{"method": "OffsetFilter", "offset": 2}],
|
{"method": "OffsetFilter", "offset": 2}],
|
||||||
"USDT", ['ADAHALF/USDT', 'ADADOUBLE/USDT']),
|
"USDT", ['ADAHALF/USDT', 'ADADOUBLE/USDT']),
|
||||||
|
# VolumePairList with offset and limit
|
||||||
|
([{"method": "VolumePairList", "number_assets": 20, "sort_key": "quoteVolume"},
|
||||||
|
{"method": "OffsetFilter", "offset": 1, "number_assets": 2}],
|
||||||
|
"USDT", ['NANO/USDT', 'ADAHALF/USDT']),
|
||||||
# VolumePairList with higher offset, than total pairlist
|
# VolumePairList with higher offset, than total pairlist
|
||||||
([{"method": "VolumePairList", "number_assets": 20, "sort_key": "quoteVolume"},
|
([{"method": "VolumePairList", "number_assets": 20, "sort_key": "quoteVolume"},
|
||||||
{"method": "OffsetFilter", "offset": 100}],
|
{"method": "OffsetFilter", "offset": 100}],
|
||||||
@ -1152,6 +1156,10 @@ def test_spreadfilter_invalid_data(mocker, default_conf, markets, tickers, caplo
|
|||||||
"0.01 and above 0.99 over the last days.'}]",
|
"0.01 and above 0.99 over the last days.'}]",
|
||||||
None
|
None
|
||||||
),
|
),
|
||||||
|
({"method": "OffsetFilter", "offset": 5, "number_assets": 10},
|
||||||
|
"[{'OffsetFilter': 'OffsetFilter - Taking 10 Pairs, starting from 5.'}]",
|
||||||
|
None
|
||||||
|
),
|
||||||
])
|
])
|
||||||
def test_pricefilter_desc(mocker, whitelist_conf, markets, pairlistconfig,
|
def test_pricefilter_desc(mocker, whitelist_conf, markets, pairlistconfig,
|
||||||
desc_expected, exception_expected):
|
desc_expected, exception_expected):
|
||||||
|
Loading…
Reference in New Issue
Block a user