0% acharam este documento útil (0 voto)
11 visualizações5 páginas

Template Lua para Estratégia de Trading

Ui

Enviado por

rodolfobrunss
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato TXT, PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
11 visualizações5 páginas

Template Lua para Estratégia de Trading

Ui

Enviado por

rodolfobrunss
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato TXT, PDF, TXT ou leia on-line no Scribd

--[[

Template Lua para estratégia baseada no seu Pine Script


- Cálculo de EMA, RSI, ATR
- Condições de entrada e saída
- Filtro de datas para backtest
- Gerenciamento simples de posições
--]]

-- Configurações iniciais
local initial_capital = 5000
local position_size_percent = 50 -- % do capital
local commission_percent = 0.02

-- Parâmetros da estratégia (ajuste conforme necessário)


local TPSType = "Trailing" -- "ATR", "Trailing", "Options"
local setupType = "Open/Close" -- "Open/Close" ou "Renko"
local tradeType = "BOTH" -- "LONG", "SHORT", "BOTH", "NONE"

local enableFilter = true


local fromDate = [Link]{year=2023, month=1, day=1}
local toDate = [Link]{year=2099, month=12, day=31}

-- Parâmetros indicadores
local emaPeriod = 48
local emaPeriod2 = 2
local emaPeriod3 = 21
local rsiPeriod = 7
local atrPeriod = 14

-- Sensibilidade para sinal HSN


local Multiplier = 3.2

-- Funções auxiliares

-- Exponencial Moving Average (EMA)


function ema(data, period)
local ema_values = {}
local k = 2 / (period + 1)
ema_values[1] = data[1] -- inicializa com o primeiro valor
for i = 2, #data do
ema_values[i] = data[i] * k + ema_values[i-1] * (1 - k)
end
return ema_values
end

-- Simple Moving Average (SMA)


function sma(data, period)
local sma_values = {}
local sum = 0
for i = 1, #data do
sum = sum + data[i]
if i >= period then
if i > period then
sum = sum - data[i - period]
end
sma_values[i] = sum / period
else
sma_values[i] = nil
end
end
return sma_values
end

-- RSI
function rsi(data, period)
local rsi_values = {}
local gain = 0
local loss = 0
for i = 2, period + 1 do
local change = data[i] - data[i-1]
if change > 0 then gain = gain + change else loss = loss - change end
end
local avgGain = gain / period
local avgLoss = loss / period
rsi_values[period + 1] = avgLoss == 0 and 100 or 100 - (100 / (1 + avgGain /
avgLoss))
for i = period + 2, #data do
local change = data[i] - data[i-1]
local gainVal = change > 0 and change or 0
local lossVal = change < 0 and -change or 0
avgGain = (avgGain * (period - 1) + gainVal) / period
avgLoss = (avgLoss * (period - 1) + lossVal) / period
rsi_values[i] = avgLoss == 0 and 100 or 100 - (100 / (1 + avgGain / avgLoss))
end
return rsi_values
end

-- ATR
function atr(high, low, close, period)
local tr = {}
for i = 2, #close do
local h_l = high[i] - low[i]
local h_pc = [Link](high[i] - close[i-1])
local l_pc = [Link](low[i] - close[i-1])
tr[i] = [Link](h_l, h_pc, l_pc)
end
local atr_values = {}
local sum = 0
for i = 2, period + 1 do
sum = sum + tr[i]
end
atr_values[period + 1] = sum / period
for i = period + 2, #close do
atr_values[i] = (atr_values[i-1] * (period - 1) + tr[i]) / period
end
return atr_values
end
-- Função para verificar se a data está dentro do período permitido
function isDateAllowed(timestamp)
if not enableFilter then return true end
return timestamp >= fromDate and timestamp <= toDate
end

-- Função para detectar crossover


function crossover(series1, series2, index)
if index < 2 then return false end
return series1[index-1] <= series2[index-1] and series1[index] > series2[index]
end

-- Função para detectar crossunder


function crossunder(series1, series2, index)
if index < 2 then return false end
return series1[index-1] >= series2[index-1] and series1[index] < series2[index]
end

-- Função para simular estratégia


function runStrategy(data)
-- data: tabela com campos open, high, low, close, time (timestamp)
local n = #[Link]

-- Calcula indicadores
local ema1 = ema([Link], emaPeriod)
local ema2 = ema([Link], emaPeriod2)
local ema3 = ema([Link], emaPeriod3)
local rsi_values = rsi([Link], rsiPeriod)
local atr_values = atr([Link], [Link], [Link], atrPeriod)

-- Variáveis para controle de posição


local position = nil -- "long", "short", ou nil
local entry_price = 0
local equity = initial_capital
local position_size = equity * (position_size_percent / 100)
local trades = {}

for i = [Link](emaPeriod, rsiPeriod, atrPeriod) + 1, n do


if not isDateAllowed([Link][i]) then
-- Fora do período permitido
goto continue
end

-- Condições de entrada simplificadas (exemplo baseado no seu código)


local buy_signal = false
local sell_signal = false

-- Exemplo: compra quando EMA2 cruza acima EMA1 e RSI < 30


if crossover(ema2, ema1, i) and rsi_values[i] and rsi_values[i] < 30 then
buy_signal = true
end

-- Exemplo: venda quando EMA2 cruza abaixo EMA1 e RSI > 70


if crossunder(ema2, ema1, i) and rsi_values[i] and rsi_values[i] > 70 then
sell_signal = true
end

-- Gerenciamento de ordens
if position == nil then
if buy_signal and (tradeType == "LONG" or tradeType == "BOTH") then
position = "long"
entry_price = [Link][i]
print([Link]("Entrada LONG em %s preço %.2f", [Link]("%Y-%m-%d",
[Link][i]), entry_price))
elseif sell_signal and (tradeType == "SHORT" or tradeType == "BOTH") then
position = "short"
entry_price = [Link][i]
print([Link]("Entrada SHORT em %s preço %.2f", [Link]("%Y-%m-%d",
[Link][i]), entry_price))
end
else
-- Exemplo simples de saída: cruzamento contrário
if position == "long" and sell_signal then
local exit_price = [Link][i]
local profit = (exit_price - entry_price) * (position_size / entry_price)
equity = equity + profit - (equity * commission_percent / 100)
print([Link]("Saída LONG em %s preço %.2f lucro %.2f saldo %.2f",
[Link]("%Y-%m-%d", [Link][i]), exit_price, profit, equity))
position = nil
elseif position == "short" and buy_signal then
local exit_price = [Link][i]
local profit = (entry_price - exit_price) * (position_size / entry_price)
equity = equity + profit - (equity * commission_percent / 100)
print([Link]("Saída SHORT em %s preço %.2f lucro %.2f saldo %.2f",
[Link]("%Y-%m-%d", [Link][i]), exit_price, profit, equity))
position = nil
end
end

::continue::
end

print([Link]("Saldo final: %.2f", equity))


end

-- Exemplo de dados (substitua pelos seus dados reais)


local data = {
time = {1672531200, 1672617600, 1672704000, 1672790400, 1672876800, 1672963200,
1673049600, 1673136000, 1673222400, 1673308800},
open = {100, 102, 101, 103, 105, 104, 106, 108, 107, 109},
high = {103, 104, 103, 106, 107, 108, 109, 110, 111, 112},
low = {99, 100, 100, 102, 103, 102, 105, 106, 105, 107},
close = {102, 101, 103, 105, 104, 107, 108, 109, 110, 111}
}
-- Executa

Você também pode gostar