Introdução PineScript - Áreas de Código e Série de dados.

Fala Traders.

Iremos dar continuidade ao nosso estudo Intrudução ao PineScript. Vamos ver hoje sobre como organizar nosso código dividindo-o em áreas específicas para melhor desenvolvimento de estratégias para backtestes. Iremos ver também todo o código do Setup Dave Landry para que vocês possam estudar. Vamos lá?

ÁREAS DE CÓDIGO

Para uma melhor organização e compreensão, é boa prática de quem está escrevendo uma estratégia de execução ou indicador que separe o código e áreas. Na figura abaixo vemos 4 áreas principais:

- Área de Inputs (quando houver);

- Área de declaração de variáveis;

- Área da lógica de execução;

- Área de plotagem de indicadores (quando houver);

snapshot

Área de inputs

Inputs são valores atribuídos pelo usuário para que o código execute durante todo o código. Inputs significa que houve um valor externo "entrando" no código (input = entrada).

Por exemplo, se você quiser atribuir valores de caixa inicial para sua estratégia para verificar se o capital aumenta ou esgota durante um determinado tempo você irá adicionar o valor deste caixa como sendo um input, pois poderá modificar no futuro apenas o valor inicial sem a necessidade de modificar todo o código.

Para isso, aqui no editor Pine, você precisará adicionar a palavra "Input" antes do nome "caixa inicial" para o editor reconhecer esse valor como sendo um input.

Área de declaração de variáveis


Variáveis são "espaço" em memória do editor para que o mesmo possa usá-lo durante todo o código, para que não haja necessidade de repetição deste valor. É semelhante aos inputs. Porém, para que o editor entenda que uma declaração é tida como variável o usuário terá que adicionar a palavra "var" antes dessa declaração.

No setup do Dave Landry iremos utilizar as variáveis da imagem abaixo.

snapshot

Vemos na imagem que atribuímos as palavras "candle", "tamanho", "alvo" e "stop" como sendo variáveis de valor 0.

Nas variáveis existem 3 tipos principais que iremos utilizar no desenvolvimento de outros setups. São eles:

- Tipo inteiro;

- Tipo float;

- Tipo booleano;

O tipo inteiro, como o nome já diz, são valores inteiros atribuídos às variáveis. Por exemplo, quero uma média móvel de 20 períodos. O número 20 é um número inteiro, portanto será uma variável do tipo inteiro.

Tipo float ( ou ponto flutuante) são valores fracionários. No nosso exemplo da imagem acima temos o valor "tamanho", "alvo" e "stop" como sendo do tipo float.

Tipo booleano são variáveis que possuem valores lógico como true ou false (verdadeiro ou falso). Tais valores são usado com as terminações IF, THEN e ELSE (são os três principais).

Bom, vimos as principais áreas do código, o que são inputs e variáveis. Agora precisamos saber o que são Série de dados.

SÉRIE DE DADOS

Série de dados nada mais é do que os valores da mínima, máxima, abertura e fechamento de um determinado período, seja ele no período de 1 horas, 30 minutos, diário, entre outros.

snapshot

Para cada período, utilizamos o valor entre chaves no código pine. Por exemplo, close[1] refere-se ao fechamento da barra anterior. Close[2], refere-se ao fechamento da barra ante anterior. Assim sucessivamente.

snapshot

No setup do Dave Landry utilizaremos a função de séries de dados para saber o valor da mínimas e máximas do candle atual, assim como dos dois candles anteriores para fazermos nossa condição de compra e venda.

snapshot

No código da figura vemos que a condição de compra se dá pela mínima do candle atual sendo menor do que a mínima do candle anterior e menor que a mínima do candle ante anterior e fechamento da barra atual (close) sendo maior do que a média móvel de 20 períodos (low[0]<low[1] and (low[0]<low[2]) and (close>sma(close,20));.

A condição de venda é montada da mesma maneira, porém utilizando a série de dados das máxima dos candles anteriores e fechamento de candle atual menor do que a média móvel de 20 períodos.

Ora meus amigos, isso não é o setup apresentado pelo Dave Landry?

Então, com o conhecimento dada neste estudo e do post anterior, já podemos montar nossa estratégia de execução e testar em vários papeis.

Segue o código completo abaixo:

//version=4

strategy("DAVE LANDRY - DAY TRADE", overlay = true)

//---------------------------------------------//
// ÁREA DE DECLARAÇÃO DE VARIÁVEIS
//---------------------------------------------//

var candle = 0

var tamanho = 0.00

var alvo = 0.00

var stop = 0.00

// CONDIÇÕES DE COMPRA E VENDA

condicoes_de_compra = (low[0]<low[1]) and (low[0]<low[2]) and (close>sma(close,20))

condicoes_de_venda = (high[0]>high[1]) and (high[0]>high[2]) and (close<sma(close,20))

//---------------------------------------------//
// FUNÇÕES PARA EXCLUIR ORDENS PENDENTES
//---------------------------------------------//

strategy.cancel("entrada_na_compra")

strategy.cancel("entrada_na_venda")

//---------------------------------------------//
// LÓGICA DE ENTRADA NAS OPERAÇÕES
//---------------------------------------------//

if (strategy.position_size==0) and (hour<16)

candle:=0

if (condicoes_de_compra)

strategy.entry("entrada_na_compra", true, stop = high)

if (condicoes_de_venda)

strategy.entry("entrada_na_venda", false, stop = low)

//---------------------------------------------//
// LÓGICA DE SAÍDA DAS OPERAÇÕES DE COMPRA
//---------------------------------------------//

if (strategy.position_size>0)

candle := candle + 1

tamanho := high[candle] - low[candle]

alvo := (tamanho * 2) + high[candle] // Esse é o seu alvo

stop := abs( (tamanho * 2) - low[candle] )// Esse é o seu stop

//Abaixo temos o envio da ordem contendo definição do alvo e stop

strategy.exit("saída_da_compra", "entrada_na_compra", limit = alvo, stop = stop)

//---------------------------------------------//
// LÓGICA DE SAÍDA DAS OPERAÇÕES DE VENDA
//---------------------------------------------//

if (strategy.position_size<0)

candle := candle + 1

tamanho := high[candle] - low[candle]

alvo := abs( ( tamanho * 2 ) - low[candle] ) // Esse é o seu alvo

stop := ( tamanho * 2 ) + high[candle] // Esse é o seu stop

//Envio da ordem contendo o alvo e o stop

strategy.exit("saída_da_venda", "entrada_na_venda", limit = alvo, stop = stop)

//----------------------------------------------------------//
// HORÁRIO DE ENCERRAMENTO PARA DAY TRADE
//----------------------------------------------------------//

if (hour>=16)

strategy.close("entrada_na_compra", comment = "fechando posição")

strategy.close("entrada_na_venda", comment = "fechando posição")

//---------------------------------------------//
// ÁREA DE PLOTAGEM
//---------------------------------------------//


plot(sma(close,20))



//----------------------------------------------------------------------------------------


FIM DE CÓDIGO!

Basta copiar e colar o código no seu Editor Pine e estuda-lo e fazer o backtest em vários outros papeis. Lembrando que é um código para DayTrade, por isso há funções de encerramento por horário.

Bons estudos.






Fundamental AnalysisHarmonic PatternspinecoderspinescriptTrend Analysis

Também em:

Aviso legal