mtcli 3.2.0.dev2__tar.gz → 3.3.0__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 (69) hide show
  1. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/PKG-INFO +1 -1
  2. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/commands/bars.py +147 -118
  3. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/commands/conf.py +1 -1
  4. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/commands/logs.py +42 -40
  5. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/conecta.py +42 -41
  6. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/conf.py +8 -7
  7. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/data/mt5.py +95 -97
  8. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/logger.py +3 -1
  9. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/models/conf_model.py +1 -2
  10. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/models/signals_model.py +0 -2
  11. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/mt5_context.py +34 -33
  12. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/plugins/media_movel/models/model_media_movel.py +22 -25
  13. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/plugins/range_medio/command.py +1 -0
  14. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/views/close_view.py +1 -1
  15. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/views/high_view.py +1 -1
  16. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/views/low_view.py +1 -1
  17. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/views/open_view.py +1 -1
  18. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/views/ranges_view.py +1 -3
  19. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/views/vars_view.py +1 -8
  20. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/views/volumes_view.py +1 -2
  21. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/pyproject.toml +28 -3
  22. mtcli-3.2.0.dev2/mtcli/plugins/agressao/__init__.py +0 -4
  23. mtcli-3.2.0.dev2/mtcli/plugins/agressao/command.py +0 -45
  24. mtcli-3.2.0.dev2/mtcli/plugins/agressao/models/__init__.py +0 -1
  25. mtcli-3.2.0.dev2/mtcli/plugins/agressao/models/model_agressao.py +0 -39
  26. mtcli-3.2.0.dev2/mtcli/plugins/agressao/views/__init__.py +0 -1
  27. mtcli-3.2.0.dev2/mtcli/plugins/agressao/views/view_agressao.py +0 -15
  28. mtcli-3.2.0.dev2/mtcli/plugins/volume_medio/conf.py +0 -1
  29. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/LICENSE +0 -0
  30. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/README.md +0 -0
  31. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/__init__.py +0 -0
  32. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/commands/__init__.py +0 -0
  33. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/data/__init__.py +0 -0
  34. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/data/base.py +0 -0
  35. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/data/csv.py +0 -0
  36. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/models/__init__.py +0 -0
  37. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/models/bar_model.py +0 -0
  38. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/models/bars_model.py +0 -0
  39. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/models/chart_model.py +0 -0
  40. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/models/consecutive_bars_model.py +0 -0
  41. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/models/rates_model.py +0 -0
  42. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/models/unconsecutive_bar_model.py +0 -0
  43. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/mt.py +0 -0
  44. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/plugin.py +0 -0
  45. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/plugins/__init__.py +0 -0
  46. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/plugins/media_movel/__init__.py +0 -0
  47. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/plugins/media_movel/command.py +0 -0
  48. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/plugins/media_movel/conf.py +0 -0
  49. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/plugins/media_movel/models/__init__.py +0 -0
  50. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/plugins/media_movel/tests/__init__.py +0 -0
  51. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/plugins/media_movel/tests/test_mm.py +0 -0
  52. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/plugins/media_movel/tests/test_model_media_movel.py +0 -0
  53. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/plugins/range_medio/__init__.py +0 -0
  54. {mtcli-3.2.0.dev2/mtcli/plugins/agressao → mtcli-3.3.0/mtcli/plugins/range_medio}/conf.py +0 -0
  55. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/plugins/range_medio/models/__init__.py +0 -0
  56. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/plugins/range_medio/models/average_range_model.py +0 -0
  57. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/plugins/range_medio/tests/__init__.py +0 -0
  58. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/plugins/range_medio/tests/test_rm.py +0 -0
  59. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/plugins/volume_medio/__init__.py +0 -0
  60. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/plugins/volume_medio/command.py +0 -0
  61. {mtcli-3.2.0.dev2/mtcli/plugins/range_medio → mtcli-3.3.0/mtcli/plugins/volume_medio}/conf.py +0 -0
  62. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/plugins/volume_medio/models/__init__.py +0 -0
  63. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/plugins/volume_medio/models/model_average_volume.py +0 -0
  64. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/plugins/volume_medio/tests/__init__.py +0 -0
  65. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/plugins/volume_medio/tests/test_vm.py +0 -0
  66. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/views/__init__.py +0 -0
  67. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/views/full_view.py +0 -0
  68. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/views/min_view.py +0 -0
  69. {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/views/rates_view.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: mtcli
3
- Version: 3.2.0.dev2
3
+ Version: 3.3.0
4
4
  Summary: Aplicativo CLI para exibir gráficos do MetaTrader 5 em texto acessível ao leitor de telas
5
5
  License: GPL-3.0
6
6
  Keywords: MetaTrader 5,trading,CLI
@@ -1,118 +1,147 @@
1
- """Exibe o gráfico de barras."""
2
-
3
- import click
4
-
5
- from mtcli import conf
6
- from mtcli.models.rates_model import RatesModel
7
- from mtcli.models.bars_model import BarsModel
8
- from mtcli.views.full_view import FullView
9
- from mtcli.views.min_view import MinView
10
- from mtcli.views.ranges_view import RangesView
11
- from mtcli.views.volumes_view import VolumesView
12
- from mtcli.views.vars_view import VarsView
13
- from mtcli.views.rates_view import RatesView
14
- from mtcli.views.open_view import OpenView
15
- from mtcli.views.high_view import HighView
16
- from mtcli.views.low_view import LowView
17
- from mtcli.views.close_view import CloseView
18
-
19
-
20
- @click.command(
21
- "bars",
22
- help="Mostra o gráfico de candles em texto para o ativo e período especificados.",
23
- )
24
- @click.argument("symbol")
25
- @click.option(
26
- "--view",
27
- "-v",
28
- type=click.Choice(
29
- [
30
- "ch",
31
- "m",
32
- "hl",
33
- "f",
34
- "full",
35
- "r",
36
- "range",
37
- "v",
38
- "volume",
39
- "va",
40
- "percentual",
41
- "oh",
42
- "ohlc",
43
- "o",
44
- "open",
45
- "h",
46
- "high",
47
- "l",
48
- "low",
49
- "c",
50
- "close",
51
- ],
52
- case_sensitive=False,
53
- ),
54
- default=conf.view,
55
- help="Formato de exibicao, default m. Opcoes: ch ou m - minima; f - completa; r - ranges; v - volumes; va - variações percentuais; oh - OHLC; o - aberturas; h - maximas; l - minimas; c - fechamentos",
56
- )
57
- @click.option(
58
- "--period",
59
- "-p",
60
- type=click.Choice(conf.timeframes, case_sensitive=False),
61
- default=conf.period,
62
- help="Tempo grafico, default D1.",
63
- )
64
- @click.option(
65
- "--count",
66
- "-c",
67
- type=int,
68
- default=conf.periodos,
69
- help="Quantidade de barras, default 20.",
70
- )
71
- @click.option(
72
- "--date", "-d", default=conf.date, help="Data para intraday, formato AAAA-MM-DD."
73
- )
74
- @click.option("--numerator", "-n", is_flag=True, help="Ativa a numeracao das barras.")
75
- @click.option("--show-date", "-sd", is_flag=True, help="Ativa a datacao das barras.")
76
- @click.option(
77
- "--volume",
78
- "-vo",
79
- type=click.Choice(["tick", "real"], case_sensitive=False),
80
- default=conf.volume,
81
- help="Tipo de volume, default tick.",
82
- )
83
- def bars(symbol, view, period, count, date, numerator, show_date, volume):
84
- """Exibe o grafico do MetaTrader 5."""
85
- period = period.lower()
86
- view = view.lower()
87
- rates = RatesModel(symbol, period, count).get_data()
88
- bars = BarsModel(rates, date).get_bars()
89
- views = []
90
- if view in ["m", "ch", "hl"]: # máximas e mínimas
91
- views = MinView(bars, count, period, date, numerator, show_date).views()
92
- elif view in ["r", "range"]: # ranges
93
- views = RangesView(bars, count, period, date, numerator, show_date).views()
94
- elif view in ["oh", "ohlc"]: # OHLC
95
- views = RatesView(bars, count, period, date, numerator, show_date).views()
96
- elif view in ["va", "percentual"]: # variações percentuais
97
- views = VarsView(bars, count, period, date, numerator, show_date).views()
98
- elif view in ["o", "open"]: # abertura
99
- views = OpenView(bars, count, period, date, numerator, show_date).views()
100
- elif view in ["h", "high"]: # máximas
101
- views = HighView(bars, count, period, date, numerator, show_date).views()
102
- elif view in ["l", "low"]: # mínimas
103
- views = LowView(bars, count, period, date, numerator, show_date).views()
104
- elif view in ["c", "close"]: # fechamentos
105
- views = CloseView(bars, count, period, date, numerator, show_date).views()
106
- elif view in ["v", "volume"]: # volumes
107
- views = VolumesView(
108
- bars, count, period, date, numerator, show_date, volume
109
- ).views()
110
- else: # completo
111
- views = FullView(bars, count, period, date, numerator, show_date).views()
112
- if views:
113
- for view in views:
114
- click.echo(view)
115
-
116
-
117
- if __name__ == "__main__":
118
- bars()
1
+ """Exibe o gráfico de barras."""
2
+
3
+ import click
4
+
5
+ from mtcli.conf import (
6
+ BARS,
7
+ DATE,
8
+ PERIOD,
9
+ TIMEFRAMES,
10
+ VIEW,
11
+ VOLUME,
12
+ )
13
+ from mtcli.models.bars_model import BarsModel
14
+ from mtcli.models.rates_model import RatesModel
15
+ from mtcli.views.close_view import CloseView
16
+ from mtcli.views.full_view import FullView
17
+ from mtcli.views.high_view import HighView
18
+ from mtcli.views.low_view import LowView
19
+ from mtcli.views.min_view import MinView
20
+ from mtcli.views.open_view import OpenView
21
+ from mtcli.views.ranges_view import RangesView
22
+ from mtcli.views.rates_view import RatesView
23
+ from mtcli.views.vars_view import VarsView
24
+ from mtcli.views.volumes_view import VolumesView
25
+
26
+
27
+ @click.command(
28
+ "bars",
29
+ help="Mostra o gráfico de candles em texto para o ativo e período especificados.",
30
+ )
31
+ @click.argument("symbol")
32
+ @click.option(
33
+ "--view",
34
+ "-v",
35
+ type=click.Choice(
36
+ [
37
+ "ch",
38
+ "m",
39
+ "hl",
40
+ "f",
41
+ "full",
42
+ "r",
43
+ "range",
44
+ "v",
45
+ "volume",
46
+ "va",
47
+ "percentual",
48
+ "oh",
49
+ "ohlc",
50
+ "o",
51
+ "open",
52
+ "h",
53
+ "high",
54
+ "l",
55
+ "low",
56
+ "c",
57
+ "close",
58
+ ],
59
+ case_sensitive=False,
60
+ ),
61
+ default=VIEW,
62
+ show_default=True,
63
+ help="Formato de exibicao. Opcoes: minima ou HL - minima; f - completa; r - ranges; v - volumes; va - variações percentuais; oh - OHLC; o - aberturas; h - maximas; l - minimas; c - fechamentos.",
64
+ )
65
+ @click.option(
66
+ "--period",
67
+ "-p",
68
+ type=click.Choice(TIMEFRAMES, case_sensitive=False),
69
+ default=PERIOD,
70
+ show_default=True,
71
+ help="Timeframe das barras.",
72
+ )
73
+ @click.option(
74
+ "--count",
75
+ "-c",
76
+ type=int,
77
+ default=BARS,
78
+ show_default=True,
79
+ help="Numero de barras.",
80
+ )
81
+ @click.option(
82
+ "--date",
83
+ "-d",
84
+ default=DATE,
85
+ show_default=True,
86
+ help="Data para intraday, formato AAAA-MM-DD.",
87
+ )
88
+ @click.option(
89
+ "--numerator",
90
+ "-n",
91
+ is_flag=True,
92
+ default=False,
93
+ show_default=True,
94
+ help="Ativa a numeracao das barras.",
95
+ )
96
+ @click.option(
97
+ "--show-date",
98
+ "-sd",
99
+ is_flag=True,
100
+ default=False,
101
+ show_default=True,
102
+ help="Ativa a datacao das barras.",
103
+ )
104
+ @click.option(
105
+ "--volume",
106
+ "-vo",
107
+ type=click.Choice(["tick", "real"], case_sensitive=False),
108
+ default=VOLUME,
109
+ show_default=True,
110
+ help="Tipo de volume.",
111
+ )
112
+ def bars(symbol, view, period, count, date, numerator, show_date, volume):
113
+ """Exibe o grafico do MetaTrader 5."""
114
+ period = period.lower()
115
+ view = view.lower()
116
+ rates = RatesModel(symbol, period, count).get_data()
117
+ bars = BarsModel(rates, date).get_bars()
118
+ views = []
119
+ if view in ["m", "ch", "hl"]: # máximas e mínimas
120
+ views = MinView(bars, count, period, date, numerator, show_date).views()
121
+ elif view in ["r", "range"]: # ranges
122
+ views = RangesView(bars, count, period, date, numerator, show_date).views()
123
+ elif view in ["oh", "ohlc"]: # OHLC
124
+ views = RatesView(bars, count, period, date, numerator, show_date).views()
125
+ elif view in ["va", "percentual"]: # variações percentuais
126
+ views = VarsView(bars, count, period, date, numerator, show_date).views()
127
+ elif view in ["o", "open"]: # abertura
128
+ views = OpenView(bars, count, period, date, numerator, show_date).views()
129
+ elif view in ["h", "high"]: # máximas
130
+ views = HighView(bars, count, period, date, numerator, show_date).views()
131
+ elif view in ["l", "low"]: # mínimas
132
+ views = LowView(bars, count, period, date, numerator, show_date).views()
133
+ elif view in ["c", "close"]: # fechamentos
134
+ views = CloseView(bars, count, period, date, numerator, show_date).views()
135
+ elif view in ["v", "volume"]: # volumes
136
+ views = VolumesView(
137
+ bars, count, period, date, numerator, show_date, volume
138
+ ).views()
139
+ else: # completo
140
+ views = FullView(bars, count, period, date, numerator, show_date).views()
141
+ if views:
142
+ for view in views:
143
+ click.echo(view)
144
+
145
+
146
+ if __name__ == "__main__":
147
+ bars()
@@ -1,7 +1,7 @@
1
1
  """Gerencia configurações registradas no mtcli.ini."""
2
2
 
3
- import os
4
3
  import click
4
+
5
5
  from mtcli.models.conf_model import ConfModel
6
6
 
7
7
 
@@ -1,40 +1,42 @@
1
- """Comando logs para exibição dos logs."""
2
-
3
- import os
4
- import click
5
- from mtcli.logger import setup_logger
6
-
7
-
8
- @click.command("logs", help="Exibe ou limpa os logs de execução do mtcli.")
9
- @click.option("--clear", is_flag=True, help="Limpa o arquivo de log.")
10
- @click.option("--tail", default=0, type=int, help="Mostra apenas as últimas N linhas.")
11
- @click.option("--grep", default="", help="Filtra o log por uma palavra-chave.")
12
- def logs(clear, tail, grep):
13
- """Exibe ou limpa os registros de log do mtcli."""
14
- logger = setup_logger()
15
- log_file = logger.handlers[0].baseFilename
16
-
17
- if clear:
18
- if os.path.exists(log_file):
19
- open(log_file, "w", encoding="utf-8").close()
20
- click.echo("Log limpo com sucesso.")
21
- else:
22
- click.echo("Nenhum log para limpar.")
23
- return
24
-
25
- if not os.path.exists(log_file):
26
- click.echo("Nenhum log encontrado.")
27
- return
28
-
29
- with open(log_file, encoding="utf-8", errors="ignore") as f:
30
- linhas = f.readlines()
31
-
32
- if tail > 0:
33
- linhas = linhas[-tail:]
34
- if grep:
35
- linhas = [linha for linha in linhas if grep.lower() in linha.lower()]
36
-
37
- if not linhas:
38
- click.echo("Nenhuma linha encontrada com os filtros aplicados.")
39
- else:
40
- click.echo_via_pager("".join(linhas))
1
+ """Comando logs para exibição dos logs."""
2
+
3
+ import os
4
+
5
+ import click
6
+
7
+ from mtcli.logger import setup_logger
8
+
9
+
10
+ @click.command("logs", help="Exibe ou limpa os logs de execução do mtcli.")
11
+ @click.option("--clear", is_flag=True, help="Limpa o arquivo de log.")
12
+ @click.option("--tail", default=0, type=int, help="Mostra apenas as últimas N linhas.")
13
+ @click.option("--grep", default="", help="Filtra o log por uma palavra-chave.")
14
+ def logs(clear, tail, grep):
15
+ """Exibe ou limpa os registros de log do mtcli."""
16
+ logger = setup_logger()
17
+ log_file = logger.handlers[0].baseFilename
18
+
19
+ if clear:
20
+ if os.path.exists(log_file):
21
+ open(log_file, "w", encoding="utf-8").close()
22
+ click.echo("Log limpo com sucesso.")
23
+ else:
24
+ click.echo("Nenhum log para limpar.")
25
+ return
26
+
27
+ if not os.path.exists(log_file):
28
+ click.echo("Nenhum log encontrado.")
29
+ return
30
+
31
+ with open(log_file, encoding="utf-8", errors="ignore") as f:
32
+ linhas = f.readlines()
33
+
34
+ if tail > 0:
35
+ linhas = linhas[-tail:]
36
+ if grep:
37
+ linhas = [linha for linha in linhas if grep.lower() in linha.lower()]
38
+
39
+ if not linhas:
40
+ click.echo("Nenhuma linha encontrada com os filtros aplicados.")
41
+ else:
42
+ click.echo_via_pager("".join(linhas))
@@ -1,41 +1,42 @@
1
- """
2
- Gerencia a conexão direta com o terminal MetaTrader 5.
3
- Usado internamente pelo contexto mt5_conexao().
4
- """
5
-
6
- import MetaTrader5 as mt5
7
- from mtcli.logger import setup_logger
8
-
9
- log = setup_logger()
10
-
11
-
12
- def conectar() -> bool:
13
- """
14
- Inicializa a conexão com o MetaTrader 5.
15
-
16
- Retorna:
17
- bool: True se conectado com sucesso, False caso contrário.
18
-
19
- Levanta:
20
- ConnectionError: se a inicialização do MT5 falhar.
21
- """
22
- log.debug("Tentando inicializar conexao com MetaTrader 5...")
23
-
24
- if not mt5.initialize():
25
- erro = mt5.last_error()
26
- log.error(f"Erro ao conectar ao MetaTrader 5: {erro}")
27
- raise ConnectionError(f"Falha ao conectar ao MetaTrader 5: {erro}")
28
-
29
- log.info("Conexao com MetaTrader 5 estabelecida com sucesso.")
30
- return True
31
-
32
-
33
- def shutdown():
34
- """
35
- Encerra a conexão com o MetaTrader 5 de forma segura.
36
- """
37
- try:
38
- mt5.shutdown()
39
- log.debug("Conexao com MetaTrader 5 encerrada.")
40
- except Exception as e:
41
- log.error(f"Erro ao encerrar conexao com MetaTrader 5: {e}")
1
+ """
2
+ Gerencia a conexão direta com o terminal MetaTrader 5.
3
+ Usado internamente pelo contexto mt5_conexao().
4
+ """
5
+
6
+ import MetaTrader5 as mt5
7
+
8
+ from mtcli.logger import setup_logger
9
+
10
+ log = setup_logger()
11
+
12
+
13
+ def conectar() -> bool:
14
+ """
15
+ Inicializa a conexão com o MetaTrader 5.
16
+
17
+ Retorna:
18
+ bool: True se conectado com sucesso, False caso contrário.
19
+
20
+ Levanta:
21
+ ConnectionError: se a inicialização do MT5 falhar.
22
+ """
23
+ log.debug("Tentando inicializar conexao com MetaTrader 5...")
24
+
25
+ if not mt5.initialize():
26
+ erro = mt5.last_error()
27
+ log.error(f"Erro ao conectar ao MetaTrader 5: {erro}")
28
+ raise ConnectionError(f"Falha ao conectar ao MetaTrader 5: {erro}")
29
+
30
+ log.info("Conexao com MetaTrader 5 estabelecida com sucesso.")
31
+ return True
32
+
33
+
34
+ def shutdown():
35
+ """
36
+ Encerra a conexão com o MetaTrader 5 de forma segura.
37
+ """
38
+ try:
39
+ mt5.shutdown()
40
+ log.debug("Conexao com MetaTrader 5 encerrada.")
41
+ except Exception as e:
42
+ log.error(f"Erro ao encerrar conexao com MetaTrader 5: {e}")
@@ -1,21 +1,22 @@
1
1
  import os
2
+
2
3
  import MetaTrader5 as mt5
4
+
3
5
  from mtcli.conecta import conectar, shutdown
4
6
  from mtcli.models.conf_model import ConfModel
5
7
 
6
-
7
8
  config = ConfModel("mtcli.ini").carregar()
8
9
 
9
10
  section = "DEFAULT"
10
11
  symbol = os.getenv("SYMBOL", config[section].get("symbol", fallback="WIN$N"))
11
12
  digitos = int(os.getenv("DIGITOS", config[section].getint("digitos", fallback=2)))
12
- period = os.getenv("PERIOD", config[section].get("period", fallback="D1"))
13
- periodos = count = int(
13
+ PERIOD = period = os.getenv("PERIOD", config[section].get("period", fallback="D1"))
14
+ BARS = periodos = count = int(
14
15
  os.getenv("COUNT", config[section].getint("count", fallback=999))
15
16
  )
16
- view = os.getenv("VIEW", config[section].get("view", fallback="ch"))
17
- volume = os.getenv("VOLUME", config[section].get("volume", fallback="tick"))
18
- date = os.getenv("DATE", config[section].get("date", fallback=""))
17
+ VIEW = view = os.getenv("VIEW", config[section].get("view", fallback="ch"))
18
+ VOLUME = volume = os.getenv("VOLUME", config[section].get("volume", fallback="tick"))
19
+ DATE = date = os.getenv("DATE", config[section].get("date", fallback=""))
19
20
 
20
21
  lateral = os.getenv("LATERAL", config[section].get("lateral", fallback="doji"))
21
22
  alta = os.getenv("ALTA", config[section].get("alta", fallback="verde"))
@@ -76,7 +77,7 @@ if not csv_path:
76
77
  csv_path = csv_path.replace("\\", "/")
77
78
  csv_path += "/"
78
79
 
79
- timeframes = [
80
+ TIMEFRAMES = timeframes = [
80
81
  "mn1",
81
82
  "w1",
82
83
  "d1",