Skip to content

Commit

Permalink
pretty annotations & update deps (#52)
Browse files Browse the repository at this point in the history
  • Loading branch information
DBoyara authored Feb 25, 2025
1 parent d3ce009 commit dd79da5
Show file tree
Hide file tree
Showing 9 changed files with 1,104 additions and 988 deletions.
5 changes: 1 addition & 4 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
PROGRAM_NAME = finam-trade-api

.PHONY: help clean dep dep-test sort mypy flake8
.PHONY: help clean dep dep-test sort mypy

.DEFAULT_GOAL := help

Expand All @@ -19,6 +19,3 @@ sort:

mypy:
mypy finam_trade_api

flake8:
flake8 finam_trade_api
12 changes: 6 additions & 6 deletions examples/candles.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
)
from finam_trade_api.client import Client

token = os.getenv("TOKEN", "")
token = os.getenv("TOKEN", "CAEQx4uXBhoY976DzzTuCEu0XXVtJ76bj2kvUAhgvX2a")


async def get_day_candles():
Expand All @@ -26,10 +26,10 @@ async def get_day_candles():
async def get_in_day_candles():
client = Client(token)
params = IntraDayCandlesRequestModel(
securityBoard="TQBR",
securityCode="SBER",
timeFrame=IntraDayInterval.M1,
intervalFrom="2023-06-07 08:33:52",
securityBoard="FUT",
securityCode="CRH5",
timeFrame=IntraDayInterval.M5,
intervalTo='2025-02-24 14:25:45',
count=10
)
return await client.candles.get_in_day_candles(params)
Expand All @@ -38,6 +38,6 @@ async def get_in_day_candles():
if __name__ == "__main__":
import asyncio

print(asyncio.run(get_day_candles()))
# print(asyncio.run(get_day_candles()))

print(asyncio.run(get_in_day_candles()))
11 changes: 5 additions & 6 deletions finam_trade_api/candles/model.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
from enum import Enum
from typing import List, Optional

from pydantic import BaseModel

Expand All @@ -19,9 +18,9 @@ class IntraDayInterval(str, Enum):
class BaseCandlesRequestModel(BaseModel):
securityBoard: str
securityCode: str
intervalFrom: Optional[str]
intervalTo: Optional[str]
count: Optional[int]
intervalFrom: str | None = None
intervalTo: str | None
count: int | None


class DayCandlesRequestModel(BaseCandlesRequestModel):
Expand Down Expand Up @@ -50,7 +49,7 @@ class DayCandle(BaseCandleModel):


class CandlesResponse(BaseModel):
candles: List[DayCandle]
candles: list[DayCandle]


class DayCandlesResponse(BaseModel):
Expand All @@ -62,7 +61,7 @@ class IntraDayCandle(BaseCandleModel):


class InDayCandlesResponse(BaseModel):
candles: List[IntraDayCandle]
candles: list[IntraDayCandle]


class IntraDayCandlesResponse(BaseModel):
Expand Down
122 changes: 60 additions & 62 deletions finam_trade_api/order/model.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
from enum import Enum
from typing import List, Optional

from pydantic import BaseModel

Expand Down Expand Up @@ -52,20 +51,20 @@ class StopPriceUnits(str, Enum):

class OrdersRequestModel(BaseModel):
clientId: str
includeMatched: Optional[str] = None
includeCanceled: Optional[str] = None
includeActive: Optional[str] = None
includeMatched: str | None = None
includeCanceled: str | None = None
includeActive: str | None = None


class Condition(BaseModel):
type: ConditionType
price: float # цена активации
time: Optional[str] = None
time: str | None = None


class ValidBefore(BaseModel):
type: ValidBeforeType
time: Optional[str] = None
time: str | None = None


class OrderStatus(str, Enum):
Expand All @@ -75,29 +74,57 @@ class OrderStatus(str, Enum):
Matched = "Matched"


class StopQuantity(BaseModel):
value: float # Значение объема.
units: StopQuantityUnits # Единицы объема стоп-заявки.


class StopLossModel(BaseModel):
activationPrice: float
price: float | None = None
marketPrice: bool
quantity: StopQuantity
time: int = 0 # Защитное время, сек.
useCredit: bool = False


class StopPrice(BaseModel):
value: float # Значение объема.
units: StopPriceUnits # Единицы объема стоп-заявки.


class TakeProfitModel(BaseModel):
activationPrice: float
correctionPrice: StopPrice | None = None
spreadPrice: StopPrice | None = None
marketPrice: bool
quantity: StopQuantity
time: int = 0 # Защитное время, сек.
useCredit: bool = False

