mtcli-renko 1.1.2__tar.gz → 1.2.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.
Files changed (21) hide show
  1. {mtcli_renko-1.1.2 → mtcli_renko-1.2.0.dev0}/PKG-INFO +1 -1
  2. {mtcli_renko-1.1.2 → mtcli_renko-1.2.0.dev0}/mtcli_renko/models/renko_model.py +28 -2
  3. {mtcli_renko-1.1.2 → mtcli_renko-1.2.0.dev0}/mtcli_renko/views/renko_view.py +205 -200
  4. {mtcli_renko-1.1.2 → mtcli_renko-1.2.0.dev0}/pyproject.toml +1 -1
  5. {mtcli_renko-1.1.2 → mtcli_renko-1.2.0.dev0}/LICENSE +0 -0
  6. {mtcli_renko-1.1.2 → mtcli_renko-1.2.0.dev0}/README.md +0 -0
  7. {mtcli_renko-1.1.2 → mtcli_renko-1.2.0.dev0}/mtcli_renko/__init__.py +0 -0
  8. {mtcli_renko-1.1.2 → mtcli_renko-1.2.0.dev0}/mtcli_renko/commands/__init__.py +0 -0
  9. {mtcli_renko-1.1.2 → mtcli_renko-1.2.0.dev0}/mtcli_renko/commands/renko.py +0 -0
  10. {mtcli_renko-1.1.2 → mtcli_renko-1.2.0.dev0}/mtcli_renko/conf.py +0 -0
  11. {mtcli_renko-1.1.2 → mtcli_renko-1.2.0.dev0}/mtcli_renko/controllers/__init__.py +0 -0
  12. {mtcli_renko-1.1.2 → mtcli_renko-1.2.0.dev0}/mtcli_renko/controllers/renko_controller.py +0 -0
  13. {mtcli_renko-1.1.2 → mtcli_renko-1.2.0.dev0}/mtcli_renko/database.py +0 -0
  14. {mtcli_renko-1.1.2 → mtcli_renko-1.2.0.dev0}/mtcli_renko/marketdata/__init__.py +0 -0
  15. {mtcli_renko-1.1.2 → mtcli_renko-1.2.0.dev0}/mtcli_renko/marketdata/tick_cache.py +0 -0
  16. {mtcli_renko-1.1.2 → mtcli_renko-1.2.0.dev0}/mtcli_renko/marketdata/tick_repository.py +0 -0
  17. {mtcli_renko-1.1.2 → mtcli_renko-1.2.0.dev0}/mtcli_renko/models/__init__.py +0 -0
  18. {mtcli_renko-1.1.2 → mtcli_renko-1.2.0.dev0}/mtcli_renko/plugin.py +0 -0
  19. {mtcli_renko-1.1.2 → mtcli_renko-1.2.0.dev0}/mtcli_renko/utils/__init__.py +0 -0
  20. {mtcli_renko-1.1.2 → mtcli_renko-1.2.0.dev0}/mtcli_renko/utils/renko_stats.py +0 -0
  21. {mtcli_renko-1.1.2 → mtcli_renko-1.2.0.dev0}/mtcli_renko/views/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mtcli-renko
3
- Version: 1.1.2
3
+ Version: 1.2.0.dev0
4
4
  Summary: Renko plugin institucional para mtcli (MetaTrader 5)
5
5
  License-Expression: MIT
6
6
  License-File: LICENSE
@@ -34,6 +34,8 @@ class Brick:
34
34
  direction: str
35
35
  open: float
36
36
  close: float
37
+ volume: float = 0
38
+ ticks: int = 0
37
39
 
38
40
 
39
41
  class RenkoTickResult(NamedTuple):
@@ -253,10 +255,16 @@ class RenkoModel:
253
255
 
254
256
  last_price = float(ticks[0][3])
255
257
  last_direction: Optional[str] = None
258
+ volume_acumulado = 0
259
+ ticks_acumulados = 0
256
260
 
257
261
  for tick in ticks[1:]:
258
262
 
259
263
  price = float(tick[3])
264
+ volume = float(tick[4])
265
+
266
+ volume_acumulado += volume
267
+ ticks_acumulados += 1
260
268
 
261
269
  # =============================
262
270
  # movimento de alta
@@ -274,9 +282,17 @@ class RenkoModel:
274
282
  novo = last_price + self.brick_size
275
283
 
276
284
  bricks.append(
277
- Brick("up", last_price, novo)
285
+ Brick(
286
+ direction="up",
287
+ open=last_price,
288
+ close=novo,
289
+ volume=volume_acumulado,
290
+ ticks=ticks_acumulados,
291
+ )
278
292
  )
