মোমেন্টাম ট্র্যাকিং কৌশলটি মূল্যের প্রবণতা দিক নির্ধারণের জন্য মূল সূচক হিসাবে হাল্ল মুভিং অ্যাভারেজ ব্যবহার করে। একই সাথে, কৌশলটি মূল্যের প্রবণতা যাচাই করতে এবং মিথ্যা সংকেতগুলি ফিল্টার করতে বেসলাইন, নিশ্চিতকরণ সূচক ইত্যাদির মতো অন্যান্য সূচক অন্তর্ভুক্ত করে। বাজারে প্রবেশের পরে, কৌশলটি লাভের জন্য প্রবণতা ট্র্যাক করার জন্য গতিশীল স্টপ লস গণনা করতে গড় সত্য পরিসীমা ব্যবহার করে।
মম্পটাম ট্র্যাকিং কৌশলটির মূলটি হল হাল্ল মুভিং এভারেজ। হাল্ল মুভিং এভারেজ দামের পরিবর্তনের প্রতি আরও সংবেদনশীল এবং কার্যকরভাবে প্রবণতার দিক নির্ধারণ করতে পারে। যখন দাম হাল্ল লাইনের মধ্য দিয়ে উপরে যায়, তখন একটি আপগ্রেড প্রবণতা নিশ্চিত হয়, দীর্ঘ যায়; যখন দাম হাল্ল লাইনের মধ্য দিয়ে নীচে যায়, তখন একটি ডাউনগ্রেড প্রবণতা নিশ্চিত হয়, শর্ট যায়।
এছাড়াও, কৌশলটি স্বল্প ও দীর্ঘমেয়াদী প্রবণতা বিচার করার জন্য একটি বেসলাইন সূচকও প্রবর্তন করে; একটি নিশ্চিতকরণ সূচক মিথ্যা ব্রেকআউটগুলি ফিল্টার করতে ব্যবহৃত হয়। একটি ট্রেডিং সংকেত কেবল তখনই সক্রিয় হবে যখন বেসলাইন এবং নিশ্চিতকরণ সূচক উভয়ই প্রবণতার দিক যাচাই করেছে।
বাজারে প্রবেশের পর, কৌশলটি স্টপ লস পজিশন সেট করার জন্য গড় সত্য পরিসীমা এবং হাল ইএমএ ব্যবহার করে। প্রবণতা অব্যাহত থাকায়, স্টপ লস লাইন প্রবণতা মুনাফা লক করতে উপরে / নীচে চলতে থাকবে।
মোমেন্টাম ট্র্যাকিং কৌশলটি প্রবণতা বিচার এবং ঝুঁকি নিয়ন্ত্রণের সুবিধাগুলি একত্রিত করে, যা ট্রেন্ডিং বাজারে ভাল রিটার্ন অর্জন করতে পারে। স্থির স্টপ লস কৌশলগুলির তুলনায়, এটি স্টপ লসগুলি সরিয়ে ট্রেন্ড রানগুলি ট্র্যাক করতে পারে এবং সাধারণ বাজারের ওঠানামা দ্বারা বন্ধ হওয়া এড়াতে পারে।
একাধিক সূচকগুলির সংমিশ্রণটি কৌশলটিকে বাজারের পরিবর্তনের প্রতি আরও সংবেদনশীল করে তোলে, পাশাপাশি কার্যকরভাবে মিথ্যা সংকেতগুলি ফিল্টার করে। উপরন্তু, কৌশলটি ব্যবহারকারীদের নিজস্ব বাজারের বিচারের ভিত্তিতে অনুকূলিতকরণের জন্য একাধিক সামঞ্জস্যযোগ্য পরামিতি সরবরাহ করে।
কৌশলটি মূলত প্রবণতা সূচকগুলির উপর নির্ভর করে এবং সংহতকরণের সময় ভুল সংকেত উত্পাদন এবং ক্ষতি বন্ধ করার প্রবণতা রয়েছে। এছাড়াও, একাধিক সূচকগুলির সংমিশ্রণ সূচকগুলির মধ্যে দ্বন্দ্বের দিকেও পরিচালিত করতে পারে। অনুপযুক্ত পরামিতি সেটিংগুলি দুর্বল কৌশল পারফরম্যান্সের দিকেও পরিচালিত করতে পারে।
সূচকগুলি যখন বিচ্যুতি দেখায় তখন ট্রেডিং বন্ধ করার জন্য কৌশলটিতে একটি অতিরিক্ত বিচার মডিউল যুক্ত করার বিষয়টি বিবেচনা করুন; বা একাধিক সূচকের বিচার ফলাফলগুলি সংশ্লেষণ করার জন্য একটি ভোটদান প্রক্রিয়া গ্রহণ করুন। প্যারামিটার সেটিংসের জন্য, সর্বোত্তম প্যারামিটারগুলি ব্যাকটেস্ট অপ্টিমাইজেশন পদ্ধতির মাধ্যমে পাওয়া যেতে পারে।
মম্পটাম ট্র্যাকিং কৌশল নিম্নলিখিত দিকগুলিতে অপ্টিমাইজ করা যেতে পারেঃ
সংক্ষেপে, মোমেন্টাম ট্র্যাকিং কৌশলটি একটি দুর্দান্ত ট্রেন্ড ট্র্যাকিং কৌশল। এটি সফলভাবে প্রবণতা বিচার এবং গতিশীল স্টপ লসকে একত্রিত করে, যা প্রবণতা থেকে কার্যকরভাবে ট্র্যাক এবং লাভ করতে পারে। আরও অপ্টিমাইজেশনের সাথে এটি আরও ভাল কৌশল কর্মক্ষমতা অর্জন করবে বলে আশা করা হচ্ছে। কৌশলটি পরিমাণগত ট্রেডিং কৌশল নির্মাণের জন্য একটি ভাল রেফারেন্স সরবরাহ করে।
/*backtest start: 2023-11-28 00:00:00 end: 2023-12-28 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // © Milleman //@version=4 strategy("MilleMachine", overlay=true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, initial_capital=10000, commission_type=strategy.commission.percent, commission_value=0.06) // Additional settings Mode = input(title="Mode", defval="LongShort", options=["LongShort", "OnlyLong", "OnlyShort","Indicator Mode"]) UseTP = false //input(false, title="Use Take Profit?") QuickSwitch = true //input(true, title="Quickswitch") UseTC = true //input(true, title="Use Trendchange?") // Risk management settings //Spacer2 = input(false, title="======= Risk management settings =======") Risk = input(1.0, title="% Risk",minval=0)/100 RRR = 2 //input(2,title="Risk Reward Ratio",step=0.1,minval=0,maxval=20) SL_Mode = false // input(true, title="ON = Fixed SL / OFF = Dynamic SL (ATR)") SL_Fix = 3 //input(3,title="StopLoss %",step=0.25, minval=0)/100 ATR = atr(14) //input(14,title="Periode ATR")) Mul = input(2,title="ATR Multiplier",step=0.1) xATR = ATR * Mul SL = SL_Mode ? SL_Fix : (1 - close/(close+xATR)) // INDICATORS ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Ind(type, src, len) => float result = 0 if type=="McGinley" result := na(result[1]) ? ema(src, len) : result[1] + (src - result[1]) / (len * pow(src/result[1], 4)) if type=="HMA" result := wma(2*wma(src, len/2)-wma(src, len), round(sqrt(len))) if type=="EHMA" result := ema(2*ema(src, len/2)-ema(src, len), round(sqrt(len))) if type=="THMA" lend = len/2 result := wma(wma(src, lend/3)*3-wma(src, lend/2)-wma(src,lend), lend) if type=="SMA" // Simple result := sma(src, len) if type=="EMA" // Exponential result := ema(src, len) if type=="DEMA" // Double Exponential e = ema(src, len) result := 2 * e - ema(e, len) if type=="TEMA" // Triple Exponential e = ema(src, len) result := 3 * (e - ema(e, len)) + ema(ema(e, len), len) if type=="WMA" // Weighted result := wma(src, len) if type=="VWMA" // Volume Weighted result := vwma(src, len) if type=="SMMA" // Smoothed w = wma(src, len) result := (w[1] * (len - 1) + src) / len if type == "RMA" result := rma(src, len) if type=="LSMA" // Least Squares result := linreg(src, len, 0) if type=="ALMA" // Arnaud Legoux result := alma(src, len, 0.85, 6) if type=="Kijun" //Kijun-sen kijun = avg(lowest(len), highest(len)) result :=kijun if type=="WWSA" // Welles Wilder Smoothed Moving Average result := nz(result[1]) + (close -nz(result[1]))/len result // Baseline : Switch from Long to Short and vice versa BL_Act = input(true, title="====== Activate Baseline - Switch L/S ======") BL_type = input(title="Baseline Type", defval="McGinley", options=["McGinley","HMA","EHMA","THMA","SMA","EMA","DEMA","TEMA","WMA","VWMA","SMMA","RMA","LSMA","ALMA","Kijun","WWSA"]) BL_src = input(close, title="BL source") BL_len = input(50, title="BL length", minval=1) BL = Ind(BL_type,BL_src, BL_len) // Confirmation indicator C1_Act = input(false, title="===== Activate Confirmation indicator =====") C1_type = input(title="C1 Entry indicator", defval="SMA", options=["McGinley","HMA","EHMA","THMA","SMA","EMA","DEMA","TEMA","WMA","VWMA","SMMA","RMA","LSMA","ALMA","Kijun","WWSA"]) C1_src = input(close, title="Source") C1_len = input(5,title="Length", minval=1) C1 = Ind(C1_type,C1_src,C1_len) // Entry indicator : Hull Moving Average Spacer5 = input(true, title="====== ENTRY indicator =======") EI_type = input(title="EI Entry indicator", defval="HMA", options=["McGinley","HMA","EHMA","THMA","SMA","EMA","DEMA","TEMA","WMA","VWMA","SMMA","RMA","LSMA","ALMA","Kijun","WWSA"]) EI_src = input(close, title="Source") EI_Len = input(46,title="Length", minval=1) EI = Ind(EI_type,EI_src,EI_Len) // Trail stop settings TrailActivation = input(true, title="===== Activate Trailing Stop =====") TS_type = input(title="TS Traling Stop Type", defval="EMA", options=["McGinley","HMA","EHMA","THMA","SMA","EMA","DEMA","TEMA","WMA","VWMA","SMMA","RMA","LSMA","ALMA","Kijun","WWSA"]) TrailSLScaling = 1 //input(100, title="SL Scaling", minval=0, step=5)/100 TrailingSourceLong = Ind(TS_type,low,input(5,"Smoothing Trail Long EMA", minval=1)) TrailingSourceShort = Ind(TS_type,high,input(2,"Smoothing Trail Short EMA", minval=1)) //VARIABLES MANAGEMENT TriggerPrice = 0.0, TriggerPrice := TriggerPrice[1] TriggerSL = 0.0, TriggerSL := TriggerSL[1] SLPrice = 0.0, SLPrice := SLPrice[1], TPPrice = 0.0, TPPrice := TPPrice[1] isLong = false, isLong := isLong[1], isShort = false, isShort := isShort[1] //LOGIC GoLong = crossover(EI,EI[1]) and (strategy.position_size == 0.0 and QuickSwitch) and (not BL_Act or BL/BL[1] > 1) and (not C1_Act or C1>C1[1]) and (Mode == "LongShort" or Mode == "OnlyLong") GoShort = crossunder(EI,EI[1]) and (strategy.position_size == 0.0 and QuickSwitch) and (not BL_Act or BL/BL[1] < 1) and (not C1_Act or C1<C1[1]) and (Mode == "LongShort" or Mode == "OnlyShort") ExitLong = isLong and crossunder(EI,EI[1]) and UseTC ExitShort = isShort and crossover(EI,EI[1]) and UseTC //FRAMEWORK //Reset Long-Short memory if isLong and strategy.position_size == 0.0 isLong := false if isShort and strategy.position_size == 0.0 isShort := false //Long if GoLong isLong := true, TriggerPrice := close, TriggerSL := SL TPPrice := UseTP? TriggerPrice * (1 + (TriggerSL * RRR)) : na SLPrice := TriggerPrice * (1-TriggerSL) Entry_Contracts = strategy.equity * Risk / ((TriggerPrice-SLPrice)/TriggerPrice) / TriggerPrice strategy.entry("Long", strategy.long, comment=tostring(round((TriggerSL/TriggerPrice)*1000)), qty=Entry_Contracts) strategy.exit("TPSL","Long", limit=TPPrice, stop=SLPrice) if isLong NewValSL = TrailingSourceLong * (1 - (SL*TrailSLScaling)) if TrailActivation and NewValSL > SLPrice SLPrice := NewValSL strategy.exit("TPSL","Long", limit=TPPrice, stop=SLPrice) if ExitLong strategy.close_all(comment="TrendChange") isLong := false //Short if GoShort isShort := true, TriggerPrice := close, TriggerSL := SL TPPrice := UseTP? TriggerPrice * (1 - (TriggerSL * RRR)) : na SLPrice := TriggerPrice * (1 + TriggerSL) Entry_Contracts = strategy.equity * Risk / ((SLPrice-TriggerPrice)/TriggerPrice) / TriggerPrice strategy.entry("Short", strategy.short, comment=tostring(round((TriggerSL/TriggerPrice)*1000)), qty=Entry_Contracts) strategy.exit("TPSL","Short", limit=TPPrice, stop=SLPrice) if isShort NewValSL = TrailingSourceShort * (1 + (SL*TrailSLScaling)) if TrailActivation and NewValSL < SLPrice SLPrice := NewValSL strategy.exit("TPSL","Short", limit=TPPrice, stop=SLPrice) if ExitShort strategy.close_all(comment="TrendChange") isShort := false //VISUALISATION plot(BL_Act?BL:na, color=color.blue,title="Baseline") plot(C1_Act?C1:na, color=color.yellow,title="confirmation Indicator") EIColor = EI>EI[1] ? color.green : color.red Fill_EI = plot(EI, color=EIColor, linewidth=1, transp=40, title="Entry Indicator EI") Fill_EID = plot(EI[1], color=EIColor, linewidth=1, transp=40, title="Entry Indicator EID") fill(Fill_EI,Fill_EID, title="EI_Fill", color=EIColor,transp=50) plot(strategy.position_size != 0.0 and (isLong or isShort) ? TriggerPrice : na, title="TriggerPrice", color=color.yellow, style=plot.style_linebr) plot(strategy.position_size != 0.0 and (isLong or isShort) ? TPPrice : na, title="TakeProfit", color=color.green, style=plot.style_linebr) plot(strategy.position_size != 0.0 and (isLong or isShort) ? SLPrice : na, title="StopLoss", color=color.red, style=plot.style_linebr) bgcolor(isLong[1] and cross(low,SLPrice) and low[1] > SLPrice and TriggerPrice>SLPrice ? color.yellow : na, transp=75, title="SL Long") bgcolor(isShort[1] and cross(high,SLPrice) and high[1] < SLPrice and TriggerPrice<SLPrice ? color.yellow : na, transp=75, title="SL Short")