Single Arrow MTF
- Indicadores
-
Ahmed Hamed Hamed Eadwan
PORTUGUESE TRANSLATION — PORTUGUÊS
====================================
TITLE:
Desenvolvedor MQL5 e Trader | Fundador da R protocols
ABOUT:
Olá, sou Ahmed — um trader e desenvolvedor MQL5 baseado nos
Emirados Árabes Unidos, e fundador da R protocols. - Versão: 1.0
- Ativações: 5
Um arquivo. Uma seta. Uma decisão.
SingleArrow MTF é um indicador profissional e autossuficiente de sinais de divergência para MetaTrader 5. Ele combina um motor ZigZag próprio de tempo linear, um filtro de divergência Williams %R com separação de pernas, uma camada opcional de proteção de pivôs, um painel de concordância multi-timeframe e suportes/resistências automáticos — tudo compilado em um único arquivo, sem indicadores externos, sem bibliotecas e sem DLLs.
Para quem é
- Traders discricionários que querem setas de divergência limpas e baseadas em regras, em vez de osciladores crus.
- Desenvolvedores de EAs que precisam de uma fonte de sinais legível por máquina e transparente quanto a repintura (buffers + canal GlobalVariable).
- Backtesters e estrategistas que precisam de um fluxo de sinais confirmado e estável no histórico (modo Confirm).
A arquitetura em uma imagem
- Camada de estrutura: o motor ZigZag interno extrai pivôs do preço.
- Camada de análise: o filtro de divergência Williams %R valida cada par de pivôs com separação de pernas.
- Camada de apresentação: setas, painel MTF, níveis S/R, alertas e contadores de transparência.
1) O motor ZigZag interno (por que não o da plataforma?)
- Tempo linear O(n): todo o histórico carregado é processado em uma única passada; cada tick novo custa O(1) de trabalho, então o indicador continua leve com ticks rápidos e histórico profundo.
- Trio clássico, núcleo moderno: Deviation / Depth / Backstep mantêm seu significado habitual, enquanto a gestão interna de pivôs (supressão limitada de Backstep, inserção segura de pivôs no início) foi implementada do zero e endurecida contra casos-limite.
- Sem iCustom, sem buffers faltando: o motor é embutido, portanto o pipeline de sinal nunca depende de outro indicador presente no gráfico ou na pasta do terminal. O EX5 compilado funciona em qualquer lugar, inclusive em aluguéis do Market.
- Determinístico: parâmetros idênticos produzem pivôs idênticos em qualquer gráfico, símbolo e build do terminal.
2) Divergência Williams %R com separação de pernas
Um cruzamento de nível do oscilador, por si só, aqui não é sinal. O indicador compara pernas de preço (movimentos de pivô a pivô) com pernas do oscilador no mesmo intervalo:
- Divergência de baixa: o preço marca uma máxima mais alta enquanto a perna do Williams %R marca uma máxima mais baixa → seta de venda na máxima confirmada.
- Divergência de alta: o preço marca uma mínima mais baixa enquanto a perna do Williams %R marca uma mínima mais alta → seta de compra na mínima confirmada.
- Separação de pernas: oscilações dentro de uma perna ficam excluídas da comparação, de modo que um pico ruidoso no meio da perna não pode falsificar nem esconder uma divergência — e dois pivôs consecutivos da mesma direção nunca são comparados, a fonte clássica de sinais falsos em combos ZigZag/divergência mais baratos.
- Somente um pivô que passa pelas regras estruturais do ZigZag e pelo teste de divergência WPR produz seta. Cada seta é uma decisão completa, não um palpite cru.
3) Modos de sinal: Confirm vs Live (leia com atenção)
Confirm (padrão, InpConfirmBars > 0) — fluxo estável no histórico. O indicador espera N barras (InpConfirmBars) antes de pintar a seta: uma divergência candidata fica pendente até que o pivô que a causou seja confirmado pela ação do preço seguinte. Uma vez comprometida, a seta congela: nunca se move, nunca desaparece e nunca muda de direção*. Com InpConfirmBars = 0 você troca para o modo Live.
Live — a leitura mais cedo possível. A seta é mostrada dentro da barra em formação. Por projeto, ela pode se mover ou sumir enquanto a barra não termina; os contadores de transparência integrados relatam cada evento desse tipo (seção 7).
*Matriz de garantia de não repintura (modo Confirm):
- Deviation/Depth/Backstep = Manual → garantido, incondicionalmente.
- Depth/Backstep adaptativos por ATR + bloqueio de pivôs ligado → garantido.
- Adaptativos + bloqueio desligado → o indicador ativa o bloqueio automaticamente e avisa você, justamente para preservar a garantia.
Essa garantia condicional é declarada com honestidade nos metadados do produto e é imposta por validação de entradas na inicialização.
4) Bloqueio de pivôs
Pivôs confirmados são congelados em um registro interno; recálculos posteriores, picos de volatilidade ou edições de parâmetros não podem movê-los. É o mecanismo que torna possível a garantia do modo adaptativo, e é recomendado sempre que você usar Live.
5) Parâmetros ZigZag adaptativos por ATR
A volatilidade muda entre sessões e símbolos. Em vez de reajustar Deviation/Depth/Backstep à mão, o modo adaptativo os escala pelo ATR atual dentro de limites configuráveis (por exemplo, DepthMax limita o Depth adaptativo). A estrutura permanece significativa em ouro, cripto, índices e FX sem tutela manual por símbolo.
6) Painel multi-timeframe
O mesmo motor roda em segundo plano em até 23 timeframes adicionais (M5/M15/H1/H4/D1 por padrão, totalmente configuráveis via InpMTFTimeframes, com InpMTFLookback como janela de análise). O painel no gráfico mostra o sinal ao vivo/confirmado, o estado de divergência e o status do pivô por timeframe, para que você opere apenas quando o seu timeframe concorda com o quadro maior — p. ex., aceitar setas de alta no M15 quando H1/H4 mostram contexto de alta.
7) Ferramentas de transparência (para desenvolvedores de EAs)
- SA_RepaintBars (buffer 5): contador contínuo de eventos de repintura no Live — 0 por projeto no Confirm.
- SA_PostCommitBars (buffer 6): contador contínuo de ajustes pós-confirmação — ele audita o próprio modo Confirm.
- São contadores vivos monotônicos, não séries históricas: só o valor atual (últimas 2–3 barras) tem significado. Leia a barra 0 ou as Global Variables espelhadas SA_REP_ / SA_POST_ + símbolo + timeframe; nunca varra o histórico.
- SA_PivotState (buffer 3) informa ainda se o pivô desta barra está confirmado (1) ou ainda se formando (0).
8) Suporte/resistência automáticos
O indicador agrupa pivôs (do timeframe do gráfico, ou de todos os timeframes monitorados via InpSRUseAllTF) em níveis de suporte/resistência ranqueados com contadores de toques, desenhados como linhas horizontais, raios ou zonas sombreadas (InpSRMode 0/1/2). Os níveis dão contexto imediato: uma seta de divergência de alta se formando em um suporte ranqueado carrega mais informação do que uma seta no meio do nada.
9) Alertas
Alertas opcionais disparam em sinais recém-confirmados pelos ganchos de alerta/push/e-mail da plataforma. Os textos de alerta são apenas em inglês por projeto, em coerência com as regras do Market.
10) Referência completa de configurações (agrupada)
- Motor de sinal: InpConfirmBars (0 = Live, N = Confirm), InpLiveMargin, InpLockPivots + InpLockAfterBars, InpShowDiag.
- ZigZag: InpDepth / InpBackstep / InpDeviation; Manual vs adaptativo por ATR por parâmetro via InpDevMode / InpDepthMode / InpBackstepMode, mais InpATRPeriod, InpATRMult, InpDepthATRMult, InpDepthMin/InpDepthMax, InpBackstepATRMult, InpBackstepMin/InpBackstepMax.
- Divergência: InpWPRPeriod, InpUseDivergence, InpLookback — validado contra o mínimo interno do motor; valores inválidos são rejeitados na inicialização com mensagem clara em inglês.
- Painel MTF: InpMTFEnabled, InpMTFTimeframes (ex.: "M5,M15,H1,H4,D1", até 23), InpMTFLookback, InpDashEnabled, InpDashCorner, InpDashX/Y, InpDashFontSize.
- S/R: InpSREnabled, InpSRLevelsCount, InpSRTolPts, InpSRMinTouches, InpSRSupportClr/InpSRResistClr, InpSRShowLabel, InpSRMode (0=HLine, 1=Ray, 2=Zone), InpSRUseAllTF.
11) Instalação e primeira execução
- Instale pela aba Market do seu terminal (aluguéis e licenças vitalícias são gerenciados pelo MetaTrader 5).
- Anexe a qualquer gráfico e qualquer timeframe.
- Comece com os padrões no Confirm, observe o painel e então ajuste o trio ZigZag ou ligue o modo adaptativo por ATR.
12) Guias práticos
- Intraday: setas do M15 filtradas pela concordância do painel de H1; entradas no Confirm em pullbacks até os S/R projetados.
- Swing: pivôs do H4 como contexto, setas do H1 como gatilhos.
- EA: leia os buffers de sinal na barra 1 para setas comprometidas; monitore a atividade Live pelos contadores de transparência na barra 0.
13) Desempenho e requisitos
- MetaTrader 5, qualquer símbolo, qualquer timeframe. Sem DLLs, sem arquivos externos, sem indicadores extras.
- Núcleo de tempo linear com tratamento incremental de ticks — projetado para fluxo rápido de ticks sem congelar o gráfico.
- Desinicialização limpa: objetos do gráfico são removidos ao destacar ou trocar de timeframe.
14) O que este produto não é
Ele não executa operações, não gerencia dinheiro e não garante lucros. Divergência é uma leitura probabilística e contextual. No modo Live, a repintura é por projeto e é sempre relatada pelos contadores.
15) Histórico de alterações
- v1.03: validação unificada do Lookback com o mínimo interno do motor (elimina casos silenciosos sem sinal); inserção de pivôs no início endurecida; reconstrução S/R reforçada.
- v1.01: primeira publicação no Market.
16) Perguntas frequentes
- Ele repinta? No Confirm, sob as condições de garantia (seção 3), não. No Live, mudanças são por projeto e contadas com transparência.
- Funciona em qualquer símbolo? Sim; o modo adaptativo por ATR foi construído justamente para manter a estrutura significativa entre símbolos.
- Meu EA pode usá-lo? Sim — buffers de sinal, canal GlobalVariable e contadores de repintura o tornam amigável a EAs.
- Por que uma seta em vez de muitas dicas? Cada seta passou pela validação de estrutura + divergência; menos sinais, de maior qualidade, por projeto.
- Preciso do ZigZag da plataforma no meu gráfico? Não. O motor é embutido.
17) Integração iCustom e ligação com EAs (buffers, código, Global Variables)
O SingleArrow MTF publica 7 buffers, legíveis por qualquer EA via iCustom() + CopyBuffer() — o MetaTrader carrega o indicador automaticamente na primeira chamada iCustom; sem anexar manualmente.
// BUFFER MAP (index -> content) // 0 SA_Buy BUY arrow price (0.0 = none) // 1 SA_Sell SELL arrow price (0.0 = none) // 2 SA_Signal +1 buy / -1 sell / 0 none // 3 SA_PivotState 1 = confirmed pivot, 0 = still forming // 4 SA_WPR Williams %R value // 5 SA_RepaintBars live-repaint counter (0 by design in Confirm) // 6 SA_PostCommitBars post-commit counter (audits Confirm mode) int h = iCustom(_Symbol, PERIOD_CURRENT, "SingleArrow_MTF", 34, // InpDepth 8, // InpBackstep 13, // InpDeviation 14, // InpWPRPeriod 5000, // InpLookback false, // InpUseDivergence 1); // InpConfirmBars (0 = Live, 1+ = Confirm) double sig[]; ArraySetAsSeries(sig, true); CopyBuffer(h, 2, 0, 3, sig); // buffer 2 = SA_Signal if(sig[1] == 1) { /* confirmed buy on last closed bar */ } if(sig[1] == -1) { /* confirmed sell on last closed bar */ } // Repaint counters via Global Variables (no CopyBuffer needed): double rep = GlobalVariableGet("SA_REP_" + _Symbol + "_" + IntegerToString((int)PERIOD_CURRENT)); double post = GlobalVariableGet("SA_POST_" + _Symbol + "_" + IntegerToString((int)PERIOD_CURRENT));
// FULL iCustom SIGNATURE (positional order - every declared input) iCustom(symbol, timeframe, "SingleArrow_MTF", 34, // InpDepth int default 34 8, // InpBackstep int default 8 13, // InpDeviation int default 13 14, // InpWPRPeriod int default 14 5000, // InpLookback int default 5000 false, // InpUseDivergence bool default false 1, // InpConfirmBars int default 1 (0 = Live) 12, // InpLiveMargin int default 12 true, // InpShowDiag bool default true 0, // InpDevMode enum 0=Manual 1=ATR-Adaptive 14, // InpATRPeriod int default 14 0.15, // InpATRMult double default 0.15 0, // InpDepthMode enum 0=Manual 1=ATR-Adaptive 1.0, // InpDepthATRMult double default 1.0 15, // InpDepthMin int default 15 80, // InpDepthMax int default 80 0, // InpBackstepMode enum 0=Manual 1=ATR-Adaptive 1.0, // InpBackstepATRMult double default 1.0 3, // InpBackstepMin int default 3 30, // InpBackstepMax int default 30 false, // InpLockPivots bool default false 3, // InpLockAfterBars int default 3 true, // InpMTFEnabled bool default true "M5,M15,H1,H4,D1", // InpMTFTimeframes string 1200, // InpMTFLookback int default 1200 true, // InpSREnabled bool default true 5, // InpSRLevelsCount int default 5 15, // InpSRTolPts int default 15 2, // InpSRMinTouches int default 2 clrDodgerBlue, // InpSRSupportClr clrOrangeRed, // InpSRResistClr true, // InpSRShowLabel bool default true 0, // InpSRMode int 0=HLine 1=Ray 2=Zone false, // InpSRUseAllTF bool default false true, // InpDashEnabled bool default true CORNER_LEFT_UPPER, // InpDashCorner 10, // InpDashX int default 10 30, // InpDashY int default 30 7); // InpDashFontSize int default 7
- Ciclo de vida do handle: crie-o uma vez em OnInit e libere com IndicatorRelease() em OnDeinit; nunca iCustom por tick.
- Feed comprometido na barra 1: leia SA_Signal / SA_Buy / SA_Sell na última barra fechada para um fluxo estável e consistente com o backtest; SA_PivotState separa pivôs confirmados (1) da ponta em formação (0).
- Contadores são valores vivos monotônicos: os buffers 5/6 (e as Global Variables SA_REP_/SA_POST_) só fazem sentido nas últimas 2–3 barras — leia a barra 0, nunca varra o histórico.
- Dica de desempenho só-EA: passe InpDashEnabled=false e InpSREnabled=false para pular todo o desenho de objetos e manter o handle puramente computacional.
- Duas instâncias no mesmo símbolo+timeframe compartilham o único canal de Global Variables; isso afeta apenas a leitura de conveniência, nunca o cálculo do sinal.
