
QFL, ATR, PANIC-SELL, REBOUND, MEAN-REVERSION
Quando os investidores de varejo vendem loucamente em meio a uma tempestade de sangue nos mercados financeiros, há sempre um grupo de comerciantes calmos em silêncio. Eles não estão perseguindo a queda, mas aguardando um momento especial de extremo pânico para afundar o mercado. Esta é a filosofia central da estratégia de Jackson Quickfingersluc (QFL): ganância quando os outros estão com medo.
A estratégia QFL não é simplesmente um pensamento retrógrado, mas um sofisticado sistema de quantificação que tenta capturar o rebote técnico após a venda de panico das oportunidades de negociação mais valiosas do mercado. O nome da estratégia vem do apelido de um lendário comerciante, conhecido por copiar rapidamente os mercados em queda.
O núcleo da estratégia QFL consiste em identificar dois níveis de preço-chave: o nível de referência (Base Level) e o nível de rebote (Rebound Level). O nível de referência é calculado através da análise dos preços de fechamento mais baixos históricos e representa uma área de suporte relativamente segura. O nível de rebote, por sua vez, é baseado na amplitude de flutuações de preços recentes e fornece uma referência para a obtenção de lucros.
Ainda mais sofisticado, a estratégia introduziu o ATR (Average True Rate) para identificar o panic selling. Quando os preços flutuam acima de um determinado número de vezes o ATR, o sistema determina que o mercado está em uma flutuação anormal, o que geralmente é acompanhado por uma liberação de pânico. Este design evita a entrada prematura em um ajuste normal do mercado e, em vez disso, se concentra em capturar o verdadeiro desequilíbrio do mercado.
A estratégia também estabelece um mecanismo de período de arrefecimento para evitar transações frequentes em um curto período de tempo. Este design reflete uma profunda compreensão da psicologia do mercado. As vendas verdadeiramente de pânico geralmente levam tempo para serem totalmente liberadas, e operações muito frequentes podem perder o melhor momento.
A estratégia QFL oferece três maneiras diferentes de obter lucro, cada uma correspondendo a diferentes preferências de risco e compreensão de mercado:
Modelo de preço médioAdequado para os comerciantes que buscam um lucro estável. Ao calcular o custo médio de todas as posições, este método pode suavizar o impacto de uma única transação e reduzir a pressão de escolha do momento.
Modo de entrada inicialA estratégia mais radical é a que se baseia em uma liquidação total, desde que a primeira transação atinja o objetivo de lucro. Esta estratégia é adequada para os comerciantes que têm confiança no tempo do mercado e podem bloquear rapidamente os lucros.
Modelo de liquidação por lotesO mais preciso, permitindo o gerenciamento de cada posição independente. Esta forma é especialmente eficaz em mercados com maior volatilidade, podendo maximizar o aproveitamento de vários rebotes de preços.
De acordo com os dados de retrospectiva, a estratégia QFL mostra uma boa adaptabilidade em diferentes cenários de mercado. Em mercados de tendência de queda, a estratégia é capaz de capturar várias rebotes técnicas, embora os ganhos individuais possam ser limitados, mas a taxa de vitória é relativamente alta. Em mercados de turbulência, a estratégia tem um desempenho mais excelente, pois o rebote após a venda de pânico costuma ser mais rápido e visível.
No entanto, a estratégia também tem limitações óbvias. Em uma forte tendência ascendente, a oportunidade de panico é relativamente pequena e a frequência de negociação da estratégia é significativamente reduzida. Além disso, em eventos de risco sistêmico extremo, a análise técnica tradicional pode falhar e os níveis de referência podem ser batidos rapidamente.
A gestão de risco da estratégia QFL se manifesta em vários níveis. Primeiro, o ATR ajusta dinamicamente a sensibilidade da identificação de pânico, permitindo que a estratégia se adapte a diferentes ambientes de volatilidade do mercado. Segundo, o mecanismo de período de arrefecimento efetivamente impede o excesso de negociação e protege a segurança dos fundos.
Mais importante ainda, o mecanismo de contenção da estratégia foi projetado para equilibrar habilmente a ganância e o medo. Ao exigir simultaneamente o cumprimento dos objetivos de lucro e a confirmação de rebote, a estratégia evitou a saída prematura e, ao mesmo tempo, impediu a retirada drástica dos lucros.
Com a mudança contínua da estrutura do mercado, as estratégias de QFL também precisam de otimização contínua. A introdução de tecnologias de aprendizado de máquina pode melhorar a precisão da identificação do pânico, enquanto a combinação de indicadores de emoção pode aumentar a capacidade de previsão das estratégias.
Além disso, tendo em conta as características de alta frequência dos mercados modernos, as estratégias podem precisar de ser executadas em um período de tempo mais curto, o que requer um ajuste e otimização correspondente dos parâmetros.
O verdadeiro valor da estratégia QFL não reside apenas na sua rentabilidade, mas na filosofia de negociação que ela representa, mantendo-se racional nos momentos mais sombrios do mercado e mostrando coragem quando a multidão está com medo. Esta implementação quantitativa do pensamento inverso oferece aos comerciantes modernos uma perspectiva única para entender e participar dos mercados financeiros.
/*backtest
start: 2025-05-01 00:00:00
end: 2025-08-26 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT","tradesMode":"1"}]
*/
//@version=6
strategy("Jackson Quickfingersluc (QFL) Strategy", overlay=true)
// Parameters
baseLevelMultiplier = input.float(1, title="Base Level Multiplier", minval=0.1, maxval=1.0, step=0.05)
reboundMultiplier = input.float(0.8, title="Rebound Level Multiplier", minval=0.0001, maxval=1.0, step=0.01) // Multiplier for range of past candles
lookBackPeriod = input.int(50, title="Look-back Period", minval=10)
atrPeriod = input.int(14, title="ATR Period", minval=1)
atrMultiplier = input.float(1.2, title="Panic Sell ATR Multiplier", minval=0.1, maxval=5.0, step=0.1) // Multiplier for ATR threshold
panicSellPercentage = input.float(0.005, title="Panic Sell Percentage Below Base Level", step=0.0001) // Percentage below base level for panic sell
exitProfitThreshold = input.float(0.01, title="Exit Profit Threshold", minval=0.001, maxval=0.1, step=0.001) // Minimum profit threshold (e.g., 1%)
takeProfitOption = input.string("avg_price", title="Take Profit Option", options=["avg_price", "first_entry", "each_position"]) // TP option selection
rangeBars = input.int(3, title="Number of Bars for Range Calculation", minval=1) // Input for number of bars for range calculation
cooldownBars = input.int(5, title="Cooldown Period (Bars)", minval=1) // Input for cooldown period after a buy
// Calculate Base Level
lowestClose = ta.lowest(close, lookBackPeriod)
baseLevel = lowestClose[1] * baseLevelMultiplier
// Calculate Rebound Level as a multiplier of the range of the last 'rangeBars' bars
rangeLastBars = ta.highest(high, rangeBars) - ta.lowest(low, rangeBars)
reboundLevel = reboundMultiplier * rangeLastBars + baseLevel
// Plotting base and rebound levels
plot(baseLevel, color=color.green, linewidth=2, title="Base Level")
plot(reboundLevel, color=color.red, linewidth=2, title="Rebound Level")
// Calculate ATR
atrValue = ta.atr(atrPeriod)
// Factorial average and panic sell movement calculation
var bool panicSellMovement = false
// Loop through each range and check for panic sell condition
for bar_i = 1 to rangeBars+1
currentBarRange = high[bar_i - 1] - low[bar_i - 1] // Current bar range
rangeOfLastXBars = ta.highest(high, bar_i) - ta.lowest(low, bar_i) // Range of the last `bar_i` bars
// Condition 1: Check if the average range of the last `bar_i` bars exceeds ATR multiplier
if (rangeOfLastXBars / bar_i) > atrMultiplier * atrValue
panicSellMovement := true
break // Exit the loop immediately
// Condition 2: Check if the current bar range exceeds ATR multiplier
if currentBarRange > atrMultiplier * atrValue
panicSellMovement := true
break // Exit the loop immediately
// Define the adjusted base level threshold for panic sell (base level - percentage)
panicSellThreshold = baseLevel[0] * (1 - panicSellPercentage)
// Define panic sell condition with base level check and the panic sell percentage threshold
isPanicSell = low < panicSellThreshold and panicSellMovement
// Define rebound condition
isRebound = close > reboundLevel
// Track the last entry bar index
var float lastEntryBar = na
// Store entry prices for each position in an array
var float[] entryPrices = na
var float[] entrySizes = na
bool exit_cond = false
if (na(entryPrices))
entryPrices := array.new_float(0)
if (na(entrySizes))
entrySizes := array.new_float(0)
// Strategy to simulate buys and sells (for backtesting purposes)
entry_cond = isPanicSell and (na(lastEntryBar) or (bar_index - lastEntryBar) > cooldownBars)
if entry_cond
strategy.entry("Buy", strategy.long)
lastEntryBar := bar_index // Set last entry bar to current bar index
// Store the entry price and size for this new position
array.push(entryPrices, close)
array.push(entrySizes, strategy.position_size)
isTakeProfitCondition(entryPrice) =>
profitPercentage = (close - entryPrice) / entryPrice
profitCondition = profitPercentage >= exitProfitThreshold
reboundCondition = isRebound
profitCondition and reboundCondition
// Check TP condition based on selected option
if takeProfitOption == "avg_price"
avgEntryPrice = strategy.position_avg_price
if isTakeProfitCondition(avgEntryPrice)
exit_cond := true
strategy.close("Buy")
else if takeProfitOption == "first_entry"
firstEntryPrice = strategy.opentrades.entry_price(0)
if isTakeProfitCondition(firstEntryPrice)
exit_cond := true
strategy.close("Buy")
else if takeProfitOption == "each_position"
// Ensure we only check when there is at least one entry
if array.size(entryPrices) > 0
// Loop until there are no more entries left
i = 0
while i < array.size(entryPrices)
entryPrice = array.get(entryPrices, i)
positionSize = array.get(entrySizes, i)
// Check profit condition for each position
if isTakeProfitCondition(entryPrice)
exit_cond := true
// Remove the entry price and size from the arrays once the position is closed
array.remove(entryPrices, i)
array.remove(entrySizes, i)
strategy.close("Buy", qty=positionSize) // Close only the position that reached the target
else
// Only increment the index if the current entry is not closed
i := i + 1
// Trigger BUY alert
if entry_cond
alert("BUY ALERT: Panic Sell condition triggered", alert.freq_once_per_bar)
// Trigger SELL alert
if exit_cond
alert("SELL ALERT: Exit condition met (take profit or rebound)", alert.freq_once_per_bar)