TradingHelperLib — Biblioteca Pine Script para Automação de Ordens
Guia completo da biblioteca TradingHelperLib: cálculo de ordens limite, gestão de risco, P&L, liquidação, DCA (Fixed, Fibonacci, Martingale) e exemplos práticos em Pine Script v6.
A TradingHelperLib é uma biblioteca open-source para Pine Script publicada por SwSpace no TradingView. Ela encapsula os cálculos repetitivos que aparecem em qualquer estratégia séria: preços de ordem limite, P&L, liquidação, margem, stop-loss dinâmico, trailing stop e gestão de DCA — tudo em funções reutilizáveis e testadas.
Link do script original: TradingHelperLib — SwSpace (TradingView)
Por que usar uma biblioteca utilitária?
Quando se desenvolve estratégias em Pine Script, os mesmos cálculos aparecem repetidamente:
- Quanto o preço precisa recuar para preencher minha ordem limite?
- Qual é meu stop-loss considerando a volatilidade atual?
- Em que ponto serei liquidado com essa alavancagem?
- Qual o multiplicador certo para um DCA progressivo?
Sem uma biblioteca, esses cálculos ficam espalhados em múltiplos scripts com variações sutis que geram bugs difíceis de rastrear. A TradingHelperLib consolida tudo isso em uma API limpa.
Importando a biblioteca
//@version=6
import SwSpace/TradingHelperLib/2 as thA versão 2 inclui todas as funções de TP/SL/trailing stop que não existiam na v1.
Módulo 1 — Ordens Limite
calcLimitPrice()
Calcula o preço de uma ordem limite com desvio configurável em relação ao preço atual.
// Sintaxe
th.calcLimitPrice(basePrice, deviationPct)
// Exemplo: ordem de compra 0.2% abaixo do fechamento
limitBuy = th.calcLimitPrice(close, -0.2)
// Exemplo: ordem de venda 0.15% acima
limitSell = th.calcLimitPrice(close, 0.15)Por que isso importa: bots de automação frequentemente precisam enviar ordens limite ligeiramente fora do preço de mercado para garantir execução (maker orders em exchanges de cripto, por exemplo). Um desvio de 0.1% a 0.3% é comum.
checkLimitFill()
Verifica se uma ordem limite foi preenchida, comparando o preço-alvo com o high/low do candle atual.
// Para posição long: a ordem compra foi preenchida?
filled = th.checkLimitFill(limitPrice, "long")
if filled
// Registrar entrada, calcular SL/TP...Lógica interna: uma ordem limite de compra é considerada preenchida quando o low do candle toca ou passa abaixo do preço-alvo. Para venda, quando o high toca ou supera o preço-alvo.
Módulo 2 — Cálculos de Pip
f_pipValue() e f_pipsToPrice()
Abstraem a conversão entre pips e preço absoluto, considerando as características do símbolo.
// Valor monetário de 1 pip no símbolo atual
pipVal = th.f_pipValue()
// Converter 50 pips em variação de preço
priceMove = th.f_pipsToPrice(50)
// Stop-loss de 30 pips abaixo da entrada
stopLoss = entryPrice - th.f_pipsToPrice(30)Contexto: em forex, 1 pip vale 0.0001 para pares como EUR/USD mas 0.01 para pares como USD/JPY. Hardcodar esse valor é fonte de bugs quando o script é aplicado a símbolos diferentes.
Módulo 3 — Profit & Loss
calcPnlLong() e calcPnlShort()
Calculam o P&L atual de uma posição aberta, em valor absoluto ou percentual.
// P&L de uma posição long
pnl = th.calcPnlLong(
entryPrice = 100.0,
currentPrice = close,
quantity = 1.0
)
// P&L de uma posição short
pnlShort = th.calcPnlShort(
entryPrice = 100.0,
currentPrice = close,
quantity = 1.0
)Caso de uso típico: exibir no gráfico o P&L flutuante de posições abertas controladas pelo script, ou acionar lógica de saída parcial quando o lucro atinge determinado patamar.
// Fechar 50% quando P&L > 2%
if th.calcPnlLong(entryPrice, close, qty) > 0.02
strategy.close("Long", qty_percent=50)Módulo 4 — Preço de Liquidação
calcLiqPriceLongSimple() e calcLiqPriceShortSimple()
Estimam o preço de liquidação para posições alavancadas.
leverage = 10.0 // 10x de alavancagem
liqLong = th.calcLiqPriceLongSimple(entryPrice, leverage)
liqShort = th.calcLiqPriceShortSimple(entryPrice, leverage)
// Plotar no gráfico como referência visual
plot(liqLong, "Liq Long", color=color.red, style=plot.style_circles)
plot(liqShort, "Liq Short", color=color.green, style=plot.style_circles)Fórmula simplificada:
- Long:
entryPrice * (1 - 1/leverage) - Short:
entryPrice * (1 + 1/leverage)
Atenção: estas são estimativas simplificadas. Exchanges aplicam taxas de manutenção de margem que tornam a liquidação real ligeiramente diferente. Use como referência, não como valor exato.
Módulo 5 — Margem e Tamanho de Posição
calcMargin() e calcNotional()
Convertem entre o valor nocional de uma posição e a margem necessária.
leverage = 5.0
notional = 10000.0 // $10.000 em posição
// Margem necessária para essa posição
margin = th.calcMargin(notional, leverage)
// → $2.000 (20% de $10.000 com 5x)
// Posição máxima com $500 de margem disponível
maxPosition = th.calcNotional(500, leverage)
// → $2.500Aplicação prática: ao desenvolver estratégias para mercados de futuros ou cripto com alavancagem, essas funções ajudam a dimensionar corretamente cada trade com base no capital disponível.
Módulo 6 — Take Profit, Stop Loss e Trailing Stop
Estas funções foram adicionadas na versão 2 e são as mais usadas em automação completa.
f_checkTPHit()
Detecta se o take profit foi atingido no candle atual.
tpHit = th.f_checkTPHit(
entryPrice = entryPrice,
tpPrice = takeProfit,
direction = "long"
)
if tpHit
strategy.close("Long", comment="TP atingido")f_calcSLPrice()
Calcula o preço de stop-loss a partir de uma distância em percentual ou pips.
// Stop-loss 1.5% abaixo da entrada (long)
sl = th.f_calcSLPrice(entryPrice, 1.5, "long")
// Stop-loss 2% acima da entrada (short)
sl = th.f_calcSLPrice(entryPrice, 2.0, "short")f_calcTSValue()
Gerencia trailing stop: retorna o novo nível de stop quando o preço se move a favor.
trailingPct = 1.0 // trailing de 1%
newTS = th.f_calcTSValue(
currentPrice = close,
trailingPct = trailingPct,
currentSL = stopLevel,
direction = "long"
)
// O trailing stop só sobe (long) ou só desce (short), nunca volta
stopLevel := math.max(stopLevel, newTS)Módulo 7 — DCA (Dollar Cost Averaging)
A função f_multiplier() é uma das mais poderosas da biblioteca. Ela calcula o multiplicador de tamanho de posição para estratégias de DCA — onde cada entrada adicional em uma posição perdedora tem um tamanho diferente do anterior.
Os três modos
Modo Fixed (fixo)
Todas as entradas têm o mesmo tamanho.
mult = th.f_multiplier(
mode = "fixed",
step = orderNumber, // Número da ordem (1, 2, 3...)
multiplier = 1.0
)
// Resultado: sempre 1.0x — tamanho constanteQuando usar: quando você quer médias simples sem aumentar o risco.
Modo Fibonacci
Os tamanhos seguem a proporção da sequência de Fibonacci: 1, 1, 2, 3, 5, 8...
mult = th.f_multiplier(
mode = "fibonacci",
step = orderNumber
)
// Order 1: 1x | Order 2: 1x | Order 3: 2x | Order 4: 3x | Order 5: 5xMatemática: cada termo é a soma dos dois anteriores. O crescimento é progressivo, mas mais controlado que o Martingale.
Quando usar: DCA agressivo em ativos com alta convicção, onde você aceita aumentar a exposição gradualmente.
Modo Martingale
Cada ordem tem o dobro do tamanho da anterior.
mult = th.f_multiplier(
mode = "martingale",
step = orderNumber,
multiplier = 2.0
)
// Order 1: 1x | Order 2: 2x | Order 3: 4x | Order 4: 8x | Order 5: 16xQuando usar: raramente em trading real.
Aviso crítico sobre Martingale: matematicamente, o sistema de Martingale é destrutivo em sequências longas de perdas. Com 7 ordens e multiplicador 2x, o tamanho da última ordem é 64x a primeira. Uma sequência adversa pode zerar a conta antes do preço se recuperar. Use apenas em contexto educacional, em backtesting com capital ilimitado, ou com um limite rígido de ordens máximas.
Estratégia DCA completa — exemplo prático
//@version=6
strategy("DCA com TradingHelperLib", overlay=true, initial_capital=10000,
default_qty_type=strategy.fixed, default_qty_value=1)
import SwSpace/TradingHelperLib/2 as th
// Parâmetros
baseQty = input.float(0.1, "Quantidade base")
maxOrders = input.int(5, "Máximo de ordens DCA")
dcaStep = input.float(1.0, "Desvio entre ordens (%)")
dcaMode = input.string("fibonacci", "Modo DCA", options=["fixed","fibonacci","martingale"])
tpPct = input.float(2.0, "Take Profit (%)")
leverage = input.float(1.0, "Alavancagem")
// Estado
var float entryPrice = na
var int orderCount = 0
var float totalQty = 0.0
var float stopLevel = na
// Condição de entrada inicial
longEntry = ta.crossover(ta.ema(close, 9), ta.ema(close, 21))
// Primeira entrada
if longEntry and orderCount == 0 and strategy.position_size == 0
entryPrice := close
orderCount := 1
totalQty := baseQty
strategy.entry("DCA-1", strategy.long, qty=baseQty)
stopLevel := th.f_calcSLPrice(close, 3.0, "long")
// Entradas adicionais de DCA
if strategy.position_size > 0 and orderCount < maxOrders
targetPrice = entryPrice * (1 - (dcaStep * orderCount / 100))
filled = th.checkLimitFill(targetPrice, "long")
if filled
mult = th.f_multiplier(dcaMode, orderCount + 1, 2.0)
newQty = baseQty * mult
totalQty := totalQty + newQty
entryPrice := (entryPrice * (totalQty - newQty) + targetPrice * newQty) / totalQty
orderCount := orderCount + 1
strategy.entry("DCA-" + str.tostring(orderCount), strategy.long, qty=newQty)
// Take Profit
tpPrice = entryPrice * (1 + tpPct / 100)
tpHit = th.f_checkTPHit(entryPrice, tpPrice, "long")
if tpHit and strategy.position_size > 0
strategy.close_all(comment="TP")
orderCount := 0
totalQty := 0.0
entryPrice := na
// Stop Loss
if strategy.position_size > 0 and close < stopLevel
strategy.close_all(comment="SL")
orderCount := 0
totalQty := 0.0
entryPrice := na
// Visual
plot(entryPrice, "Preço médio", color=color.yellow, style=plot.style_circles)
plot(tpPrice, "Take Profit", color=color.green, style=plot.style_circles)
plot(stopLevel, "Stop Loss", color=color.red, style=plot.style_circles)Comparativo dos modos DCA
| Ordem | Fixed (1x) | Fibonacci | Martingale (2x) |
|---|---|---|---|
| 1ª | 1x | 1x | 1x |
| 2ª | 1x | 1x | 2x |
| 3ª | 1x | 2x | 4x |
| 4ª | 1x | 3x | 8x |
| 5ª | 1x | 5x | 16x |
| Total (5 ordens) | 5x | 12x | 31x |
O modo Fibonacci oferece um equilíbrio entre agressividade e controle de risco — cresce progressivamente, mas não de forma exponencial como o Martingale.
Funções utilitárias extras
Conversão percentual-preço
// Converter 2% de variação em preço absoluto
delta = th.pctToPrice(close, 2.0)Cálculo de taxas
// Taxa de uma operação com 0.1% de comissão
fee = th.calcFee(notional, 0.1)Timeframe para barras
// Quantas barras do gráfico atual equivalem a 1 hora?
barsIn1h = th.tfToBars("60")Quando usar a TradingHelperLib
| Cenário | Vale usar? |
|---|---|
| Bot com ordens limite e DCA | Sim — core use case |
| Indicador visual simples | Não — overhead desnecessário |
| Estratégia com alavancagem e liquidação | Sim — cálculos de margem embutidos |
| Scalping de alta frequência | Parcialmente — depende das funções |
| Aprendizado de Pine Script | Sim — boa referência de implementação |
Boas práticas ao usar a biblioteca
- Defina
maxOrderssempre que usar DCA — sem limite, sequências adversas consomem capital indefinidamente. - Evite Martingale em live trading sem um stop total de estratégia baseado em drawdown máximo da conta.
- Use
calcLiqPriceLong/Shortcomo linha de referência no gráfico ao operar com alavancagem — saber onde está a liquidação muda o comportamento de gestão de risco. - Valide com backtesting extenso antes de qualquer deploy via webhook — especialmente para modos DCA com Fibonacci que acumulam posições grandes.
- Teste em múltiplos timeframes — o comportamento do DCA muda drasticamente entre M5, H1 e D1.
Referências
- Script original — TradingHelperLib (SwSpace)
- Documentação Pine Script v6
- Referência de Libraries em Pine Script
- Automação no TradingView via Webhooks
Aviso Legal: Conteúdo educativo. Não constitui recomendação de investimento. A estratégia Martingale é apresentada exclusivamente para fins didáticos — seu uso em trading real com capital próprio apresenta risco elevado de perda total.