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.
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/PKG-INFO +1 -1
- mtcli-3.8.0.dev3/mtcli/cli.py +105 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/conf.py +315 -309
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/database.py +42 -4
- mtcli-3.8.0.dev3/mtcli/marketdata/tick_cache.py +61 -0
- mtcli-3.8.0.dev3/mtcli/marketdata/tick_engine.py +93 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/marketdata/tick_repository.py +16 -10
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/marketdata/tick_streamer.py +4 -4
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/pyproject.toml +1 -1
- mtcli-3.8.0.dev1/mtcli/cli.py +0 -135
- mtcli-3.8.0.dev1/mtcli/marketdata/tick_cache.py +0 -38
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/LICENSE +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/README.md +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/__init__.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/commands/__init__.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/commands/bars.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/commands/conf.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/commands/doctor.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/commands/migrate.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/conecta.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/config_registre.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/data/__init__.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/data/base.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/data/csv.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/data/mt5.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/domain/__init__.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/domain/timeframe.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/logger.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/marketdata/__init__.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/migrations/001_initial_schema.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/migrations/002_ticks_time_msc.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/migrations/003_optimize_ticks_without_rowid.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/migrations/__init__.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/migrations/runner.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/models/__init__.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/models/bar_model.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/models/bars_model.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/models/chart_model.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/models/conf_model.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/models/consecutive_bars_model.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/models/rates_model.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/models/signals_model.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/models/unconsecutive_bar_model.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/mt5_context.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugin.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugin_loader.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugin_manager.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugins/__init__.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugins/exemplo.py-dist +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugins/media_movel/__init__.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugins/media_movel/cli.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugins/media_movel/conf.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugins/media_movel/models/__init__.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugins/media_movel/models/model_media_movel.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugins/media_movel/tests/__init__.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugins/media_movel/tests/test_mm.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugins/media_movel/tests/test_model_media_movel.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugins/range_medio/__init__.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugins/range_medio/cli.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugins/range_medio/conf.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugins/range_medio/models/__init__.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugins/range_medio/models/average_range_model.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugins/range_medio/tests/__init__.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugins/range_medio/tests/test_rm.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugins/volume_medio/__init__.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugins/volume_medio/cli.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugins/volume_medio/conf.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugins/volume_medio/models/__init__.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugins/volume_medio/models/model_average_volume.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugins/volume_medio/tests/__init__.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/plugins/volume_medio/tests/test_vm.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/views/__init__.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/views/close_view.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/views/full_view.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/views/high_view.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/views/low_view.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/views/min_view.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/views/open_view.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/views/ranges_view.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/views/rates_view.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/views/vars_view.py +0 -0
- {mtcli-3.8.0.dev1 → mtcli-3.8.0.dev3}/mtcli/views/volumes_view.py +0 -0
|
@@ -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()
|