mtcli 3.8.0.dev1__tar.gz → 3.8.0.dev3__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 (82) hide show
  1. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/PKG-INFO +1 -1
  2. mtcli-3.8.0.dev3/mtcli/cli.py +105 -0
  3. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/conf.py +315 -309
  4. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/database.py +42 -4
  5. mtcli-3.8.0.dev3/mtcli/marketdata/tick_cache.py +61 -0
  6. mtcli-3.8.0.dev3/mtcli/marketdata/tick_engine.py +93 -0
  7. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/marketdata/tick_repository.py +16 -10
  8. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/marketdata/tick_streamer.py +4 -4
  9. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/pyproject.toml +1 -1
  10. mtcli-3.8.0.dev1/mtcli/cli.py +0 -135
  11. mtcli-3.8.0.dev1/mtcli/marketdata/tick_cache.py +0 -38
  12. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/LICENSE +0 -0
  13. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/README.md +0 -0
  14. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/__init__.py +0 -0
  15. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/commands/__init__.py +0 -0
  16. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/commands/bars.py +0 -0
  17. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/commands/conf.py +0 -0
  18. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/commands/doctor.py +0 -0
  19. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/commands/migrate.py +0 -0
  20. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/conecta.py +0 -0
  21. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/config_registre.py +0 -0
  22. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/data/__init__.py +0 -0
  23. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/data/base.py +0 -0
  24. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/data/csv.py +0 -0
  25. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/data/mt5.py +0 -0
  26. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/domain/__init__.py +0 -0
  27. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/domain/timeframe.py +0 -0
  28. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/logger.py +0 -0
  29. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/marketdata/__init__.py +0 -0
  30. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/migrations/001_initial_schema.py +0 -0
  31. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/migrations/002_ticks_time_msc.py +0 -0
  32. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/migrations/003_optimize_ticks_without_rowid.py +0 -0
  33. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/migrations/__init__.py +0 -0
  34. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/migrations/runner.py +0 -0
  35. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/models/__init__.py +0 -0
  36. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/models/bar_model.py +0 -0
  37. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/models/bars_model.py +0 -0
  38. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/models/chart_model.py +0 -0
  39. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/models/conf_model.py +0 -0
  40. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/models/consecutive_bars_model.py +0 -0
  41. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/models/rates_model.py +0 -0
  42. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/models/signals_model.py +0 -0
  43. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/models/unconsecutive_bar_model.py +0 -0
  44. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/mt5_context.py +0 -0
  45. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugin.py +0 -0
  46. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugin_loader.py +0 -0
  47. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugin_manager.py +0 -0
  48. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugins/__init__.py +0 -0
  49. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugins/exemplo.py-dist +0 -0
  50. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugins/media_movel/__init__.py +0 -0
  51. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugins/media_movel/cli.py +0 -0
  52. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugins/media_movel/conf.py +0 -0
  53. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugins/media_movel/models/__init__.py +0 -0
  54. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugins/media_movel/models/model_media_movel.py +0 -0
  55. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugins/media_movel/tests/__init__.py +0 -0
  56. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugins/media_movel/tests/test_mm.py +0 -0
  57. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugins/media_movel/tests/test_model_media_movel.py +0 -0
  58. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugins/range_medio/__init__.py +0 -0
  59. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugins/range_medio/cli.py +0 -0
  60. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugins/range_medio/conf.py +0 -0
  61. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugins/range_medio/models/__init__.py +0 -0
  62. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugins/range_medio/models/average_range_model.py +0 -0
  63. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugins/range_medio/tests/__init__.py +0 -0
  64. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugins/range_medio/tests/test_rm.py +0 -0
  65. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugins/volume_medio/__init__.py +0 -0
  66. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugins/volume_medio/cli.py +0 -0
  67. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugins/volume_medio/conf.py +0 -0
  68. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugins/volume_medio/models/__init__.py +0 -0
  69. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugins/volume_medio/models/model_average_volume.py +0 -0
  70. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugins/volume_medio/tests/__init__.py +0 -0
  71. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugins/volume_medio/tests/test_vm.py +0 -0
  72. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/views/__init__.py +0 -0
  73. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/views/close_view.py +0 -0
  74. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/views/full_view.py +0 -0
  75. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/views/high_view.py +0 -0
  76. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/views/low_view.py +0 -0
  77. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/views/min_view.py +0 -0
  78. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/views/open_view.py +0 -0
  79. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/views/ranges_view.py +0 -0
  80. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/views/rates_view.py +0 -0
  81. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/views/vars_view.py +0 -0
  82. {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/views/volumes_view.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mtcli
3
- Version: 3.8.0.dev1
3
+ Version: 3.8.0.dev3
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
@@ -0,0 +1,105 @@
1
+ """
2
+ CLI principal do mtcli.
3
+ """
4
+
5
+ import os
6
+ import threading
7
+ import click
8
+
9
+ from mtcli.plugin_loader import load_plugins
10
+ from mtcli.logger import setup_logger
11
+ from mtcli.marketdata.tick_streamer import TickStreamer
12
+
13
+ from .commands.bars import bars
14
+ from .commands.doctor import doctor
15
+ from .commands.migrate import migrate
16
+
17
+
18
+ logger = setup_logger(__name__)
19
+
20
+ _tick_streamer = None
21
+
22
+
23
+ def start_tick_capture():
24
+ """
25
+ Inicia captura contínua de ticks em background.
26
+
27
+ O símbolo deve ser definido via variável:
28
+
29
+ MTCLI_SYMBOL=WINJ26
30
+ """
31
+
32
+ global _tick_streamer
33
+
34
+ if _tick_streamer:
35
+ return
36
+
37
+ symbol = os.getenv("MTCLI_SYMBOL")
38
+
39
+ if not symbol:
40
+ logger.info("Captura de ticks desativada (MTCLI_SYMBOL não definido).")
41
+ return
42
+
43
+ logger.info("Iniciando captura contínua de ticks para %s", symbol)
44
+
45
+ try:
46
+
47
+ _tick_streamer = TickStreamer(symbol)
48
+
49
+ thread = threading.Thread(
50
+ target=_tick_streamer.start,
51
+ daemon=True,
52
+ name="mtcli-tick-streamer",
53
+ )
54
+
55
+ thread.start()
56
+
57
+ logger.info("Captura de ticks iniciada em background.")
58
+
59
+ except Exception:
60
+
61
+ logger.exception("Falha ao iniciar captura de ticks")
62
+
63
+
64
+ @click.group(context_settings={"max_content_width": 120}, invoke_without_command=True)
65
+ @click.version_option(package_name="mtcli")
66
+ @click.pass_context
67
+ def mt(ctx):
68
+ """
69
+ CLI principal do mtcli.
70
+ """
71
+
72
+ start_tick_capture()
73
+
74
+ if ctx.invoked_subcommand is None:
75
+ click.echo(ctx.get_help())
76
+
77
+
78
+ mt.add_command(doctor, name="doctor")
79
+ mt.add_command(bars, name="bars")
80
+ mt.add_command(doctor, name="dr")
81
+ mt.add_command(migrate)
82
+
83
+ loaded_plugins = load_plugins(mt)
84
+
85
+ logger.info("Plugins carregados: %s", loaded_plugins)
86
+
87
+
88
+ @mt.command(name="plugins")
89
+ def list_plugins():
90
+ """
91
+ Lista os plugins carregados.
92
+ """
93
+
94
+ if not loaded_plugins:
95
+ click.echo("Nenhum plugin carregado.")
96
+ return
97
+
98
+ click.echo("Plugins carregados:\n")
99
+
100
+ for name in loaded_plugins:
101
+ click.echo(f" {name}")
102
+
103
+
104
+ if __name__ == "__main__":
105
+ mt()