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.
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.
Definição: Uma palavra que não pode ser utilizada como um identificador - por ser reservada para uso da gramática da linguagem. Exemplos,
inicio
fim
begin
end
São identificadores reservados para variáveis nativas da linguagem, ou seja, que foram determinadas no momento da concepção desta linguagem. Exemplos,
Abertura
, Fechamento
, Máxima
, Mínima
.Open
, Close
, High
, Low
.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.
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.
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.
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?
É 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
e o início do nosso código com a palavra reservada inicio
(begin
).var vReal : Real; vInt : Inteiro; vBool : Booleano; vTexto : String; Inicio // Inicio do código a ser executado // Fim do código Fim;
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?
Utiliza os mesmos tipos definidos nas variáveis. (Real, Inteiro, Booleano, String)
Como Declarar
parametro
ou input
e a palavra reservada var
.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;
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 Close
com indexador [0]
(zero) ou nenhum indexador, portanto,
Close[0]
= Fechamento[0]
= Close
= Fechamento
Referenciar Valores Históricos
Referência a valores do passado é feito através de contadores (indexadores):
[x]
onde x é o número do contador ou indexador. Exemplos, Abertura[1]
= Retorna o preço de abertura do período anterior.Close[3]
= Retorna o preço de fechamento de 3 períodos anteriores ao atual.High[0]
= Retorna o preço de máxima do período atual.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].
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
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 |
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
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;
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;
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;
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;
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.