mtcli 3.7.3__tar.gz → 3.7.4__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.7.3 → mtcli-3.7.4}/PKG-INFO +1 -1
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/data/base.py +9 -9
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/domain/timeframe.py +102 -87
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/models/bar_model.py +105 -105
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/plugin.py +18 -18
- {mtcli-3.7.3/mtcli/plugins/volume_medio → mtcli-3.7.4/mtcli/plugins/range_medio}/conf.py +1 -1
- {mtcli-3.7.3/mtcli/plugins/range_medio → mtcli-3.7.4/mtcli/plugins/volume_medio}/conf.py +1 -1
- {mtcli-3.7.3 → mtcli-3.7.4}/pyproject.toml +1 -1
- {mtcli-3.7.3 → mtcli-3.7.4}/LICENSE +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/README.md +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/__init__.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/__main__.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/cli.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/commands/__init__.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/commands/bars.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/commands/conf.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/commands/doctor.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/conecta.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/conf.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/config_registre.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/data/__init__.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/data/csv.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/data/mt5.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/domain/__init__.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/logger.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/models/__init__.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/models/bars_model.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/models/chart_model.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/models/conf_model.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/models/consecutive_bars_model.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/models/rates_model.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/models/signals_model.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/models/unconsecutive_bar_model.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/mt5_context.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/plugin_loader.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/plugin_manager.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/plugins/__init__.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/plugins/exemplo.py-dist +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/plugins/media_movel/__init__.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/plugins/media_movel/cli.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/plugins/media_movel/conf.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/plugins/media_movel/models/__init__.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/plugins/media_movel/models/model_media_movel.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/plugins/media_movel/tests/__init__.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/plugins/media_movel/tests/test_mm.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/plugins/media_movel/tests/test_model_media_movel.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/plugins/range_medio/__init__.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/plugins/range_medio/cli.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/plugins/range_medio/models/__init__.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/plugins/range_medio/models/average_range_model.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/plugins/range_medio/tests/__init__.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/plugins/range_medio/tests/test_rm.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/plugins/volume_medio/__init__.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/plugins/volume_medio/cli.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/plugins/volume_medio/models/__init__.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/plugins/volume_medio/models/model_average_volume.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/plugins/volume_medio/tests/__init__.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/plugins/volume_medio/tests/test_vm.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/utils/__init__.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/utils/pidfile.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/utils/time.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/views/__init__.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/views/close_view.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/views/full_view.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/views/high_view.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/views/low_view.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/views/min_view.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/views/open_view.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/views/ranges_view.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/views/rates_view.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/views/vars_view.py +0 -0
- {mtcli-3.7.3 → mtcli-3.7.4}/mtcli/views/volumes_view.py +0 -0
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
"""Módulo da classe base para coleta de dados."""
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
class DataSourceBase:
|
|
5
|
-
"""Interface base para fontes de dados."""
|
|
6
|
-
|
|
7
|
-
def get_data(self, symbol, period, count=100):
|
|
8
|
-
"""Retorna dados em uma lista de listas."""
|
|
9
|
-
raise NotImplementedError("O método get_data deve ser implementado.")
|
|
1
|
+
"""Módulo da classe base para coleta de dados."""
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class DataSourceBase:
|
|
5
|
+
"""Interface base para fontes de dados."""
|
|
6
|
+
|
|
7
|
+
def get_data(self, symbol, period, count=100):
|
|
8
|
+
"""Retorna dados em uma lista de listas."""
|
|
9
|
+
raise NotImplementedError("O método get_data deve ser implementado.")
|
|
@@ -1,87 +1,102 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Enum de Timeframes suportados pelo MTCLI Renko.
|
|
3
|
-
|
|
4
|
-
Fornece:
|
|
5
|
-
- Conversão amigável (m5, 5m, h1, 1h)
|
|
6
|
-
- Mapeamento para constante MT5
|
|
7
|
-
- Lista de valores válidos para CLI
|
|
8
|
-
"""
|
|
9
|
-
|
|
10
|
-
from enum import Enum
|
|
11
|
-
import MetaTrader5 as mt5
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
class Timeframe(Enum):
|
|
15
|
-
"""
|
|
16
|
-
Representa timeframes suportados pelo MT5.
|
|
17
|
-
"""
|
|
18
|
-
|
|
19
|
-
M1 = ("m1", mt5.TIMEFRAME_M1)
|
|
20
|
-
M2 = ("m2", mt5.TIMEFRAME_M2)
|
|
21
|
-
M3 = ("m3", mt5.TIMEFRAME_M3)
|
|
22
|
-
M4 = ("m4", mt5.TIMEFRAME_M4)
|
|
23
|
-
M5 = ("m5", mt5.TIMEFRAME_M5)
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
"
|
|
63
|
-
"
|
|
64
|
-
"
|
|
65
|
-
"
|
|
66
|
-
"
|
|
67
|
-
"
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
1
|
+
"""
|
|
2
|
+
Enum de Timeframes suportados pelo MTCLI Renko.
|
|
3
|
+
|
|
4
|
+
Fornece:
|
|
5
|
+
- Conversão amigável (m5, 5m, h1, 1h)
|
|
6
|
+
- Mapeamento para constante MT5
|
|
7
|
+
- Lista de valores válidos para CLI
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from enum import Enum
|
|
11
|
+
import MetaTrader5 as mt5
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class Timeframe(Enum):
|
|
15
|
+
"""
|
|
16
|
+
Representa timeframes suportados pelo MT5.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
M1 = ("m1", mt5.TIMEFRAME_M1)
|
|
20
|
+
M2 = ("m2", mt5.TIMEFRAME_M2)
|
|
21
|
+
M3 = ("m3", mt5.TIMEFRAME_M3)
|
|
22
|
+
M4 = ("m4", mt5.TIMEFRAME_M4)
|
|
23
|
+
M5 = ("m5", mt5.TIMEFRAME_M5)
|
|
24
|
+
M6 = ("m6", mt5.TIMEFRAME_M6)
|
|
25
|
+
M10 = ("m10", mt5.TIMEFRAME_M10)
|
|
26
|
+
M12 = ("m12", mt5.TIMEFRAME_M12)
|
|
27
|
+
M15 = ("m15", mt5.TIMEFRAME_M15)
|
|
28
|
+
M20 = ("m20", mt5.TIMEFRAME_M20)
|
|
29
|
+
M30 = ("m30", mt5.TIMEFRAME_M30)
|
|
30
|
+
|
|
31
|
+
H1 = ("h1", mt5.TIMEFRAME_H1)
|
|
32
|
+
H2 = ("h2", mt5.TIMEFRAME_H2)
|
|
33
|
+
H3 = ("h3", mt5.TIMEFRAME_H3)
|
|
34
|
+
H4 = ("h4", mt5.TIMEFRAME_H4)
|
|
35
|
+
H6 = ("h6", mt5.TIMEFRAME_H6)
|
|
36
|
+
H8 = ("h8", mt5.TIMEFRAME_H8)
|
|
37
|
+
H12 = ("h12", mt5.TIMEFRAME_H12)
|
|
38
|
+
|
|
39
|
+
D1 = ("d1", mt5.TIMEFRAME_D1)
|
|
40
|
+
W1 = ("w1", mt5.TIMEFRAME_W1)
|
|
41
|
+
MN1 = ("mn1", mt5.TIMEFRAME_MN1)
|
|
42
|
+
|
|
43
|
+
def __init__(self, label: str, mt5_const: int):
|
|
44
|
+
self.label = label
|
|
45
|
+
self.mt5_const = mt5_const
|
|
46
|
+
|
|
47
|
+
@classmethod
|
|
48
|
+
def from_string(cls, value: str) -> "Timeframe":
|
|
49
|
+
"""
|
|
50
|
+
Converte string amigável para Enum Timeframe.
|
|
51
|
+
|
|
52
|
+
Aceita:
|
|
53
|
+
m5, 5m
|
|
54
|
+
h1, 1h
|
|
55
|
+
d1, 1d
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
value = value.strip().lower()
|
|
59
|
+
|
|
60
|
+
# Aliases humanos
|
|
61
|
+
aliases = {
|
|
62
|
+
"1m": "m1",
|
|
63
|
+
"2m": "m2",
|
|
64
|
+
"3m": "m3",
|
|
65
|
+
"4m": "m4",
|
|
66
|
+
"5m": "m5",
|
|
67
|
+
"6m": "m6",
|
|
68
|
+
"10m": "m10",
|
|
69
|
+
"12m": "m12",
|
|
70
|
+
"15m": "m15",
|
|
71
|
+
"20m": "m20",
|
|
72
|
+
"30m": "m30",
|
|
73
|
+
"1h": "h1",
|
|
74
|
+
"2h": "h2",
|
|
75
|
+
"3h": "h3",
|
|
76
|
+
"4h": "h4",
|
|
77
|
+
"6h": "h6",
|
|
78
|
+
"8h": "h8",
|
|
79
|
+
"12h": "h12",
|
|
80
|
+
"1d": "d1",
|
|
81
|
+
"1w": "w1",
|
|
82
|
+
"1mo": "mn1",
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
if value in aliases:
|
|
86
|
+
value = aliases[value]
|
|
87
|
+
|
|
88
|
+
for tf in cls:
|
|
89
|
+
if tf.label == value:
|
|
90
|
+
return tf
|
|
91
|
+
|
|
92
|
+
raise ValueError(
|
|
93
|
+
f"Timeframe inválido: {value}. "
|
|
94
|
+
f"Use: {', '.join(cls.valid_labels())}"
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
@classmethod
|
|
98
|
+
def valid_labels(cls):
|
|
99
|
+
"""
|
|
100
|
+
Retorna lista de labels válidos.
|
|
101
|
+
"""
|
|
102
|
+
return [tf.label for tf in cls]
|
|
@@ -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,18 +1,18 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Registro de plugins internos do mtcli.
|
|
3
|
-
"""
|
|
4
|
-
|
|
5
|
-
from mtcli.plugins import media_movel
|
|
6
|
-
from mtcli.plugins import range_medio
|
|
7
|
-
from mtcli.plugins import volume_medio
|
|
8
|
-
|
|
9
|
-
def register(cli):
|
|
10
|
-
"""
|
|
11
|
-
Registra todos os plugins internos no CLI principal.
|
|
12
|
-
|
|
13
|
-
Args:
|
|
14
|
-
cli (click.Group): grupo Click principal (`mt`)
|
|
15
|
-
"""
|
|
16
|
-
media_movel.register(cli)
|
|
17
|
-
range_medio.register(cli)
|
|
18
|
-
volume_medio.register(cli)
|
|
1
|
+
"""
|
|
2
|
+
Registro de plugins internos do mtcli.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from mtcli.plugins import media_movel
|
|
6
|
+
from mtcli.plugins import range_medio
|
|
7
|
+
from mtcli.plugins import volume_medio
|
|
8
|
+
|
|
9
|
+
def register(cli):
|
|
10
|
+
"""
|
|
11
|
+
Registra todos os plugins internos no CLI principal.
|
|
12
|
+
|
|
13
|
+
Args:
|
|
14
|
+
cli (click.Group): grupo Click principal (`mt`)
|
|
15
|
+
"""
|
|
16
|
+
media_movel.register(cli)
|
|
17
|
+
range_medio.register(cli)
|
|
18
|
+
volume_medio.register(cli)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
from mtcli.conf import *
|
|
1
|
+
from mtcli.conf import *
|
|
@@ -1 +1 @@
|
|
|
1
|
-
from mtcli.conf import *
|
|
1
|
+
from mtcli.conf import *
|
|
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
|
|
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
|