ট্রিপল ডায়নামিক মুভিং এভারেজ ট্রেন্ড ট্র্যাকিং কৌশলটি একাধিক সময় ফ্রেম ডায়নামিক মসৃণ মুভিং এভারেজ ব্যবহার করে বাজারের প্রবণতা সনাক্ত করতে এবং বিভিন্ন সময় ফ্রেম জুড়ে প্রবণতা ধারাবাহিকতা ফিল্টারিং অর্জন করতে, যার ফলে ট্রেডিং সংকেতগুলির নির্ভরযোগ্যতা উন্নত হয়।
কৌশলটি বিভিন্ন প্যারামিটার সেটিং সহ 3 টি গতিশীল মসৃণ চলমান গড় ব্যবহার করে। প্রথম চলমান গড় বর্তমান সময়ের দামের প্রবণতা দিক গণনা করে, দ্বিতীয় চলমান গড় উচ্চতর সময় ফ্রেমের দামের প্রবণতা দিক গণনা করে এবং তৃতীয় চলমান গড় আরও উচ্চতর সময় ফ্রেমের দামের প্রবণতা দিক গণনা করে। প্রথম চলমান গড় দ্বিতীয় চলমান গড়ের উপরে অতিক্রম করলে একটি ক্রয় সংকেত উত্পন্ন হয় এবং তৃতীয় চলমান গড়ও একটি ঊর্ধ্বমুখী প্রবণতায় থাকে, যা ক্রয় সংকেতের নির্ভরযোগ্যতা যাচাই করে। পুরো কৌশলটি আন্তঃ-সময় ফ্রেম প্রবণতা ফিল্টারিংয়ের মাধ্যমে একাধিক সময় ফ্রেমে প্রবণতার ধারাবাহীতা অর্জন করে, ট্রেডিং সংকেতগুলির নির্ভরযোগ্যতা নিশ্চিত করে।
গতিশীল মসৃণকরণ বৈশিষ্ট্যটি স্বয়ংক্রিয়ভাবে বিভিন্ন সময় ফ্রেমের মধ্যে উপযুক্ত মসৃণকরণ ফ্যাক্টরগুলি গণনা এবং প্রয়োগ করতে ব্যবহৃত হয়, যাতে উচ্চতর সময় ফ্রেমের চলমান গড়গুলি নিম্নতর সময় ফ্রেমের চার্টগুলিতে ঝাঁকুনিযুক্ত জিগজ্যাগ লাইনের পরিবর্তে মসৃণ প্রবণতা লাইন উপস্থাপন করে। এই গতিশীল মসৃণকরণ কৌশলটিকে কার্যকর প্রবণতা ট্র্যাকিংয়ের জন্য নিম্নতর সময় ফ্রেমগুলিতে বাণিজ্য সম্পাদন করার সময় উচ্চতর সময় ফ্রেমগুলিতে সামগ্রিক প্রবণতার দিক নির্ধারণ করতে দেয়।
এই কৌশলটির সবচেয়ে বড় সুবিধা হল এর ইন্টার-টাইমফ্রেম ট্রেন্ড ফিল্টারিং প্রক্রিয়া। বিভিন্ন সময়কাল জুড়ে মূল্যের গড় প্রবণতা দিক গণনা করে এবং তাদের মধ্যে ধারাবাহিকতার প্রয়োজন, এটি কার্যকরভাবে ট্রেডিং সংকেতগুলিতে হস্তক্ষেপ করে এমন স্বল্পমেয়াদী দামের হ্রাসকে ফিল্টার করতে পারে, নিশ্চিত করে যে প্রতিটি বাণিজ্য প্রধান প্রবণতা বরাবর স্থাপন করা হয়, যার ফলে লাভজনকতা উল্লেখযোগ্যভাবে উন্নত হয়।
আরেকটি সুবিধা হল গতিশীল মসৃণকরণের প্রয়োগ। এটি কৌশলটিকে একই সাথে উচ্চতর সময় ফ্রেমগুলিতে সামগ্রিক প্রবণতা এবং নিম্নতর সময় ফ্রেমগুলিতে নির্দিষ্ট ট্রেডিং পয়েন্টগুলি সনাক্ত করতে দেয়। কৌশলটি নিম্নতর সময় ফ্রেমে নির্দিষ্ট ট্রেডগুলি সম্পাদন করার সময় উচ্চতর সময় ফ্রেমগুলিতে প্রধান প্রবণতার দিক নির্ধারণ করতে পারে। একাধিক সময় ফ্রেমের এই প্রয়োগটি ট্রেডিং ঝুঁকি নিয়ন্ত্রণের সময় বাজার সুযোগগুলি মূলধন করতে সহায়তা করে।
এই কৌশলটির প্রধান ঝুঁকি হ'ল তুলনামূলকভাবে কয়েকটি ট্রেডিং সংকেত। কঠোর প্রবণতা ফিল্টারিং শর্তগুলি ট্রেডিং সুযোগের সংখ্যা হ্রাস করে, যা উচ্চ-ফ্রিকোয়েন্সি ট্রেডিং অনুসরণকারী কিছু বিনিয়োগকারীদের পক্ষে উপযুক্ত নাও হতে পারে। আরও বেশি ট্রেডিং সুযোগ পেতে ফিল্টারিং শর্তগুলির কঠোরতা হ্রাস করা যেতে পারে।
উপরন্তু, প্যারামিটার সেটিংসের জন্য সাবধানে পরীক্ষা এবং অপ্টিমাইজেশান প্রয়োজন, বিশেষ করে চলমান গড় সময়ের জন্য, যা বিভিন্ন বাজারে বিভিন্ন সর্বোত্তম মানের প্রয়োজন। সর্বোত্তম প্যারামিটার সমন্বয় ব্যাকটেস্টিংয়ের মাধ্যমে পাওয়া যেতে পারে।
ভবিষ্যতের অপ্টিমাইজেশান দিকগুলি সিগন্যাল ফিল্টারিংয়ের জন্য আরও প্রযুক্তিগত সূচক অন্তর্ভুক্ত করা বা স্বয়ংক্রিয় পরামিতি অপ্টিমাইজেশনের জন্য মেশিন লার্নিং অ্যালগরিদম বাড়ানো বিবেচনা করতে পারে। এগুলি কৌশল কর্মক্ষমতা উন্নত করার জন্য সমস্ত কার্যকর পদ্ধতি।
উপসংহারে, এটি একটি খুব ব্যবহারিক প্রবণতা ট্র্যাকিং কৌশল। ইন্টার-টাইমফ্রেম প্রবণতা ফিল্টারিং প্রতিটি ট্রেডিং সিদ্ধান্তকে সমর্থন করার জন্য কার্যকরভাবে ট্রেডিং ঝুঁকি হ্রাস করার জন্য একটি ভাল দিকনির্দেশক গাইডেন্স সরবরাহ করে। গতিশীল মসৃণকরণের সংযোজন এই মাল্টি-টাইমফ্রেম পদ্ধতির দক্ষ বাস্তবায়নও সক্ষম করে। পুরো কৌশল কাঠামোটি যুক্তিসঙ্গত এবং দক্ষ, শেখার এবং প্রয়োগের যোগ্য।
/*backtest start: 2024-01-23 00:00:00 end: 2024-02-22 00:00:00 period: 1h basePeriod: 15m 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/ // © Harrocop //@version=5 strategy(title = "Triple MA HTF strategy - Dynamic Smoothing", shorttitle = "Triple MA strategy", overlay=true, pyramiding=5, initial_capital = 10000, calc_on_order_fills=false, slippage = 0, commission_type=strategy.commission.percent, commission_value=0.05) ////////////////////////////////////////////////////// ////////// Risk Management //////////// ////////////////////////////////////////////////////// RISKM = "-------------------- Risk Management --------------------" InitialBalance = input.float(defval = 10000, title = "Initial Balance", minval = 1, maxval = 1000000, step = 1000, tooltip = "starting capital", group = RISKM) LeverageEquity = input.bool(defval = true, title = "qty based on equity %", tooltip = "true turns on MarginFactor based on equity, false gives fixed qty for positionsize", group = RISKM) MarginFactor = input.float(0, minval = - 0.9, maxval = 100, step = 0.1, tooltip = "Margin Factor, meaning that 0.5 will add 50% extra capital to determine ordersize quantity, 0.0 means 100% of equity is used to decide quantity of instrument", inline = "qty", group = RISKM) QtyNr = input.float(defval = 3.5, title = "Quantity Contracts", minval = 0, maxval = 1000000, step = 0.01, tooltip = "Margin Factor, meaning that 0.5 will add 50% extra capital to determine ordersize quantity, 0.0 means 100% of equity is used to decide quantity of instrument", inline = "qty", group = RISKM) EquityCurrent = InitialBalance + strategy.netprofit[1] QtyEquity = EquityCurrent * (1 + MarginFactor) / close[1] QtyTrade = LeverageEquity ? QtyEquity : QtyNr ///////////////////////////////////////////////////// ////////// MA Filter Trend //////////// ///////////////////////////////////////////////////// TREND = "-------------------- Moving Average 1 --------------------" Plot_MA = input.bool(true, title = "Plot MA trend?", inline = "Trend1", group = TREND) TimeFrame_Trend = input.timeframe(title='Higher Time Frame', defval='15', inline = "Trend1", group = TREND) length = input.int(21, title="Length MA", minval=1, tooltip = "Number of bars used to measure trend on higher timeframe chart", inline = "Trend2", group = TREND) MA_Type = input.string(defval="McGinley" , options=["EMA","DEMA","TEMA","SMA","WMA", "HMA", "McGinley"], title="MA type:", inline = "Trend2", group = TREND) ma(type, src, length) => float result = 0 if type == 'TMA' // Triangular Moving Average result := ta.sma(ta.sma(src, math.ceil(length / 2)), math.floor(length / 2) + 1) result if type == 'LSMA' // Least Squares Moving Average result := ta.linreg(src, length, 0) result if type == 'SMA' // Simple Moving Average result := ta.sma(src, length) result if type == 'EMA' // Exponential Moving Average result := ta.ema(src, length) result if type == 'DEMA' // Double Exponential Moving Average e = ta.ema(src, length) result := 2 * e - ta.ema(e, length) result if type == 'TEMA' // Triple Exponentiale e = ta.ema(src, length) result := 3 * (e - ta.ema(e, length)) + ta.ema(ta.ema(e, length), length) result if type == 'WMA' // Weighted Moving Average result := ta.wma(src, length) result if type == 'HMA' // Hull Moving Average result := ta.wma(2 * ta.wma(src, length / 2) - ta.wma(src, length), math.round(math.sqrt(length))) result if type == 'McGinley' // McGinley Dynamic Moving Average mg = 0.0 mg := na(mg[1]) ? ta.ema(src, length) : mg[1] + (src - mg[1]) / (length * math.pow(src / mg[1], 4)) result := mg result result // Moving Average MAtrend = ma(MA_Type, close, length) MA_Value_HTF = request.security(syminfo.tickerid, TimeFrame_Trend, MAtrend) // Get minutes for current and higher timeframes // Function to convert a timeframe string to its equivalent in minutes timeframeToMinutes(tf) => multiplier = 1 if (str.endswith(tf, "D")) multiplier := 1440 else if (str.endswith(tf, "W")) multiplier := 10080 else if (str.endswith(tf, "M")) multiplier := 43200 else if (str.endswith(tf, "H")) multiplier := int(str.tonumber(str.replace(tf, "H", ""))) else multiplier := int(str.tonumber(str.replace(tf, "m", ""))) multiplier // Get minutes for current and higher timeframes currentTFMinutes = timeframeToMinutes(timeframe.period) higherTFMinutes = timeframeToMinutes(TimeFrame_Trend) // Calculate the smoothing factor dynamicSmoothing = math.round(higherTFMinutes / currentTFMinutes) MA_Value_Smooth = ta.sma(MA_Value_HTF, dynamicSmoothing) // Trend HTF UP = MA_Value_Smooth > MA_Value_Smooth[1] // Use "UP" Function to use as filter in combination with other indicators DOWN = MA_Value_Smooth < MA_Value_Smooth[1] // Use "Down" Function to use as filter in combination with other indicators ///////////////////////////////////////////////////// ////////// Second MA Filter Trend /////////// ///////////////////////////////////////////////////// TREND2 = "-------------------- Moving Average 2 --------------------" Plot_MA2 = input.bool(true, title = "Plot Second MA trend?", inline = "Trend3", group = TREND2) TimeFrame_Trend2 = input.timeframe(title='HTF', defval='60', inline = "Trend3", group = TREND2) length2 = input.int(21, title="Length Second MA", minval=1, tooltip = "Number of bars used to measure trend on higher timeframe chart", inline = "Trend4", group = TREND2) MA_Type2 = input.string(defval="McGinley" , options=["EMA","DEMA","TEMA","SMA","WMA", "HMA", "McGinley"], title="MA type:", inline = "Trend4", group = TREND2) // Second Moving Average MAtrend2 = ma(MA_Type2, close, length2) MA_Value_HTF2 = request.security(syminfo.tickerid, TimeFrame_Trend2, MAtrend2) // Get minutes for current and higher timeframes higherTFMinutes2 = timeframeToMinutes(TimeFrame_Trend2) // Calculate the smoothing factor for the second moving average dynamicSmoothing2 = math.round(higherTFMinutes2 / currentTFMinutes) MA_Value_Smooth2 = ta.sma(MA_Value_HTF2, dynamicSmoothing2) // Trend HTF for the second moving average UP2 = MA_Value_Smooth2 > MA_Value_Smooth2[1] DOWN2 = MA_Value_Smooth2 < MA_Value_Smooth2[1] ///////////////////////////////////////////////////// ////////// Third MA Filter Trend /////////// ///////////////////////////////////////////////////// TREND3 = "-------------------- Moving Average 3 --------------------" Plot_MA3 = input.bool(true, title = "Plot third MA trend?", inline = "Trend5", group = TREND3) TimeFrame_Trend3 = input.timeframe(title='HTF', defval='240', inline = "Trend5", group = TREND3) length3 = input.int(50, title="Length third MA", minval=1, tooltip = "Number of bars used to measure trend on higher timeframe chart", inline = "Trend6", group = TREND3) MA_Type3 = input.string(defval="McGinley" , options=["EMA","DEMA","TEMA","SMA","WMA", "HMA", "McGinley"], title="MA type:", inline = "Trend6", group = TREND3) // Second Moving Average MAtrend3 = ma(MA_Type3, close, length3) MA_Value_HTF3 = request.security(syminfo.tickerid, TimeFrame_Trend3, MAtrend3) // Get minutes for current and higher timeframes higherTFMinutes3 = timeframeToMinutes(TimeFrame_Trend3) // Calculate the smoothing factor for the second moving average dynamicSmoothing3 = math.round(higherTFMinutes3 / currentTFMinutes) MA_Value_Smooth3 = ta.sma(MA_Value_HTF3, dynamicSmoothing3) // Trend HTF for the second moving average UP3 = MA_Value_Smooth3 > MA_Value_Smooth3[1] DOWN3 = MA_Value_Smooth3 < MA_Value_Smooth3[1] ///////////////////////////////////////////////////// ////////// Entry Settings //////////// ///////////////////////////////////////////////////// BuySignal = ta.crossover(MA_Value_HTF, MA_Value_HTF2) and UP3 == true SellSignal = ta.crossunder(MA_Value_HTF, MA_Value_HTF2) and DOWN3 == true ExitBuy = ta.crossunder(MA_Value_HTF, MA_Value_HTF2) ExitSell = ta.crossover(MA_Value_HTF, MA_Value_HTF2) ///////////////////////////////////////////////// /////////// Strategy //////////////// /////////// Entry & Exit //////////////// /////////// logic //////////////// ///////////////////////////////////////////////// // Long if BuySignal strategy.entry("Long", strategy.long, qty = QtyTrade) if (strategy.position_size > 0 and ExitBuy == true) strategy.close(id = "Long", comment = "Close Long") // Short if SellSignal strategy.entry("Short", strategy.short, qty = QtyTrade) if (strategy.position_size < 0 and ExitSell == true) strategy.close(id = "Short", comment = "Close Short") ///////////////////////////////////////////////////// ////////// Visuals Chart //////////// ///////////////////////////////////////////////////// // Plot Moving Average HTF p1 = plot(Plot_MA ? MA_Value_Smooth : na, "HTF Trend", color = UP ? color.rgb(238, 255, 0) : color.rgb(175, 173, 38), linewidth = 1, style = plot.style_line) p2 = plot(Plot_MA2 ? MA_Value_Smooth2 : na, "HTF Trend", color = UP2 ? color.rgb(0, 132, 255) : color.rgb(0, 17, 255), linewidth = 1, style = plot.style_line) plot(Plot_MA3 ? MA_Value_Smooth3 : na, "HTF Trend", color = UP3 ? color.rgb(0, 255, 8) : color.rgb(255, 0, 0), linewidth = 2, style = plot.style_line) fill(p1, p2, color = color.rgb(255, 208, 0, 90), title="Fill")