এই কৌশলটি গতি এবং প্রবণতা অনুসরণের উপর ভিত্তি করে একটি বহু-স্তরযুক্ত ট্রেডিং সিস্টেম। এটি উচ্চ-সম্ভাব্যতা দীর্ঘ সুযোগগুলি সনাক্ত করতে উইলিয়ামস অ্যালিগেটর, উইলিয়ামস ফ্র্যাক্টালস, আশ্চর্যজনক দোলক (এও) এবং এক্সপোনেনশিয়াল মুভিং এভারেজ (ইএমএ) একত্রিত করে। কৌশলটি একটি স্তরযুক্ত মূলধন মোতায়েন প্রক্রিয়া ব্যবহার করে, ধীরে ধীরে ট্রেন্ডগুলি শক্তিশালী হওয়ার সাথে সাথে অবস্থানগুলি বাড়িয়ে তোলে, প্রতিটি মূলধনের 10% ব্যবহার করে একযোগে 5 টি পর্যন্ত অবস্থান ধরে রাখার ক্ষমতা সহ।
কৌশলটি ট্রেডিং দিকের নির্ভুলতা নিশ্চিত করার জন্য একাধিক ফিল্টারিং প্রক্রিয়া ব্যবহার করে। প্রথমত, এটি দীর্ঘমেয়াদী প্রবণতা বিচারের জন্য ইএমএ ব্যবহার করে, কেবলমাত্র যখন দাম ইএমএর উপরে থাকে তখনই দীর্ঘমেয়াদী সুযোগগুলি সন্ধান করে। দ্বিতীয়ত, উইলিয়ামস কুমির এবং ফ্র্যাক্টালগুলির সংমিশ্রণের মাধ্যমে এটি স্বল্পমেয়াদী প্রবণতা বিচার করে, যখন কুমিরের দাঁতের রেখার উপরে একটি আপফ্র্যাক্টাল ব্রেকআউট ঘটে তখন একটি আপট্রেন্ড নিশ্চিত করে। অবশেষে, প্রবণতা নিশ্চিত হওয়ার পরে, কৌশলটি নির্দিষ্ট প্রবেশের সময়সূচির জন্য এও সূচক
এই ঝুঁকি হ্রাস করার জন্য, এটি সুপারিশ করা হয়ঃ
এটি একটি সু-ডিজাইন করা ট্রেন্ড-ফলোিং কৌশল যা একাধিক প্রযুক্তিগত সূচকগুলির সংমিশ্রণের মাধ্যমে সুরক্ষা বজায় রেখে ভাল রিটার্ন অর্জন করে। কৌশলটির উদ্ভাবনটি এর বহু-স্তরীয় প্রবণতা নিশ্চিতকরণ প্রক্রিয়া এবং প্রগতিশীল মূলধন পরিচালনার পদ্ধতিতে রয়েছে। অপ্টিমাইজেশনের ক্ষেত্র থাকলেও এটি সামগ্রিকভাবে একটি ট্রেডিং সিস্টেম যা চেষ্টা করার মতো।
/*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>