Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
wiseplat
GitHub Repository: wiseplat/python-code
Path: blob/master/ invest-robot-contest_tinkoff-invest-volume-analysis-robot-master/utils/order_util.py
5927 views
1
from datetime import datetime
2
from typing import List
3
from uuid import uuid4
4
5
from tinkoff.invest import OrderDirection
6
7
from domains.order import Order
8
9
10
# подготовка списка ордеров для открытия сделки
11
def prepare_orders(
12
instrument: str,
13
current_price: float,
14
time: datetime,
15
stop_loss: float,
16
direction: OrderDirection,
17
count_lots: int,
18
count_goals: int,
19
goal_step: float,
20
first_goal: int
21
) -> List[Order]:
22
group_id = str(uuid4())
23
quantity = int(count_lots / count_goals)
24
25
orders = []
26
step = 1
27
final_step = (goal_step * count_goals) + 1
28
while step < final_step:
29
take = current_price - ((stop_loss - current_price) * first_goal * step)
30
order = Order(
31
id=str(uuid4()),
32
group_id=group_id,
33
instrument=instrument,
34
open=current_price,
35
stop=stop_loss,
36
take=take,
37
quantity=quantity,
38
direction=direction.value,
39
time=time
40
)
41
orders.append(order)
42
step += goal_step
43
return orders
44
45
46
def is_order_already_open(orders: List[Order], order: Order) -> bool:
47
active_order = list(filter(
48
lambda item: item.instrument == order.instrument and
49
item.direction == order.direction and
50
item.status == "active",
51
orders)
52
)
53
if len(active_order) > 0:
54
# если уже есть активная заявка, но она с одной группы (точки входа), то считаю ее новой
55
if order.group_id == active_order[0].group_id:
56
return False
57
# если уже есть активная заявка, но она не совпадает с текущей группой (точкой входа),
58
# то запрещаю создание новой до тех пор, пока активная заявка не будет закрыта
59
return True
60
return False
61
62
63
# возвращаю текущие открытые сделки, если поступила новая с обратным направлением
64
def get_reverse_order(orders: List[Order], order: Order) -> List[Order]:
65
active_order = list(filter(
66
lambda item: item.instrument == order.instrument and
67
item.status == "active" and
68
item.direction != order.direction,
69
orders)
70
)
71
return active_order
72
73