mtcli 3.0.0.dev1__tar.gz → 3.0.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.0.0.dev1 → mtcli-3.0.0.dev2}/PKG-INFO +1 -1
  2. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/commands/bars.py +126 -126
  3. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/commands/conf.py +1 -3
  4. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/conf.py +101 -104
  5. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/models/bar_model.py +105 -105
  6. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/models/bars_model.py +25 -25
  7. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/models/chart_model.py +155 -155
  8. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/models/consecutive_bars_model.py +77 -77
  9. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/models/rates_model.py +41 -41
  10. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/models/signals_model.py +102 -102
  11. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/models/unconsecutive_bar_model.py +67 -67
  12. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/plugins/media_movel/command.py +99 -99
  13. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/plugins/range_medio/__init__.py +2 -2
  14. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/plugins/range_medio/command.py +32 -32
  15. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/plugins/range_medio/models/average_range_model.py +29 -29
  16. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/plugins/volume_medio/command.py +42 -42
  17. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/plugins/volume_medio/models/model_average_volume.py +31 -31
  18. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/views/close_view.py +37 -37
  19. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/views/full_view.py +65 -65
  20. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/views/high_view.py +37 -37
  21. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/views/low_view.py +37 -37
  22. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/views/min_view.py +42 -42
  23. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/views/open_view.py +37 -37
  24. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/views/ranges_view.py +43 -43
  25. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/views/rates_view.py +41 -41
  26. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/views/vars_view.py +53 -53
  27. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/views/volumes_view.py +52 -52
  28. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/pyproject.toml +1 -1
  29. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/LICENSE +0 -0
  30. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/README.md +0 -0
  31. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/__init__.py +0 -0
  32. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/commands/__init__.py +0 -0
  33. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/commands/logs.py +0 -0
  34. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/conecta.py +0 -0
  35. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/data/__init__.py +0 -0
  36. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/data/base.py +0 -0
  37. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/data/csv.py +0 -0
  38. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/data/mt5.py +0 -0
  39. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/logger.py +0 -0
  40. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/models/__init__.py +0 -0
  41. /mtcli-3.0.0.dev1/mtcli/models/model_conf.py → /mtcli-3.0.0.dev2/mtcli/models/conf_model.py +0 -0
  42. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/mt.py +0 -0
  43. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/plugin.py +0 -0
  44. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/plugins/__init__.py +0 -0
  45. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/plugins/agressao/__init__.py +0 -0
  46. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/plugins/agressao/command.py +0 -0
  47. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/plugins/agressao/conf.py +0 -0
  48. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/plugins/agressao/models/__init__.py +0 -0
  49. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/plugins/agressao/models/model_agressao.py +0 -0
  50. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/plugins/agressao/views/__init__.py +0 -0
  51. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/plugins/agressao/views/view_agressao.py +0 -0
  52. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/plugins/media_movel/__init__.py +0 -0
  53. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/plugins/media_movel/conf.py +0 -0
  54. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/plugins/media_movel/models/__init__.py +0 -0
  55. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/plugins/media_movel/models/model_media_movel.py +0 -0
  56. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/plugins/media_movel/tests/__init__.py +0 -0
  57. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/plugins/media_movel/tests/test_mm.py +0 -0
  58. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/plugins/media_movel/tests/test_model_media_movel.py +0 -0
  59. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/plugins/range_medio/conf.py +0 -0
  60. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/plugins/range_medio/models/__init__.py +0 -0
  61. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/plugins/range_medio/tests/__init__.py +0 -0
  62. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/plugins/range_medio/tests/test_rm.py +0 -0
  63. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/plugins/volume_medio/__init__.py +0 -0
  64. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/plugins/volume_medio/conf.py +0 -0
  65. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/plugins/volume_medio/models/__init__.py +0 -0
  66. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/plugins/volume_medio/tests/__init__.py +0 -0
  67. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/plugins/volume_medio/tests/test_vm.py +0 -0
  68. {mtcli-3.0.0.dev1 → mtcli-3.0.0.dev2}/mtcli/views/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: mtcli
