//+------------------------------------------------------------------+ //| 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); } //+------------------------------------------------------------------+