139 lines
6.3 KiB
MQL5
139 lines
6.3 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| 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);
|
|
}
|
|
//+------------------------------------------------------------------+
|