mtcli-volume 2.4.0.dev0__tar.gz → 2.4.1__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.
@@ -0,0 +1,219 @@
1
+ Metadata-Version: 2.4
2
+ Name: mtcli-volume
3
+ Version: 2.4.1
4
+ Summary: Plugin mtcli para cálculo e exibição de Volume Profile no terminal
5
+ License-File: LICENSE
6
+ Author: Valmir França
7
+ Author-email: vfranca3@gmail.com
8
+ Maintainer: Valmir França
9
+ Maintainer-email: vfranca3@gmail.com
10
+ Requires-Python: >=3.10,<3.14
11
+ Classifier: Programming Language :: Python :: 3
12
+ Classifier: Programming Language :: Python :: 3.10
13
+ Classifier: Programming Language :: Python :: 3.11
14
+ Classifier: Programming Language :: Python :: 3.12
15
+ Classifier: Programming Language :: Python :: 3.13
16
+ Requires-Dist: click (>=8.3.0,<9.0.0)
17
+ Requires-Dist: metatrader5 (>=5.0.5370,<6.0.0)
18
+ Requires-Dist: mtcli (>=3.2.0)
19
+ Requires-Dist: tzdata (>=2025.2)
20
+ Project-URL: Documentation, https://mtcli-volume.readthedocs.io
21
+ Project-URL: Homepage, https://github.com/vfranca/mtcli-volume
22
+ Project-URL: Repository, https://github.com/vfranca/mtcli-volume
23
+ Project-URL: issues, https://github.com/vfranca/mtcli-volume/issues
24
+ Description-Content-Type: text/markdown
25
+
26
+ # mtcli-volume
27
+
28
+ Plugin do **mtcli** para cálculo e visualização de **Volume Profile** diretamente no terminal, com foco em:
29
+
30
+ - Precisão técnica (distribuição High–Low)
31
+ - Leitura profissional de mercado
32
+ - Total acessibilidade (screen reader friendly)
33
+ - Integração com MetaTrader 5
34
+
35
+ ---
36
+
37
+ ## Principais recursos
38
+
39
+ - **Volume Profile por faixa High–Low**
40
+ - O volume de cada candle é distribuído uniformemente entre todas as faixas de preço tocadas entre o **LOW** e o **HIGH**
41
+ - Modelo mais próximo do Volume Profile clássico (VAP)
42
+
43
+ - **Estatísticas de Market Profile**
44
+ - POC (Point of Control)
45
+ - Área de Valor (70%)
46
+ - HVNs e LVNs com critérios profissionais
47
+
48
+ - ⚙️ **Critérios avançados para HVN/LVN**
49
+ - Baseado na média (multiplicadores)
50
+ - Baseado em percentis (ex: 80% / 20%)
51
+
52
+ - **100% acessível**
53
+ - Saída textual linear
54
+ - Compatível com NVDA, JAWS e leitores de tela
55
+ - Sem dependência de cores ou gráficos visuais
56
+
57
+ - **Arquitetura MVC**
58
+ - Model: cálculos e dados
59
+ - Controller: fluxo de negócio
60
+ - View: apresentação no terminal
61
+ - CLI: interface de linha de comando
62
+
63
+ ---
64
+
65
+ ## Instalação
66
+
67
+ Via PyPI:
68
+
69
+ ```bash
70
+ pip install mtcli-volume
71
+ ````
72
+
73
+ Ou com Poetry:
74
+
75
+ ```bash
76
+ poetry add mtcli-volume
77
+ ```
78
+
79
+ > ⚠️ Requer MetaTrader 5 instalado e configurado corretamente no sistema.
80
+
81
+ ---
82
+
83
+ ## Uso básico
84
+
85
+ Após a instalação, o comando é registrado automaticamente no `mtcli`:
86
+
87
+ ```bash
88
+ mt vp
89
+ ```
90
+
91
+ Exemplo completo:
92
+
93
+ ```bash
94
+ mt vp \
95
+ --symbol WING26 \
96
+ --period m1 \
97
+ --limit 500 \
98
+ --range 100 \
99
+ --volume tick \
100
+ --hvn-criterio media \
101
+ --verbose
102
+ ```
103
+
104
+ ---
105
+
106
+ ## 🔧 Opções disponíveis
107
+
108
+ | Opção | Descrição |
109
+ | ------------------- | -------------------------------------------- |
110
+ | `--symbol`, `-s` | Símbolo do ativo (ex: WIN, WDO, PETR4) |
111
+ | `--period`, `-p` | Timeframe (m1, m5, m15, h1, etc.) |
112
+ | `--limit`, `-l` | Quantidade de candles analisados |
113
+ | `--range`, `-r` | Tamanho da faixa de preço |
114
+ | `--volume`, `-v` | Tipo de volume (`tick` ou `real`) |
115
+ | `--inicio`, `-i` | Data/hora inicial (`YYYY-MM-DD HH:MM`) |
116
+ | `--fim`, `-f` | Data/hora final (`YYYY-MM-DD HH:MM`) |
117
+ | `--timezone`, `-tz` | Fuso horário para exibição |
118
+ | `--hvn-criterio` | Critério de HVN/LVN (`media` ou `percentil`) |
119
+ | `--verbose`, `-vv` | Exibe informações detalhadas |
120
+
121
+ ---
122
+
123
+ ## Metodologia de cálculo
124
+
125
+ ### Volume Profile
126
+
127
+ * Cada candle contribui volume para **todas as faixas de preço** entre seu `low` e `high`
128
+ * O volume é distribuído **uniformemente**
129
+ * Evita o viés de concentrar volume apenas no preço de fechamento
130
+
131
+ ### HVN / LVN
132
+
133
+ Critérios disponíveis:
134
+
135
+ * **Média**
136
+
137
+ * HVN: volume ≥ média × multiplicador
138
+ * LVN: volume ≤ média × multiplicador
139
+
140
+ * **Percentil**
141
+
142
+ * HVN: acima do percentil superior (ex: 80%)
143
+ * LVN: abaixo do percentil inferior (ex: 20%)
144
+
145
+ ---
146
+
147
+ ## Acessibilidade
148
+
149
+ Este plugin foi projetado para uso total com leitores de tela:
150
+
151
+ * Tabelas em texto puro
152
+ * Distribuição expressa em percentuais
153
+ * Estatísticas narráveis
154
+ * Sem gráficos ASCII ruidosos
155
+
156
+ Funciona corretamente com:
157
+
158
+ * NVDA
159
+ * JAWS
160
+ * VoiceOver (terminal)
161
+
162
+ ---
163
+
164
+ ## Arquitetura
165
+
166
+ ```text
167
+ mtcli_volume/
168
+ ├── cli.py # Interface de linha de comando
169
+ ├── controller.py # Orquestração do fluxo
170
+ ├── model.py # Cálculos e acesso ao MT5
171
+ ├── view.py # Apresentação acessível
172
+ ├── conf.py # Configurações padrão
173
+ └── plugin.py # Registro no mtcli
174
+ ```
175
+
176
+ ---
177
+
178
+ ## Exemplo de saída
179
+
180
+ ```text
181
+ Volume Profile — WING26
182
+
183
+ Preço | Volume | Distribuição
184
+ -------------------------------------------------------
185
+ 186300.00 | 18.250 | 72.4% do máximo
186
+ 186200.00 | 25.190 | 100.0% do máximo
187
+ 186100.00 | 14.880 | 59.1% do máximo
188
+
189
+ Estatísticas
190
+ POC : 186200.00
191
+ Área de Valor : 185900.00 → 186300.00
192
+ HVNs : 186200.00, 186100.00
193
+ LVNs : 185700.00
194
+ ```
195
+
196
+ ---
197
+
198
+ ## Testes
199
+
200
+ O plugin foi projetado para facilitar testes unitários do cálculo no `model.py`,
201
+ permitindo validação independente do MetaTrader 5.
202
+
203
+ ---
204
+
205
+ ## Contribuição
206
+
207
+ Pull requests são bem-vindos, especialmente para:
208
+
209
+ * Novos critérios de HVN/LVN
210
+ * Value Area expandida a partir do POC
211
+ * Modo TPO
212
+ * Integração com VWAP e Footprint
213
+
214
+ ---
215
+
216
+ ## Licença
217
+
218
+ GPL License
219
+
@@ -0,0 +1,193 @@
1
+ # mtcli-volume
2
+
3
+ Plugin do **mtcli** para cálculo e visualização de **Volume Profile** diretamente no terminal, com foco em:
4
+
5
+ - Precisão técnica (distribuição High–Low)
6
+ - Leitura profissional de mercado
7
+ - Total acessibilidade (screen reader friendly)
8
+ - Integração com MetaTrader 5
9
+
10
+ ---
11
+
12
+ ## Principais recursos
13
+
14
+ - **Volume Profile por faixa High–Low**
15
+ - O volume de cada candle é distribuído uniformemente entre todas as faixas de preço tocadas entre o **LOW** e o **HIGH**
16
+ - Modelo mais próximo do Volume Profile clássico (VAP)
17
+
18
+ - **Estatísticas de Market Profile**
19
+ - POC (Point of Control)
20
+ - Área de Valor (70%)
21
+ - HVNs e LVNs com critérios profissionais
22
+
23
+ - ⚙️ **Critérios avançados para HVN/LVN**
24
+ - Baseado na média (multiplicadores)
25
+ - Baseado em percentis (ex: 80% / 20%)
26
+
27
+ - **100% acessível**
28
+ - Saída textual linear
29
+ - Compatível com NVDA, JAWS e leitores de tela
30
+ - Sem dependência de cores ou gráficos visuais
31
+
32
+ - **Arquitetura MVC**
33
+ - Model: cálculos e dados
34
+ - Controller: fluxo de negócio
35
+ - View: apresentação no terminal
36
+ - CLI: interface de linha de comando
37
+
38
+ ---
39
+
40
+ ## Instalação
41
+
42
+ Via PyPI:
43
+
44
+ ```bash
45
+ pip install mtcli-volume
46
+ ````
47
+
48
+ Ou com Poetry:
49
+
50
+ ```bash
51
+ poetry add mtcli-volume
52
+ ```
53
+
54
+ > ⚠️ Requer MetaTrader 5 instalado e configurado corretamente no sistema.
55
+
56
+ ---
57
+
58
+ ## Uso básico
59
+
60
+ Após a instalação, o comando é registrado automaticamente no `mtcli`:
61
+
62
+ ```bash
63
+ mt vp
64
+ ```
65
+
66
+ Exemplo completo:
67
+
68
+ ```bash
69
+ mt vp \
70
+ --symbol WING26 \
71
+ --period m1 \
72
+ --limit 500 \
73
+ --range 100 \
74
+ --volume tick \
75
+ --hvn-criterio media \
76
+ --verbose
77
+ ```
78
+
79
+ ---
80
+
81
+ ## 🔧 Opções disponíveis
82
+
83
+ | Opção | Descrição |
84
+ | ------------------- | -------------------------------------------- |
85
+ | `--symbol`, `-s` | Símbolo do ativo (ex: WIN, WDO, PETR4) |
86
+ | `--period`, `-p` | Timeframe (m1, m5, m15, h1, etc.) |
87
+ | `--limit`, `-l` | Quantidade de candles analisados |
88
+ | `--range`, `-r` | Tamanho da faixa de preço |
89
+ | `--volume`, `-v` | Tipo de volume (`tick` ou `real`) |
90
+ | `--inicio`, `-i` | Data/hora inicial (`YYYY-MM-DD HH:MM`) |
91
+ | `--fim`, `-f` | Data/hora final (`YYYY-MM-DD HH:MM`) |
92
+ | `--timezone`, `-tz` | Fuso horário para exibição |
93
+ | `--hvn-criterio` | Critério de HVN/LVN (`media` ou `percentil`) |
94
+ | `--verbose`, `-vv` | Exibe informações detalhadas |
95
+
96
+ ---
97
+
98
+ ## Metodologia de cálculo
99
+
100
+ ### Volume Profile
101
+
102
+ * Cada candle contribui volume para **todas as faixas de preço** entre seu `low` e `high`
103
+ * O volume é distribuído **uniformemente**
104
+ * Evita o viés de concentrar volume apenas no preço de fechamento
105
+
106
+ ### HVN / LVN
107
+
108
+ Critérios disponíveis:
109
+
110
+ * **Média**
111
+
112
+ * HVN: volume ≥ média × multiplicador
113
+ * LVN: volume ≤ média × multiplicador
114
+
115
+ * **Percentil**
116
+
117
+ * HVN: acima do percentil superior (ex: 80%)
118
+ * LVN: abaixo do percentil inferior (ex: 20%)
119
+
120
+ ---
121
+
122
+ ## Acessibilidade
123
+
124
+ Este plugin foi projetado para uso total com leitores de tela:
125
+
126
+ * Tabelas em texto puro
127
+ * Distribuição expressa em percentuais
128
+ * Estatísticas narráveis
129
+ * Sem gráficos ASCII ruidosos
130
+
131
+ Funciona corretamente com:
132
+
133
+ * NVDA
134
+ * JAWS
135
+ * VoiceOver (terminal)
136
+
137
+ ---
138
+
139
+ ## Arquitetura
140
+
141
+ ```text
142
+ mtcli_volume/
143
+ ├── cli.py # Interface de linha de comando
144
+ ├── controller.py # Orquestração do fluxo
145
+ ├── model.py # Cálculos e acesso ao MT5
146
+ ├── view.py # Apresentação acessível
147
+ ├── conf.py # Configurações padrão
148
+ └── plugin.py # Registro no mtcli
149
+ ```
150
+
151
+ ---
152
+
153
+ ## Exemplo de saída
154
+
155
+ ```text
156
+ Volume Profile — WING26
157
+
158
+ Preço | Volume | Distribuição
159
+ -------------------------------------------------------
160
+ 186300.00 | 18.250 | 72.4% do máximo
161
+ 186200.00 | 25.190 | 100.0% do máximo
162
+ 186100.00 | 14.880 | 59.1% do máximo
163
+
164
+ Estatísticas
165
+ POC : 186200.00
166
+ Área de Valor : 185900.00 → 186300.00
167
+ HVNs : 186200.00, 186100.00
168
+ LVNs : 185700.00
169
+ ```
170
+
171
+ ---
172
+
173
+ ## Testes
174
+
175
+ O plugin foi projetado para facilitar testes unitários do cálculo no `model.py`,
176
+ permitindo validação independente do MetaTrader 5.
177
+
178
+ ---
179
+
180
+ ## Contribuição
181
+
182
+ Pull requests são bem-vindos, especialmente para:
183
+
184
+ * Novos critérios de HVN/LVN
185
+ * Value Area expandida a partir do POC
186
+ * Modo TPO
187
+ * Integração com VWAP e Footprint
188
+
189
+ ---
190
+
191
+ ## Licença
192
+
193
+ GPL License
@@ -0,0 +1,88 @@
1
+ """
2
+ Interface de linha de comando (CLI) do plugin mtcli-volume.
3
+
4
+ Este módulo define o comando `vp`, responsável por:
5
+ - Interpretar argumentos do usuário via Click
6
+ - Validar parâmetros de entrada
7
+ - Acionar o controller para cálculo do Volume Profile
8
+ - Delegar a exibição dos resultados para a view
9
+
10
+ Não contém lógica de cálculo nem regras de negócio.
11
+ """
12
+
13
+ from datetime import datetime
14
+
15
+ import click
16
+
17
+ from .conf import (
18
+ FIM,
19
+ INICIO,
20
+ LIMIT,
21
+ PERIOD,
22
+ RANGE,
23
+ SYMBOL,
24
+ TIMEZONE,
25
+ VOLUME,
26
+ )
27
+ from .controller import calcular_volume_profile
28
+ from .view import exibir_volume_profile
29
+
30
+
31
+ @click.command(
32
+ help=(
33
+ "Exibe o Volume Profile distribuindo o volume dos candles "
34
+ "uniformemente entre as faixas de preço entre LOW e HIGH."
35
+ )
36
+ )
37
+ @click.version_option(package_name="mtcli-volume")
38
+ @click.option("--symbol", "-s", default=SYMBOL, show_default=True, help="Símbolo do ativo.")
39
+ @click.option("--period", "-p", default=PERIOD, show_default=True, help="Timeframe utilizado no cálculo.")
40
+ @click.option("--limit", "-l", default=LIMIT, show_default=True, help="Quantidade de candles analisados.")
41
+ @click.option("--range", "-r", type=float, default=RANGE, show_default=True, help="Tamanho da faixa de preço.")
42
+ @click.option("--volume", "-v", type=click.Choice(["tick", "real"], case_sensitive=False),
43
+ default=VOLUME, show_default=True, help="Tipo de volume utilizado.")
44
+ @click.option("--inicio", "-i", default=INICIO, show_default=True, help="Data/hora inicial (YYYY-MM-DD HH:MM).")
45
+ @click.option("--fim", "-f", default=FIM, show_default=True, help="Data/hora final (YYYY-MM-DD HH:MM).")
46
+ @click.option("--timezone", "-tz", default=TIMEZONE, show_default=True, help="Fuso horário para exibição.")
47
+ @click.option("--hvn-criterio", type=click.Choice(["media", "percentil"], case_sensitive=False),
48
+ default="percentil", show_default=True, help="Critério para definição de HVNs/LVNs.")
49
+ @click.option("--verbose", "-vv", is_flag=True, help="Exibe informações detalhadas da análise.")
50
+ def volume(
51
+ symbol,
52
+ period,
53
+ limit,
54
+ range,
55
+ volume,
56
+ inicio,
57
+ fim,
58
+ timezone,
59
+ hvn_criterio,
60
+ verbose,
61
+ ):
62
+ """
63
+ Executa o cálculo e a exibição do Volume Profile.
64
+
65
+ O Volume Profile é calculado distribuindo o volume de cada candle
66
+ igualmente entre todas as faixas de preço compreendidas entre
67
+ o LOW e o HIGH do candle.
68
+
69
+ Esta abordagem fornece uma representação mais precisa da
70
+ concentração de volume ao longo do eixo de preços.
71
+ """
72
+ inicio_dt = datetime.strptime(inicio, "%Y-%m-%d %H:%M") if inicio else None
73
+ fim_dt = datetime.strptime(fim, "%Y-%m-%d %H:%M") if fim else None
74
+
75
+ profile, stats, info = calcular_volume_profile(
76
+ symbol=symbol,
77
+ period=period,
78
+ limit=limit,
79
+ step=range,
80
+ volume=volume,
81
+ inicio=inicio_dt,
82
+ fim=fim_dt,
83
+ verbose=verbose,
84
+ timezone_str=timezone,
85
+ criterio_hvn=hvn_criterio.lower(),
86
+ )
87
+
88
+ exibir_volume_profile(profile, stats, symbol, info, verbose)
@@ -0,0 +1,23 @@
1
+ """
2
+ Configurações padrão do plugin mtcli-volume.
3
+
4
+ Os valores podem ser sobrescritos por:
5
+ - Variáveis de ambiente
6
+ - Arquivo de configuração do mtcli
7
+
8
+ Este módulo não contém lógica, apenas parâmetros padrão.
9
+ """
10
+
11
+ import os
12
+ from mtcli.conf import config
13
+
14
+ SYMBOL = os.getenv("SYMBOL", config["DEFAULT"].get("symbol", fallback="WIN$N"))
15
+ DIGITOS = int(os.getenv("DIGITOS", config["DEFAULT"].getint("digitos", fallback=0)))
16
+ PERIOD = os.getenv("PERIOD", config["DEFAULT"].get("period", fallback="M1"))
17
+ LIMIT = int(os.getenv("LIMIT", config["DEFAULT"].getint("limit", fallback=566)))
18
+ RANGE = float(os.getenv("RANGE", config["DEFAULT"].getfloat("range", fallback=100)))
19
+ VOLUME = os.getenv("VOLUME", config["DEFAULT"].get("volume", fallback="tick"))
20
+ INICIO = os.getenv("INICIO", config["DEFAULT"].get("inicio", fallback=""))
21
+ FIM = os.getenv("FIM", config["DEFAULT"].get("fim", fallback=""))
22
+ TIMEZONE = os.getenv("TIMEZONE", config["DEFAULT"].get("timezone", fallback="America/Sao_Paulo"))
23
+ FORMAT = os.getenv("FORMAT", config["DEFAULT"].get("format", fallback="k"))
@@ -0,0 +1,79 @@
1
+ """
2
+ Controller do plugin mtcli-volume.
3
+
4
+ Este módulo coordena o fluxo de execução do Volume Profile:
5
+ - Solicita dados históricos ao model
6
+ - Aciona o cálculo do Volume Profile
7
+ - Calcula estatísticas de Market Profile
8
+ - Prepara informações de contexto (datas, timezone, candles)
9
+
10
+ Não realiza cálculos matemáticos nem formatação de saída.
11
+ """
12
+
13
+ from datetime import datetime, timedelta, timezone
14
+ import zoneinfo
15
+ import numpy as np
16
+
17
+ from mtcli.logger import setup_logger
18
+ from .model import calcular_profile, calcular_estatisticas, obter_rates
19
+
20
+ log = setup_logger()
21
+
22
+
23
+ def calcular_volume_profile(
24
+ symbol,
25
+ period,
26
+ limit,
27
+ step,
28
+ volume,
29
+ inicio=None,
30
+ fim=None,
31
+ verbose=False,
32
+ timezone_str="America/Sao_Paulo",
33
+ criterio_hvn="media",
34
+ ):
35
+ """
36
+ Orquestra o cálculo completo do Volume Profile.
37
+
38
+ Etapas:
39
+ - Obtém candles históricos via MetaTrader 5
40
+ - Calcula o Volume Profile por faixa de preço (High–Low)
41
+ - Calcula estatísticas de Market Profile (POC, VA, HVN, LVN)
42
+ - Converte datas para o fuso horário configurado
43
+
44
+ Retorna estruturas prontas para consumo pela camada de visualização.
45
+ """
46
+ volume = volume.lower().strip()
47
+ if volume not in ("tick", "real"):
48
+ raise ValueError("Tipo de volume inválido. Use 'tick' ou 'real'.")
49
+
50
+ rates = obter_rates(symbol, period, limit, inicio, fim)
51
+
52
+ if rates is None or not isinstance(rates, np.ndarray) or len(rates) == 0:
53
+ log.error("Nenhum dado retornado para o cálculo do Volume Profile.")
54
+ return {}, {}, {}
55
+
56
+ profile = calcular_profile(rates, step, volume)
57
+ stats = calcular_estatisticas(profile, criterio=criterio_hvn)
58
+
59
+ try:
60
+ fuso = zoneinfo.ZoneInfo(timezone_str)
61
+ except Exception:
62
+ fuso = timezone(timedelta(hours=-3))
63
+
64
+ try:
65
+ inicio_real = datetime.utcfromtimestamp(float(rates[0]["time"])).astimezone(fuso)
66
+ fim_real = datetime.utcfromtimestamp(float(rates[-1]["time"])).astimezone(fuso)
67
+ except Exception:
68
+ inicio_real = fim_real = "?"
69
+
70
+ info = {
71
+ "symbol": symbol,
72
+ "period": period,
73
+ "candles": len(rates),
74
+ "inicio": str(inicio_real),
75
+ "fim": str(fim_real),
76
+ "timezone": timezone_str,
77
+ }
78
+
79
+ return profile, stats, info