3
- Version: 3.0.0.dev1
3
+ Version: 3.0.0.dev2
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,126 +1,126 @@
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
- from mtcli.logger import setup_logger
19
-
20
-
21
- logger = setup_logger("mtcli") # Cria o logger
22
-
23
-
24
- @click.command(
25
- "bars",
26
- help="Mostra o gráfico de candles em texto para o ativo e período especificados.",
27
- )
28
- @click.argument("symbol")
29
- @click.option(
30
- "--view",
31
- "-v",
32
- type=click.Choice(
33
- [
34
- "ch",
35
- "m",
36
- "hl",
37
- "f",
38
- "full",
39
- "r",
40
- "range",
41
- "v",
42
- "volume",
43
- "va",
44
- "percentual",
45
- "oh",
46
- "ohlc",
47
- "o",
48
- "open",
49
- "h",
50
- "high",
51
- "l",
52
- "low",
53
- "c",
54
- "close",
55
- ],
56
- case_sensitive=False,
57
- ),
58
- default=conf.view,
59
- 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",
60
- )
61
- @click.option(
62
- "--period",
63
- "-p",
64
- type=click.Choice(conf.timeframes, case_sensitive=False),
65
- default=conf.period,
66
- help="Tempo grafico, default D1.",
67
- )
68
- @click.option(
69
- "--count",
70
- "-c",
71
- type=int,
72
- default=conf.periodos,
73
- help="Quantidade de barras, default 20.",
74
- )
75
- @click.option(
76
- "--date", "-d", default=conf.date, help="Data para intraday, formato AAAA-MM-DD."
77
- )
78
- @click.option("--numerator", "-n", is_flag=True, help="Ativa a numeracao das barras.")
79
- @click.option("--show-date", "-sd", is_flag=True, help="Ativa a datacao das barras.")
80
- @click.option(
81
- "--volume",
82
- "-vo",
83
- type=click.Choice(["tick", "real"], case_sensitive=False),
84
- default=conf.volume,
85
- help="Tipo de volume, default tick.",
86
- )
87
- def bars(symbol, view, period, count, date, numerator, show_date, volume):
88
- """Exibe o grafico do MetaTrader 5."""
89
- period = period.lower()
90
- view = view.lower()
91
- logger.info(
92
- f"Iniciando exibição do gráfico MT5: {symbol} view {view} no {period} data {date} numerador {numerator} data {show_date} volume {volume}."
93
- )
94
- rates = RatesModel(symbol, period, count).get_data()
95
- bars = BarsModel(rates, date).get_bars()
96
- views = []
97
- if view in ["m", "ch", "hl"]: # máximas e mínimas
98
- views = MinView(bars, count, period, date, numerator, show_date).views()
99
- elif view in ["r", "range"]: # ranges
100
- views = RangesView(bars, count, period, date, numerator, show_date).views()
101
- elif view in ["oh", "ohlc"]: # OHLC
102
- views = RatesView(bars, count, period, date, numerator, show_date).views()
103
- elif view in ["va", "percentual"]: # variações percentuais
104
- views = VarsView(bars, count, period, date, numerator, show_date).views()
105
- elif view in ["o", "open"]: # abertura
106
- views = OpenView(bars, count, period, date, numerator, show_date).views()
107
- elif view in ["h", "high"]: # máximas
108
- views = HighView(bars, count, period, date, numerator, show_date).views()
109
- elif view in ["l", "low"]: # mínimas
110
- views = LowView(bars, count, period, date, numerator, show_date).views()
111
- elif view in ["c", "close"]: # fechamentos
112
- views = CloseView(bars, count, period, date, numerator, show_date).views()
113
- elif view in ["v", "volume"]: # volumes
114
- views = VolumesView(
115
- bars, count, period, date, numerator, show_date, volume
116
- ).views()
117
- else: # completo
118
- views = FullView(bars, count, period, date, numerator, show_date).views()
119
- if views:
120
- for view in views:
121
- click.echo(view)
122
- logger.info("Exibição do gráfico MT5 finalizada.")
123
-
124
-
125
- if __name__ == "__main__":
126
- bars()
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
+ from mtcli.logger import setup_logger
19
+
20
+
21
+ logger = setup_logger("mtcli") # Cria o logger
22
+
23
+
24
+ @click.command(
25
+ "bars",
26
+ help="Mostra o gráfico de candles em texto para o ativo e período especificados.",
27
+ )
28
+ @click.argument("symbol")
29
+ @click.option(
30
+ "--view",
31
+ "-v",
32
+ type=click.Choice(
33
+ [
34
+ "ch",
35
+ "m",
36
+ "hl",
37
+ "f",
38
+ "full",
39
+ "r",
40
+ "range",
41
+ "v",
42
+ "volume",
43
+ "va",
44
+ "percentual",
45
+ "oh",
46
+ "ohlc",
47
+ "o",
48
+ "open",
49
+ "h",
50
+ "high",
51
+ "l",
52
+ "low",
53
+ "c",
54
+ "close",
55
+ ],
56
+ case_sensitive=False,
57
+ ),
58
+ default=conf.view,
59
+ 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",
60
+ )
61
+ @click.option(
62
+ "--period",
63
+ "-p",
64
+ type=click.Choice(conf.timeframes, case_sensitive=False),
65
+ default=conf.period,
66
+ help="Tempo grafico, default D1.",
67
+ )
68
+ @click.option(
69
+ "--count",
70
+ "-c",
71
+ type=int,
72
+ default=conf.periodos,
73
+ help="Quantidade de barras, default 20.",
74
+ )
75
+ @click.option(
76
+ "--date", "-d", default=conf.date, help="Data para intraday, formato AAAA-MM-DD."
77
+ )
78
+ @click.option("--numerator", "-n", is_flag=True, help="Ativa a numeracao das barras.")
79
+ @click.option("--show-date", "-sd", is_flag=True, help="Ativa a datacao das barras.")
80
+ @click.option(
81
+ "--volume",
82
+ "-vo",
83
+ type=click.Choice(["tick", "real"], case_sensitive=False),
84
+ default=conf.volume,
85
+ help="Tipo de volume, default tick.",
86
+ )
87
+ def bars(symbol, view, period, count, date, numerator, show_date, volume):
88
+ """Exibe o grafico do MetaTrader 5."""
89
+ period = period.lower()
90
+ view = view.lower()
91
+ logger.info(
92
+ f"Iniciando exibição do gráfico MT5: {symbol} view {view} no {period} data {date} numerador {numerator} data {show_date} volume {volume}."
93
+ )
94
+ rates = RatesModel(symbol, period, count).get_data()
95
+ bars = BarsModel(rates, date).get_bars()
96
+ views = []
97
+ if view in ["m", "ch", "hl"]: # máximas e mínimas
98
+ views = MinView(bars, count, period, date, numerator, show_date).views()
99
+ elif view in ["r", "range"]: # ranges
100
+ views = RangesView(bars, count, period, date, numerator, show_date).views()
101
+ elif view in ["oh", "ohlc"]: # OHLC
102
+ views = RatesView(bars, count, period, date, numerator, show_date).views()
103
+ elif view in ["va", "percentual"]: # variações percentuais
104
+ views = VarsView(bars, count, period, date, numerator, show_date).views()
105
+ elif view in ["o", "open"]: # abertura
106
+ views = OpenView(bars, count, period, date, numerator, show_date).views()
107
+ elif view in ["h", "high"]: # máximas
108
+ views = HighView(bars, count, period, date, numerator, show_date).views()
109
+ elif view in ["l", "low"]: # mínimas
110
+ views = LowView(bars, count, period, date, numerator, show_date).views()
111
+ elif view in ["c", "close"]: # fechamentos
112
+ views = CloseView(bars, count, period, date, numerator, show_date).views()
113
+ elif view in ["v", "volume"]: # volumes
114
+ views = VolumesView(
115
+ bars, count, period, date, numerator, show_date, volume
116
+ ).views()
117
+ else: # completo
118
+ views = FullView(bars, count, period, date, numerator, show_date).views()
119
+ if views:
120
+ for view in views:
121
+ click.echo(view)
122
+ logger.info("Exibição do gráfico MT5 finalizada.")
123
+
124
+
125
+ if __name__ == "__main__":
126
+ bars()
@@ -2,9 +2,7 @@
2
2
 
