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ática | Por quê |
|---|---|
if (CurrentBar < N) then exit no início | Evita calcular indicadores sem histórico suficiente |
Usar [1] (barra fechada) para sinais de entrada | Barra [0] está em formação e pode mudar |
Evitar divisão por zero: if (b <> 0) then x := a/b | Causa erro de runtime |
Preferir and/or a aninhar if excessivamente | Código mais legível e menos propenso a erros |
Loops internos ao begin devem ser limitados em N | Evita travamento em ativos com muito histórico |
Referências
Referências externas
NTSL — Fundamentos da Linguagem
Tipos de dados, séries de preço, variáveis, arrays, constantes, funções, procedimentos e padrões fundamentais de programação em NTSL para o Profit Nelogica.
NTSL — Análise Multi-Ativo com Asset()
Como usar a função Asset() em NTSL para correlacionar múltiplos ativos, comparar séries de preço entre diferentes mercados e construir estratégias com filtros externos no Profit.