Tabela de conteúdos

Lógica de Programação

O que é Lógica de Programação?

Lógica de programação é um conjunto de técnicas e princípios usados para escrever e pensar em algoritmos e solucionar problemas de forma eficiente. Ela envolve a análise de problemas e a identificação de soluções eficientes, a criação de planos para resolver problemas, e a implementação dessas soluções através do uso de uma linguagem de programação. A lógica de programação é uma habilidade importante para qualquer pessoa que deseje aprender a programar computadores.

Introdução

Para definir instruções para o computador executar determinada tarefa é necessário utilizar um linguagem de programação que o computador possa compreender.

No contexto do Profitchart essa linguagem é:

Linguagem: NTSL (Nelogica Trading System Language)

Pergunta: Por que precisamos entender a Lógica de Programação?

Resposta: Isso nos ajudará a programar códigos eficazes.

Nos ajudará também a identificar e corrigir problemas com o nosso código.


Palavras Reservadas

Definição: Uma palavra que não pode ser utilizada como um identificador - por ser reservada para uso da gramática da linguagem. Exemplos,

Identificadores reservados

São identificadores reservados para variáveis nativas da linguagem, ou seja, que foram determinadas no momento da concepção desta linguagem. Exemplos,

Funções

Definição: Uma função é um bloco de código pré-definido para executar uma tarefa específica que pode ser chamado e executado inúmeras veze no decorrer do seu código. Por exemplo uma função de cálculo de Média Móvel.

O identificador usado para chamar uma função é reservado, podendo este ser nativo da linguagem ou determinado pelo programador, porém, uma vez estipulado passa a ser reservado e por tanto pode ser usado apenas para este propósito.


Modelo de Execução do Código

Definição: Modelo de Execução se refere a rotina de execução do código, ou seja, a sequência de eventos para execução do código em relação ao contexto da aplicação, neste caso o caso Profitchart.

Mercado Fechado

O código é executado uma vez por barra, começando da primeira barra disponível no gráfico, ou seja, a barra mais antiga, até chegar à barra mais recente. É importante entender que essa execução ocorre apenas uma vez por barra, uma vez que esses períodos históricos já estão fechados o compilador irá usar os valores que foram confirmados no fechamento do período, isso é chamado de modelo OHLC (Open, High, Low, Close), já que o compilador não consegue estipular o que aconteceu dentro do período e como o preço se movimentou, ele apenas tem as informações que foram confirmadas no fim do período.

Mercado Aberto

O código é executado de forma completa barra por barra como no modelo de mercado fechado até atingir a barra mais atual, onde passa a ser executado a cada atualização de valor de preço ou volume (também conhecido como variação de tick), ou seja, toda vez que há uma alteração no preço o código é executado novamente pelo compilador.

Exemplo, em uma Regra de Coloração para pintar uma barra de vermelho quando o preço atual está abaixo do preço de abertura, ou pintar de verde, quando o preço atual está acima do preço de abertura. Para a coloração acontecer em tempo real é necessário que o código seja reexecutado a cada variação de tick para confirmar qual das duas condições são verdadeiras.


Depuração

Inglês: Debug

Definição: Processo de localizar e resolver defeitos ou problemas com um programa de computador, que o previne de operar de forma correta. É importante dominar formas de depurar nossos códigos.

3 Formas Principais

  1. Verificar Sintaxe
    • Sintaxe: Conjunto de regras que determinam as diferentes possibilidades de associação das palavras de uma língua.
    • Funciona da mesma forma que para um idioma, pois, até mesmo linguagens de programação seguem uma determinada 'gramática'.
    • Em resumo é o que determina se uma frase (instrução no código) faz sentido para o computador.
  2. Step Over (F3)
    • Executa o código linha a linha, porém sem investigar as funções usadas pelo código, por isso 'step over' ou 'pular', 'passar por cima'
  3. Trace Into (F7)
    • Assim como em Step Over, também executa um código linha a linha, porém também investiga as funções usadas linha a linha. 'Trace Into', 'traçar dentro'.

Variáveis

Definição: Um objeto, (uma posição, normalmente alocada na memória do computador) capaz de reter e representar um valor ou expressão. Como uma ‘caixa’ que armazena algo dentro.

Identificadores: Um nome para identificá-la e permitir ao programador referenciá-la cada vez que necessário.

Por que usar variáveis?

Tipos de Dados

É um atributo que define para o compilador qual o tipo de dado está sendo usado, no contexto de programação em NTSL é obrigatório definir qual o tipo de dado necessário para manipulá-lo.

PT EN Definição Exemplos
Real Float Representa números ponto flutuantes (real) 3.14
Inteiro Integer Representa números inteiros 1, 2, 3
Booleano Boolean Representa uma relação binária (1 e 0) Verdadeiro (True) / Falso (False)
String String Representa um grupo de caracteres para formar um texto “Hello World”

Como Declarar

