mtcli 3.0.0.dev1__tar.gz → 3.1.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.0.0.dev1 → mtcli-3.1.0}/PKG-INFO +1 -1
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/commands/bars.py +126 -126
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/commands/conf.py +50 -52
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/conf.py +1 -4
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/logger.py +1 -1
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/models/bar_model.py +105 -105
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/models/bars_model.py +25 -25
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/models/chart_model.py +155 -155
- mtcli-3.0.0.dev1/mtcli/models/model_conf.py → mtcli-3.1.0/mtcli/models/conf_model.py +33 -33
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/models/consecutive_bars_model.py +77 -77
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/models/rates_model.py +41 -41
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/models/signals_model.py +102 -102
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/models/unconsecutive_bar_model.py +67 -67
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/plugins/media_movel/command.py +99 -99
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/plugins/range_medio/__init__.py +2 -2
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/plugins/range_medio/command.py +32 -32
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/plugins/range_medio/models/average_range_model.py +29 -29
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/plugins/volume_medio/command.py +42 -42
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/plugins/volume_medio/models/model_average_volume.py +31 -31
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/views/close_view.py +37 -37
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/views/full_view.py +65 -65
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/views/high_view.py +37 -37
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/views/low_view.py +37 -37
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/views/min_view.py +42 -42
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/views/open_view.py +37 -37
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/views/ranges_view.py +43 -43
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/views/rates_view.py +41 -41
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/views/vars_view.py +53 -53
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/views/volumes_view.py +52 -52
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/pyproject.toml +1 -1
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/LICENSE +0 -0
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/README.md +0 -0
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/__init__.py +0 -0
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/commands/__init__.py +0 -0
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/commands/logs.py +0 -0
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/conecta.py +0 -0
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/data/__init__.py +0 -0
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/data/base.py +0 -0
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/data/csv.py +0 -0
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/data/mt5.py +0 -0
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/models/__init__.py +0 -0
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/mt.py +0 -0
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/plugin.py +0 -0
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/plugins/__init__.py +0 -0
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/plugins/agressao/__init__.py +0 -0
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/plugins/agressao/command.py +0 -0
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/plugins/agressao/conf.py +0 -0
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/plugins/agressao/models/__init__.py +0 -0
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/plugins/agressao/models/model_agressao.py +0 -0
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/plugins/agressao/views/__init__.py +0 -0
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/plugins/agressao/views/view_agressao.py +0 -0
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/plugins/media_movel/__init__.py +0 -0
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/plugins/media_movel/conf.py +0 -0
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/plugins/media_movel/models/__init__.py +0 -0
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/plugins/media_movel/models/model_media_movel.py +0 -0
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/plugins/media_movel/tests/__init__.py +0 -0
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/plugins/media_movel/tests/test_mm.py +0 -0
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/plugins/media_movel/tests/test_model_media_movel.py +0 -0
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/plugins/range_medio/conf.py +0 -0
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/plugins/range_medio/models/__init__.py +0 -0
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/plugins/range_medio/tests/__init__.py +0 -0
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/plugins/range_medio/tests/test_rm.py +0 -0
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/plugins/volume_medio/__init__.py +0 -0
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/plugins/volume_medio/conf.py +0 -0
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/plugins/volume_medio/models/__init__.py +0 -0
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/plugins/volume_medio/tests/__init__.py +0 -0
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/plugins/volume_medio/tests/test_vm.py +0 -0
- {mtcli-3.0.0.dev1 → mtcli-3.1.0}/mtcli/views/__init__.py +0 -0
|
@@ -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()
|
|
@@ -1,52 +1,50 @@
|
|
|
1
|
-
"""Gerencia configurações registradas no mtcli.ini."""
|
|
2
|
-
|
|
3
|
-
import os
|
|
4
|
-
import click
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
)
|
|
14
|
-
@click.option("--
|
|
15
|
-
@click.option("--
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
click.echo(f"{get}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
if __name__ == "__main__":
|
|
52
|
-
conf()
|
|
1
|
+
"""Gerencia configurações registradas no mtcli.ini."""
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
import click
|
|
5
|
+
from mtcli.models.conf_model import ConfModel
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
@click.command(
|
|
9
|
+
"conf",
|
|
10
|
+
help="Gerencia as configurações salvas no arquivo mtcli.ini (adicionar, editar, listar).",
|
|
11
|
+
)
|
|
12
|
+
@click.option("--list", "list_", is_flag=True, help="Lista todas as configurações.")
|
|
13
|
+
@click.option("--set", "set_", nargs=2, help="Define o valor de uma configuração.")
|
|
14
|
+
@click.option("--get", help="Exibe o valor de uma configuração.")
|
|
15
|
+
@click.option("--reset", is_flag=True, help="Redefine as configurações padrão.")
|
|
16
|
+
def conf(list_, set_, get, reset):
|
|
17
|
+
"""Gerencia configurações registradas no mtcli.ini."""
|
|
18
|
+
conf = ConfModel("mtcli.ini")
|
|
19
|
+
config = conf.carregar()
|
|
20
|
+
|
|
21
|
+
if list_:
|
|
22
|
+
for key in config["DEFAULT"]:
|
|
23
|
+
click.echo(f"{key} = {config['DEFAULT'][key]}")
|
|
24
|
+
|
|
25
|
+
elif set_:
|
|
26
|
+
chave, valor = set_
|
|
27
|
+
config["DEFAULT"][chave] = valor
|
|
28
|
+
conf.salvar(config)
|
|
29
|
+
click.echo(f"Configuração '{chave}' definida como '{valor}'.")
|
|
30
|
+
|
|
31
|
+
elif get:
|
|
32
|
+
valor = config["DEFAULT"].get(get)
|
|
33
|
+
if valor is not None:
|
|
34
|
+
click.echo(f"{get} = {valor}")
|
|
35
|
+
else:
|
|
36
|
+
click.echo(f"Configuração '{get}' não encontrada.")
|
|
37
|
+
|
|
38
|
+
elif reset:
|
|
39
|
+
config["DEFAULT"].clear()
|
|
40
|
+
conf.salvar(config)
|
|
41
|
+
click.echo("Configurações redefinidas.")
|
|
42
|
+
|
|
43
|
+
else:
|
|
44
|
+
click.echo(
|
|
45
|
+
"Nenhuma opção fornecida. Use --help para ver as opções disponíveis."
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
if __name__ == "__main__":
|
|
50
|
+
conf()
|
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
"""Gerencia configurações registradas no mtcli.ini."""
|
|
2
|
-
|
|
3
1
|
import os
|
|
4
|
-
import click
|
|
5
2
|
import MetaTrader5 as mt5
|
|
6
3
|
from mtcli.conecta import conectar, shutdown
|
|
7
|
-
from mtcli.models.
|
|
4
|
+
from mtcli.models.conf_model import ConfModel
|
|
8
5
|
|
|
9
6
|
|
|
10
7
|
config = ConfModel("mtcli.ini").carregar()
|
|
@@ -1,105 +1,105 @@
|
|
|
1
|
-
"""Módulo da classe model da barra."""
|
|
2
|
-
|
|
3
|
-
from datetime import datetime
|
|
4
|
-
|
|
5
|
-
from mtcli import conf
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class BarModel:
|
|
9
|
-
"""Classe do model da barra."""
|
|
10
|
-
|
|
11
|
-
def __init__(self, rate):
|
|
12
|
-
"""Model da barra."""
|
|
13
|
-
self.datetime = rate[0]
|
|
14
|
-
self.date = self.__get_date()
|
|
15
|
-
self.time = self.__get_time()
|
|
16
|
-
self.open = float(rate[1])
|
|
17
|
-
self.high = float(rate[2])
|
|
18
|
-
self.low = float(rate[3])
|
|
19
|
-
self.close = float(rate[4])
|
|
20
|
-
self.volume = int(rate[5])
|
|
21
|
-
self.volume_real = int(rate[6])
|
|
22
|
-
self.range = self.__get_range()
|
|
23
|
-
self.body = self.__get_body()
|
|
24
|
-
self.top = self.__get_top()
|
|
25
|
-
self.bottom = self.__get_bottom()
|
|
26
|
-
self.body_range = self.__get_body_range()
|
|
27
|
-
self.trend = self.__get_trend()
|
|
28
|
-
self.medium_point = self.__get_medium_point()
|
|
29
|
-
|
|
30
|
-
def __get_date(self):
|
|
31
|
-
"""Obtem a data da barra no formato YYYY-MM-DD."""
|
|
32
|
-
data = datetime.strptime(self.datetime, "%Y.%m.%d %H:%M:%S")
|
|
33
|
-
return data.date()
|
|
34
|
-
|
|
35
|
-
def __get_time(self):
|
|
36
|
-
"""Obtem o horário da barra no formato HH:MM:SS."""
|
|
37
|
-
hora = datetime.strptime(self.datetime, "%Y.%m.%d %H:%M:%S")
|
|
38
|
-
hora = hora.time()
|
|
39
|
-
return hora.strftime("%H:%M")
|
|
40
|
-
|
|
41
|
-
def __get_range(self):
|
|
42
|
-
"""Obtem o range da barra."""
|
|
43
|
-
return self.high - self.low
|
|
44
|
-
|
|
45
|
-
def __get_body(self):
|
|
46
|
-
"""Calcula o range relativo do corpo da barra em porcentagem."""
|
|
47
|
-
if self.range == 0:
|
|
48
|
-
return 0
|
|
49
|
-
|
|
50
|
-
return round((self.close - self.open) / self.range * 100)
|
|
51
|
-
|
|
52
|
-
def __get_top(self):
|
|
53
|
-
"""Calcula o range relativo da sombra superior da barra em porcentagem."""
|
|
54
|
-
high = self.high
|
|
55
|
-
open = self.open
|
|
56
|
-
close = self.close
|
|
57
|
-
range = self.range
|
|
58
|
-
|
|
59
|
-
if close >= open:
|
|
60
|
-
top = high - close
|
|
61
|
-
else:
|
|
62
|
-
top = high - open
|
|
63
|
-
|
|
64
|
-
if range == 0:
|
|
65
|
-
return 0
|
|
66
|
-
|
|
67
|
-
return round(top / range * 100)
|
|
68
|
-
|
|
69
|
-
def __get_bottom(self):
|
|
70
|
-
"""Obtem o range relativo da sombra inferior da barra em porcentagem."""
|
|
71
|
-
low = self.low
|
|
72
|
-
open = self.open
|
|
73
|
-
close = self.close
|
|
74
|
-
range = self.range
|
|
75
|
-
|
|
76
|
-
if close >= open:
|
|
77
|
-
bottom = open - low
|
|
78
|
-
else:
|
|
79
|
-
bottom = close - low
|
|
80
|
-
|
|
81
|
-
if range == 0:
|
|
82
|
-
return 0
|
|
83
|
-
|
|
84
|
-
return round(bottom / range * 100)
|
|
85
|
-
|
|
86
|
-
def __get_body_range(self):
|
|
87
|
-
"""Calcula o range do corpo da barra."""
|
|
88
|
-
return abs(self.close - self.open)
|
|
89
|
-
|
|
90
|
-
def __get_trend(self):
|
|
91
|
-
"""Obtem a tendência da barra."""
|
|
92
|
-
b = self.body
|
|
93
|
-
|
|
94
|
-
if b > 0:
|
|
95
|
-
trend = conf.alta
|
|
96
|
-
elif b < 0:
|
|
97
|
-
trend = conf.baixa
|
|
98
|
-
else:
|
|
99
|
-
trend = conf.lateral
|
|
100
|
-
|
|
101
|
-
return trend
|
|
102
|
-
|
|
103
|
-
def __get_medium_point(self):
|
|
104
|
-
"""Obtem o ponto médio da barra."""
|
|
105
|
-
return round(self.low + self.range / 2, conf.digitos)
|
|
1
|
+
"""Módulo da classe model da barra."""
|
|
2
|
+
|
|
3
|
+
from datetime import datetime
|
|
4
|
+
|
|
5
|
+
from mtcli import conf
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class BarModel:
|
|
9
|
+
"""Classe do model da barra."""
|
|
10
|
+
|
|
11
|
+
def __init__(self, rate):
|
|
12
|
+
"""Model da barra."""
|
|
13
|
+
self.datetime = rate[0]
|
|
14
|
+
self.date = self.__get_date()
|
|
15
|
+
self.time = self.__get_time()
|
|
16
|
+
self.open = float(rate[1])
|
|
17
|
+
self.high = float(rate[2])
|
|
18
|
+
self.low = float(rate[3])
|
|
19
|
+
self.close = float(rate[4])
|
|
20
|
+
self.volume = int(rate[5])
|
|
21
|
+
self.volume_real = int(rate[6])
|
|
22
|
+
self.range = self.__get_range()
|
|
23
|
+
self.body = self.__get_body()
|
|
24
|
+
self.top = self.__get_top()
|
|
25
|
+
self.bottom = self.__get_bottom()
|
|
26
|
+
self.body_range = self.__get_body_range()
|
|
27
|
+
self.trend = self.__get_trend()
|
|
28
|
+
self.medium_point = self.__get_medium_point()
|
|
29
|
+
|
|
30
|
+
def __get_date(self):
|
|
31
|
+
"""Obtem a data da barra no formato YYYY-MM-DD."""
|
|
32
|
+
data = datetime.strptime(self.datetime, "%Y.%m.%d %H:%M:%S")
|
|
33
|
+
return data.date()
|
|
34
|
+
|
|
35
|
+
def __get_time(self):
|
|
36
|
+
"""Obtem o horário da barra no formato HH:MM:SS."""
|
|
37
|
+
hora = datetime.strptime(self.datetime, "%Y.%m.%d %H:%M:%S")
|
|
38
|
+
hora = hora.time()
|
|
39
|
+
return hora.strftime("%H:%M")
|
|
40
|
+
|
|
41
|
+
def __get_range(self):
|
|
42
|
+
"""Obtem o range da barra."""
|
|
43
|
+
return self.high - self.low
|
|
44
|
+
|
|
45
|
+
def __get_body(self):
|
|
46
|
+
"""Calcula o range relativo do corpo da barra em porcentagem."""
|
|
47
|
+
if self.range == 0:
|
|
48
|
+
return 0
|
|
49
|
+
|
|
50
|
+
return round((self.close - self.open) / self.range * 100)
|
|
51
|
+
|
|
52
|
+
def __get_top(self):
|
|
53
|
+
"""Calcula o range relativo da sombra superior da barra em porcentagem."""
|
|
54
|
+
high = self.high
|
|
55
|
+
open = self.open
|
|
56
|
+
close = self.close
|
|
57
|
+
range = self.range
|
|
58
|
+
|
|
59
|
+
if close >= open:
|
|
60
|
+
top = high - close
|
|
61
|
+
else:
|
|
62
|
+
top = high - open
|
|
63
|
+
|
|
64
|
+
if range == 0:
|
|
65
|
+
return 0
|
|
66
|
+
|
|
67
|
+
return round(top / range * 100)
|
|
68
|
+
|
|
69
|
+
def __get_bottom(self):
|
|
70
|
+
"""Obtem o range relativo da sombra inferior da barra em porcentagem."""
|
|
71
|
+
low = self.low
|
|
72
|
+
open = self.open
|
|
73
|
+
close = self.close
|
|
74
|
+
range = self.range
|
|
75
|
+
|
|
76
|
+
if close >= open:
|
|
77
|
+
bottom = open - low
|
|
78
|
+
else:
|
|
79
|
+
bottom = close - low
|
|
80
|
+
|
|
81
|
+
if range == 0:
|
|
82
|
+
return 0
|
|
83
|
+
|
|
84
|
+
return round(bottom / range * 100)
|
|
85
|
+
|
|
86
|
+
def __get_body_range(self):
|
|
87
|
+
"""Calcula o range do corpo da barra."""
|
|
88
|
+
return abs(self.close - self.open)
|
|
89
|
+
|
|
90
|
+
def __get_trend(self):
|
|
91
|
+
"""Obtem a tendência da barra."""
|
|
92
|
+
b = self.body
|
|
93
|
+
|
|
94
|
+
if b > 0:
|
|
95
|
+
trend = conf.alta
|
|
96
|
+
elif b < 0:
|
|
97
|
+
trend = conf.baixa
|
|
98
|
+
else:
|
|
99
|
+
trend = conf.lateral
|
|
100
|
+
|
|
101
|
+
return trend
|
|
102
|
+
|
|
103
|
+
def __get_medium_point(self):
|
|
104
|
+
"""Obtem o ponto médio da barra."""
|
|
105
|
+
return round(self.low + self.range / 2, conf.digitos)
|
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
"""Módulo da classe model da lista de barras."""
|
|
2
|
-
|
|
3
|
-
from mtcli.models.bar_model import BarModel
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
class BarsModel:
|
|
7
|
-
"""Classe model da lista de barras."""
|
|
8
|
-
|
|
9
|
-
def __init__(self, rates, date=""):
|
|
10
|
-
"""Model da lista de barras."""
|
|
11
|
-
self.rates = rates
|
|
12
|
-
self.date = date
|
|
13
|
-
# self.lista = self.__lista()
|
|
14
|
-
|
|
15
|
-
def get_bars(self):
|
|
16
|
-
"""Gera a lista das barras."""
|
|
17
|
-
lista = []
|
|
18
|
-
for rate in self.rates:
|
|
19
|
-
bar = BarModel(rate)
|
|
20
|
-
if (
|
|
21
|
-
self.date and str(bar.date) != self.date
|
|
22
|
-
): # filtra por data para intraday
|
|
23
|
-
continue
|
|
24
|
-
lista.append(bar)
|
|
25
|
-
return lista
|
|
1
|
+
"""Módulo da classe model da lista de barras."""
|
|
2
|
+
|
|
3
|
+
from mtcli.models.bar_model import BarModel
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class BarsModel:
|
|
7
|
+
"""Classe model da lista de barras."""
|
|
8
|
+
|
|
9
|
+
def __init__(self, rates, date=""):
|
|
10
|
+
"""Model da lista de barras."""
|
|
11
|
+
self.rates = rates
|
|
12
|
+
self.date = date
|
|
13
|
+
# self.lista = self.__lista()
|
|
14
|
+
|
|
15
|
+
def get_bars(self):
|
|
16
|
+
"""Gera a lista das barras."""
|
|
17
|
+
lista = []
|
|
18
|
+
for rate in self.rates:
|
|
19
|
+
bar = BarModel(rate)
|
|
20
|
+
if (
|
|
21
|
+
self.date and str(bar.date) != self.date
|
|
22
|
+
): # filtra por data para intraday
|
|
23
|
+
continue
|
|
24
|
+
lista.append(bar)
|
|
25
|
+
return lista
|