mtcli 3.5.0.dev0__tar.gz → 3.5.0.dev2__tar.gz
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.
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/PKG-INFO +1 -1
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/marketdata/tick_repository.py +40 -30
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/pyproject.toml +1 -1
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/LICENSE +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/README.md +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/__init__.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/commands/__init__.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/commands/bars.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/commands/conf.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/commands/logs.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/conecta.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/conf.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/data/__init__.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/data/base.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/data/csv.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/data/mt5.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/database.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/domain/__init__.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/domain/timeframe.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/logger.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/marketdata/__init__.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/marketdata/tick_cache.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/models/__init__.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/models/bar_model.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/models/bars_model.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/models/chart_model.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/models/conf_model.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/models/consecutive_bars_model.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/models/rates_model.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/models/signals_model.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/models/unconsecutive_bar_model.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/mt.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/mt5_context.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugin.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/__init__.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/media_movel/__init__.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/media_movel/command.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/media_movel/conf.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/media_movel/models/__init__.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/media_movel/models/model_media_movel.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/media_movel/tests/__init__.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/media_movel/tests/test_mm.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/media_movel/tests/test_model_media_movel.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/range_medio/__init__.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/range_medio/command.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/range_medio/conf.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/range_medio/models/__init__.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/range_medio/models/average_range_model.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/range_medio/tests/__init__.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/range_medio/tests/test_rm.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/volume_medio/__init__.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/volume_medio/command.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/volume_medio/conf.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/volume_medio/models/__init__.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/volume_medio/models/model_average_volume.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/volume_medio/tests/__init__.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/volume_medio/tests/test_vm.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/views/__init__.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/views/close_view.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/views/full_view.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/views/high_view.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/views/low_view.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/views/min_view.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/views/open_view.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/views/ranges_view.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/views/rates_view.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/views/vars_view.py +0 -0
- {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/views/volumes_view.py +0 -0
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
TickRepository centralizado.
|
|
3
3
|
|
|
4
4
|
Responsável por:
|
|
5
|
-
- Sincronizar com MT5
|
|
6
|
-
- Persistir ticks
|
|
5
|
+
- Sincronizar com MT5 via mt5_conexao
|
|
6
|
+
- Persistir ticks corretamente (structured array numpy)
|
|
7
7
|
- Fornecer ticks para modelos
|
|
8
8
|
"""
|
|
9
9
|
|
|
@@ -12,6 +12,7 @@ from datetime import datetime, timedelta
|
|
|
12
12
|
|
|
13
13
|
from ..database import get_connection
|
|
14
14
|
from .tick_cache import TickCache
|
|
15
|
+
from mtcli.mt5_context import mt5_conexao
|
|
15
16
|
|
|
16
17
|
|
|
17
18
|
class TickRepository:
|
|
@@ -20,9 +21,9 @@ class TickRepository:
|
|
|
20
21
|
self.conn = get_connection()
|
|
21
22
|
self.cache = TickCache()
|
|
22
23
|
|
|
23
|
-
#
|
|
24
|
+
# ============================================================
|
|
24
25
|
# SINCRONIZAÇÃO INCREMENTAL
|
|
25
|
-
#
|
|
26
|
+
# ============================================================
|
|
26
27
|
|
|
27
28
|
def sync(self, symbol: str, days_back: int = 1):
|
|
28
29
|
"""
|
|
@@ -31,44 +32,53 @@ class TickRepository:
|
|
|
31
32
|
Busca apenas ticks após o último armazenado.
|
|
32
33
|
"""
|
|
33
34
|
|
|
34
|
-
|
|
35
|
+
with mt5_conexao():
|
|
35
36
|
|
|
36
|
-
|
|
37
|
-
start = datetime.fromtimestamp(last_time)
|
|
38
|
-
else:
|
|
39
|
-
start = datetime.now() - timedelta(days=days_back)
|
|
37
|
+
last_time = self._get_last_tick_time(symbol)
|
|
40
38
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
39
|
+
if last_time:
|
|
40
|
+
start = datetime.fromtimestamp(last_time)
|
|
41
|
+
else:
|
|
42
|
+
start = datetime.now() - timedelta(days=days_back)
|
|
43
|
+
|
|
44
|
+
ticks = mt5.copy_ticks_from(
|
|
45
|
+
symbol,
|
|
46
|
+
start,
|
|
47
|
+
200000,
|
|
48
|
+
mt5.COPY_TICKS_ALL,
|
|
49
|
+
)
|
|
47
50
|
|
|
48
|
-
|
|
49
|
-
|
|
51
|
+
if ticks is None or len(ticks) == 0:
|
|
52
|
+
return 0
|
|
50
53
|
|
|
51
|
-
|
|
52
|
-
|
|
54
|
+
inserted = self._insert_ticks(symbol, ticks)
|
|
55
|
+
self.cache.add_many(ticks)
|
|
53
56
|
|
|
54
|
-
|
|
57
|
+
return inserted
|
|
55
58
|
|
|
56
|
-
#
|
|
59
|
+
# ============================================================
|
|
57
60
|
# INSERÇÃO
|
|
58
|
-
#
|
|
61
|
+
# ============================================================
|
|
59
62
|
|
|
60
63
|
def _insert_ticks(self, symbol, ticks):
|
|
64
|
+
"""
|
|
65
|
+
Insere ticks no SQLite.
|
|
66
|
+
|
|
67
|
+
O retorno do MT5 é numpy structured array.
|
|
68
|
+
Acesso deve ser por campo: t["time"], t["last"], etc.
|
|
69
|
+
"""
|
|
70
|
+
|
|
61
71
|
cursor = self.conn.cursor()
|
|
62
72
|
|
|
63
73
|
data = [
|
|
64
74
|
(
|
|
65
75
|
symbol,
|
|
66
|
-
int(t
|
|
67
|
-
float(t
|
|
68
|
-
float(t
|
|
69
|
-
float(t
|
|
70
|
-
float(t
|
|
71
|
-
int(t
|
|
76
|
+
int(t["time"]),
|
|
77
|
+
float(t["bid"]),
|
|
78
|
+
float(t["ask"]),
|
|
79
|
+
float(t["last"]),
|
|
80
|
+
float(t["volume"]),
|
|
81
|
+
int(t["flags"]),
|
|
72
82
|
)
|
|
73
83
|
for t in ticks
|
|
74
84
|
]
|
|
@@ -84,9 +94,9 @@ class TickRepository:
|
|
|
84
94
|
self.conn.commit()
|
|
85
95
|
return cursor.rowcount
|
|
86
96
|
|
|
87
|
-
#
|
|
97
|
+
# ============================================================
|
|
88
98
|
# CONSULTAS
|
|
89
|
-
#
|
|
99
|
+
# ============================================================
|
|
90
100
|
|
|
91
101
|
def get_ticks_between(self, symbol, start_ts, end_ts):
|
|
92
102
|
cursor = self.conn.cursor()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/media_movel/tests/test_model_media_movel.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/range_medio/models/average_range_model.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/volume_medio/models/model_average_volume.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|