(self)
| 3686 | self.init_throttler() |
| 3687 | |
| 3688 | def features_generator(self): |
| 3689 | # |
| 3690 | # in the exchange-specific features can be something like self, where we support 'string' aliases too: |
| 3691 | # |
| 3692 | # { |
| 3693 | # 'my' : { |
| 3694 | # 'createOrder' : {...}, |
| 3695 | # }, |
| 3696 | # 'swap': { |
| 3697 | # 'linear': { |
| 3698 | # 'extends': my', |
| 3699 | # }, |
| 3700 | # }, |
| 3701 | # } |
| 3702 | # |
| 3703 | if self.features is None: |
| 3704 | return |
| 3705 | # reconstruct |
| 3706 | initialFeatures = self.features |
| 3707 | self.features = {} |
| 3708 | unifiedMarketTypes = ['spot', 'swap', 'future', 'option'] |
| 3709 | subTypes = ['linear', 'inverse'] |
| 3710 | # atm only support basic methods, eg: 'createOrder', 'fetchOrder', 'fetchOrders', 'fetchMyTrades' |
| 3711 | for i in range(0, len(unifiedMarketTypes)): |
| 3712 | marketType = unifiedMarketTypes[i] |
| 3713 | # if marketType is not filled for self exchange, don't add that in `features` |
| 3714 | if not (marketType in initialFeatures): |
| 3715 | self.features[marketType] = None |
| 3716 | else: |
| 3717 | if marketType == 'spot': |
| 3718 | self.features[marketType] = self.features_mapper(initialFeatures, marketType) |
| 3719 | else: |
| 3720 | self.features[marketType] = {} |
| 3721 | for j in range(0, len(subTypes)): |
| 3722 | subType = subTypes[j] |
| 3723 | self.features[marketType][subType] = self.features_mapper(initialFeatures, marketType, subType) |
| 3724 | |
| 3725 | def features_mapper(self, initialFeatures: Any, marketType: Str, subType: Str = None): |
| 3726 | featuresObj = initialFeatures[marketType][subType] if (subType is not None) else initialFeatures[marketType] |
no test coverage detected