tradepose-models 1.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- tradepose_models/__init__.py +44 -0
- tradepose_models/auth/__init__.py +13 -0
- tradepose_models/auth/api_keys.py +52 -0
- tradepose_models/auth/auth.py +20 -0
- tradepose_models/base.py +57 -0
- tradepose_models/billing/__init__.py +33 -0
- tradepose_models/billing/checkout.py +17 -0
- tradepose_models/billing/plans.py +32 -0
- tradepose_models/billing/subscriptions.py +34 -0
- tradepose_models/billing/usage.py +71 -0
- tradepose_models/broker/__init__.py +34 -0
- tradepose_models/broker/account_config.py +93 -0
- tradepose_models/broker/account_models.py +61 -0
- tradepose_models/broker/binding.py +54 -0
- tradepose_models/broker/connection_status.py +14 -0
- tradepose_models/commands/__init__.py +8 -0
- tradepose_models/commands/trader_command.py +80 -0
- tradepose_models/datafeed/__init__.py +19 -0
- tradepose_models/datafeed/events.py +132 -0
- tradepose_models/enums/__init__.py +47 -0
- tradepose_models/enums/account_source.py +42 -0
- tradepose_models/enums/broker_type.py +21 -0
- tradepose_models/enums/currency.py +17 -0
- tradepose_models/enums/engagement_phase.py +47 -0
- tradepose_models/enums/execution_mode.py +16 -0
- tradepose_models/enums/export_type.py +23 -0
- tradepose_models/enums/freq.py +32 -0
- tradepose_models/enums/indicator_type.py +46 -0
- tradepose_models/enums/operation_type.py +19 -0
- tradepose_models/enums/order_strategy.py +47 -0
- tradepose_models/enums/orderbook_event_type.py +29 -0
- tradepose_models/enums/persist_mode.py +28 -0
- tradepose_models/enums/stream.py +14 -0
- tradepose_models/enums/task_status.py +23 -0
- tradepose_models/enums/trade_direction.py +42 -0
- tradepose_models/enums/trend_type.py +22 -0
- tradepose_models/enums/weekday.py +30 -0
- tradepose_models/enums.py +32 -0
- tradepose_models/events/__init__.py +11 -0
- tradepose_models/events/order_events.py +79 -0
- tradepose_models/export/__init__.py +19 -0
- tradepose_models/export/request.py +52 -0
- tradepose_models/export/requests.py +75 -0
- tradepose_models/export/task_metadata.py +97 -0
- tradepose_models/gateway/__init__.py +19 -0
- tradepose_models/gateway/responses.py +37 -0
- tradepose_models/indicators/__init__.py +56 -0
- tradepose_models/indicators/base.py +42 -0
- tradepose_models/indicators/factory.py +254 -0
- tradepose_models/indicators/market_profile.md +60 -0
- tradepose_models/indicators/market_profile.py +333 -0
- tradepose_models/indicators/market_profile_developer.md +1782 -0
- tradepose_models/indicators/market_profile_trading.md +1060 -0
- tradepose_models/indicators/momentum.py +53 -0
- tradepose_models/indicators/moving_average.py +63 -0
- tradepose_models/indicators/other.py +40 -0
- tradepose_models/indicators/trend.py +80 -0
- tradepose_models/indicators/volatility.py +57 -0
- tradepose_models/instruments/__init__.py +13 -0
- tradepose_models/instruments/instrument.py +87 -0
- tradepose_models/scheduler/__init__.py +9 -0
- tradepose_models/scheduler/results.py +49 -0
- tradepose_models/schemas/__init__.py +15 -0
- tradepose_models/schemas/enhanced_ohlcv.py +111 -0
- tradepose_models/schemas/performance.py +40 -0
- tradepose_models/schemas/trades.py +64 -0
- tradepose_models/schemas.py +34 -0
- tradepose_models/shared.py +15 -0
- tradepose_models/strategy/__init__.py +52 -0
- tradepose_models/strategy/base.py +56 -0
- tradepose_models/strategy/blueprint.py +55 -0
- tradepose_models/strategy/config.py +142 -0
- tradepose_models/strategy/entities.py +104 -0
- tradepose_models/strategy/helpers.py +173 -0
- tradepose_models/strategy/indicator_spec.py +531 -0
- tradepose_models/strategy/performance.py +66 -0
- tradepose_models/strategy/portfolio.py +171 -0
- tradepose_models/strategy/registry.py +249 -0
- tradepose_models/strategy/requests.py +33 -0
- tradepose_models/strategy/trigger.py +77 -0
- tradepose_models/trading/__init__.py +55 -0
- tradepose_models/trading/engagement.py +160 -0
- tradepose_models/trading/orderbook.py +73 -0
- tradepose_models/trading/orders.py +137 -0
- tradepose_models/trading/positions.py +78 -0
- tradepose_models/trading/trader_commands.py +138 -0
- tradepose_models/trading/trades_execution.py +27 -0
- tradepose_models/types.py +35 -0
- tradepose_models/utils/__init__.py +13 -0
- tradepose_models/utils/rate_converter.py +112 -0
- tradepose_models/validators.py +32 -0
- tradepose_models-1.1.0.dist-info/METADATA +633 -0
- tradepose_models-1.1.0.dist-info/RECORD +94 -0
- tradepose_models-1.1.0.dist-info/WHEEL +4 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"""Multi-currency rate converter module.
|
|
2
|
+
|
|
3
|
+
Provides currency conversion utilities with USD as the base currency.
|
|
4
|
+
All conversions A → B are executed as A → USD → B.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from decimal import Decimal
|
|
8
|
+
|
|
9
|
+
from tradepose_models.enums import Currency
|
|
10
|
+
|
|
11
|
+
# Default exchange rates (1 unit of currency = X USD)
|
|
12
|
+
DEFAULT_RATES: dict[Currency, Decimal] = {
|
|
13
|
+
# Base currencies
|
|
14
|
+
Currency.USD: Decimal("1"),
|
|
15
|
+
Currency.USDT: Decimal("1"),
|
|
16
|
+
# Fiat currencies
|
|
17
|
+
Currency.TWD: Decimal("1") / Decimal("32.5"), # 1 TWD ≈ 0.0308 USD
|
|
18
|
+
Currency.EUR: Decimal("1.08"), # 1 EUR = 1.08 USD
|
|
19
|
+
Currency.JPY: Decimal("1") / Decimal("157"), # 1 JPY ≈ 0.0064 USD
|
|
20
|
+
# Cryptocurrencies
|
|
21
|
+
Currency.BTC: Decimal("95000"), # 1 BTC = 95000 USD
|
|
22
|
+
Currency.ETH: Decimal("3400"), # 1 ETH = 3400 USD
|
|
23
|
+
# Commodities/Indices
|
|
24
|
+
Currency.XAU: Decimal("2600"), # 1 oz Gold = 2600 USD
|
|
25
|
+
Currency.TAIEX: Decimal("200") / Decimal("32.5"), # TAIEX point value: 200 TWD
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class RateConverter:
|
|
30
|
+
"""Multi-currency rate converter.
|
|
31
|
+
|
|
32
|
+
Uses USD as the base currency for a centralized conversion model.
|
|
33
|
+
All conversions A → B are executed as A → USD → B.
|
|
34
|
+
|
|
35
|
+
Example:
|
|
36
|
+
>>> rates = {Currency.USD: Decimal("1"), Currency.TWD: Decimal("0.0308")}
|
|
37
|
+
>>> converter = RateConverter(rates)
|
|
38
|
+
>>> converter.convert(Decimal("1000"), Currency.USD, Currency.TWD)
|
|
39
|
+
Decimal('32467.532467...')
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
def __init__(self, rates_to_usd: dict[Currency, Decimal]) -> None:
|
|
43
|
+
"""Initialize the rate converter.
|
|
44
|
+
|
|
45
|
+
Args:
|
|
46
|
+
rates_to_usd: Exchange rates where each value represents
|
|
47
|
+
how many USD 1 unit of that currency equals.
|
|
48
|
+
Example: {Currency.BTC: Decimal("95000")} means 1 BTC = 95000 USD
|
|
49
|
+
|
|
50
|
+
Raises:
|
|
51
|
+
ValueError: If USD rate is not 1 or any rate is non-positive.
|
|
52
|
+
"""
|
|
53
|
+
if rates_to_usd.get(Currency.USD) != Decimal("1"):
|
|
54
|
+
raise ValueError("USD 必須為基準貨幣,匯率必須為 1")
|
|
55
|
+
if any(rate <= 0 for rate in rates_to_usd.values()):
|
|
56
|
+
raise ValueError("所有匯率必須為正數")
|
|
57
|
+
self._rates = rates_to_usd.copy()
|
|
58
|
+
|
|
59
|
+
def convert(
|
|
60
|
+
self,
|
|
61
|
+
amount: Decimal,
|
|
62
|
+
from_currency: Currency,
|
|
63
|
+
to_currency: Currency,
|
|
64
|
+
) -> Decimal:
|
|
65
|
+
"""Convert an amount from one currency to another.
|
|
66
|
+
|
|
67
|
+
Args:
|
|
68
|
+
amount: The amount to convert.
|
|
69
|
+
from_currency: The source currency.
|
|
70
|
+
to_currency: The target currency.
|
|
71
|
+
|
|
72
|
+
Returns:
|
|
73
|
+
The converted amount in the target currency.
|
|
74
|
+
|
|
75
|
+
Raises:
|
|
76
|
+
ValueError: If either currency is not supported.
|
|
77
|
+
"""
|
|
78
|
+
if from_currency not in self._rates or to_currency not in self._rates:
|
|
79
|
+
raise ValueError(f"不支援的幣種:{from_currency} 或 {to_currency}")
|
|
80
|
+
|
|
81
|
+
amount_in_usd = amount * self._rates[from_currency]
|
|
82
|
+
return amount_in_usd / self._rates[to_currency]
|
|
83
|
+
|
|
84
|
+
def get_rate(
|
|
85
|
+
self,
|
|
86
|
+
from_currency: Currency,
|
|
87
|
+
to_currency: Currency,
|
|
88
|
+
) -> Decimal:
|
|
89
|
+
"""Get the exchange rate between two currencies.
|
|
90
|
+
|
|
91
|
+
Args:
|
|
92
|
+
from_currency: The source currency.
|
|
93
|
+
to_currency: The target currency.
|
|
94
|
+
|
|
95
|
+
Returns:
|
|
96
|
+
The exchange rate (how many units of to_currency per 1 unit of from_currency).
|
|
97
|
+
|
|
98
|
+
Raises:
|
|
99
|
+
ValueError: If either currency is not supported.
|
|
100
|
+
"""
|
|
101
|
+
if from_currency not in self._rates or to_currency not in self._rates:
|
|
102
|
+
raise ValueError(f"不支援的幣種:{from_currency} 或 {to_currency}")
|
|
103
|
+
return self._rates[from_currency] / self._rates[to_currency]
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def get_default_converter() -> RateConverter:
|
|
107
|
+
"""Get a converter initialized with default exchange rates.
|
|
108
|
+
|
|
109
|
+
Returns:
|
|
110
|
+
A RateConverter instance with DEFAULT_RATES.
|
|
111
|
+
"""
|
|
112
|
+
return RateConverter(DEFAULT_RATES)
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"""Shared validation utilities (共用驗證工具).
|
|
2
|
+
|
|
3
|
+
This module contains reusable Pydantic validators and validation functions
|
|
4
|
+
that are used across multiple packages.
|
|
5
|
+
|
|
6
|
+
這個模組包含跨多個包使用的可重用 Pydantic 驗證器和驗證函數。
|
|
7
|
+
|
|
8
|
+
Example usage:
|
|
9
|
+
from pydantic import BaseModel, field_validator
|
|
10
|
+
from tradepose_models.validators import validate_api_key_format
|
|
11
|
+
|
|
12
|
+
class APIKeyModel(BaseModel):
|
|
13
|
+
key: str
|
|
14
|
+
|
|
15
|
+
@field_validator('key')
|
|
16
|
+
@classmethod
|
|
17
|
+
def validate_key(cls, v):
|
|
18
|
+
return validate_api_key_format(v)
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
# Placeholder for shared validators
|
|
22
|
+
# Validators will be added here as needed
|
|
23
|
+
# 共用驗證器將根據需要添加到這裡
|
|
24
|
+
|
|
25
|
+
# Example structure:
|
|
26
|
+
# def validate_api_key_format(value: str) -> str:
|
|
27
|
+
# """Validate API key format."""
|
|
28
|
+
# if not value.startswith('sk_'):
|
|
29
|
+
# raise ValueError("API key must start with 'sk_'")
|
|
30
|
+
# return value
|
|
31
|
+
|
|
32
|
+
__all__ = []
|