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.
- mtcli_volume-2.4.1/PKG-INFO +219 -0
- mtcli_volume-2.4.1/README.md +193 -0
- mtcli_volume-2.4.1/mtcli_volume/cli.py +88 -0
- mtcli_volume-2.4.1/mtcli_volume/conf.py +23 -0
- mtcli_volume-2.4.1/mtcli_volume/controller.py +79 -0
- mtcli_volume-2.4.1/mtcli_volume/model.py +153 -0
- mtcli_volume-2.4.1/mtcli_volume/plugin.py +23 -0
- mtcli_volume-2.4.1/mtcli_volume/view.py +52 -0
- {mtcli_volume-2.4.0.dev0 → mtcli_volume-2.4.1}/pyproject.toml +17 -11
- mtcli_volume-2.4.0.dev0/PKG-INFO +0 -121
- mtcli_volume-2.4.0.dev0/README.md +0 -98
- mtcli_volume-2.4.0.dev0/mtcli_volume/conf.py +0 -17
- mtcli_volume-2.4.0.dev0/mtcli_volume/controllers/volume_controller.py +0 -83
- mtcli_volume-2.4.0.dev0/mtcli_volume/models/volume_model.py +0 -129
- mtcli_volume-2.4.0.dev0/mtcli_volume/plugin.py +0 -5
- mtcli_volume-2.4.0.dev0/mtcli_volume/views/volume_view.py +0 -69
- mtcli_volume-2.4.0.dev0/mtcli_volume/volume.py +0 -97
- {mtcli_volume-2.4.0.dev0 → mtcli_volume-2.4.1}/LICENSE +0 -0
- {mtcli_volume-2.4.0.dev0 → mtcli_volume-2.4.1}/mtcli_volume/__init__.py +0 -0
|
@@ -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
|