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.
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/PKG-INFO +1 -1
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/commands/bars.py +147 -118
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/commands/conf.py +1 -1
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/commands/logs.py +42 -40
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/conecta.py +42 -41
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/conf.py +8 -7
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/data/mt5.py +95 -97
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/logger.py +3 -1
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/models/conf_model.py +1 -2
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/models/signals_model.py +0 -2
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/mt5_context.py +34 -33
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/plugins/media_movel/models/model_media_movel.py +22 -25
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/plugins/range_medio/command.py +1 -0
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/views/close_view.py +1 -1
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/views/high_view.py +1 -1
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/views/low_view.py +1 -1
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/views/open_view.py +1 -1
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/views/ranges_view.py +1 -3
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/views/vars_view.py +1 -8
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/views/volumes_view.py +1 -2
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/pyproject.toml +28 -3
- mtcli-3.2.0.dev2/mtcli/plugins/agressao/__init__.py +0 -4
- mtcli-3.2.0.dev2/mtcli/plugins/agressao/command.py +0 -45
- mtcli-3.2.0.dev2/mtcli/plugins/agressao/models/__init__.py +0 -1
- mtcli-3.2.0.dev2/mtcli/plugins/agressao/models/model_agressao.py +0 -39
- mtcli-3.2.0.dev2/mtcli/plugins/agressao/views/__init__.py +0 -1
- mtcli-3.2.0.dev2/mtcli/plugins/agressao/views/view_agressao.py +0 -15
- mtcli-3.2.0.dev2/mtcli/plugins/volume_medio/conf.py +0 -1
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/LICENSE +0 -0
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/README.md +0 -0
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/__init__.py +0 -0
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/commands/__init__.py +0 -0
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/data/__init__.py +0 -0
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/data/base.py +0 -0
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/data/csv.py +0 -0
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/models/__init__.py +0 -0
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/models/bar_model.py +0 -0
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/models/bars_model.py +0 -0
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/models/chart_model.py +0 -0
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/models/consecutive_bars_model.py +0 -0
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/models/rates_model.py +0 -0
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/models/unconsecutive_bar_model.py +0 -0
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/mt.py +0 -0
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/plugin.py +0 -0
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/plugins/__init__.py +0 -0
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/plugins/media_movel/__init__.py +0 -0
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/plugins/media_movel/command.py +0 -0
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/plugins/media_movel/conf.py +0 -0
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/plugins/media_movel/models/__init__.py +0 -0
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/plugins/media_movel/tests/__init__.py +0 -0
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/plugins/media_movel/tests/test_mm.py +0 -0
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/plugins/media_movel/tests/test_model_media_movel.py +0 -0
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/plugins/range_medio/__init__.py +0 -0
- {mtcli-3.2.0.dev2/mtcli/plugins/agressao → mtcli-3.3.0/mtcli/plugins/range_medio}/conf.py +0 -0
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/plugins/range_medio/models/__init__.py +0 -0
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/plugins/range_medio/models/average_range_model.py +0 -0
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/plugins/range_medio/tests/__init__.py +0 -0
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/plugins/range_medio/tests/test_rm.py +0 -0
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/plugins/volume_medio/__init__.py +0 -0
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/plugins/volume_medio/command.py +0 -0
- {mtcli-3.2.0.dev2/mtcli/plugins/range_medio → mtcli-3.3.0/mtcli/plugins/volume_medio}/conf.py +0 -0
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/plugins/volume_medio/models/__init__.py +0 -0
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/plugins/volume_medio/models/model_average_volume.py +0 -0
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/plugins/volume_medio/tests/__init__.py +0 -0
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/plugins/volume_medio/tests/test_vm.py +0 -0
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/views/__init__.py +0 -0
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/views/full_view.py +0 -0
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/views/min_view.py +0 -0
- {mtcli-3.2.0.dev2 → mtcli-3.3.0}/mtcli/views/rates_view.py +0 -0
|
@@ -1,118 +1,147 @@
|
|
|
1
|
-
"""Exibe o gráfico de barras."""
|
|
2
|
-
|
|
3
|
-
import click
|
|
4
|
-
|
|
5
|
-
from mtcli import
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
from mtcli.
|
|
14
|
-
from mtcli.
|
|
15
|
-
from mtcli.views.
|
|
16
|
-
from mtcli.views.
|
|
17
|
-
from mtcli.views.
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
"
|
|
38
|
-
"
|
|
39
|
-
"
|
|
40
|
-
"
|
|
41
|
-
"
|
|
42
|
-
"
|
|
43
|
-
"
|
|
44
|
-
"
|
|
45
|
-
"
|
|
46
|
-
"
|
|
47
|
-
"
|
|
48
|
-
"
|
|
49
|
-
"
|
|
50
|
-
"
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
default=
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
"
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
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,40 +1,42 @@
|
|
|
1
|
-
"""Comando logs para exibição dos logs."""
|
|
2
|
-
|
|
3
|
-
import os
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
@click.
|
|
11
|
-
@click.option("--
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
click.echo("
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
if
|
|
35
|
-
linhas = [
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
click.
|
|
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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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",
|