Esta é uma estratégia de negociação de futuros que aproveita o mecanismo martingale para alcançar altos retornos.
A lógica central desta estratégia é: quando o preço desencadeia a linha de stop loss, reabra posições com tamanhos maiores enquanto reduz a linha de stop loss em uma certa porcentagem.
Especificamente, ele primeiro entra no preço atual com o tamanho da posição definido e toma os níveis de lucro/perda. Quando o preço se move para a linha de stop loss, posições maiores serão reabertas e a linha de stop loss é reduzida em uma porcentagem definida. Tais operações de reabertura e redução de stop loss reduzirão o preço médio de abertura, aumentando o potencial de lucro. Depois que o número de ordens adicionadas atinge o máximo, ele aguarda a reversão do preço para atingir o take profit.
A maior vantagem é a capacidade de reduzir a base de custos através da reabertura alavancada, enquanto ainda tem a chance de reversão favorável quando as tendências são negativas.
Também funciona bem para commodities e outros mercados de alta volatilidade, amplificando ganhos/perdas através da alavancagem.
O principal risco é que o preço possa continuar a tendência de queda após a reabertura, até quebrando os níveis de stop loss anteriores, levando a grandes perdas.
Outro risco é o insuficiência de capital para suportar a quantidade máxima de encomendas antes da reversão.
Algumas formas de otimizar ainda mais a estratégia:
Ajuste dinâmico do nível de alavancagem, mais baixo quando se obtém lucro e mais elevado quando se perde
Incorporar indicadores de tendência para parar perdas quando a tendência não estiver clara
O valor da posição em risco deve ser calculado em função da volatilidade do mercado.
Adicionar módulos de perda de parada automática para limitar perdas extremas
Esta é uma estratégia típica de negociação de martingale alavancada. Ao reduzir o custo através de ordens adicionadas, ele busca retornos mais altos, mas também introduz riscos.
/*backtest start: 2023-01-19 00:00:00 end: 2024-01-25 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("Leveraged Martingale Strategy with Fees", overlay=true) // User-defined input parameters var float takeProfitPct = input(2.0, title="Take Profit Percentage") / 100.0 var float positionMultiplier = input(2.0, title="Position Size Multiplier") var int maxOrders = input(10, title="Maximum Number of Reinforced Orders") var float tradeSizeUSD = input(10000.0, title="Trade Size in USD") var float dropPctForNextTrade = input(1.0, title="Drop Percentage for Next Trade") / 100.0 var float leverage = input(5.0, title="Leverage Factor") var bool enterAtCurrentPrice = input(true, title="Enter First Trade at Current Price") var float takerFeePct = input(0.1, title="Taker Order Fee Percentage") / 100.0 // State variables var float last_entry_price = na var float avg_entry_price = na var float total_position_size = 0.0 var int num_trades = 0 // Entry logic if (num_trades == 0) if (enterAtCurrentPrice or close < last_entry_price * (1 - dropPctForNextTrade)) float size = tradeSizeUSD / close * leverage strategy.entry("Long", strategy.long, qty=size) avg_entry_price := close total_position_size := size last_entry_price := close num_trades := 1 else if (close < last_entry_price * (1 - dropPctForNextTrade) and num_trades < maxOrders) float size = tradeSizeUSD / close * leverage * pow(positionMultiplier, num_trades) strategy.entry("Double Long" + tostring(num_trades), strategy.long, qty=size) avg_entry_price := ((avg_entry_price * total_position_size) + (close * size)) / (total_position_size + size) total_position_size := total_position_size + size last_entry_price := close num_trades := num_trades + 1 // Take profit logic adjusted for leverage and fees var float take_profit_price = na var float fee_deduction = na if (num_trades > 0) take_profit_price := avg_entry_price * (1 + takeProfitPct / leverage) fee_deduction := total_position_size * close * takerFeePct if (close > take_profit_price + fee_deduction / total_position_size) strategy.close_all() num_trades := 0