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.
Files changed (68) hide show
  1. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/PKG-INFO +1 -1
  2. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/marketdata/tick_repository.py +40 -30
  3. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/pyproject.toml +1 -1
  4. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/LICENSE +0 -0
  5. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/README.md +0 -0
  6. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/__init__.py +0 -0
  7. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/commands/__init__.py +0 -0
  8. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/commands/bars.py +0 -0
  9. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/commands/conf.py +0 -0
  10. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/commands/logs.py +0 -0
  11. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/conecta.py +0 -0
  12. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/conf.py +0 -0
  13. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/data/__init__.py +0 -0
  14. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/data/base.py +0 -0
  15. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/data/csv.py +0 -0
  16. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/data/mt5.py +0 -0
  17. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/database.py +0 -0
  18. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/domain/__init__.py +0 -0
  19. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/domain/timeframe.py +0 -0
  20. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/logger.py +0 -0
  21. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/marketdata/__init__.py +0 -0
  22. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/marketdata/tick_cache.py +0 -0
  23. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/models/__init__.py +0 -0
  24. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/models/bar_model.py +0 -0
  25. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/models/bars_model.py +0 -0
  26. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/models/chart_model.py +0 -0
  27. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/models/conf_model.py +0 -0
  28. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/models/consecutive_bars_model.py +0 -0
  29. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/models/rates_model.py +0 -0
  30. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/models/signals_model.py +0 -0
  31. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/models/unconsecutive_bar_model.py +0 -0
  32. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/mt.py +0 -0
  33. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/mt5_context.py +0 -0
  34. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugin.py +0 -0
  35. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/__init__.py +0 -0
  36. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/media_movel/__init__.py +0 -0
  37. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/media_movel/command.py +0 -0
  38. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/media_movel/conf.py +0 -0
  39. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/media_movel/models/__init__.py +0 -0
  40. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/media_movel/models/model_media_movel.py +0 -0
  41. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/media_movel/tests/__init__.py +0 -0
  42. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/media_movel/tests/test_mm.py +0 -0
  43. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/media_movel/tests/test_model_media_movel.py +0 -0
  44. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/range_medio/__init__.py +0 -0
  45. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/range_medio/command.py +0 -0
  46. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/range_medio/conf.py +0 -0
  47. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/range_medio/models/__init__.py +0 -0
  48. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/range_medio/models/average_range_model.py +0 -0
  49. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/range_medio/tests/__init__.py +0 -0
  50. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/range_medio/tests/test_rm.py +0 -0
  51. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/volume_medio/__init__.py +0 -0
  52. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/volume_medio/command.py +0 -0
  53. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/volume_medio/conf.py +0 -0
  54. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/volume_medio/models/__init__.py +0 -0
  55. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/volume_medio/models/model_average_volume.py +0 -0
  56. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/volume_medio/tests/__init__.py +0 -0
  57. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/plugins/volume_medio/tests/test_vm.py +0 -0
  58. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/views/__init__.py +0 -0
  59. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/views/close_view.py +0 -0
  60. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/views/full_view.py +0 -0
  61. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/views/high_view.py +0 -0
  62. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/views/low_view.py +0 -0
  63. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/views/min_view.py +0 -0
  64. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/views/open_view.py +0 -0
  65. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/views/ranges_view.py +0 -0
  66. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/views/rates_view.py +0 -0
  67. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/views/vars_view.py +0 -0
  68. {mtcli-3.5.0.dev0 → mtcli-3.5.0.dev2}/mtcli/views/volumes_view.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mtcli
3
- Version: 3.5.0.dev0
3
+ Version: 3.5.0.dev2
4
4
  Summary: Aplicativo CLI para exibir gráficos do MetaTrader 5 screen reader friendly
5
5
  License-Expression: MIT
6
6
  License-File: LICENSE
@@ -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
- last_time = self._get_last_tick_time(symbol)
35
+ with mt5_conexao():
35
36
 
36
- if last_time:
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
- ticks = mt5.copy_ticks_from(
42
- symbol,
43
- start,
44
- 100000,
45
- mt5.COPY_TICKS_ALL,
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
- if ticks is None or len(ticks) == 0:
49
- return 0
51
+ if ticks is None or len(ticks) == 0:
52
+ return 0
50
53
 
51
- inserted = self._insert_ticks(symbol, ticks)
52
- self.cache.add_many(ticks)
54
+ inserted = self._insert_ticks(symbol, ticks)
55
+ self.cache.add_many(ticks)
53
56
 
54
- return inserted
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.time),
67
- float(t.bid),
68
- float(t.ask),
69
- float(t.last),
70
- float(t.volume),
71
- int(t.flags),
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()
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mtcli"
3
- version = "3.5.0.dev0"
3
+ version = "3.5.0.dev2"
4
4
  description = "Aplicativo CLI para exibir gráficos do MetaTrader 5 screen reader friendly"
5
5
  authors = [
6
6
  {name = "Valmir França da Silva",email = "vfranca3@gmail.com"}
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