A estratégia de compra traseira é uma estratégia de tendência. Quando a média móvel rápida cruza a média móvel lenta, ela desencadeia um sinal de posição aberta. Ao contrário da posição aberta diretamente, esta estratégia não entrará no mercado imediatamente após o sinal de posição aberta ser desencadeado, mas executará a ordem de compra apenas quando o preço atingir certas condições. Isso pode aumentar o lucro da estratégia até certo ponto.
Esta estratégia é baseada em um sistema de cruzamento de média móvel com duas médias móveis. A média móvel rápida e a média móvel lenta são calculadas, respectivamente.
A lógica de execução será diferente quando a opção de compra de atraso estiver habilitada:
Quando o sinal longo é acionado, em vez de comprar diretamente, registe o preço mais baixo naquele momento.
Em seguida, calcular o limiar do preço de compra de acordo com a percentagem de compra final, ou seja, o preço mais baixo * (1 + percentagem).
Nas barras subsequentes, continue a comparar o preço mais baixo da barra atual com o limiar do preço de compra.
Quando o preço mais baixo ultrapassar o limiar do preço de compra, executar a ordem de compra.
Desta forma, podemos entrar no mercado a um preço melhor após a confirmação da tendência.
As vantagens desta estratégia são as seguintes:
Usando a compra de trailing pode evitar o risco de falsa ruptura, entrando no mercado depois que a tendência se torna mais óbvia.
Através da compra de trailers, podem ser alcançados melhores preços, melhorando o lucro até certo ponto.
Esta estratégia é simples e fácil de implementar.
A percentagem de crescimento da compra final é personalizável, tornando a estratégia mais flexível.
Os períodos de média móvel podem ser personalizados para se adaptarem aos diferentes ambientes de mercado.
Esta estratégia apresenta também alguns riscos:
A compra atrasada pode causar um certo atraso e perder a oportunidade de entrar.
A fixação inadequada da percentagem de crescimento da compra final pode resultar na impossibilidade de comprar.
Os períodos de média móvel incorretos podem produzir mais sinais falsos.
A estratégia pode sofrer perdas graves em diversos mercados.
Esta é uma estratégia simples com espaço para otimização de parâmetros.
As medidas correspondentes:
Encurtar o percentual de compra para reduzir o atraso.
Teste diferentes percentagens para encontrar o ideal.
Otimizar os períodos de média móvel para adaptar o mercado.
Adicionar outros filtros para evitar mercados variados.
Considerar a adição de um stop loss para reduzir as perdas.
A estratégia pode ser otimizada nas seguintes direcções:
Adicione indicadores de preço-volume como o Klinger para evitar a incompatibilidade preço-volume.
Adicionar julgamentos de condição de volume, comprar apenas quando o volume se expande.
Otimizar os períodos de média móvel para diferentes produtos.
Adicionar indicadores de volatilidade para evitar zonas de variação.
Adicione o stop loss do ATR.
Considere tornar o percentual de avanço dinâmico, avançando mais rápido quando a tendência é mais óbvia.
Em resumo, a estratégia de trailing buy melhora a estratégia, seguindo o preço para melhores pontos de entrada, mantendo-a simples.
/*backtest start: 2023-10-01 00:00:00 end: 2023-10-08 00:00:00 period: 5m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 // // ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ // ----------------------------------------------------------------------------- // Copyright 2022 Iason Nikolas | jason5480 // Trailing Buy script may be freely distributed under the MIT license. // // Permission is hereby granted, free of charge, // to any person obtaining a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, // publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, // subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // // ----------------------------------------------------------------------------- // // Authors: @jason5480 // Revision: v1.0.0 // Date: 15-Feb-2022 // // Description // ============================================================================= // This strategy will go long if fast MA crosses over slow MA. // If the trailing buy is checked then the strategy instead of entering into the position // directly it will follow the price downwards (percentagewise) with small steps // If the price raise by this percentage then the entry order will be executed // // The strategy has the following parameters: // // Fast SMA Length - How many candles back to calculte the fast SMA. // Slow SMA Length - How many candles back to calculte the slow SMA. // Enable Trailing - Enable or disable the trailing // Training Buy Deviation % - The step to follow the price when the open position condition is met. // Source Buy - The price to compare the current buyPrice in order to trigger the buy order when trailing // // ----------------------------------------------------------------------------- // Disclaimer: // 1. I am not licensed financial advisors or broker dealer. I do not tell you // when or what to buy or sell. I developed this software which enables you // execute manual or automated using TradingView. The // software allows you to set the criteria you want for entering and exiting // trades. // 2. Do not trade with money you cannot afford to lose. // 3. I do not guarantee consistent profits or that anyone can make money with no // effort. And I am not selling the holy grail. // 4. Every system can have winning and losing streaks. // 5. Money management plays a large role in the results of your trading. For // example: lot size, account size, broker leverage, and broker margin call // rules all have an effect on results. Also, your Take Profit and Stop Loss // settings for individual pair trades and for overall account equity have a // major impact on results. If you are new to trading and do not understand // these items, then I recommend you seek education materials to further your // knowledge. // // YOU NEED TO FIND AND USE THE TRADING SYSTEM THAT WORKS BEST FOR YOU AND YOUR // TRADING TOLERANCE. // // I HAVE PROVIDED NOTHING MORE THAN A TOOL WITH OPTIONS FOR YOU TO TRADE WITH THIS PROGRAM ON TRADINGVIEW. // // I accept suggestions to improve the script. // If you encounter any problems I will be happy to share with me. // ----------------------------------------------------------------------------- // // ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ // SETUP ============================================================================================================ strategy(title = 'Trailing Buy', shorttitle = 'TB', overlay = true, pyramiding = 0, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, initial_capital = 100000) // // ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ // FILTERS ========================================================================================================== // INPUT ============================================================================================================ usefromDate = input.bool(defval = true, title = 'From', inline = "From Date", group = "Filters") fromDate = input(defval = timestamp('01 Jan 2021 00:00 UTC'), title = '', inline = "From Date", group = 'Filters') usetoDate = input.bool(defval = false, title = 'To ', inline = "To Date", group = "Filters") toDate = input(defval = timestamp('31 Dec 2121 23:59 UTC'), title = '', inline = "To Date", group = 'Filters') // LOGIC ============================================================================================================ isWithinPeriod() => true // PLOT ============================================================================================================= bgcolor(color = isWithinPeriod() ? color.new(color.gray, 90) : na, title = 'Period') // // ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ // STRATEGY ========================================================================================================= // INPUT ============================================================================================================ fastMALen = input.int(defval = 21, title = 'Fast/Slow SMA Length', inline = 'MA Length', group = 'Strategy') slowMALen = input.int(defval = 49, title = '', tooltip = 'How many candles back to calculte the fast/slow SMA.', inline = 'MA Length', group = 'Strategy') // LOGIC ============================================================================================================ fastMA = ta.sma(close, fastMALen) slowMA = ta.sma(close, slowMALen) bool openLongPosition = isWithinPeriod() and ta.crossover(fastMA, slowMA) bool closeLongPosition = ta.crossunder(fastMA, slowMA) bool longIsActive = openLongPosition or strategy.position_size > 0 // PLOT ============================================================================================================= var fastColor = color.new(#0056BD, 0) plot(series = fastMA, title = 'Fast SMA', color = fastColor, linewidth = 1, style = plot.style_line) var slowColor = color.new(#FF6A00, 0) plot(series = slowMA, title = 'Slow SMA', color = slowColor, linewidth = 1, style = plot.style_line) plotshape(series = openLongPosition and strategy.position_size <= 0 ? fastMA : na, title = 'Buy', text = 'Buy', style = shape.labelup, location = location.absolute, color = color.new(color.green, 0), textcolor = color.new(color.white, 0), size = size.tiny) // // ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ // BUY ============================================================================================================== // INPUT ============================================================================================================ enableTrailing = input.bool(defval = true, title = 'Enable Trailing', tooltip = 'Enable or disable the trailing for buy.', group = 'Buy') trailingBuyDeviationPerc = input.float(defval = 4.0, title = 'Trailing Buy Deviation %', minval = 0.01, maxval = 100, step = 0.05, tooltip = 'The step to follow the price when the open position condition is met.', group = 'Buy') / 100 srcBuy = input.source(defval = high, title = 'Source Buy', tooltip = 'The price to check to trigger the buy order', group = 'Buy') // LOGIC ============================================================================================================ int barsSinceOpenLong = nz(ta.barssince(openLongPosition), 999999) int barsSinceCloseLong = nz(ta.barssince(closeLongPosition), 999999) bool tryOpenLongPosition = isWithinPeriod() and barsSinceCloseLong >= barsSinceOpenLong and not (strategy.position_size > 0) float longBuyPrice = na longBuyPrice := if openLongPosition and not (strategy.position_size > 0) low * (1 + trailingBuyDeviationPerc) else if tryOpenLongPosition math.min(low * (1 + trailingBuyDeviationPerc), nz(longBuyPrice[1], 999999)) else na bool executeLongPosition = enableTrailing ? isWithinPeriod() and srcBuy > longBuyPrice : openLongPosition // PLOT ============================================================================================================= var buyColor = color.new(#419388, 0) plot(series = enableTrailing ? longBuyPrice : na, title = 'Long Buy Price', color = buyColor, linewidth = 1, style = plot.style_linebr, offset = 1) // // ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ // POSITION ORDERS ================================================================================================== // LOGIC ============================================================================================================ // getting into LONG position strategy.entry(id = 'Long Entry', direction = strategy.long, when = executeLongPosition, alert_message = 'Long(' + syminfo.ticker + '): Started') // submit close order on trend reversal strategy.close(id = 'Long Entry', when = closeLongPosition, comment = 'Close Long', alert_message = 'Long(' + syminfo.ticker + '): Closed at market price') // PLOT ============================================================================================================= var posColor = color.new(color.white, 0) plot(series = strategy.position_avg_price, title = 'Position', color = posColor, linewidth = 1, style = plot.style_linebr) // ==================================================================================================================