class CoinflexPerpetulTestnetConfigMap(BaseConnectorConfigMap): connector: str = Field(default="coinflex_perpetual_testnet", const=True, client_data=None) coinflex_perpetual_testnet_api_key: SecretStr = Field( default=..., client_data=ClientFieldData( prompt=lambda cm: "Enter your Coinflex Perpetual testnet API key", is_secure=True, is_connect_key=True, prompt_on_new=True, ), ) coinflex_perpetual_testnet_api_secret: SecretStr = Field( default=..., client_data=ClientFieldData( prompt=lambda cm: "Enter your Coinflex Perpetual testnet API secret", is_secure=True, is_connect_key=True, prompt_on_new=True, )) class Config: title = "coinflex_perpetual_testnet"
class OKXConfigMap(BaseConnectorConfigMap): connector: str = Field(default="okx", const=True, client_data=None) okx_api_key: SecretStr = Field( default=..., client_data=ClientFieldData( prompt=lambda cm: "Enter your OKX API key", is_secure=True, is_connect_key=True, prompt_on_new=True, ), ) okx_secret_key: SecretStr = Field( default=..., client_data=ClientFieldData( prompt=lambda cm: "Enter your OKX secret key", is_secure=True, is_connect_key=True, prompt_on_new=True, ), ) okx_passphrase: SecretStr = Field( default=..., client_data=ClientFieldData( prompt=lambda cm: "Enter your OKX passphrase key", is_secure=True, is_connect_key=True, prompt_on_new=True, ), )
class FromDateToDateModel(BaseClientModel): start_datetime: datetime = Field( default=..., description= "The start date and time for date-to-date execution timeframe.", client_data=ClientFieldData( prompt=lambda mi: "Please enter the start date and time (YYYY-MM-DD HH:MM:SS)", prompt_on_new=True, ), ) end_datetime: datetime = Field( default=..., description= "The end date and time for date-to-date execution timeframe.", client_data=ClientFieldData( prompt=lambda mi: "Please enter the end date and time (YYYY-MM-DD HH:MM:SS)", prompt_on_new=True, ), ) class Config: title = "from_date_to_date" @validator("start_datetime", "end_datetime", pre=True) def validate_execution_time(cls, v: str) -> Optional[str]: ret = validate_datetime_iso_string(v) if ret is not None: raise ValueError(ret) return v
class BitmartConfigMap(BaseConnectorConfigMap): connector: str = Field(default="bitmart", client_data=None) bitmart_api_key: SecretStr = Field( default=..., client_data=ClientFieldData( prompt=lambda cm: "Enter your BitMart API key", is_secure=True, is_connect_key=True, prompt_on_new=True, )) bitmart_secret_key: SecretStr = Field( default=..., client_data=ClientFieldData( prompt=lambda cm: "Enter your BitMart secret key", is_secure=True, is_connect_key=True, prompt_on_new=True, )) bitmart_memo: SecretStr = Field( default=..., client_data=ClientFieldData( prompt=lambda cm: "Enter your BitMart API Memo", is_secure=True, is_connect_key=True, prompt_on_new=True, )) class Config: title = "bitmart"
class DailyBetweenTimesModel(BaseClientModel): start_time: time = Field( default=..., description= "The start time for daily-between-times execution timeframe.", client_data=ClientFieldData( prompt=lambda mi: "Please enter the start time (HH:MM:SS)", prompt_on_new=True, ), ) end_time: time = Field( default=..., description="The end time for daily-between-times execution timeframe.", client_data=ClientFieldData( prompt=lambda mi: "Please enter the end time (HH:MM:SS)", prompt_on_new=True, ), ) class Config: title = "daily_between_times" @validator("start_time", "end_time", pre=True) def validate_execution_time(cls, v: str) -> Optional[str]: ret = validate_time_iso_string(v) if ret is not None: raise ValueError(ret) return v
class CoinzoomConfigMap(BaseConnectorConfigMap): connector: str = Field(default="coinzoom", client_data=None) coinzoom_api_key: SecretStr = Field( default=..., client_data=ClientFieldData( prompt=lambda cm: f"Enter your {Constants.EXCHANGE_NAME} API key", is_secure=True, is_connect_key=True, prompt_on_new=True, )) coinzoom_secret_key: SecretStr = Field( default=..., client_data=ClientFieldData( prompt=lambda cm: f"Enter your {Constants.EXCHANGE_NAME} secret key", is_secure=True, is_connect_key=True, prompt_on_new=True, )) coinzoom_username: SecretStr = Field( default=..., client_data=ClientFieldData( prompt=lambda cm: f"Enter your {Constants.EXCHANGE_NAME} ZoomMe username", is_secure=True, is_connect_key=True, prompt_on_new=True, )) class Config: title = "coinzoom"
class KrakenConfigMap(BaseConnectorConfigMap): connector: str = Field(default="kraken", client_data=None) kraken_api_key: SecretStr = Field( default=..., client_data=ClientFieldData( prompt=lambda cm: "Enter your Kraken API key", is_secure=True, is_connect_key=True, prompt_on_new=True, )) kraken_secret_key: SecretStr = Field( default=..., client_data=ClientFieldData( prompt=lambda cm: "Enter your Kraken secret key", is_secure=True, is_connect_key=True, prompt_on_new=True, )) kraken_api_tier: str = Field( default="Starter", client_data=ClientFieldData( prompt=lambda cm: "Enter your Kraken API Tier (Starter/Intermediate/Pro)", is_connect_key=True, prompt_on_new=True, )) class Config: title = "kraken"
class CoinbaseProConfigMap(BaseConnectorConfigMap): connector: str = Field(default="coinbase_pro", client_data=None) coinbase_pro_api_key: SecretStr = Field( default=..., client_data=ClientFieldData( prompt=lambda cm: "Enter your Coinbase API key", is_secure=True, is_connect_key=True, prompt_on_new=True, ) ) coinbase_pro_secret_key: SecretStr = Field( default=..., client_data=ClientFieldData( prompt=lambda cm: "Enter your Coinbase secret key", is_secure=True, is_connect_key=True, prompt_on_new=True, ) ) coinbase_pro_passphrase: SecretStr = Field( default=..., client_data=ClientFieldData( prompt=lambda cm: "Enter your Coinbase passphrase", is_secure=True, is_connect_key=True, prompt_on_new=True, ) ) class Config: title = "coinbase_pro"
class KuCoinTestnetConfigMap(BaseConnectorConfigMap): connector: str = Field(default="kucoin_testnet", client_data=None) kucoin_testnet_api_key: SecretStr = Field( default=..., client_data=ClientFieldData( prompt=lambda cm: "Enter your KuCoin Testnet API key", is_secure=True, is_connect_key=True, prompt_on_new=True, )) kucoin_testnet_secret_key: SecretStr = Field( default=..., client_data=ClientFieldData( prompt=lambda cm: "Enter your KuCoin Testnet secret key", is_secure=True, is_connect_key=True, prompt_on_new=True, )) kucoin_testnet_passphrase: SecretStr = Field( default=..., client_data=ClientFieldData( prompt=lambda cm: "Enter your KuCoin Testnet passphrase", is_secure=True, is_connect_key=True, prompt_on_new=True, )) class Config: title = "kucoin_testnet"
class FtxConfigMap(BaseConnectorConfigMap): connector: str = Field(default="ftx", client_data=None) ftx_api_key: SecretStr = Field( default=..., client_data=ClientFieldData( prompt=lambda cm: "Enter your FTX API key", is_secure=True, is_connect_key=True, prompt_on_new=True, )) ftx_secret_key: SecretStr = Field( default=..., client_data=ClientFieldData( prompt=lambda cm: "Enter your FTX API secret", is_secure=True, is_connect_key=True, prompt_on_new=True, )) ftx_subaccount_name: SecretStr = Field( default=..., client_data=ClientFieldData( prompt=lambda cm: "Enter your FTX subaccount name (if this is not a subaccount, leave blank)", is_secure=True, is_connect_key=True, prompt_on_new=True, )) class Config: title = "ftx"
class TakerToMakerConversionRateMode(ConversionRateModel): taker_to_maker_base_conversion_rate: Decimal = Field( default=Decimal("1.0"), description= "A fixed conversion rate between the maker and taker tradin pairs based on the maker base asset.", gt=0.0, client_data=ClientFieldData( prompt=lambda mi: ("Enter conversion rate for taker base asset value to maker base asset value, e.g. " "if maker base asset is USD and the taker is DAI, 1 DAI is valued at 1.25 USD, " "the conversion rate is 1.25"), prompt_on_new=True, ), ) taker_to_maker_quote_conversion_rate: Decimal = Field( default=Decimal("1.0"), description= "A fixed conversion rate between the maker and taker tradin pairs based on the maker quote asset.", gt=0.0, client_data=ClientFieldData( prompt=lambda mi: ("Enter conversion rate for taker quote asset value to maker quote asset value, e.g. " "if maker quote asset is USD and the taker is DAI, 1 DAI is valued at 1.25 USD, " "the conversion rate is 1.25"), prompt_on_new=True, ), ) class Config: title = "fixed_conversion_rate" def get_taker_to_maker_conversion_rate( self, market_pair: CrossExchangeMarketPair ) -> Tuple[str, str, Decimal, str, str, Decimal]: """ Find conversion rates from taker market to maker market :param market_pair: maker and taker trading pairs for which to do conversion :return: A tuple of quote pair symbol, quote conversion rate source, quote conversion rate, base pair symbol, base conversion rate source, base conversion rate """ quote_pair = f"{market_pair.taker.quote_asset}-{market_pair.maker.quote_asset}" quote_rate_source = "fixed" quote_rate = self.taker_to_maker_quote_conversion_rate base_pair = f"{market_pair.taker.base_asset}-{market_pair.maker.base_asset}" base_rate_source = "fixed" base_rate = self.taker_to_maker_base_conversion_rate return quote_pair, quote_rate_source, quote_rate, base_pair, base_rate_source, base_rate @validator( "taker_to_maker_base_conversion_rate", "taker_to_maker_quote_conversion_rate", pre=True, ) def validate_decimal(cls, v: str, values: Dict, config: BaseModel.Config, field: Field): return super().validate_decimal(v=v, field=field)
class DummyModel(BaseStrategyConfigMap): strategy: str = Field(default="pure_market_making", client_data=None) some_attr: int = Field(default=1, client_data=ClientFieldData(prompt=lambda mi: "some prompt")) nested_model: NestedModel = Field(default=NestedModel()) class Config: title = "dummy_model"
class NestedModel(BaseClientModel): nested_attr: str = Field( default="some value", client_data=ClientFieldData(prompt=lambda mi: "some prompt") ) class Config: title = "nested_model"
class DummyModel(BaseStrategyConfigMap): strategy: str = Field(default="pure_market_making", client_data=None) some_attr: int = Field(default=1, client_data=ClientFieldData(prompt=lambda mi: "some prompt")) another_attr: Decimal = Field(default=Decimal("1.0")) class Config: title = "dummy_model"
class DummyModel(BaseClientModel): some_attr: int = Field(default=1, client_data=ClientFieldData()) nested_model: Union[NestedModelTwo, NestedModelOne] = Field(default=NestedModelOne()) another_attr: Decimal = Field(default=Decimal("1.0")) class Config: title = "dummy_model"
class DummyModel(BaseClientModel): some_attr: str = Field( default=..., client_data=ClientFieldData( prompt=lambda mi: "Some prompt?", prompt_on_new=True, ), )
class BitmexPerpetualConfigMap(BaseConnectorConfigMap): connector: str = Field(default="bitmex_perpetual", client_data=None) bitmex_perpetual_api_key: SecretStr = Field( default=..., client_data=ClientFieldData( prompt=lambda cm: "Enter your Bitmex Perpetual API key", is_secure=True, is_connect_key=True, prompt_on_new=True, ) ) bitmex_perpetual_api_secret: SecretStr = Field( default=..., client_data=ClientFieldData( prompt=lambda cm: "Enter your Bitmex Perpetual API secret", is_secure=True, is_connect_key=True, prompt_on_new=True, ) )
class PassiveOrderRefreshMode(OrderRefreshMode): cancel_order_threshold: Decimal = Field( default=Decimal("5.0"), description="Profitability threshold to cancel a trade.", gt=-100.0, lt=100.0, client_data=ClientFieldData( prompt=lambda mi: "What is the threshold of profitability to cancel a trade? (Enter 1 to indicate 1%)", prompt_on_new=True, ), ) limit_order_min_expiration: Decimal = Field( default=130.0, description="Limit order expiration time limit.", gt=0.0, client_data=ClientFieldData( prompt=lambda mi: "How often do you want limit orders to expire (in seconds)?", prompt_on_new=True, ), ) class Config: title = "passive_order_refresh" def get_cancel_order_threshold(self) -> Decimal: return self.cancel_order_threshold / Decimal("100") def get_expiration_seconds(self) -> Decimal: return self.limit_order_min_expiration @validator( "cancel_order_threshold", "limit_order_min_expiration", pre=True, ) def validate_decimal(cls, v: str, values: Dict, config: BaseModel.Config, field: Field): return super().validate_decimal(v=v, field=field)
class BeaxyConfigMap(BaseConnectorConfigMap): connector: str = Field(default="beaxy", client_data=None) beaxy_api_key: SecretStr = Field( default=..., client_data=ClientFieldData( prompt=lambda cm: "Enter your Beaxy API key", is_secure=True, is_connect_key=True, prompt_on_new=True, )) beaxy_secret_key: SecretStr = Field( default=..., client_data=ClientFieldData( prompt=lambda cm: "Enter your Beaxy secret key", is_secure=True, is_connect_key=True, prompt_on_new=True, )) class Config: title = "beaxy"
class BybitPerpetualTestnetConfigMap(BaseConnectorConfigMap): connector: str = Field(default="bybit_perpetual_testnet", client_data=None) bybit_perpetual_testnet_api_key: SecretStr = Field( default=..., client_data=ClientFieldData( prompt=lambda cm: "Enter your Bybit Perpetual Testnet API key", is_secure=True, is_connect_key=True, prompt_on_new=True, )) bybit_perpetual_testnet_secret_key: SecretStr = Field( default=..., client_data=ClientFieldData( prompt=lambda cm: "Enter your Bybit Perpetual Testnet secret key", is_secure=True, is_connect_key=True, prompt_on_new=True, )) class Config: title = "bybit_perpetual_testnet"
class MexcConfigMap(BaseConnectorConfigMap): connector: str = Field(default="mexc", client_data=None) mexc_api_key: SecretStr = Field( default=..., client_data=ClientFieldData( prompt=lambda cm: "Enter your MEXC API key", is_secure=True, is_connect_key=True, prompt_on_new=True, )) mexc_secret_key: SecretStr = Field( default=..., client_data=ClientFieldData( prompt=lambda cm: "Enter your MEXC secret key", is_secure=True, is_connect_key=True, prompt_on_new=True, )) class Config: title = "mexc"
class AscendExConfigMap(BaseConnectorConfigMap): connector: str = Field(default="ascend_ex", client_data=None) ascend_ex_api_key: SecretStr = Field( default=..., client_data=ClientFieldData( prompt=lambda cm: "Enter your AscendEx API key", is_secure=True, is_connect_key=True, prompt_on_new=True, )) ascend_ex_secret_key: SecretStr = Field( default=..., client_data=ClientFieldData( prompt=lambda cm: "Enter your AscendEx secret key", is_secure=True, is_connect_key=True, prompt_on_new=True, )) class Config: title = "ascend_ex"
class BinanceUSConfigMap(BaseConnectorConfigMap): connector: str = Field(default="binance_us", const=True, client_data=None) binance_api_key: SecretStr = Field( default=..., client_data=ClientFieldData( prompt=lambda cm: "Enter your Binance US API key", is_secure=True, is_connect_key=True, prompt_on_new=True, )) binance_api_secret: SecretStr = Field( default=..., client_data=ClientFieldData( prompt=lambda cm: "Enter your Binance US API secret", is_secure=True, is_connect_key=True, prompt_on_new=True, )) class Config: title = "binance_us"
class WazirxConfigMap(BaseConnectorConfigMap): connector: str = Field(default="wazirx", client_data=None) wazirx_api_key: SecretStr = Field( default=..., client_data=ClientFieldData( prompt=lambda cm: "Enter your WazirX API key", is_secure=True, is_connect_key=True, prompt_on_new=True, )) wazirx_secret_key: SecretStr = Field( default=..., client_data=ClientFieldData( prompt=lambda cm: "Enter your WazirX secret key", is_secure=True, is_connect_key=True, prompt_on_new=True, )) class Config: title = "wazirx"
class HuobiConfigMap(BaseConnectorConfigMap): connector: str = Field(default="huobi", client_data=None) huobi_api_key: SecretStr = Field( default=..., client_data=ClientFieldData( prompt=lambda cm: "Enter your Huobi API key", is_secure=True, is_connect_key=True, prompt_on_new=True, )) huobi_secret_key: SecretStr = Field( default=..., client_data=ClientFieldData( prompt=lambda cm: "Enter your Huobi secret key", is_secure=True, is_connect_key=True, prompt_on_new=True, )) class Config: title = "huobi"
class LatokenConfigMap(BaseConnectorConfigMap): connector: str = Field(default="latoken", const=True, client_data=None) latoken_api_key: SecretStr = Field( default=..., client_data=ClientFieldData( prompt=lambda cm: "Enter your Latoken API key", is_secure=True, is_connect_key=True, prompt_on_new=True, )) latoken_api_secret: SecretStr = Field( default=..., client_data=ClientFieldData( prompt=lambda cm: "Enter your Latoken API secret", is_secure=True, is_connect_key=True, prompt_on_new=True, )) class Config: title = "latoken"
class ProbitConfigMap(BaseConnectorConfigMap): connector: str = Field(default="probit", client_data=None) probit_api_key: SecretStr = Field( default=..., client_data=ClientFieldData( prompt=lambda cm: "Enter your ProBit Client ID", is_secure=True, is_connect_key=True, prompt_on_new=True, )) probit_secret_key: SecretStr = Field( default=..., client_data=ClientFieldData( prompt=lambda cm: "Enter your ProBit secret key", is_secure=True, is_connect_key=True, prompt_on_new=True, )) class Config: title = "probit"
class MultiOrderLevelModel(BaseClientModel): order_levels: int = Field( default=2, description= "The number of orders placed on either side of the order book.", ge=2, client_data=ClientFieldData( prompt=lambda mi: "How many orders do you want to place on both sides?", prompt_on_new=True, ), ) level_distances: Decimal = Field( default=Decimal("0"), description= "The spread between order levels, expressed in % of optimal spread.", ge=0, client_data=ClientFieldData( prompt=lambda mi: "How far apart in % of optimal spread should orders on one side be?", prompt_on_new=True, ), ) class Config: title = "multi_order_level" @validator("order_levels", pre=True) def validate_int_zero_or_above(cls, v: str): ret = validate_int(v, min_value=2) if ret is not None: raise ValueError(ret) return v @validator("level_distances", pre=True) def validate_decimal_zero_or_above(cls, v: str): ret = validate_decimal(v, min_value=Decimal("0"), inclusive=True) if ret is not None: raise ValueError(ret) return v
class GateIOConfigMap(BaseConnectorConfigMap): connector: str = Field(default="gate_io", client_data=None) gate_io_api_key: SecretStr = Field( default=..., client_data=ClientFieldData( prompt=lambda cm: f"Enter your {CONSTANTS.EXCHANGE_NAME} API key", is_secure=True, is_connect_key=True, prompt_on_new=True, )) gate_io_secret_key: SecretStr = Field( default=..., client_data=ClientFieldData( prompt=lambda cm: f"Enter your {CONSTANTS.EXCHANGE_NAME} secret key", is_secure=True, is_connect_key=True, prompt_on_new=True, )) class Config: title = "gate_io"
class AltmarketsConfigMap(BaseConnectorConfigMap): connector: str = Field(default="altmarkets", client_data=None) altmarkets_api_key: SecretStr = Field( default=..., client_data=ClientFieldData( prompt=lambda cm: f"Enter your {Constants.EXCHANGE_NAME} API key", is_secure=True, is_connect_key=True, prompt_on_new=True, )) altmarkets_secret_key: SecretStr = Field( default=..., client_data=ClientFieldData( prompt=lambda cm: f"Enter your {Constants.EXCHANGE_NAME} secret key", is_secure=True, is_connect_key=True, prompt_on_new=True, )) class Config: title = "altmarkets"