mtcli 2.6.0__tar.gz → 2.7.0.dev0__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-2.6.0 → mtcli-2.7.0.dev0}/PKG-INFO +1 -1
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/__init__.py +1 -1
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/commands/bars.py +8 -4
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/commands/conf.py +4 -1
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/commands/logs.py +1 -1
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/conf.py +104 -104
- mtcli-2.6.0/mtcli/models/model_bars.py → mtcli-2.7.0.dev0/mtcli/models/bars_model.py +4 -4
- mtcli-2.6.0/mtcli/models/model_rates.py → mtcli-2.7.0.dev0/mtcli/models/rates_model.py +1 -2
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/mt.py +1 -1
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/plugin.py +9 -9
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/plugins/media_movel/command.py +5 -3
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/plugins/range_medio/__init__.py +0 -1
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/plugins/range_medio/command.py +7 -7
- mtcli-2.6.0/mtcli/plugins/range_medio/models/model_average_range.py → mtcli-2.7.0.dev0/mtcli/plugins/range_medio/models/average_range_model.py +5 -7
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/plugins/volume_medio/command.py +6 -3
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/plugins/volume_medio/models/model_average_volume.py +5 -5
- mtcli-2.7.0.dev0/mtcli/plugins/volume_medio/tests/__init__.py +0 -0
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/pyproject.toml +1 -1
- mtcli-2.6.0/mtcli/plugins/range_medio/models/__init__.py +0 -1
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/LICENSE +0 -0
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/README.md +0 -0
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/commands/__init__.py +0 -0
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/conecta.py +0 -0
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/data/__init__.py +0 -0
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/data/base.py +0 -0
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/data/csv.py +0 -0
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/data/mt5.py +0 -0
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/logger.py +0 -0
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/models/__init__.py +0 -0
- /mtcli-2.6.0/mtcli/models/model_bar.py → /mtcli-2.7.0.dev0/mtcli/models/bar_model.py +0 -0
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/models/model_chart.py +0 -0
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/models/model_conf.py +0 -0
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/models/model_consecutive_bars.py +0 -0
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/models/model_signals.py +0 -0
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/models/model_unconsecutive_bar.py +0 -0
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/plugins/__init__.py +0 -0
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/plugins/agressao/__init__.py +0 -0
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/plugins/agressao/command.py +0 -0
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/plugins/agressao/conf.py +0 -0
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/plugins/agressao/models/__init__.py +0 -0
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/plugins/agressao/models/model_agressao.py +0 -0
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/plugins/agressao/views/__init__.py +0 -0
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/plugins/agressao/views/view_agressao.py +0 -0
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/plugins/media_movel/__init__.py +0 -0
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/plugins/media_movel/conf.py +0 -0
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/plugins/media_movel/models/__init__.py +0 -0
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/plugins/media_movel/models/model_media_movel.py +0 -0
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/plugins/media_movel/tests/__init__.py +0 -0
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/plugins/media_movel/tests/test_mm.py +0 -0
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/plugins/media_movel/tests/test_model_media_movel.py +0 -0
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/plugins/range_medio/conf.py +0 -0
- {mtcli-2.6.0/mtcli/plugins/range_medio/tests → mtcli-2.7.0.dev0/mtcli/plugins/range_medio/models}/__init__.py +0 -0
- {mtcli-2.6.0/mtcli/plugins/volume_medio → mtcli-2.7.0.dev0/mtcli/plugins/range_medio}/tests/__init__.py +0 -0
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/plugins/range_medio/tests/test_rm.py +0 -0
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/plugins/volume_medio/__init__.py +0 -0
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/plugins/volume_medio/conf.py +0 -0
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/plugins/volume_medio/models/__init__.py +0 -0
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/plugins/volume_medio/tests/test_vm.py +0 -0
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/views/__init__.py +0 -0
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/views/view_close.py +0 -0
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/views/view_full.py +0 -0
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/views/view_high.py +0 -0
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/views/view_low.py +0 -0
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/views/view_min.py +0 -0
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/views/view_open.py +0 -0
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/views/view_ranges.py +0 -0
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/views/view_rates.py +0 -0
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/views/view_vars.py +0 -0
- {mtcli-2.6.0 → mtcli-2.7.0.dev0}/mtcli/views/view_volumes.py +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
"""Aplicativo de linha de comando para exibir graficos do MetaTrader 5 em texto."""
|
|
1
|
+
"""Aplicativo de linha de comando para exibir graficos do MetaTrader 5 em texto."""
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
import click
|
|
4
4
|
|
|
5
5
|
from mtcli import conf
|
|
6
|
-
from mtcli.models import
|
|
6
|
+
from mtcli.models.rates_model import RatesModel
|
|
7
|
+
from mtcli.models.bars_model import BarsModel
|
|
7
8
|
from mtcli.views import (
|
|
8
9
|
view_close,
|
|
9
10
|
view_full,
|
|
@@ -21,7 +22,10 @@ from mtcli.logger import setup_logger
|
|
|
21
22
|
logger = setup_logger("mtcli") # Cria o logger
|
|
22
23
|
|
|
23
24
|
|
|
24
|
-
@click.command(
|
|
25
|
+
@click.command(
|
|
26
|
+
"bars",
|
|
27
|
+
help="Mostra o gráfico de candles em texto para o ativo e período especificados.",
|
|
28
|
+
)
|
|
25
29
|
@click.argument("symbol")
|
|
26
30
|
@click.option(
|
|
27
31
|
"--view",
|
|
@@ -88,8 +92,8 @@ def bars(symbol, view, period, count, date, numerator, show_date, volume):
|
|
|
88
92
|
logger.info(
|
|
89
93
|
f"Iniciando exibição do gráfico MT5: {symbol} view {view} no {period} data {date} numerador {numerator} data {show_date} volume {volume}."
|
|
90
94
|
)
|
|
91
|
-
rates =
|
|
92
|
-
bars =
|
|
95
|
+
rates = RatesModel(symbol, period, count).get_data()
|
|
96
|
+
bars = BarsModel(rates, date).get_bars()
|
|
93
97
|
views = []
|
|
94
98
|
if view in ["m", "ch", "hl"]: # máximas e mínimas
|
|
95
99
|
views = view_min.MinView(
|
|
@@ -7,7 +7,10 @@ from mtcli.conecta import conectar, shutdown
|
|
|
7
7
|
from mtcli.models.model_conf import ConfModel
|
|
8
8
|
|
|
9
9
|
|
|
10
|
-
@click.command(
|
|
10
|
+
@click.command(
|
|
11
|
+
"conf",
|
|
12
|
+
help="Gerencia as configurações salvas no arquivo mtcli.ini (adicionar, editar, listar).",
|
|
13
|
+
)
|
|
11
14
|
@click.option("--list", "list_", is_flag=True, help="Lista todas as configurações.")
|
|
12
15
|
@click.option("--set", "set_", nargs=2, help="Define o valor de uma configuração.")
|
|
13
16
|
@click.option("--get", help="Exibe o valor de uma configuração.")
|
|
@@ -5,7 +5,7 @@ import click
|
|
|
5
5
|
from mtcli.logger import setup_logger
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
@click.command("logs")
|
|
8
|
+
@click.command("logs", help="Exibe ou limpa os logs de execução do mtcli.")
|
|
9
9
|
@click.option("--clear", is_flag=True, help="Limpa o arquivo de log.")
|
|
10
10
|
@click.option("--tail", default=0, type=int, help="Mostra apenas as últimas N linhas.")
|
|
11
11
|
@click.option("--grep", default="", help="Filtra o log por uma palavra-chave.")
|
|
@@ -1,104 +1,104 @@
|
|
|
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
|
+
"""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,6 +1,6 @@
|
|
|
1
1
|
"""Módulo da classe model da lista de barras."""
|
|
2
2
|
|
|
3
|
-
from mtcli.models import
|
|
3
|
+
from mtcli.models.bar_model import BarModel
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
class BarsModel:
|
|
@@ -10,13 +10,13 @@ class BarsModel:
|
|
|
10
10
|
"""Model da lista de barras."""
|
|
11
11
|
self.rates = rates
|
|
12
12
|
self.date = date
|
|
13
|
-
self.lista = self.__lista()
|
|
13
|
+
# self.lista = self.__lista()
|
|
14
14
|
|
|
15
|
-
def
|
|
15
|
+
def get_bars(self):
|
|
16
16
|
"""Gera a lista das barras."""
|
|
17
17
|
lista = []
|
|
18
18
|
for rate in self.rates:
|
|
19
|
-
bar =
|
|
19
|
+
bar = BarModel(rate)
|
|
20
20
|
if (
|
|
21
21
|
self.date and str(bar.date) != self.date
|
|
22
22
|
): # filtra por data para intraday
|
|
@@ -17,9 +17,8 @@ class RatesModel:
|
|
|
17
17
|
self.end = end
|
|
18
18
|
self.limit = limit
|
|
19
19
|
self.source = conf.get_data_source()
|
|
20
|
-
self.lista = self.__get_data()
|
|
21
20
|
|
|
22
|
-
def
|
|
21
|
+
def get_data(self):
|
|
23
22
|
"""Obtém a lista das cotações com filtros opcionais."""
|
|
24
23
|
data = self.source.get_data(self.symbol, self.period, self.count)
|
|
25
24
|
|
|
@@ -8,7 +8,7 @@ except ImportError:
|
|
|
8
8
|
from importlib_metadata import entry_points # Para Python < 3.8
|
|
9
9
|
|
|
10
10
|
|
|
11
|
-
@click.group()
|
|
11
|
+
@click.group(context_settings={"max_content_width": 120})
|
|
12
12
|
@click.version_option(package_name="mtcli")
|
|
13
13
|
def mt():
|
|
14
14
|
"""Exibe o grafico do MetaTrader 5 em texto."""
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
from mtcli.commands.bars import bars
|
|
2
|
-
from mtcli.commands.conf import conf
|
|
3
|
-
from mtcli.commands.logs import logs
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
def register(cli):
|
|
7
|
-
cli.add_command(bars)
|
|
8
|
-
cli.add_command(conf)
|
|
9
|
-
cli.add_command(logs)
|
|
1
|
+
from mtcli.commands.bars import bars
|
|
2
|
+
from mtcli.commands.conf import conf
|
|
3
|
+
from mtcli.commands.logs import logs
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def register(cli):
|
|
7
|
+
cli.add_command(bars)
|
|
8
|
+
cli.add_command(conf)
|
|
9
|
+
cli.add_command(logs)
|
|
@@ -5,7 +5,7 @@ from datetime import datetime
|
|
|
5
5
|
import click
|
|
6
6
|
|
|
7
7
|
from mtcli.logger import setup_logger
|
|
8
|
-
from mtcli.models.
|
|
8
|
+
from mtcli.models.rates_model import RatesModel
|
|
9
9
|
|
|
10
10
|
from . import conf
|
|
11
11
|
from .models.model_media_movel import MediaMovelModel
|
|
@@ -13,7 +13,9 @@ from .models.model_media_movel import MediaMovelModel
|
|
|
13
13
|
logger = setup_logger()
|
|
14
14
|
|
|
15
15
|
|
|
16
|
-
@click.command(
|
|
16
|
+
@click.command(
|
|
17
|
+
"mm", help="Calcula a média móvel (SMA ou EMA) para o ativo e período especificado."
|
|
18
|
+
)
|
|
17
19
|
@click.argument("symbol")
|
|
18
20
|
@click.option(
|
|
19
21
|
"--period",
|
|
@@ -56,7 +58,7 @@ def mm(symbol, period, periodos, tipo, limit, inicio, fim):
|
|
|
56
58
|
f"Iniciando cálculo da média móvel: ativo {symbol} período {period} períodos {periodos} tipo {tipo} limite {limit}"
|
|
57
59
|
)
|
|
58
60
|
|
|
59
|
-
rates = RatesModel(symbol, period).
|
|
61
|
+
rates = RatesModel(symbol, period).get_data()
|
|
60
62
|
closes = [r[4] for r in rates]
|
|
61
63
|
datas = [r[0] for r in rates]
|
|
62
64
|
|
|
@@ -2,13 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
import click
|
|
4
4
|
|
|
5
|
-
from mtcli.models import
|
|
6
|
-
|
|
5
|
+
from mtcli.models.rates_model import RatesModel
|
|
7
6
|
from . import conf
|
|
8
|
-
from .models import
|
|
7
|
+
from .models.average_range_model import AverageRangeModel
|
|
9
8
|
|
|
10
9
|
|
|
11
|
-
@click.command(
|
|
10
|
+
@click.command(
|
|
11
|
+
"rm", help="Calcula o range médio de preços do ativo em um determinado período."
|
|
12
|
+
)
|
|
12
13
|
@click.argument("symbol")
|
|
13
14
|
@click.option(
|
|
14
15
|
"--period",
|
|
@@ -22,9 +23,8 @@ from .models import model_average_range
|
|
|
22
23
|
)
|
|
23
24
|
def rm(symbol, period, periodos):
|
|
24
25
|
"""Calcula o range medio do ativo symbol."""
|
|
25
|
-
rates =
|
|
26
|
-
rm =
|
|
27
|
-
rm = rm.average()
|
|
26
|
+
rates = RatesModel(symbol, period).get_data()
|
|
27
|
+
rm = AverageRangeModel(rates, periodos).average()
|
|
28
28
|
click.echo(rm)
|
|
29
29
|
|
|
30
30
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"""Módulo da classe model para range médio."""
|
|
2
2
|
|
|
3
3
|
from mtcli import conf
|
|
4
|
-
from mtcli.models import
|
|
4
|
+
from mtcli.models.bar_model import BarModel
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
class AverageRangeModel:
|
|
@@ -11,15 +11,13 @@ class AverageRangeModel:
|
|
|
11
11
|
"""Model do range médio."""
|
|
12
12
|
self.rates = rates
|
|
13
13
|
self.count = count
|
|
14
|
-
self.
|
|
14
|
+
self.ranges = self.get_ranges()
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
def __list(self):
|
|
16
|
+
def get_ranges(self):
|
|
19
17
|
"""Lista de ranges."""
|
|
20
18
|
lista = []
|
|
21
19
|
for rate in self.rates:
|
|
22
|
-
bar =
|
|
20
|
+
bar = BarModel(rate)
|
|
23
21
|
if bar.open == bar.high and bar.high == bar.low and bar.low == bar.close:
|
|
24
22
|
continue # elimina doji de 4 preços
|
|
25
23
|
lista.append(bar.high - bar.low)
|
|
@@ -27,5 +25,5 @@ class AverageRangeModel:
|
|
|
27
25
|
|
|
28
26
|
def average(self):
|
|
29
27
|
"""Calcula o range médio."""
|
|
30
|
-
ranges = self.
|
|
28
|
+
ranges = self.ranges[-self.count :]
|
|
31
29
|
return round(sum(ranges) / len(ranges), conf.digitos)
|
|
@@ -2,13 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
import click
|
|
4
4
|
|
|
5
|
-
from mtcli.models import
|
|
5
|
+
from mtcli.models.rates_model import RatesModel
|
|
6
6
|
|
|
7
7
|
from . import conf
|
|
8
8
|
from .models import model_average_volume
|
|
9
9
|
|
|
10
10
|
|
|
11
|
-
@click.command(
|
|
11
|
+
@click.command(
|
|
12
|
+
"vm",
|
|
13
|
+
help="Calcula o volume médio (em ticks ou financeiro) do ativo em determinado período.",
|
|
14
|
+
)
|
|
12
15
|
@click.argument("symbol")
|
|
13
16
|
@click.option(
|
|
14
17
|
"--period",
|
|
@@ -29,7 +32,7 @@ from .models import model_average_volume
|
|
|
29
32
|
)
|
|
30
33
|
def vm(symbol, period, periodos, tipo):
|
|
31
34
|
"""Calcula o volume médio (tick ou real) do ativo symbol."""
|
|
32
|
-
rates =
|
|
35
|
+
rates = RatesModel(symbol, period).get_data()
|
|
33
36
|
vm = model_average_volume.AverageVolumeModel(rates, periodos, tipo)
|
|
34
37
|
vm = vm.average()
|
|
35
38
|
click.echo(vm)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"""Módulo da classe model para volume médio."""
|
|
2
2
|
|
|
3
3
|
from mtcli import conf
|
|
4
|
-
from mtcli.models import
|
|
4
|
+
from mtcli.models.bar_model import BarModel
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
class AverageVolumeModel:
|
|
@@ -12,13 +12,13 @@ class AverageVolumeModel:
|
|
|
12
12
|
self.rates = rates
|
|
13
13
|
self.count = count
|
|
14
14
|
self.type = type
|
|
15
|
-
self.
|
|
15
|
+
self.volumes = self.__get_volumes()
|
|
16
16
|
|
|
17
|
-
def
|
|
17
|
+
def __get_volumes(self):
|
|
18
18
|
"""Lista dos volumes."""
|
|
19
19
|
list = []
|
|
20
20
|
for rate in self.rates:
|
|
21
|
-
bar =
|
|
21
|
+
bar = BarModel(rate)
|
|
22
22
|
if self.type == "tick":
|
|
23
23
|
list.append(bar.volume)
|
|
24
24
|
if self.type == "real":
|
|
@@ -27,5 +27,5 @@ class AverageVolumeModel:
|
|
|
27
27
|
|
|
28
28
|
def average(self):
|
|
29
29
|
"""Calcula o volume médio."""
|
|
30
|
-
volumes = self.
|
|
30
|
+
volumes = self.volumes[-self.count :]
|
|
31
31
|
return round(sum(volumes) / len(volumes), conf.digitos)
|
|
File without changes
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
from . import model_average_range
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|