Esta estratégia é um sistema de negociação de múltiplas camadas baseado no impulso e na tendência. Combina o Alligador Williams, os Fractals Williams, o Awesome Oscillator (AO) e a Média Móvel Exponencial (EMA) para identificar oportunidades longas de alta probabilidade.
A estratégia utiliza múltiplos mecanismos de filtragem para garantir a precisão da direção da negociação. Em primeiro lugar, usa a EMA para julgamento da tendência de longo prazo, procurando oportunidades de longo prazo apenas quando o preço está acima da EMA. Em segundo lugar, julga tendências de curto prazo através da combinação do Alligador de Williams e Fractals, confirmando uma tendência de alta quando uma quebra fractal ascendente ocorre acima da linha dos dentes do Alligador. Finalmente, após a confirmação da tendência, a estratégia procura sinais longos do indicador AO para o tempo de entrada específico. O sistema usa apenas 10% do capital por negociação e pode abrir até 5 posições longas à medida que a tendência se fortalece. Quando a combinação fractal e Alligator indica uma reversão da tendência, todas as posições são fechadas.
Para reduzir estes riscos, recomenda-se:
Esta é uma estratégia de seguimento de tendências bem projetada que atinge bons retornos, mantendo a segurança através da combinação de vários indicadores técnicos. A inovação da estratégia reside em seu mecanismo de confirmação de tendências de várias camadas e método de gestão de capital progressivo.
/*backtest start: 2019-12-23 08:00:00 end: 2024-12-04 00:00:00 period: 1d basePeriod: 1d exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © Skyrexio //@version=6 //_______ <licence> strategy(title = "MultiLayer Awesome Oscillator Saucer Strategy [Skyrexio]", shorttitle = "AO Saucer", overlay = true, format = format.inherit, pyramiding = 5, calc_on_order_fills = false, calc_on_every_tick = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 10, initial_capital = 10000, currency = currency.NONE, commission_type = strategy.commission.percent, commission_value = 0.1, slippage = 5, use_bar_magnifier = true) //_______ <constant_declarations> var const color skyrexGreen = color.new(#2ECD99, 0) var const color skyrexGray = color.new(#F2F2F2, 0) var const color skyrexWhite = color.new(#FFFFFF, 0) //________<variables declarations> var int trend = 0 var float upFractalLevel = na var float upFractalActivationLevel = na var float downFractalLevel = na var float downFractalActivationLevel = na var float saucerActivationLevel = na bool highCrossesUpfractalLevel = ta.crossover(high, upFractalActivationLevel) bool lowCrossesDownFractalLevel = ta.crossunder(low, downFractalActivationLevel) var int signalsQtyInRow = 0 //_______ <inputs> // Trading bot settings sourceUuid = input.string(title = "sourceUuid:", defval = "yourBotSourceUuid", group = "🤖Trading Bot Settings🤖") secretToken = input.string(title = "secretToken:", defval = "yourBotSecretToken", group = "🤖Trading Bot Settings🤖") // Trading period settings lookBackPeriodStart = input(title = "Trade Start Date/Time", defval = timestamp('2023-01-01T00:00:00'), group = "🕐Trading Period Settings🕐") lookBackPeriodStop = input(title = "Trade Stop Date/Time", defval = timestamp('2025-01-01T00:00:00'), group = "🕐Trading Period Settings🕐") // Strategy settings EMaLength = input.int(100, minval = 10, step = 10, title = "EMA Length", group = "📈Strategy settings📈") //_______ <function_declarations> //@function Used to calculate Simple moving average for Alligator //@param src Sourse for smma Calculations //@param length Number of bars to calculate smma //@returns The calculated smma value smma(src, length) => var float smma = na sma_value = ta.sma(src, length) smma := na(smma) ? sma_value : (smma * (length - 1) + src) / length smma //_______ <calculations> //Upfractal calculation upFractalPrice = ta.pivothigh(2, 2) upFractal = not na(upFractalPrice) //Downfractal calculation downFractalPrice = ta.pivotlow(2, 2) downFractal = not na(downFractalPrice) //Calculating Alligator's teeth teeth = smma(hl2, 8)[5] //Calculating upfractal and downfractal levels if upFractal upFractalLevel := upFractalPrice else upFractalLevel := upFractalLevel[1] if downFractal downFractalLevel := downFractalPrice else downFractalLevel := downFractalLevel[1] //Calculating upfractal activation level, downfractal activation level to approximate the trend and this current trend if upFractalLevel > teeth upFractalActivationLevel := upFractalLevel if highCrossesUpfractalLevel trend := 1 upFractalActivationLevel := na downFractalActivationLevel := downFractalLevel if downFractalLevel < teeth downFractalActivationLevel := downFractalLevel if lowCrossesDownFractalLevel trend := -1 downFractalActivationLevel := na upFractalActivationLevel := upFractalLevel if trend == 1 upFractalActivationLevel := na if trend == -1 downFractalActivationLevel := na //Calculating filter EMA filterEMA = ta.ema(close, EMaLength) //Сalculating AO saucer signal ao = ta.sma(hl2,5) - ta.sma(hl2,34) diff = ao - ao[1] saucerSignal = ao > ao[1] and ao[1] < ao[2] and ao > 0 and ao[1] > 0 and ao[2] > 0 and trend == 1 and close > filterEMA //Calculating sauser activation level if saucerSignal saucerActivationLevel := high else saucerActivationLevel := saucerActivationLevel[1] if not na(saucerActivationLevel[1]) and high < saucerActivationLevel[1] and diff > 0 saucerActivationLevel := high saucerSignal := true if (high > saucerActivationLevel[1] and not na(saucerActivationLevel)) or diff < 0 saucerActivationLevel := na //Calculating number of valid saucer signal in current trading cycle if saucerSignal and not saucerSignal[1] signalsQtyInRow := signalsQtyInRow + 1 if not na(saucerActivationLevel[1]) and diff < 0 and na(saucerActivationLevel) and not (strategy.opentrades[1] <= strategy.opentrades - 1) signalsQtyInRow := signalsQtyInRow - 1 if trend == -1 and trend[1] == 1 signalsQtyInRow := 0 //_______ <strategy_calls> //Defining trade close condition closeCondition = trend[1] == 1 and trend == -1 //Cancel stop buy order if current Awesome oscillator column lower, than prevoius if diff < 0 strategy.cancel_all() //Strategy entry if (signalsQtyInRow == 1 and not na(saucerActivationLevel)) strategy.entry(id = "entry1", direction = strategy.long, stop = saucerActivationLevel + syminfo.mintick, alert_message = '{\n"base": "' + syminfo.basecurrency + '",\n"quote": "' + syminfo.currency + '",\n"position": "entry1",\n"price": "' + str.tostring(close) + '",\n"sourceUuid": "' + sourceUuid + '",\n"secretToken": "' + secretToken + '",\n"timestamp": "' + str.tostring(timenow) + '"\n}') if (signalsQtyInRow == 2 and not na(saucerActivationLevel)) strategy.entry(id = "entry2", direction = strategy.long, stop = saucerActivationLevel + syminfo.mintick, alert_message = '{\n"base": "' + syminfo.basecurrency + '",\n"quote": "' + syminfo.currency + '",\n"position": "entry2",\n"price": "' + str.tostring(close) + '",\n"sourceUuid": "' + sourceUuid + '",\n"secretToken": "' + secretToken + '",\n"timestamp": "' + str.tostring(timenow) + '"\n}') if (signalsQtyInRow == 3 and not na(saucerActivationLevel)) strategy.entry(id = "entry3", direction = strategy.long, stop = saucerActivationLevel + syminfo.mintick, alert_message = '{\n"base": "' + syminfo.basecurrency + '",\n"quote": "' + syminfo.currency + '",\n"position": "entry3",\n"price": "' + str.tostring(close) + '",\n"sourceUuid": "' + sourceUuid + '",\n"secretToken": "' + secretToken + '",\n"timestamp": "' + str.tostring(timenow) + '"\n}') if (signalsQtyInRow == 4 and not na(saucerActivationLevel)) strategy.entry(id = "entry4", direction = strategy.long, stop = saucerActivationLevel + syminfo.mintick, alert_message = '{\n"base": "' + syminfo.basecurrency + '",\n"quote": "' + syminfo.currency + '",\n"position": "entry4",\n"price": "' + str.tostring(close) + '",\n"sourceUuid": "' + sourceUuid + '",\n"secretToken": "' + secretToken + '",\n"timestamp": "' + str.tostring(timenow) + '"\n}') if (signalsQtyInRow == 5 and not na(saucerActivationLevel)) strategy.entry(id = "entry5", direction = strategy.long, stop = saucerActivationLevel + syminfo.mintick, alert_message = '{\n"base": "' + syminfo.basecurrency + '",\n"quote": "' + syminfo.currency + '",\n"position": "entry5",\n"price": "' + str.tostring(close) + '",\n"sourceUuid": "' + sourceUuid + '",\n"secretToken": "' + secretToken + '",\n"timestamp": "' + str.tostring(timenow) + '"\n}') //Strategy exit if (closeCondition) strategy.close_all(alert_message = '{\n"base": "' + syminfo.basecurrency + '",\n"quote": "' + syminfo.currency + '",\n"position": "close",\n"price": "' + str.tostring(close) + '",\n"sourceUuid": "' + sourceUuid + '",\n"secretToken": "' + secretToken + '",\n"timestamp": "' + str.tostring(timenow) + '"\n}') //_______ <visuals> //Plotting shapes for adding to current long trades gradPercent = if strategy.opentrades == 2 90 else if strategy.opentrades == 3 80 else if strategy.opentrades == 4 70 else if strategy.opentrades == 5 60 pricePlot = plot(close, title="Price", color=color.new(color.blue, 100)) teethPlot = plot(strategy.opentrades > 1 ? teeth : na, title="Teeth", color= skyrexGreen, style=plot.style_linebr, linewidth = 2) fill(pricePlot, teethPlot, color = color.new(skyrexGreen, gradPercent)) if strategy.opentrades != 1 and strategy.opentrades[1] == strategy.opentrades - 1 label.new(bar_index, teeth, style = label.style_label_up, color = color.lime, size = size.tiny, text="Buy More", textcolor = color.black, text_formatting = text.format_bold) //_______ <alerts>