From e38d14f4869f144be0518d26bab346bd6e6f8755 Mon Sep 17 00:00:00 2001 From: DBoyara Date: Fri, 1 Mar 2024 22:45:19 +0500 Subject: [PATCH] actualize data types; replace Market; rename Order (#37) * actualize data types; replace Market; rename Order --- README.md | 17 +-------- examples/order.py | 33 +++++----------- examples/security.py | 9 +---- finam_trade_api/models.py | 11 ++++++ finam_trade_api/order/__init__.py | 2 +- finam_trade_api/order/model.py | 59 ++++++++++++++++++----------- finam_trade_api/portfolio/model.py | 4 +- finam_trade_api/securities/model.py | 24 ++++++------ pyproject.toml | 2 +- setup.py | 2 +- 10 files changed, 77 insertions(+), 86 deletions(-) diff --git a/README.md b/README.md index ccf4e74..466b25c 100644 --- a/README.md +++ b/README.md @@ -158,23 +158,8 @@ async def create_stop_order(transaction_id: int): ), ) return await client.orders.create_stop_order(payload) - - -if __name__ == "__main__": - import asyncio - - res = asyncio.run(create_order()) - print(res) - - print(asyncio.run(create_stop_order(1111111111111111111))) - - print(asyncio.run(get_orders())) - - print(asyncio.run(del_order(res.data.transactionId))) - - print(asyncio.run(get_orders())) ``` - +Больше примеров в examples/ ## Authors diff --git a/examples/order.py b/examples/order.py index dc90cff..29f05d4 100644 --- a/examples/order.py +++ b/examples/order.py @@ -23,11 +23,11 @@ async def create_order(): payload = CreateOrderRequestModel( clientId=client_id, - securityBoard=BoardType.Futures, - securityCode="SiH3", - buySell=OrderType.Sell, + securityBoard=BoardType.TQBR, + securityCode="ALRS", + buySell=OrderType.Buy, quantity=1, - price=74920, + price=72.23, property=PropertyType.PutInQueue, condition=None, validateBefore=None, @@ -55,12 +55,12 @@ async def del_order(transaction_id: int): async def create_stop_order(transaction_id: int): payload = CreateStopOrderRequestModel( clientId=client_id, - securityBoard=BoardType.Futures, - securityCode="SiH3", - buySell=OrderType.Buy, + securityBoard=BoardType.TQBR, + securityCode="ALRS", + buySell=OrderType.Sell, linkOrder=transaction_id, stopLoss=StopLossModel( - activationPrice=74940, + activationPrice=71.80, marketPrice=True, quantity=StopQuantity( value=1, @@ -68,7 +68,7 @@ async def create_stop_order(transaction_id: int): ) ), takeProfit=TakeProfitModel( - activationPrice=74850, + activationPrice=72.30, marketPrice=True, quantity=StopQuantity( value=1, @@ -77,18 +77,3 @@ async def create_stop_order(transaction_id: int): ), ) return await client.orders.create_stop_order(payload) - - -if __name__ == "__main__": - import asyncio - - res = asyncio.run(create_order()) - print(res) - - print(asyncio.run(create_stop_order(1111111111111111111))) - - print(asyncio.run(get_orders())) - - print(asyncio.run(del_order(res.data.transactionId))) - - print(asyncio.run(get_orders())) diff --git a/examples/security.py b/examples/security.py index 9bdac4b..b831143 100644 --- a/examples/security.py +++ b/examples/security.py @@ -6,10 +6,6 @@ client = Client(token) -async def get_all_data(): - return await client.securities.get_data() - - async def get_data_by_code(code: str): return await client.securities.get_data(code) @@ -17,7 +13,4 @@ async def get_data_by_code(code: str): if __name__ == "__main__": import asyncio - print(asyncio.run(get_all_data())) - - code_ = "SiZ2" - print(asyncio.run(get_data_by_code(code_))) + print(asyncio.run(get_data_by_code("SBER"))) diff --git a/finam_trade_api/models.py b/finam_trade_api/models.py index 4ae1ab2..b618585 100644 --- a/finam_trade_api/models.py +++ b/finam_trade_api/models.py @@ -1,3 +1,4 @@ +from enum import Enum from typing import Optional from pydantic import BaseModel @@ -11,3 +12,13 @@ class BaseErrorModel(BaseModel): class ErrorBodyModel(BaseModel): error: BaseErrorModel + + +class Market(str, Enum): + Stock = "Stock" + Forts = "Forts" + Spbex = "Spbex" + Mma = "Mma" + Ets = "Ets" + Bonds = "Bonds" + Options = "Options" diff --git a/finam_trade_api/order/__init__.py b/finam_trade_api/order/__init__.py index 6daff9f..7de5ddc 100644 --- a/finam_trade_api/order/__init__.py +++ b/finam_trade_api/order/__init__.py @@ -13,7 +13,7 @@ DelStopOrderData, DelStopOrderRequestModel, DelStopOrderResponseModel, - OrderResponse, + Order, OrdersRequestModel, OrdersResponseData, OrdersResponseModel, diff --git a/finam_trade_api/order/model.py b/finam_trade_api/order/model.py index c035819..f69d414 100644 --- a/finam_trade_api/order/model.py +++ b/finam_trade_api/order/model.py @@ -3,6 +3,8 @@ from pydantic import BaseModel +from finam_trade_api.models import Market + class OrderType(str, Enum): Sell = "Sell" @@ -21,9 +23,9 @@ class ConditionType(str, Enum): class PropertyType(str, Enum): - PutInQueue = "PutInQueue" - CancelBalance = "CancelBalance" - ImmOrCancel = "ImmOrCancel" + PutInQueue = "PutInQueue" # неисполненная часть заявки помещается в очередь заявок биржи; + CancelBalance = "CancelBalance" # неисполненная часть заявки снимается с торгов; + ImmOrCancel = "ImmOrCancel" # сделки совершаются в том случае, если заявка может быть удовлетворена полностью class ValidBeforeType(str, Enum): @@ -67,31 +69,22 @@ class ValidBefore(BaseModel): class OrderStatus(str, Enum): + NONE = "None" Active = "Active" Cancelled = "Cancelled" Matched = "Matched" -class OrderMarket(str, Enum): - Stock = "Stock" - Forts = "Forts" - Spbex = "Spbex" - Mma = "Mma" - Ets = "Ets" - Bonds = "Bonds" - Options = "Options" - - -class OrderResponse(BaseModel): +class Order(BaseModel): orderNo: int transactionId: int securityCode: Optional[str] = None clientId: Optional[str] = None - status: Optional[OrderStatus] = None + status: OrderStatus buySell: OrderType createdAt: Optional[str] = None acceptedAt: Optional[str] = None - price: float = 0 + price: float = 0 # В последующих версиях API поле для рыночных заявок будет равно null, а не 0. quantity: int balance: int message: Optional[str] = None @@ -99,12 +92,12 @@ class OrderResponse(BaseModel): condition: Optional[Condition] = None validBefore: Optional[ValidBefore] = None securityBoard: Optional[str] = None - market: Optional[OrderMarket] = None + market: Market class OrdersResponseData(BaseModel): clientId: str - orders: List[OrderResponse] + orders: List[Order] class OrdersResponseModel(BaseModel): @@ -112,13 +105,31 @@ class OrdersResponseModel(BaseModel): class StopOrder(BaseModel): - stopOrderId: int + stopId: int securityCode: str + securityBoard: BoardType + market: Market + clientId: str + buySell: OrderType + expirationDate: Optional[str] = None + linkOrder: int + validBefore: Optional[ValidBefore] = None + status: OrderStatus + message: Optional[str] = None + orderNo: int + tradeNo: int + acceptedAt: Optional[str] = None + canceledAt: Optional[str] = None + currency: Optional[str] = None + takeProfitExtremum: float + takeProfitLevel: float + stopLoss: Optional["StopLossModel"] = None + takeProfit: Optional["TakeProfitModel"] = None class StopOrdersResponseData(BaseModel): clientId: str - stopOrders: List[StopOrder] + stops: List[StopOrder] class StopOrdersResponseModel(BaseModel): @@ -142,7 +153,7 @@ class CreateOrderRequestModel(BaseModel): buySell: OrderType quantity: int useCredit: bool = False - price: Optional[float] # цена заявки + price: float = 0 # В последующих версиях API поле для рыночных заявок будет равно null, а не 0. property: PropertyType condition: Optional[Condition] = None validBefore: Optional[ValidBefore] = None @@ -155,9 +166,11 @@ class StopQuantity(BaseModel): class StopLossModel(BaseModel): activationPrice: float - price: Optional[float] = None + price: float = 0 marketPrice: bool quantity: StopQuantity + time: int = 0 # Защитное время, сек. + useCredit: bool = False class StopPrice(BaseModel): @@ -171,7 +184,7 @@ class TakeProfitModel(BaseModel): spreadPrice: Optional[StopPrice] = None marketPrice: bool quantity: StopQuantity - time: Optional[int] = None # Защитное время, сек. + time: int = 0 # Защитное время, сек. useCredit: bool = False diff --git a/finam_trade_api/portfolio/model.py b/finam_trade_api/portfolio/model.py index 08138f8..2d3fd1d 100644 --- a/finam_trade_api/portfolio/model.py +++ b/finam_trade_api/portfolio/model.py @@ -2,6 +2,8 @@ from pydantic import BaseModel +from finam_trade_api.models import Market + class PortfolioRequestOptionalModel(BaseModel): includeCurrencies: str = "true" @@ -23,7 +25,7 @@ class PortfolioContent(BaseModel): class Position(BaseModel): securityCode: str - market: str + market: Market balance: int currentPrice: float equity: float diff --git a/finam_trade_api/securities/model.py b/finam_trade_api/securities/model.py index e9bf9bc..36d127a 100644 --- a/finam_trade_api/securities/model.py +++ b/finam_trade_api/securities/model.py @@ -1,24 +1,26 @@ -from typing import List +from typing import List, Optional from pydantic import BaseModel +from finam_trade_api.models import Market + class Security(BaseModel): code: str board: str - market: str - decimals: float - lotSize: float - minStep: float - currency: str - shortName: str - properties: float - timeZoneName: str + market: Market + decimals: int + lotSize: int + minStep: int + currency: Optional[str] = None + shortName: Optional[str] = None + properties: int + timeZoneName: Optional[str] = None bpCost: float accruedInterest: float priceSign: str - ticker: str - lotDivider: float + ticker: Optional[str] = None + lotDivider: int class SecurityData(BaseModel): diff --git a/pyproject.toml b/pyproject.toml index 9f13995..e0438e4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "finam-trade-api" -version = "2.2.0" +version = "2.3.0" description = "Асинхронный REST-клиент для API Finam" authors = ["DBoyara "] license = "GNU GPL v.3.0" diff --git a/setup.py b/setup.py index b6e1a27..8d2625a 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ maintainer="DBoyara", maintainer_email="boyarshin.den@yandex.ru", packages=find_packages(), - version="2.2.0", + version="2.3.0", install_requires=["aiohttp >= 3.8.3, < 4.0.0", "pydantic >= 1.10.2, < 2.0.0"], python_requires=">3.8.0, <4", license="GNU GPL v.3.0",