Kaique Mitsuo Silva Yamamoto
Mercado financeiroAutomação de EstratégiasProfit / Nelogica NTSL

NTSL — Controle de Fluxo e Operadores

Estruturas condicionais, loops, operadores lógicos e matemáticos, fluxo de execução candle a candle e boas práticas de programação em NTSL para o Profit.

NTSL — Controle de Fluxo e Operadores

O fluxo de execução em NTSL é sequencial e candle a candle: para cada barra do histórico (e para cada novo tick em automação), o código do bloco begin/end é executado do início ao fim. Entender isso é essencial para evitar bugs sutis.

Fundamentos da linguagem: NTSL — Fundamentos


Fluxo de Execução

Histórico: [candle 1] → [candle 2] → ... → [candle N-1] → [candle N atual]

                                               Em formação (Close muda a cada tick)
  • Índice [0] = candle atual (em formação durante automação, ou processando no backtest)
  • Índice [1] = candle anterior (fechado e confirmado)
  • Índice [N] = N candles atrás
begin
  // ✓ Sinal confiável: usar barra fechada
  if (Close[1] > Media(21, Close)[1]) then
    PaintBar(clVerde);

  // ⚠ Sinal em formação: pode mudar a cada tick
  if (Close > Media(21, Close)) then
    PaintBar(clAzul);
end;

Condicional — Se/Então/Senão

// Forma simples (uma linha)
if (Close > Close[1]) then
  PaintBar(clVerde);

// Forma com bloco
if (Close > Media(21, Close)) then
begin
  PaintBar(clVerde);
  Plot(Close);
end;

// Com senão
if (Close > Media(21, Close)) then
begin
  PaintBar(clVerde);
  Plot(Close);
end
else
begin
  PaintBar(clVermelho);
  Plot(Low);
end;

// Encadeamento (else if)
if (Close > High[1]) then
  Plot(1)
else if (Close < Low[1]) then
  Plot(-1)
else
  Plot(0);

Palavras-chave equivalentes: if/se, then/então, else/senão, begin/inicio, end/fim.


Loop For

// Crescente: de 1 até N
for i := 1 to 20 do
begin
  // acumular soma dos últimos 20 fechamentos
  soma := soma + Close[i];
end;

// Decrescente: de N até 1
for i := 20 downto 1 do
begin
  if (Close[i] > High[i+1]) then
    contagem := contagem + 1;
end;
// Exemplo: encontrar a máxima dos últimos 20 candles
var
  fMaxima20 : Float;
  i         : Integer;

begin
  fMaxima20 := High[0];
  for i := 1 to 19 do
  begin
    if (High[i] > fMaxima20) then
      fMaxima20 := High[i];
  end;
  Plot(fMaxima20);
end;

Loop While

Executa enquanto a condição for verdadeira. Cuidado com loops infinitos.

var
  i     : Integer;
  soma  : Float;

begin
  i    := 0;
  soma := 0.0;

  while (i < 10) do
  begin
    soma := soma + Close[i];
    i    := i + 1;
  end;

  Plot(soma / 10);
end;

Loop Repeat/Until

Executa ao menos uma vez e verifica a condição no final.

var
  i     : Integer;
  soma  : Float;

begin
  i    := 0;
  soma := 0.0;

  repeat
    soma := soma + Close[i];
    i    := i + 1;
  until (i >= 10);

  Plot(soma / 10);
end;

Operadores

Matemáticos

a + b       // adição
a - b       // subtração
a * b       // multiplicação
a / b       // divisão
Mod(a, b)   // módulo (resto da divisão inteira)
// Exemplo: range médio dos últimos 5 candles
var
  fRangeMedia : Float;
  i           : Integer;

begin
  fRangeMedia := 0.0;
  for i := 1 to 5 do
    fRangeMedia := fRangeMedia + (High[i] - Low[i]);
  fRangeMedia := fRangeMedia / 5;
  Plot(fRangeMedia);
end;

Comparação

a >  b   // maior que
a <  b   // menor que
a >= b   // maior ou igual
a <= b   // menor ou igual
a =  b   // igual (usar = não == como em C)
a <> b   // diferente (não !=)

Lógicos

(cond1) and (cond2)   // E — ambas verdadeiras
(cond1) or  (cond2)   // OU — ao menos uma verdadeira
not (cond)            // NÃO — inverte o booleano

// Em português:
(cond1) e   (cond2)
(cond1) ou  (cond2)
não (cond)
// Exemplo: sinal com filtros múltiplos
var
  bSinalCompra : Boolean;

begin
  bSinalCompra := (Close > Media(9, Close))
              and (Close > Media(21, Close))
              and (RSI(14) > 50)
              and (CurrentBar >= 21);

  if bSinalCompra then
    PaintBar(clVerde);
end;

Instrução Exit

Para interromper a execução do candle atual:

begin
  // Sair cedo se histórico insuficiente
  if (CurrentBar < 21) then exit;

  // Resto do código só executa se CurrentBar >= 21
  Plot(Media(21, Close));
end;

Padrões de Detecção de Cruzamento

O cruzamento é um dos padrões mais usados em NTSL:

var
  sMA9  : Serie;
  sMA21 : Serie;

begin
  sMA9  := Media(9,  Close);
  sMA21 := Media(21, Close);

  // Cruzamento de alta: MA9 cruza acima da MA21
  if (sMA9 > sMA21) and (sMA9[1] <= sMA21[1]) then
    PaintBar(clVerde);

  // Cruzamento de baixa: MA9 cruza abaixo da MA21
  if (sMA9 < sMA21) and (sMA9[1] >= sMA21[1]) then
    PaintBar(clVermelho);
end;

Contagem de Candles Consecutivos

var
  iConsecutivos : Integer;

begin
  if (Close > Close[1]) then
    iConsecutivos := iConsecutivos + 1
  else
    iConsecutivos := 0;

  Plot(iConsecutivos);  // quantos candles de alta seguidos
end;

Como iConsecutivos é uma variável global do bloco principal, ela persiste entre candles — não é reiniciada a cada execução.


Boas Práticas de Fluxo

PráticaPor quê
if (CurrentBar < N) then exit no inícioEvita calcular indicadores sem histórico suficiente
Usar [1] (barra fechada) para sinais de entradaBarra [0] está em formação e pode mudar
Evitar divisão por zero: if (b <> 0) then x := a/bCausa erro de runtime
Preferir and/or a aninhar if excessivamenteCódigo mais legível e menos propenso a erros
Loops internos ao begin devem ser limitados em NEvita travamento em ativos com muito histórico

Referências

Referências externas

On this page