Indicador_Tillson_T3/Tillson T3.mq5

139 lines
6.3 KiB
MQL5
Raw Permalink Normal View History

2026-05-27 23:16:11 +00:00
//+------------------------------------------------------------------+
//| T3_Tillson.mq5 |
//| Copyright 2026, FrequenciaDoMercado |
//| https://frequenciadomercado.com.br |
//+------------------------------------------------------------------+
/*
SOBRE O INDICADOR / ABOUT THE INDICATOR:
O T3 de Tillson é uma média móvel de suavização tripla exponencial
que resolve o problema do atraso (lag ) inerente às médias móveis
tradicionais. Ele combina a suavidade de uma média de longo prazo
com a agilidade de uma média de curto prazo.
DESENVOLVIDO PARA / DEVELOPED FOR:
frequenciadomercado.com.br
*/
#property copyright "Diego Vinicius Righetti Sá | Frequência do Mercado"
#property link "https://frequenciadomercado.com.br"
#property version "1.00"
#property description "T3 de Tillson — Média Móvel de Baixo Atraso."
#property description "Tillson T3 — Low Lag Moving Average."
//--- Configurações de exibição / Display settings
#property indicator_chart_window // Exibir no gráfico principal / Display on main chart
#property indicator_buffers 7 // 1 buffer de dados + 6 auxiliares de cálculo
#property indicator_plots 1 // Apenas 1 linha será desenhada / Only 1 line plotted
//--- Estilo da linha / Line style
#property indicator_label1 "T3"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrDodgerBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 2
//+------------------------------------------------------------------+
//| PARÂMETROS DE ENTRADA / INPUT PARAMETERS |
//+------------------------------------------------------------------+
input int InpPeriod = 14; // Período de suavização / Smoothing Period
input double InpVFactor = 0.7; // Fator de Volume (0.0 a 1.0 ) / Volume Factor
input ENUM_APPLIED_PRICE InpPrice = PRICE_CLOSE; // Preço aplicado / Applied Price
//+------------------------------------------------------------------+
//| BUFFERS DO INDICADOR / INDICATOR BUFFERS |
//+------------------------------------------------------------------+
// Buffer principal que o usuário vê / Main buffer visible to user
double T3Buffer[];
// Buffers auxiliares para as 6 EMAs encadeadas / Auxiliary buffers for 6 chained EMAs
// Eles não aparecem no gráfico (INDICATOR_CALCULATIONS)
double e1[], e2[], e3[], e4[], e5[], e6[];
// Variáveis globais para coeficientes / Global variables for coefficients
double b, c1, c2, c3, c4;
//+------------------------------------------------------------------+
//| INICIALIZAÇÃO / INITIALIZATION |
//+------------------------------------------------------------------+
int OnInit()
{
//--- Mapeamento de Buffers / Buffer Mapping
// O índice 0 é o que será plotado. Os outros são apenas para cálculo.
SetIndexBuffer(0, T3Buffer, INDICATOR_DATA);
SetIndexBuffer(1, e1, INDICATOR_CALCULATIONS);
SetIndexBuffer(2, e2, INDICATOR_CALCULATIONS);
SetIndexBuffer(3, e3, INDICATOR_CALCULATIONS);
SetIndexBuffer(4, e4, INDICATOR_CALCULATIONS);
SetIndexBuffer(5, e5, INDICATOR_CALCULATIONS);
SetIndexBuffer(6, e6, INDICATOR_CALCULATIONS);
//--- Configurar nome curto / Set short name
// Aparece no canto superior esquerdo do gráfico
string short_name = StringFormat("T3(%d, %.2f)", InpPeriod, InpVFactor);
IndicatorSetString(INDICATOR_SHORTNAME, short_name);
//--- Pré-cálculo dos coeficientes de Tillson / Pre-calculate Tillson coefficients
// Baseado na derivação original de Tim Tillson
b = InpVFactor;
c1 = -b*b*b;
c2 = 3*b*b + 3*b*b*b;
c3 = -6*b*b - 3*b - 3*b*b*b;
c4 = 1 + 3*b + 3*b*b + b*b*b;
//--- Definir início do desenho / Set drawing begin
// O T3 precisa de dados acumulados para estabilizar (lag inicial)
PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, InpPeriod * 6);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| CÁLCULO PRINCIPAL / MAIN CALCULATION |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total, // Total de barras no gráfico
const int prev_calculated, // Barras já calculadas no tick anterior
const int begin, // Onde os dados válidos começam
const double &price[]) // Array de preços (Close, Open, etc)
{
//--- Validação básica / Basic validation
if(rates_total < InpPeriod) return(0);
int start;
// Coeficiente de suavização da EMA / EMA smoothing coefficient
double alpha = 2.0 / (InpPeriod + 1.0);
//--- Lógica de otimização / Optimization logic
if(prev_calculated == 0)
{
// Primeira execução: calcular tudo do zero
start = 0;
// Semente inicial: todas as EMAs começam com o primeiro preço disponível
e1[0] = e2[0] = e3[0] = e4[0] = e5[0] = e6[0] = price[0];
}
else
{
// Execuções subsequentes: recalcular apenas a última barra (incremental)
start = prev_calculated - 1;
}
//--- Loop de processamento barra a barra / Main bar-by-bar loop
for(int i = (start == 0 ? 1 : start); i < rates_total; i++)
{
// CÁLCULO DAS 6 EMAs ENCADEADAS / CALCULATION OF 6 CHAINED EMAs
// Cada linha abaixo usa o resultado da anterior para suavizar ainda mais
e1[i] = price[i] * alpha + e1[i-1] * (1.0 - alpha);
e2[i] = e1[i] * alpha + e2[i-1] * (1.0 - alpha);
e3[i] = e2[i] * alpha + e3[i-1] * (1.0 - alpha);
e4[i] = e3[i] * alpha + e4[i-1] * (1.0 - alpha);
e5[i] = e4[i] * alpha + e5[i-1] * (1.0 - alpha);
e6[i] = e5[i] * alpha + e6[i-1] * (1.0 - alpha);
// FÓRMULA FINAL DO T3 / FINAL T3 FORMULA
// Combinação linear dos buffers suavizados usando os coeficientes pré-calculados
T3Buffer[i] = c1 * e6[i] + c2 * e5[i] + c3 * e4[i] + c4 * e3[i];
}
// Retorna o total de barras processadas para ser usado no próximo tick como 'prev_calculated'
return(rates_total);
}
//+------------------------------------------------------------------+