var
  vReal : Real;
  vInt : Inteiro;
  vBool : Booleano;
  vTexto : String;
 
Inicio
  // Inicio do código a ser executado
 
  // Fim do código
Fim;

Parâmetros

Definição: Uma interface entre o mundo externo (usuário) com o código sendo executado.

Identificadores: Um nome para identificá-la e permitir ao programador referenciá-la cada vez que necessário e para que o usuário saiba sua utilidade.

Por que usar parâmetros?

Tipos de Dados

Utiliza os mesmos tipos definidos nas variáveis. (Real, Inteiro, Booleano, String)

Como Declarar

Parametro
  Periodo(21);
  Desvio(2.0);
  PlotarLinha(verdadeiro);
  Texto(“Palavra”);
 
var
  vReal : Real;
  vInt : Inteiro;
  vBool : Booleano;
  vTexto : String;
 
Inicio
  // Inicio do código a ser executado
 
  // Fim do código
Fim;

Séries de Dados

Definição: são os valores decorrentes de cada candle (barra ou box) do gráfico.

Português Inglês Definição
Abertura Open Retorna o valor de abertura da barra atual.
Fechamento Close Retorna o valor de fechamento da barra atual.
Minima Low Retorna o valor mínimo da barra atual.
Maxima High Retorna o valor máximo da barra atual.
Volume Volume Retorna o valor do volume financeiro da barra atual.
Quantidade Quantity Retorna o valor do volume quantidade da barra atual.
Trades Trades Retorna o valor do volume negócios da barra atual

Nota: ‘barra atual’ se refere ao ‘período atual’, sempre em relação ao momento em que compilador está executando o código.

Preço Mais Recente

Representado pela série Fechamento ou Closecom indexador [0] (zero) ou nenhum indexador, portanto,

Referenciar Valores Históricos

Referência a valores do passado é feito através de contadores (indexadores):

Indexador [0] (zero)

Seu uso não é obrigatório, por exemplo, Open[0] e Open retornam o mesmo valor, o preço de abertura do período atual, ou seja, para o período mais recente não é necessário declarar o indexador [0].


Operadores

Operadores Matemáticos

Os operadores matemáticos disponíveis na linguagem NTSL são:

Operador Descrição Exemplo Resultado
+ Adição 5+4 9
- Subtração 5-4 1
* Multiplicação 5*4 20
/ Divisão 5/4 1.25
Mod Módulo (calcula o resto da divisão) Mod(5, 4) 1

Nota: Mod() é uma função no contexto da linguagem NTSL, porém a linguagem não possui um operador nativo para cálculo de módulo, por isso é mostrado nessa lista.

Ordem de Operações

Divisão possui maior força de precedência, seguido por multiplicação, e então soma e subtração.

Nota: Soma e subtração seguem a ordem por sequência, ou seja, o operador que estiver primeiro é executado antes.

Apesar de não ser um operador, determinar cálculos dentro de parênteses ( ) define prioridade para o cálculo dentro dos parênteses.

() > Divisão > Multiplicação > (Soma & Subtração)

Alguns exemplos,

Expressão Resultado
10*10/5+2 22
1*2+2 4
50+100*10/2-1 549
5/2+64-6 60.50
100/10+300*2 610
1+1/2+1 2.5

Exemplo resolvido,

//Expressão:
 
x = 10 * 10/5 + 2
 
x = 10 * 2 + 2
 
x = 20 + 2
 
x = 22
 
// Programaticamente
 
 x = (10 * (10/5)) + 2 = 22

Matematicamente

Alterando ordem das operações usando parênteses:

// Programaticamente
x = (10 * 10) / (5 + 2) = 14.28

Matematicamente

Operadores de Comparação

Os operadores de comparação disponíveis na linguagem NTSL são:

Operador Descrição Exemplo (de condição verdadeira)
> Maior que 5 > 4 ;
< Menor que 4 < 5 ;
>= Maior ou igual 5 >= 5 ; 6 >= 5
Menor ou igual 5 ⇐5 ; 4 ⇐ 5
= Igual 4 = 4 ; 5 = 5
<> Diferente 5 <> 4 ; 4 <> 5

Operadores Lógicos

Definição: Uma porta lógica é um 'dispositivo eletrônico' que implementa uma função booleana, uma operação lógica executada em uma ou mais entradas binárias que produz uma única saída binária.

Convenção Binária

Operadores Lógicos

Operador Lógico 'E'

Tabela da Verdade do Operador E

A B X = A 'E' B Booleano
1 1 1 Verdadeiro
1 0 0 Falso
0 1 0 Falso
0 0 0 Falso

Operador Lógico 'OU'

Tabela da Verdade do Operador OU

A B X = A 'OU' B Booleano
1 1 1 Verdadeiro
1 0 1 Verdadeiro
0 1 1 Verdadeiro
0 0 0 Falso

Combinação de Operadores Lógicos

 (A e B) ou (C e D) 
    X    ou    Y



