Path: blob/master/ invest-robot-contest_tinkoff-invest-volume-analysis-robot-master/utils/order_util.py
5927 views
from datetime import datetime1from typing import List2from uuid import uuid434from tinkoff.invest import OrderDirection56from domains.order import Order789# подготовка списка ордеров для открытия сделки10def prepare_orders(11instrument: str,12current_price: float,13time: datetime,14stop_loss: float,15direction: OrderDirection,16count_lots: int,17count_goals: int,18goal_step: float,19first_goal: int20) -> List[Order]:21group_id = str(uuid4())22quantity = int(count_lots / count_goals)2324orders = []25step = 126final_step = (goal_step * count_goals) + 127while step < final_step:28take = current_price - ((stop_loss - current_price) * first_goal * step)29order = Order(30id=str(uuid4()),31group_id=group_id,32instrument=instrument,33open=current_price,34stop=stop_loss,35take=take,36quantity=quantity,37direction=direction.value,38time=time39)40orders.append(order)41step += goal_step42return orders434445def is_order_already_open(orders: List[Order], order: Order) -> bool:46active_order = list(filter(47lambda item: item.instrument == order.instrument and48item.direction == order.direction and49item.status == "active",50orders)51)52if len(active_order) > 0:53# если уже есть активная заявка, но она с одной группы (точки входа), то считаю ее новой54if order.group_id == active_order[0].group_id:55return False56# если уже есть активная заявка, но она не совпадает с текущей группой (точкой входа),57# то запрещаю создание новой до тех пор, пока активная заявка не будет закрыта58return True59return False606162# возвращаю текущие открытые сделки, если поступила новая с обратным направлением63def get_reverse_order(orders: List[Order], order: Order) -> List[Order]:64active_order = list(filter(65lambda item: item.instrument == order.instrument and66item.status == "active" and67item.direction != order.direction,68orders)69)70return active_order717273