class Order(BaseModel):
orderNo: int
transactionId: int
securityCode: Optional[str] = None
clientId: Optional[str] = None
securityCode: str | None = None
clientId: str | None = None
status: OrderStatus
buySell: OrderType
createdAt: Optional[str] = None
acceptedAt: Optional[str] = None
price: float = 0 # В последующих версиях API поле для рыночных заявок будет равно null, а не 0.
createdAt: str | None = None
acceptedAt: str | None = None
price: float | None = None
quantity: int
balance: int
message: Optional[str] = None
currency: Optional[str] = None
condition: Optional[Condition] = None
validBefore: Optional[ValidBefore] = None
securityBoard: Optional[str] = None
message: str | None = None
currency: str | None = None
condition: Condition | None = None
validBefore: ValidBefore | None = None
securityBoard: str | None = None
market: Market


class OrdersResponseData(BaseModel):
clientId: str
orders: List[Order]
orders: list[Order]


class OrdersResponseModel(BaseModel):
Expand All @@ -111,25 +138,25 @@ class StopOrder(BaseModel):
market: Market
clientId: str
buySell: OrderType
expirationDate: Optional[str] = None
expirationDate: str | None = None
linkOrder: int
validBefore: Optional[ValidBefore] = None
validBefore: ValidBefore | None = None
status: OrderStatus
message: Optional[str] = None
message: str | None = None
orderNo: int
tradeNo: int
acceptedAt: Optional[str] = None
canceledAt: Optional[str] = None
currency: Optional[str] = None
acceptedAt: str | None = None
canceledAt: str | None = None
currency: str | None = None
takeProfitExtremum: float
takeProfitLevel: float
stopLoss: Optional["StopLossModel"] = None
takeProfit: Optional["TakeProfitModel"] = None
stopLoss: StopLossModel | None = None
takeProfit: TakeProfitModel | None = None


class StopOrdersResponseData(BaseModel):
clientId: str
stops: List[StopOrder]
stops: list[StopOrder]


class StopOrdersResponseModel(BaseModel):
Expand All @@ -155,37 +182,8 @@ class CreateOrderRequestModel(BaseModel):
useCredit: bool = False
price: float | None = None
property: PropertyType
condition: Optional[Condition] = None
validBefore: Optional[ValidBefore] = None


class StopQuantity(BaseModel):
value: float # Значение объема.
units: StopQuantityUnits # Единицы объема стоп-заявки.


class StopLossModel(BaseModel):
activationPrice: float
price: float = 0
marketPrice: bool
quantity: StopQuantity
time: int = 0 # Защитное время, сек.
useCredit: bool = False


class StopPrice(BaseModel):
value: float # Значение объема.
units: StopPriceUnits # Единицы объема стоп-заявки.


class TakeProfitModel(BaseModel):
activationPrice: float
correctionPrice: Optional[StopPrice] = None
spreadPrice: Optional[StopPrice] = None
marketPrice: bool
quantity: StopQuantity
time: int = 0 # Защитное время, сек.
useCredit: bool = False
condition: Condition | None = None
validBefore: ValidBefore | None = None


class CreateStopOrderRequestModel(BaseModel):
Expand All @@ -195,16 +193,16 @@ class CreateStopOrderRequestModel(BaseModel):
buySell: OrderType
stopLoss: StopLossModel
takeProfit: TakeProfitModel
expirationDate: Optional[str] = None
linkOrder: Optional[int] = None
validBefore: Optional[ValidBefore] = None
expirationDate: str | None = None
linkOrder: int | None = None
validBefore: ValidBefore | None = None


class CreateStopOrderData(BaseModel):
clientId: str
stopId: int
securityCode: Optional[str] = None
securityBoard: Optional[str] = None
securityCode: str | None = None
securityBoard: str | None = None


class CreateStopOrderResponseModel(BaseModel):
Expand Down
8 changes: 3 additions & 5 deletions finam_trade_api/portfolio/model.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
from typing import List

from pydantic import BaseModel

from finam_trade_api.models import Market
Expand Down Expand Up @@ -61,9 +59,9 @@ class PortfolioResponseData(BaseModel):
content: PortfolioContent
equity: float
balance: float
positions: List[Position]
currencies: List[Currency]
money: List[Money]
positions: list[Position]
currencies: list[Currency]
money: list[Money]


class PortfolioResponseModel(BaseModel):
Expand Down
12 changes: 5 additions & 7 deletions finam_trade_api/securities/model.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
from typing import List, Optional

from pydantic import BaseModel

from finam_trade_api.models import Market
Expand All @@ -12,19 +10,19 @@ class Security(BaseModel):
decimals: int
lotSize: int
minStep: int
currency: Optional[str] = None
shortName: Optional[str] = None
currency: str | None = None
shortName: str | None = None
properties: int
timeZoneName: Optional[str] = None
timeZoneName: str | None = None
bpCost: float
accruedInterest: float
priceSign: str
ticker: Optional[str] = None
ticker: str | None = None
lotDivider: int


class SecurityData(BaseModel):
securities: List[Security]
securities: list[Security]


class SecurityResponseModel(BaseModel):
Expand Down
Loading

0 comments on commit dd79da5

Please sign in to comment.