Cette stratégie est un système de négociation à plusieurs niveaux basé sur l'élan et la tendance suivante. Elle combine l'alligator de Williams, les fractals de Williams, l'oscillateur impressionnant (AO) et l'indice moyen mobile exponentiel (EMA) pour identifier les opportunités longues à forte probabilité.
La stratégie utilise plusieurs mécanismes de filtrage pour assurer la précision de la direction du trading. Premièrement, elle utilise l'EMA pour le jugement de la tendance à long terme, en recherchant des opportunités à long terme uniquement lorsque le prix est au-dessus de l'EMA. Deuxièmement, elle juge les tendances à court terme grâce à la combinaison de l'Alligator de Williams et des fractals, confirmant une tendance haussière lorsqu'une rupture fractale ascendante se produit au-dessus de la ligne des dents de l'Alligator. Enfin, après la confirmation de la tendance, la stratégie recherche les signaux longs de l'indicateur AO pour un calendrier d'entrée spécifique. Le système utilise seulement 10% du capital par transaction et peut ouvrir jusqu'à 5 positions longues à mesure que la tendance se renforce.
Pour réduire ces risques, il est recommandé:
Il s'agit d'une stratégie de suivi des tendances bien conçue qui permet d'obtenir de bons rendements tout en maintenant la sécurité grâce à la combinaison de plusieurs indicateurs techniques.
/*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>