3
3
  import os
4
4
  import click
5
- import MetaTrader5 as mt5
6
- from mtcli.conecta import conectar, shutdown
7
- from mtcli.models.model_conf import ConfModel
5
+ from mtcli.models.conf_model import ConfModel
8
6
 
9
7
 
10
8
  @click.command(
@@ -1,104 +1,101 @@
1
- """Gerencia configurações registradas no mtcli.ini."""
2
-
3
- import os
4
- import click
5
- import MetaTrader5 as mt5
6
- from mtcli.conecta import conectar, shutdown
7
- from mtcli.models.model_conf import ConfModel
8
-
9
-
10
- config = ConfModel("mtcli.ini").carregar()
11
-
12
- section = "DEFAULT"
13
- symbol = os.getenv("SYMBOL", config[section].get("symbol", fallback="WIN$N"))
14
- digitos = int(os.getenv("DIGITOS", config[section].getint("digitos", fallback=2)))
15
- period = os.getenv("PERIOD", config[section].get("period", fallback="D1"))
16
- periodos = count = int(
17
- os.getenv("COUNT", config[section].getint("count", fallback=999))
18
- )
19
- view = os.getenv("VIEW", config[section].get("view", fallback="ch"))
20
- volume = os.getenv("VOLUME", config[section].get("volume", fallback="tick"))
21
- date = os.getenv("DATE", config[section].get("date", fallback=""))
22
-
23
- lateral = os.getenv("LATERAL", config[section].get("lateral", fallback="doji"))
24
- alta = os.getenv("ALTA", config[section].get("alta", fallback="verde"))
25
- baixa = os.getenv("BAIXA", config[section].get("baixa", fallback="vermelho"))
26
- rompimento_alta = os.getenv(
27
- "ROMPIMENTO_ALTA", config[section].get("rompimento_alta", fallback="c")
28
- )
29
- rompimento_baixa = os.getenv(
30
- "ROMPIMENTO_BAIXA", config[section].get("rompimento_baixa", fallback="v")
31
- )
32
- percentual_rompimento = int(
33
- os.getenv(
34
- "PERCENTUAL_ROMPIMENTO",
35
- config[section].getint("percentual_rompimento", fallback=50),
36
- )
37
- )
38
- percentual_doji = int(
39
- os.getenv("PERCENTUAL_DOJI", config[section].getint("percentual_doji", fallback=10))
40
- )
41
- up_bar = os.getenv("UP_BAR", config[section].get("up_bar", fallback="asc"))
42
- down_bar = os.getenv("DOWN_BAR", config[section].get("down_bar", fallback="desc"))
43
- inside_bar = os.getenv("INSIDE_BAR", config[section].get("inside_bar", fallback="ib"))
44
- outside_bar = os.getenv(
45
- "OUTSIDE_BAR", config[section].get("outside_bar", fallback="ob")
46
- )
47
- sombra_superior = os.getenv(
48
- "SOMBRA_SUPERIOR", config[section].get("sombra_superior", fallback="top")
49
- )
50
- sombra_inferior = os.getenv(
51
- "SOMBRA_INFERIOR", config[section].get("sombra_inferior", fallback="bottom")
52
- )
53
- data_source = dados = os.getenv("DADOS", config[section].get("dados", fallback="mt5"))
54
- csv_path = mt5_pasta = os.getenv(
55
- "MT5_PASTA", config[section].get("mt5_pasta", fallback="")
56
- )
57
-
58
-
59
- def get_data_source():
60
- from mtcli.data import CsvDataSource, MT5DataSource
61
-
62
- if data_source.lower() == "csv":
63
- return CsvDataSource()
64
- elif data_source.lower() == "mt5":
65
- return MT5DataSource()
66
- else:
67
- raise ValueError(f"Fonte de dados desconhecida: {data_source}")
68
-
69
-
70
- if not csv_path:
71
- conectar()
72
- terminal_info = mt5.terminal_info()
73
- if terminal_info is None:
74
- raise RuntimeError("Não foi possível obter as informações do terminal.")
75
-
76
- csv_path = terminal_info.data_path + "/MQL5/Files"
77
- shutdown()
78
-
79
- csv_path = csv_path.replace("\\", "/")
80
- csv_path += "/"
81
-
82
- timeframes = [
83
- "mn1",
84
- "w1",
85
- "d1",
86
- "h12",
87
- "h8",
88
- "h6",
89
- "h4",
90
- "h3",
91
- "h2",
92
- "h1",
93
- "m30",
94
- "m20",
95
- "m15",
96
- "m12",
97
- "m10",
98
- "m6",
99
- "m5",
100
- "m4",
101
- "m3",
102
- "m2",
103
- "m1",
104
- ]
1
+ import os
2
+ import MetaTrader5 as mt5
3
+ from mtcli.conecta import conectar, shutdown
4
+ from mtcli.models.conf_model import ConfModel
5
+
6
+
7
+ config = ConfModel("mtcli.ini").carregar()
8
+
9
+ section = "DEFAULT"
10
+ symbol = os.getenv("SYMBOL", config[section].get("symbol", fallback="WIN$N"))
11
+ 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(
14
+ os.getenv("COUNT", config[section].getint("count", fallback=999))
15
+ )
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=""))
19
+
20
+ lateral = os.getenv("LATERAL", config[section].get("lateral", fallback="doji"))
21
+ alta = os.getenv("ALTA", config[section].get("alta", fallback="verde"))
22
+ baixa = os.getenv("BAIXA", config[section].get("baixa", fallback="vermelho"))
23
+ rompimento_alta = os.getenv(
24
+ "ROMPIMENTO_ALTA", config[section].get("rompimento_alta", fallback="c")
25
+ )
26
+ rompimento_baixa = os.getenv(
27
+ "ROMPIMENTO_BAIXA", config[section].get("rompimento_baixa", fallback="v")
28
+ )
29
+ percentual_rompimento = int(
30
+ os.getenv(
31
+ "PERCENTUAL_ROMPIMENTO",
32
+ config[section].getint("percentual_rompimento", fallback=50),
33
+ )
34
+ )
35
+ percentual_doji = int(
36
+ os.getenv("PERCENTUAL_DOJI", config[section].getint("percentual_doji", fallback=10))
37
+ )
38
+ up_bar = os.getenv("UP_BAR", config[section].get("up_bar", fallback="asc"))
39
+ down_bar = os.getenv("DOWN_BAR", config[section].get("down_bar", fallback="desc"))
40
+ inside_bar = os.getenv("INSIDE_BAR", config[section].get("inside_bar", fallback="ib"))
41
+ outside_bar = os.getenv(
42
+ "OUTSIDE_BAR", config[section].get("outside_bar", fallback="ob")
43
+ )
44
+ sombra_superior = os.getenv(
45
+ "SOMBRA_SUPERIOR", config[section].get("sombra_superior", fallback="top")
46
+ )
47
+ sombra_inferior = os.getenv(
48
+ "SOMBRA_INFERIOR", config[section].get("sombra_inferior", fallback="bottom")
49
+ )
50
+ data_source = dados = os.getenv("DADOS", config[section].get("dados", fallback="mt5"))
51
+ csv_path = mt5_pasta = os.getenv(
52
+ "MT5_PASTA", config[section].get("mt5_pasta", fallback="")
53
+ )
54
+
55
+
56
+ def get_data_source():
57
+ from mtcli.data import CsvDataSource, MT5DataSource
58
+
59
+ if data_source.lower() == "csv":
60
+ return CsvDataSource()
61
+ elif data_source.lower() == "mt5":
62
+ return MT5DataSource()
63
+ else:
64
+ raise ValueError(f"Fonte de dados desconhecida: {data_source}")
65
+
66
+
67
+ if not csv_path:
68
+ conectar()
69
+ terminal_info = mt5.terminal_info()
70
+ if terminal_info is None:
71
+ raise RuntimeError("Não foi possível obter as informações do terminal.")
72
+
73
+ csv_path = terminal_info.data_path + "/MQL5/Files"
74
+ shutdown()
75
+
76
+ csv_path = csv_path.replace("\\", "/")
77
+ csv_path += "/"
78
+
79
+ timeframes = [
80
+ "mn1",
81
+ "w1",
82
+ "d1",
83
+ "h12",
84
+ "h8",
85
+ "h6",
86
+ "h4",
87
+ "h3",
88
+ "h2",
89
+ "h1",
90
+ "m30",
91
+ "m20",
92
+ "m15",
93
+ "m12",
94
+ "m10",
95
+ "m6",
96
+ "m5",
97
+ "m4",
98
+ "m3",
99
+ "m2",
100
+ "m1",
101
+ ]