Controle de Fluxo

Se Então Senão (Teste Condicional)

Definição: Se uma condição ou um grupo de condições for verdadeira, execute uma sequência de instruções (A), senão, execute uma outra sequência de instruções (B).

Inglês: If, Then, Else

Inicio
   Se (Fechamento > Abertura) entao
    inicio
      PaintBar(clVerde);
    fim
  Senao Se (Fechamento < Abertura) entao
    inicio
      PaintBar(clVermelho);
    fim
  Senao
    inicio
      PaintBar(clBranco);
    fim;
Fim;

Alternativa

Inicio
  Se (Fechamento > Abertura) entao PaintBar(clVerde)
  Senao Se (Fechamento < Abertura) entao PaintBar(clVermelho)
  Senao PaintBar(clBranco);
Fim;


Para Até (Loop Controlado)

Definição: O comando PARA é utilizado para definir um loop controlado, ou seja, instrução (A) é executada repetidamente até que a (variável de contagem) saia do (valor inicial) e atinja (valor final). A cada iteração a (variável de contagem) é incrementada em 1.

Inglês: For, To

Parametro
  Preco(Fechamento);
  Periodo(9);
 
var
  resultado : Real;
  i : Inteiro;
 
Inicio
  // Inicialização de variável
  Resultado := 0;
 
  Para i := 0 ate Periodo - 1 faca
    inicio
      resultado := resultado + Preco[i];
    fim;
 
  resultado := resultado / Periodo; 
 
  Plot(resultado);
Fim;
 
// Alternativa – Resultado igual, porém simplificado
Inicio
  Para i := 0 ate Periodo -1 faca resultado := resultado + Preco[i];
  resultado := resultado / Periodo;
  Plot(resultado);
Fim;


Enquanto Faça (Loop Controlado)

Definição: A execução da estratégia ao chegar no comando ENQUANTO testa o resultado de (condição). Caso (condição) seja verdadeiro (true) as instruções (comandos) são executadas. Após a execução a (condição) volta a ser testada, assim, o loop apenas irá se encerrar quando (condição) deixar de ser verdadeira.

Inglês: While, Do

Parametro
  Preco(Fechamento);
  Periodo(9);
 
var
  resultado : Real;
  i : Inteiro;
 
Inicio
  // Inicialização de variável
  resultado := 0;
  i := 0;
 
  Enquanto (i <= Periodo – 1) faca
    inicio
      resultado := resultado + Preco[i];
      i := i + 1;
    fim;
 
  resultado := resultado / Periodo; 
 
  Plot(resultado);
Fim;


Repetir, Até (Loop Controlado)

Definição: A execução da estratégia ao chegar no bloco de comandos irá executar as instruções primeiro, e depois irá testar a (condição) descrita no loop REPEAT. Caso (condição) seja falsa (false) as instruções (comandos) serão executadas novamente. Após a execução a (condição) volta a ser testada, assim, o loop apenas irá se encerrar quando (condição) deixar de ser falsa.

Inglês: Repeat, Until

Português: Repetir, Até (porém as palavras reservadas não foram traduzidas para o português na linguagem NTSL, por tanto, apenas a versão em inglês no momento irá funcionar).

Parametro
  Preco(Fechamento);
  Periodo(9);
 
var
  resultado : Real;
  i : Inteiro;
 
Inicio
  // Inicialização de variável
  resultado := 0;
  i := 0;
 
  Repeat
    inicio
      resultado := resultado + Preco[i];
      i := i + 1;
  until (i > Periodo – 1) fim;
 
  resultado := resultado / Periodo; 
 
  Plot(resultado);
Fim;

Funções

Definição: Uma função é um bloco de código que executa uma tarefa específica e pode ser chamado de qualquer parte do programa quantas vezes desejarmos. Uma função pode necessitar de alguns dados para que possa realizar alguma ação baseada nesses dados. Esses dados são chamados parâmetros de entrada da função.

A função pode retornar um certo valor, que é chamado valor de retorno.

Os parâmetros (e seus tipos) devem ser especificados explicitamente, assim como o tipo do valor de retorno.

Função Interna: O bloco de instruções faz parte do mesmo arquivo do código principal que irá referenciar a função.

// Função Interna
var
  Alvo1, Alvo2 : real;
 
Funcao calcAlvo(max : real; min : real; p : real) : real;
  var
    amplitude : real;
  Inicio
    amplitude := max - min;
    result := max + (amplitude * p/100);
  Fim;
 
Inicio
 
  Alvo1 := calcAlvo(Maxima, Minima, 161);
  Alvo2 := calcAlvo(Maxima, Minima, 70);
 
  Plot(Alvo1);
  Plot2(Alvo2);
 
Fim;

Função Externa: O bloco de instruções é declarado como um arquivo independente e por tanto não faz parte do mesmo arquivo do código principal que irá referenciar a função.