279
293
 
294
+ volume_acumulado = 0
295
+ ticks_acumulados = 0
280
296
  last_price = novo
281
297
  last_direction = "up"
282
298
 
@@ -296,9 +312,17 @@ class RenkoModel:
296
312
  novo = last_price - self.brick_size
297
313
 
298
314
  bricks.append(
299
- Brick("down", last_price, novo)
315
+ Brick(
316
+ direction="down",
317
+ open=last_price,
318
+ close=novo,
319
+ volume=volume_acumulado,
320
+ ticks=ticks_acumulados,
321
+ )
300
322
  )
301
323
 
324
+ volume_acumulado = 0
325
+ ticks_acumulados = 0
302
326
  last_price = novo
303
327
  last_direction = "down"
304
328
 
@@ -320,6 +344,8 @@ class RenkoModel:
320
344
  direction=direcao,
321
345
  open=last_price,
322
346
  close=ultimo_preco,
347
+ volume=volume_acumulado,
348
+ ticks=ticks_acumulados,
323
349
  )
324
350
 
325
351
  return RenkoTickResult(
@@ -1,200 +1,205 @@
1
- """
2
- Renko view acessível.
3
-
4
- Responsável por exibir os blocos Renko no terminal de forma simples,
5
- compatível com leitores de tela e ambientes CLI.
6
-
7
- Características
8
- ---------------
9
-
10
- - Saída textual simples (sem gráficos ASCII complexos)
11
- - Compatível com NVDA / JAWS
12
- - Suporte a numeração opcional dos blocos
13
- - Suporte a símbolos configuráveis para direção dos blocos
14
-
15
- Os símbolos utilizados são definidos em `conf.py`:
16
-
17
- BRICK_UP
18
- BRICK_DOWN
19
-
20
- Exemplo de saída:
21
-
22
- 128400 128460
23
- 128460 128520
24
- 128520 128460
25
- """
26
-
27
- import click
28
-
29
- from ..conf import DIGITS, BRICK_UP, BRICK_DOWN
30
-
31
-
32
- # ==========================================================
33
- # DETECÇÃO DE PADRÕES
34
- # ==========================================================
35
-
36
- def _detectar_padroes(bricks):
37
- """
38
- Detecta padrões simples de price action no Renko.
39
-
40
- Atualmente detecta:
41
-
42
- H1
43
- Primeira retomada de alta após correção.
44
-
45
- H2
46
- Segunda tentativa de continuação de alta.
47
-
48
- L2
49
- Segunda tentativa de continuação de baixa.
50
- """
51
-
52
- if len(bricks) < 3:
53
- return []
54
-
55
- patterns = []
56
-
57
- last = bricks[-1].direction
58
- prev = bricks[-2].direction
59
- prev2 = bricks[-3].direction
60
-
61
- if last == "up" and prev == "down":
62
- patterns.append("H1")
63
-
64
- if last == "up" and prev == "down" and prev2 == "up":
65
- patterns.append("H2")
66
-
67
- if last == "down" and prev == "up" and prev2 == "down":
68
- patterns.append("L2")
69
-
70
- return patterns
71
-
72
-
73
- # ==========================================================
74
- # MÉTRICAS
75
- # ==========================================================
76
-
77
- def _metricas(bricks):
78
- """
79
- Calcula métricas básicas do gráfico Renko.
80
-
81
- Retorna
82
- -------
83
- tuple
84
- (up, down)
85
- """
86
-
87
- up = sum(1 for b in bricks if b.direction == "up")
88
- down = sum(1 for b in bricks if b.direction == "down")
89
-
90
- return up, down
91
-
92
-
93
- # ==========================================================
94
- # RENDERIZAÇÃO
95
- # ==========================================================
96
-
97
- def exibir_renko(resultado, numerar=False):
98
- """
99
- Exibe os blocos Renko no terminal.
100
-
101
- Parameters
102
- ----------
103
- resultado : list | RenkoTickResult
104
- Resultado retornado pelo RenkoModel.
105
-
106
- Pode ser:
107
- - lista simples de bricks
108
- - estrutura contendo `confirmados` e `em_formacao` (modo tick)
109
-
110
- numerar : bool
111
- Se True, adiciona numeração sequencial aos blocos.
112
- """
113
-
114
- if not resultado:
115
- click.echo("Nenhum bloco Renko gerado.")
116
- return
117
-
118
- em_formacao = None
119
-
120
- # compatível com retorno candle e tick
121
- if isinstance(resultado, list):
122
- bricks = resultado
123
- else:
124
- bricks = resultado.confirmados
125
- em_formacao = resultado.em_formacao
126
-
127
- click.echo("=== GRAFICO RENKO ===")
128
- click.echo(f"Total de blocos: {len(bricks)}")
129
- click.echo()
130
-
131
- # ------------------------------------------------------
132
- # MÉTRICAS
133
- # ------------------------------------------------------
134
-
135
- up, down = _metricas(bricks)
136
-
137
- click.echo("METRICAS:")
138
- click.echo(f"Up: {up}")
139
- click.echo(f"Down: {down}")
140
- click.echo(f"Delta: {up - down}")
141
- click.echo()
142
-
143
- # ------------------------------------------------------
144
- # PADRÕES
145
- # ------------------------------------------------------
146
-
147
- patterns = _detectar_padroes(bricks)
148
-
149
- if patterns:
150
- click.echo("PADROES:")
151
- for p in patterns:
152
- click.echo(p)
153
- click.echo()
154
-
155
- # ------------------------------------------------------
156
- # BLOCOS CONFIRMADOS
157
- # ------------------------------------------------------
158
-
159
- for i, brick in enumerate(bricks, start=1):
160
-
161
- if brick.direction == "up":
162
- simbolo = BRICK_UP
163
- else:
164
- simbolo = BRICK_DOWN
165
-
166
- if numerar:
167
- linha = (
168
- f"{i} {simbolo} "
169
- f"{brick.open:.{DIGITS}f} "
170
- f"{brick.close:.{DIGITS}f}"
171
- )
172
- else:
173
- linha = (
174
- f"{simbolo} "
175
- f"{brick.open:.{DIGITS}f} "
176
- f"{brick.close:.{DIGITS}f}"
177
- )
178
-
179
- click.echo(linha)
180
-
181
- # ------------------------------------------------------
182
- # BLOCO EM FORMAÇÃO (modo híbrido)
183
- # ------------------------------------------------------
184
-
185
- if em_formacao:
186
-
187
- click.echo()
188
-
189
- if em_formacao.direction == "up":
190
- simbolo = BRICK_UP
191
- else:
192
- simbolo = BRICK_DOWN
193
-
194
- linha = (
195
- f"FORMANDO {simbolo} "
196
- f"{em_formacao.open:.{DIGITS}f} "
197
- f"{em_formacao.close:.{DIGITS}f}"
198
- )
199
-
200
- click.echo(linha)
1
+ """
2
+ Renko view acessível.
3
+
4
+ Responsável por exibir os blocos Renko no terminal de forma simples,
5
+ compatível com leitores de tela e ambientes CLI.
6
+
7
+ Características
8
+ ---------------
9
+
10
+ - Saída textual simples (sem gráficos ASCII complexos)
11
+ - Compatível com NVDA / JAWS
12
+ - Suporte a numeração opcional dos blocos
13
+ - Suporte a símbolos configuráveis para direção dos blocos
14
+
15
+ Os símbolos utilizados são definidos em `conf.py`:
16
+
17
+ BRICK_UP
18
+ BRICK_DOWN
19
+
20
+ Exemplo de saída:
21
+
22
+ up 128400 128460
23
+ up 128460 128520
24
+ down 128520 128460
25
+ """
26
+
27
+ import click
28
+
29
+ from ..conf import DIGITS, BRICK_UP, BRICK_DOWN
30
+
31
+
32
+ # ==========================================================
33
+ # DETECÇÃO DE PADRÕES
34
+ # ==========================================================
35
+
36
+ def _detectar_padroes(bricks):
37
+ """
38
+ Detecta padrões simples de price action no Renko.
39
+
40
+ Atualmente detecta:
41
+
42
+ H1
43
+ Primeira retomada de alta após correção.
44
+
45
+ H2
46
+ Segunda tentativa de continuação de alta.
47
+
48
+ L2
49
+ Segunda tentativa de continuação de baixa.
50
+ """
51
+
52
+ if len(bricks) < 3:
53
+ return []
54
+
55
+ patterns = []
56
+
57
+ last = bricks[-1].direction
58
+ prev = bricks[-2].direction
59
+ prev2 = bricks[-3].direction
60
+
61
+ if last == "up" and prev == "down":
62
+ patterns.append("H1")
63
+
64
+ if last == "up" and prev == "down" and prev2 == "up":
65
+ patterns.append("H2")
66
+
67
+ if last == "down" and prev == "up" and prev2 == "down":
68
+ patterns.append("L2")
69
+
70
+ return patterns
71
+
72
+
73
+ # ==========================================================
74
+ # MÉTRICAS
75
+ # ==========================================================
76
+
77
+ def _metricas(bricks):
78
+ """
79
+ Calcula métricas básicas do gráfico Renko.
80
+
81
+ Retorna
82
+ -------
83
+ tuple
84
+ (up, down)
85
+ """
86
+
87
+ up = sum(1 for b in bricks if b.direction == "up")
88
+ down = sum(1 for b in bricks if b.direction == "down")
89
+
90
+ return up, down
91
+
92
+
93
+ # ==========================================================
94
+ # RENDERIZAÇÃO
95
+ # ==========================================================
96
+
97
+ def exibir_renko(resultado, numerar=False):
98
+ """
99
+ Exibe os blocos Renko no terminal.
100
+
101
+ Parameters
102
+ ----------
103
+ resultado : list | RenkoTickResult
104
+ Resultado retornado pelo RenkoModel.
105
+
106
+ Pode ser:
107
+ - lista simples de bricks
108
+ - estrutura contendo `confirmados` e `em_formacao` (modo tick)
109
+
110
+ numerar : bool
111
+ Se True, adiciona numeração sequencial aos blocos.
112
+ """
113
+
114
+ if not resultado:
115
+ click.echo("Nenhum bloco Renko gerado.")
116
+ return
117
+
118
+ em_formacao = None
119
+
120
+ # compatível com retorno candle e tick
121
+ if isinstance(resultado, list):
122
+ bricks = resultado
123
+ else:
124
+ bricks = resultado.confirmados
125
+ em_formacao = resultado.em_formacao
126
+
127
+ click.echo("=== GRAFICO RENKO ===")
128
+ click.echo(f"Total de blocos: {len(bricks)}")
129
+ click.echo()
130
+
131
+ # ------------------------------------------------------
132
+ # MÉTRICAS
133
+ # ------------------------------------------------------
134
+
135
+ up, down = _metricas(bricks)
136
+
137
+ click.echo("METRICAS:")
138
+ click.echo(f"Up: {up}")
139
+ click.echo(f"Down: {down}")
140
+ click.echo(f"Delta: {up - down}")
141
+ click.echo()
142
+
143
+ # ------------------------------------------------------
144
+ # PADRÕES
145
+ # ------------------------------------------------------
146
+
147
+ patterns = _detectar_padroes(bricks)
148
+
149
+ if patterns:
150
+ click.echo("PADROES:")
151
+ for p in patterns:
152
+ click.echo(p)
153
+ click.echo()
154
+
155
+ # ------------------------------------------------------
156
+ # BLOCOS CONFIRMADOS
157
+ # ------------------------------------------------------
158
+
159
+ click.echo("Direcao Volume Abertura Fechamento")
160
+
161
+ for i, brick in enumerate(bricks, start=1):
162
+
163
+ if brick.direction == "up":
164
+ simbolo = BRICK_UP
165
+ else:
166
+ simbolo = BRICK_DOWN
167
+
168
+ if numerar:
169
+ linha = (
170
+ f"{i} {simbolo} "
171
+ f"{brick.volume:.0f} "
172
+ f"{brick.open:.{DIGITS}f} "
173
+ f"{brick.close:.{DIGITS}f}"
174
+ )
175
+ else:
176
+ linha = (
177
+ f"{simbolo} "
178
+ f"{brick.volume:.0f} "
179
+ f"{brick.open:.{DIGITS}f} "
180
+ f"{brick.close:.{DIGITS}f}"
181
+ )
182
+
183
+ click.echo(linha)
184
+
185
+ # ------------------------------------------------------
186
+ # BLOCO EM FORMAÇÃO (modo híbrido)
187
+ # ------------------------------------------------------
188
+
189
+ if em_formacao:
190
+
191
+ click.echo()
192
+
193
+ if em_formacao.direction == "up":
194
+ simbolo = BRICK_UP
195
+ else:
196
+ simbolo = BRICK_DOWN
197
+
198
+ linha = (
199
+ f"FORMANDO {simbolo} "
200
+ f"{em_formacao.volume:.0f} "
201
+ f"{em_formacao.open:.{DIGITS}f} "
202
+ f"{em_formacao.close:.{DIGITS}f}"
203
+ )
204
+
205
+ click.echo(linha)
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mtcli-renko"
3
- version = "1.1.2"
3
+ version = "1.2.0.dev0"
4
4
  description = "Renko plugin institucional para mtcli (MetaTrader 5)"
5
5
  authors = [
6
6
  { name = "Valmir França", email = "vfranca3@gmail.com" }
File without changes
File without changes