Tectonic Structure Engine
- Bibliotecas
-
Syarief Azman Bin Rosli
Olá e seja bem-vindo ao meu perfil oficial no MQL5!
Sou Syarief Azman Bin Rosli, desenvolvedor de sistemas de trading algorítmico e engenheiro de software quantitativo com mais de uma década de experiência especializada na criação de Expert Advisors para MetaTrader 5 e MetaTrader 4. - Versão: 1.0
- Ativações: 5
Biblioteca MQL4 que mapeia a estrutura do mercado para o seu EA, indicador ou script: swings confirmados com rótulos HH, HL, LH, LL, EQH e EQL, quebra de estrutura (BOS), mudança de caráter (CHoCH), varreduras de liquidez, order blocks e fair value gaps com acompanhamento do preenchimento, e a posição do preço no range operacional. Lê apenas barras fechadas e nunca repinta. Não opera, não desenha e não envia alertas. Você recebe o arquivo compilado Tectonic_Structure_Engine.ex4; esta página é a referência completa da API.
Início rápido
- Copie Tectonic_Structure_Engine.ex4 para MQL4/Libraries (Arquivo > Abrir pasta de dados).
- Cole o bloco #import abaixo no seu programa.
- Em OnInit: h = TSE_Create("", 0, 3, 1000); opcionalmente TSE_Configure.
- Chame TSE_Update(h) em OnTick ou OnCalculate. Sem barra nova, retorna 0 em cerca de um microssegundo.
- Leia TSE_Trend, TSE_GetEvent, TSE_NearestZone e as demais; TSE_Release(h) em OnDeinit.
- Verifique: execute o exemplo abaixo no Testador de estratégias (qualquer símbolo, M15). O diário lista cada evento; a primeira atualização lista todo o histórico.
Declaração de importação (pronta para copiar)
#import "Tectonic_Structure_Engine.ex4" int TSE_Create(string symbol, int timeframe, int strength, int history_bars); bool TSE_Configure(int handle, int break_mode, double min_swing_atr, double equal_tol_atr, double fvg_min_atr, int atr_period); void TSE_Release(int handle); int TSE_Update(int handle); int TSE_Trend(int handle); int TSE_SwingCount(int handle); bool TSE_GetSwing(int handle, int index, int &side, double &price, datetime &time, int &label); int TSE_EventCount(int handle); bool TSE_GetEvent(int handle, int index, int &type, double &level, datetime &swing_time, datetime &break_time); bool TSE_GetLevels(int handle, double &swing_high, double &swing_low, bool &high_broken, bool &low_broken); double TSE_RangePosition(int handle, double price); int TSE_ZoneCount(int handle); bool TSE_GetZone(int handle, int index, int &kind, int &dir, double &top, double &bottom, datetime &time, int &state, double &fill); int TSE_NearestZone(int handle, int kind, int dir, double price, double &top, double &bottom); int TSE_GetStats(int handle, int &stats[]); int TSE_LastError(); string TSE_ErrorText(int code); string TSE_LabelText(int label); string TSE_EventText(int type); string TSE_ZoneText(int kind, int dir); string TSE_StateText(int state); #import
Códigos
- Rótulos de swing: 1 HH, 2 LH, 3 EQH (topos); -1 LL, -2 HL, -3 EQL (fundos); 0 FIRST (sem swing anterior desse lado).
- Tipos de evento: 1 BOS UP, -1 BOS DOWN, 2 CHOCH UP, -2 CHOCH DOWN, 3 SWEEP HIGH, -3 SWEEP LOW.
- Tipo de zona (kind): 1 fair value gap, 2 order block. dir: 1 altista (suporte), -1 baixista (resistência). Textos: BULL FVG, BEAR FVG, BULL OB, BEAR OB.
- Estado da zona: 0 FRESH (intocada), 1 TESTED (o preço entrou), 2 FILLED (FVG atravessado), 3 BROKEN (OB fechado do outro lado).
- Erros: 0 OK, -1 BAD HANDLE, -2 BAD PARAMETERS, -3 NO HISTORY, -4 NO FREE SLOT, -5 BAD INDEX. As funções de texto retornam UNKNOWN para outros códigos.
Como cada barra fechada é lida
- Zonas: uma mínima dentro de uma zona altista (uma máxima dentro de uma baixista) marca TESTED e eleva fill, a penetração mais profunda em % da altura da zona. Um FVG passa a FILLED quando o preço atinge a borda oposta; um OB passa a BROKEN com um fechamento além da borda oposta (fill pode chegar a 100% enquanto o OB continua ativo).
- Swings: a barra strength barras atrás é um swing de alta quando sua máxima fica acima das strength barras anteriores e não abaixo das strength barras posteriores (fundos espelhados). Um swing é informado strength barras depois e nunca se move. Com min_swing_atr acima de 0, a máxima menos a menor mínima das 2 x strength + 1 barras deve ser pelo menos min_swing_atr x ATR. Rótulo em relação ao swing anterior do mesmo lado: dentro de equal_tol_atr x ATR é EQH ou EQL; caso contrário HH ou LH, LL ou HL. O swing de alta e o swing de baixa mais recentes são os níveis de quebra.
- Quebras: break_mode 0 exige um fechamento além do nível, 1 um pavio. Romper o swing de alta gera CHOCH UP se a tendência era -1, senão BOS UP; a tendência passa a 1 e o nível é consumido. Fundos espelhados. No modo fechamento, um pavio além com fechamento de volta dentro é um SWEEP, uma vez por nível.
- Order block: em cada BOS ou CHoCH, a última vela oposta (baixista para uma quebra de alta) no extremo da perna entre swing e quebra ou até 10 barras antes; a zona é a faixa máxima-mínima dessa vela.
- Fair value gap: mínima da terceira vela acima da máxima da primeira (altista), ou máxima da terceira abaixo da mínima da primeira (baixista), com altura de pelo menos fvg_min_atr x ATR.
O ATR é a média simples do true range sobre atr_period barras.
Referência da API
TSE_Create
symbol: "" ou NULL = símbolo do gráfico; deve existir. timeframe: 0 = período do gráfico, senão de PERIOD_M1 a PERIOD_MN1. strength: 1-50. history_bars: 100-20000, construídas na primeira atualização. Retorna um handle 0-31, ou -1 com BAD PARAMETERS ou NO FREE SLOT. Padrões: break_mode 0, min_swing_atr 0, equal_tol_atr 0.10, fvg_min_atr 0.25, atr_period 14.
TSE_Configure
break_mode 0-1, min_swing_atr 0-10 (0 = desligado), equal_tol_atr 0-5, fvg_min_atr 0-10, atr_period 1-500. Limpa o handle; o próximo TSE_Update reconstrói. Qualquer valor fora da faixa: false, BAD PARAMETERS, nada muda.
TSE_Release
Libera o handle para reutilização. Chame em OnDeinit.
TSE_Update
Lê as barras fechadas ainda não vistas; a primeira chamada constrói history_bars. Retorna o número de eventos novos (índices 0 a n-1 de TSE_GetEvent), 0 sem barra nova, ou -1: BAD HANDLE, ou NO HISTORY enquanto houver menos de 2 x strength + 4 barras carregadas (chame de novo no próximo tick). Se a última barra lida desaparecer (histórico recarregado), o handle se reconstrói sozinho.
int n = TSE_Update(h); if(n > 0) Print(n, " new events");
TSE_Trend
1 após uma quebra de alta, -1 após uma quebra de baixa, 0 antes da primeira quebra ou com handle inválido.
TSE_SwingCount e TSE_GetSwing
Swings armazenados, o mais recente no índice 0: side (1 topo, -1 fundo), price, horário da barra do swing, label. A contagem é -1 com handle inválido; fora de 0 a contagem-1, TSE_GetSwing retorna false com BAD INDEX.
TSE_EventCount e TSE_GetEvent
Eventos armazenados, o mais recente no índice 0: type, level (o preço do swing), swing_time, break_time (a barra que o rompeu ou varreu).
TSE_GetLevels
O swing de alta e o swing de baixa mais recentes (0.0 se ainda não houver) e se cada um já foi rompido. Um nível intacto é o próximo gatilho de BOS ou CHoCH.
TSE_RangePosition
Onde o preço está entre esses dois níveis: 0 = swing de baixa, 50 = equilíbrio, 100 = swing de alta, abaixo de 0 ou acima de 100 fora do range. price 0 = Bid do símbolo do handle. EMPTY_VALUE quando falta um nível ou a alta não está acima da baixa. A demo mostra DISCOUNT abaixo de 45 e PREMIUM acima de 55.
TSE_ZoneCount e TSE_GetZone
Zonas armazenadas de todos os estados, a mais recente no índice 0: kind, dir, top, bottom, time (FVG: vela do meio; OB: a própria vela), state, fill 0-100.
TSE_NearestZone
Zona FRESH ou TESTED mais próxima do preço (0 = Bid); distância 0 dentro de uma zona, empates vão para a zona mais recente. kind: 0 qualquer, 1 FVG, 2 OB. dir: 0 qualquer, 1, -1. Retorna o índice para TSE_GetZone e preenche top e bottom; -1 se não houver (erro OK) ou BAD PARAMETERS.
double top, bottom; int z = TSE_NearestZone(h, 2, 1, 0, top, bottom); // nearest bullish order block
TSE_GetStats
Passe um array int dinâmico; ele é redimensionado para 12 e 12 é retornado: 0 barras lidas, 1 swings de alta, 2 swings de baixa, 3 BOS UP, 4 BOS DOWN, 5 CHOCH UP, 6 CHOCH DOWN, 7 SWEEP HIGH, 8 SWEEP LOW, 9 FVGs, 10 OBs, 11 zonas ativas agora. Contagens desde a última construção.
TSE_LastError e as funções de texto
TSE_LastError: código da última chamada. TSE_ErrorText, TSE_LabelText, TSE_EventText, TSE_ZoneText(kind, dir) e TSE_StateText retornam as strings listadas em Códigos.
Exemplo de integração funcional
#import "Tectonic_Structure_Engine.ex4"
int TSE_Create(string symbol, int timeframe, int strength, int history_bars);
void TSE_Release(int handle);
int TSE_Update(int handle);
int TSE_Trend(int handle);
bool TSE_GetEvent(int handle, int index, int &type, double &level, datetime &swing_time, datetime &break_time);
int TSE_NearestZone(int handle, int kind, int dir, double price, double &top, double &bottom);
string TSE_EventText(int type);
#import
int h = -1, htf = -1;
int OnInit()
{
h = TSE_Create("", 0, 3, 1000); // chart timeframe
htf = TSE_Create("", PERIOD_H4, 3, 1000); // higher-timeframe bias
return (h >= 0 && htf >= 0) ? INIT_SUCCEEDED : INIT_FAILED;
}
void OnDeinit(const int reason) { TSE_Release(h); TSE_Release(htf); }
void OnTick()
{
TSE_Update(htf);
int n = TSE_Update(h);
for(int i = n - 1; i >= 0; i--)
{
int type; double level; datetime st, bt;
if(TSE_GetEvent(h, i, type, level, st, bt))
Print(TSE_EventText(type), " at ", level, ", H4 trend ", TSE_Trend(htf));
}
double top, bottom;
if(n > 0 && TSE_NearestZone(h, 2, 1, 0, top, bottom) >= 0)
Print("nearest bullish OB ", bottom, " - ", top);
} Configurações típicas
- Estrutura interna e externa: dois handles no mesmo gráfico, strength 2 e 8.
- Viés multi-timeframe: handle do gráfico para entradas, handle H4 ou D1 como filtro TSE_Trend.
- Quebras por pavio: TSE_Configure(h, 1, 0, 0.10, 0.25, 14); sem varreduras neste modo.
- Menos zonas e swings, maiores: fvg_min_atr 0.5-1.0, min_swing_atr 1.0.
Arquitetura e observações
- Um motor por handle, até 32 handles por programa; cada programa que importa tem os seus. Os dados ficam na memória e são reconstruídos do histórico após um reinício.
- Apenas barras fechadas, cada uma lida uma vez, da mais antiga para a mais nova: nada repinta e a barra 0 nunca é usada.
- Construir 20.000 barras levou cerca de 80 ms no Testador de estratégias do MT4.
- Outros símbolos ou timeframes são lidos com iHigh, iLow, iOpen, iClose e iTime; NO HISTORY é normal enquanto o terminal os baixa. No Testador de estratégias use o símbolo testado (qualquer timeframe).
- Por handle: até 2000 swings, 2000 eventos e 500 zonas; ao encher, os 10% mais antigos são descartados.
- MetaTrader 4 build 600 ou posterior. Seguro no Testador de estratégias e na otimização. Sem DLLs, arquivos, variáveis globais, objetos gráficos, timers, alertas ou operações.
Aviso de risco
A biblioteca descreve a estrutura do preço. Não prevê preços nem garante lucros. Teste qualquer estratégia baseada nela primeiro em uma conta demo.
