এই কৌশলটি মূলত ট্রেন্ডের দিক নির্ধারণের জন্য একাধিক সময়সীমার মধ্যে এমএ লাইন ক্রসওভার ব্যবহার করে এবং নির্দিষ্ট মানদণ্ডের সাথে সংকেতগুলি ফিল্টার করার পরে ট্রেন্ডটি স্পষ্ট হলে দীর্ঘ বা সংক্ষিপ্ত ট্রেড করে। এটি ট্রেন্ড অনুসরণকারী কৌশল বিভাগের অন্তর্গত।
ব্যবহারকারী কাস্টম ব্যাকটেস্ট সময় পরিসীমা ইনপুট।
হেকিন-আশি মোমবাতি বা সাধারণ মোমবাতি ব্যবহার করুন।
উর্ধ্বমুখী প্রবণতার জন্য ধীর, দ্রুত এবং ঐচ্ছিক তৃতীয় এমএ লাইন সংজ্ঞায়িত করুন।
প্রতিটি এমএ লাইনের জন্য এমএ প্রকার, সময়সীমা এবং পরামিতিগুলি কাস্টমাইজ করুন।
দ্রুত এমএ ধীর এমএ অতিক্রম করলে দীর্ঘ সংকেত, নীচে অতিক্রম করলে সংক্ষিপ্ত সংকেত।
তৃতীয় এমএ লাইনের উপরে ক্লোজ হলে শুধুমাত্র লং বিকল্প।
অটোমেটেড ট্রেডিংয়ের জন্য strategy.entry ব্যবহার করুন।
নির্দিষ্ট ট্রেড আকার বা অ্যাকাউন্টের শতাংশের ভিত্তিতে গণনা করা।
এমটিএফ কাঠামো ব্যবহার করে, প্রতিটি এমএ-র নিজস্ব সময়সীমা রয়েছে সময়সীমা জুড়ে প্রবণতা সনাক্ত করার জন্য।
কাস্টমাইজযোগ্য এমএ প্রকারগুলি স্থিতিশীলতার জন্য মসৃণ এমএ বা প্রতিক্রিয়াশীলতার জন্য দ্রুত এমএ ব্যবহার করতে পারে।
হেকিন-আশি ভুয়া পলাতকতা ফিল্টার করে।
বিকল্প তৃতীয় এমএ লাইন ফিল্টার whipsaws.
নমনীয় এমএ সময়কাল বিভিন্ন বাজারের পরিবেশের জন্য উপযুক্ত।
strategy.entry মডিউল ট্রেডিংকে স্বয়ংক্রিয় করে।
ব্যাকটেস্ট অপ্টিমাইজেশান সেরা পরামিতি খুঁজে পায়।
এমএ ক্রসগুলি মিথ্যা সংকেতগুলির জন্য প্রবণ, অপ্রয়োজনীয় ব্যবসায়ের কারণ হয়। সময়কাল অপ্টিমাইজ করতে পারে বা ফিল্টার যুক্ত করতে পারে।
Whipsaws বিপজ্জনক বাজারে ক্ষতির কারণ হতে পারে। MA দূরত্ব প্রসারিত বা সময়কাল বাড়াতে পারে।
নির্দিষ্ট ট্রেড আকার ঝুঁকি নিয়ন্ত্রণ করে না। অ্যাকাউন্টের আকারের শতাংশ বিবেচনা করুন।
ফি এবং স্লাইপও লাভজনকতাকে প্রভাবিত করে।
স্থিতিশীলতা এবং প্রতিক্রিয়াশীলতার সর্বোত্তম সমন্বয়ের জন্য বিভিন্ন এমএ প্রকার পরীক্ষা করুন।
প্রবণতা সনাক্তকরণ এবং সংবেদনশীলতা ভারসাম্য বজায় রাখার জন্য এমএ সময়কালকে অনুকূল করা।
এন্ট্রি শর্তগুলো পরিমার্জন করুন, আরও শক্তিশালী আপট্রেন্ড ফিল্টার বিবেচনা করুন।
নির্দিষ্ট পণ্যের জন্য সময়কাল অপ্টিমাইজ করুন।
ফিল্টার হিসাবে অন্যান্য সূচক যোগ করুন, যেমন ভলিউম।
পারফরম্যান্সকে সর্বোচ্চ করতে ব্যাকটেস্ট ডেটাতে প্যারামিটার অপ্টিমাইজেশন।
এমটিএফ এমএ ক্রসওভার কৌশল একটি সাধারণ ট্রেন্ড অনুসরণকারী সিস্টেম। সুবিধাগুলির মধ্যে সরলতা, নমনীয়তা এবং অভিযোজনযোগ্যতা অন্তর্ভুক্ত। তবে মিথ্যা সংকেতগুলি ঝুঁকিপূর্ণ। সেরা সমন্বয়গুলি খুঁজে পেতে প্যারামিটার এবং ফিল্টারগুলি ব্যাকটেস্টিংয়ের মাধ্যমে অনুকূলিত করা যেতে পারে। ট্রেন্ডিং মার্কেটের জন্য আরও উপযুক্ত। সতর্কতার সাথে ব্যবহার করুন বা অস্থির অবস্থার সময় ট্রেডিং বন্ধ করুন। একটি ঐতিহ্যগত ট্রেন্ড অনুসরণকারী কৌশল হিসাবে, এমটিএফ এমএ ক্রসওভারগুলি এখনও উত্সর্গীকৃত গবেষণা এবং প্রয়োগের মূল্যবান।
/*backtest start: 2023-11-08 00:00:00 end: 2023-11-15 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy(shorttitle="MZ MA Cross",title="MA MTF Cross Strategy", overlay=true, calc_on_order_fills=false, calc_on_every_tick=false, default_qty_type=strategy.fixed, default_qty_value=5,commission_value=0.1) timeFrameticker = input('D',type=input.resolution, title="Chart Timeframe") uha =input(true, title="Use Heikin Ashi Candles") // Use only Heikinashi Candles for all calculations haclose = uha ? security(heikinashi(syminfo.tickerid), timeFrameticker, close) : security(syminfo.tickerid, timeFrameticker, close) haopen = uha ? security(heikinashi(syminfo.tickerid), timeFrameticker, open) : security(syminfo.tickerid, timeFrameticker, open) hahigh = uha ? security(heikinashi(syminfo.tickerid), timeFrameticker, high) : security(syminfo.tickerid, timeFrameticker, high) halow = uha ?security(heikinashi(syminfo.tickerid), timeFrameticker, low) : security(syminfo.tickerid, timeFrameticker, low) //Backtest dates fromMonth = input(defval = 1, title = "From Month", type = input.integer, minval = 1, maxval = 12) fromDay = input(defval = 1, title = "From Day", type = input.integer, minval = 1, maxval = 31) fromYear = input(defval = 2021, title = "From Year", type = input.integer, minval = 1970) thruMonth = input(defval = 12, title = "Thru Month", type = input.integer, minval = 1, maxval = 12) thruDay = input(defval = 30, title = "Thru Day", type = input.integer, minval = 1, maxval = 31) thruYear = input(defval = 2021, title = "Thru Year", type = input.integer, minval = 1970) showDate = input(defval = true, title = "Show Date Range", type = input.bool) start = timestamp(fromYear, fromMonth, fromDay, 00, 00) // backtest start window finish = timestamp(thruYear, thruMonth, thruDay, 23, 59) // backtest finish window window() => true src = security(heikinashi(syminfo.tickerid), timeFrameticker, close) // INPUT MA TYPE slowMAtype = input(title="Slow MA Type", type=input.string, defval="LRC", options=["SMA","EMA","DEMA","TEMA","LRC","WMA","MF","VAMA","TMA","HMA", "JMA", "Kijun v2", "EDSMA","McGinley"]) fastMAtype = input(title="Fast MA Type", type=input.string, defval="EDSMA", options=["SMA","EMA","DEMA","TEMA","LRC","WMA","MF","VAMA","TMA","HMA", "JMA", "Kijun v2", "EDSMA","McGinley"]) upMAcond =input(false, title="Use Uptrend Conditional 3rd MA for Confirmation") upMAtype=input(title="Uptrend Conditional MA Type", type=input.string, defval="HMA", options=["SMA","EMA","DEMA","TEMA","LRC","WMA","MF","VAMA","TMA","HMA", "JMA", "Kijun v2", "EDSMA","McGinley"]) // INPUT RESOLUTION slowMAresolution = input("D",type=input.resolution, title="Slow MA Resolution") fastMAresolution = input("D",type=input.resolution, title="Fast MA Resolution") upMAresolution = input("D",type=input.resolution, title="Uptrend Conditional MA Resolution") haMAslow = uha ? security(heikinashi(syminfo.tickerid), slowMAresolution, close) : security(syminfo.tickerid, slowMAresolution, close) haMAfast = uha ?security(heikinashi(syminfo.tickerid), fastMAresolution, close) : security(syminfo.tickerid, fastMAresolution, close) haMAup = uha ?security(heikinashi(syminfo.tickerid), upMAresolution, close) : security(syminfo.tickerid, upMAresolution, close) // INPUT LENGTHS slowMAlength = input(50, minval=1, title="Slow MA Length") fastMAlength = input(30, minval=1, title="Fast MA Length") upMAlength = input(200, minval=1, title="Uptrend Conditional MA Length") ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// ///// MA Function ////// ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// // Pre-reqs // tema(src, len) => ema1 = ema(src, len) ema2 = ema(ema1, len) ema3 = ema(ema2, len) (3 * ema1) - (3 * ema2) + ema3 kidiv = input(defval=1,maxval=4, title="Kijun MOD Divider") jurik_phase = input(title="* Jurik (JMA) Only - Phase", type=input.integer, defval=3) jurik_power = input(title="* Jurik (JMA) Only - Power", type=input.integer, defval=1) volatility_lookback = input(10, title="* Volatility Adjusted (VAMA) Only - Volatility lookback length") // MF beta = input(0.8,minval=0,maxval=1,step=0.1, title="Modular Filter, General Filter Only - Beta") feedback = input(false, title="Modular Filter Only - Feedback") z = input(0.5,title="Modular Filter Only - Feedback Weighting",step=0.1, minval=0, maxval=1) //EDSMA ssfLength = input(title="EDSMA - Super Smoother Filter Length", type=input.integer, minval=1, defval=20) ssfPoles = input(title="EDSMA - Super Smoother Filter Poles", type=input.integer, defval=2, options=[2, 3]) //---- // EDSMA get2PoleSSF(src, length) => PI = 2 * asin(1) arg = sqrt(2) * PI / length a1 = exp(-arg) b1 = 2 * a1 * cos(arg) c2 = b1 c3 = -pow(a1, 2) c1 = 1 - c2 - c3 ssf = 0.0 ssf := c1 * src + c2 * nz(ssf[1]) + c3 * nz(ssf[2]) get3PoleSSF(src, length) => PI = 2 * asin(1) arg = PI / length a1 = exp(-arg) b1 = 2 * a1 * cos(1.738 * arg) c1 = pow(a1, 2) coef2 = b1 + c1 coef3 = -(c1 + b1 * c1) coef4 = pow(c1, 2) coef1 = 1 - coef2 - coef3 - coef4 ssf = 0.0 ssf := coef1 * src + coef2 * nz(ssf[1]) + coef3 * nz(ssf[2]) + coef4 * nz(ssf[3]) // MA Main function ma(type, src, len) => float result = 0 if type=="TMA" result := sma(sma(src, ceil(len / 2)), floor(len / 2) + 1) if type=="MF" ts=0.,b=0.,c=0.,os=0. //---- alpha = 2/(len+1) a = feedback ? z*src + (1-z)*nz(ts[1],src) : src //---- b := a > alpha*a+(1-alpha)*nz(b[1],a) ? a : alpha*a+(1-alpha)*nz(b[1],a) c := a < alpha*a+(1-alpha)*nz(c[1],a) ? a : alpha*a+(1-alpha)*nz(c[1],a) os := a == b ? 1 : a == c ? 0 : os[1] //---- upper = beta*b+(1-beta)*c lower = beta*c+(1-beta)*b ts := os*upper+(1-os)*lower result := ts if type=="LRC" result := linreg(src, len, 0) 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=="VAMA" // Volatility Adjusted /// Copyright © 2019 to present, Joris Duyck (JD) mid=ema(src,len) dev=src-mid vol_up=highest(dev,volatility_lookback) vol_down=lowest(dev,volatility_lookback) result := mid+avg(vol_up,vol_down) if type=="HMA" // Hull result := wma(2 * wma(src, len / 2) - wma(src, len), round(sqrt(len))) if type=="JMA" // Jurik /// Copyright © 2018 Alex Orekhov (everget) /// Copyright © 2017 Jurik Research and Consulting. phaseRatio = jurik_phase < -100 ? 0.5 : jurik_phase > 100 ? 2.5 : jurik_phase / 100 + 1.5 beta = 0.45 * (len - 1) / (0.45 * (len - 1) + 2) alpha = pow(beta, jurik_power) jma = 0.0 e0 = 0.0 e0 := (1 - alpha) * src + alpha * nz(e0[1]) e1 = 0.0 e1 := (src - e0) * (1 - beta) + beta * nz(e1[1]) e2 = 0.0 e2 := (e0 + phaseRatio * e1 - nz(jma[1])) * pow(1 - alpha, 2) + pow(alpha, 2) * nz(e2[1]) jma := e2 + nz(jma[1]) result := jma if type=="Kijun v2" kijun = avg(lowest(len), highest(len))//, (open + close)/2) conversionLine = avg(lowest(len/kidiv), highest(len/kidiv)) delta = (kijun + conversionLine)/2 result :=delta if type=="McGinley" mg = 0.0 mg := na(mg[1]) ? ema(src, len) : mg[1] + (src - mg[1]) / (len * pow(src/mg[1], 4)) result :=mg if type=="EDSMA" zeros = src - nz(src[2]) avgZeros = (zeros + zeros[1]) / 2 // Ehlers Super Smoother Filter ssf = ssfPoles == 2 ? get2PoleSSF(avgZeros, ssfLength) : get3PoleSSF(avgZeros, ssfLength) // Rescale filter in terms of Standard Deviations stdev = stdev(ssf, len) scaledFilter = stdev != 0 ? ssf / stdev : 0 alpha = 5 * abs(scaledFilter) / len edsma = 0.0 edsma := alpha * src + (1 - alpha) * nz(edsma[1]) result := edsma result ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// // MA DEFINITION slowMA = ma(slowMAtype, haMAslow , slowMAlength) //fastMA = ma(fastMAtype, slowMA , fastMAlength) fastMA = ma(fastMAtype, haMAfast , fastMAlength) upMA = ma(upMAtype, haMAup , upMAlength) closeMA = ma('SMA', src , 2) // Strategy Conditions L1 = crossover(fastMA,slowMA) L2 = close > upMA S1 = crossunder(fastMA,slowMA) S2 = close < upMA longcondition = upMAcond ? L1 and L2 : L1 shortcondition = upMAcond ? S1 or S2 : S1 // Plots color_fill_uptrend = color.new(#4caf50, 80) color_fill_downtrend = color.new(#c2185b, 80) plot(slowMA, title='Slow MA', color=color.olive, linewidth=2) plot(fastMA, title='Fast MA', color=color.teal, linewidth=2) cls=plot(closeMA, title='Source Line', color=na, linewidth=1) up = plot(upMA, title='Uptrend Conditional MA', color=color.purple, linewidth=2) fill(up,cls, color = close > upMA ? color_fill_uptrend : color_fill_downtrend ) //plotshape(longcondition, style = shape.triangleup, color = color.green, location = location.belowbar, text = "Long", size = size.small) //plotshape(shortcondition, style = shape.triangledown, color = color.red, location = location.abovebar, text = "Short", size = size.small) strategy.entry(id="long", long = true, when = longcondition and window()) strategy.close("long", when = shortcondition and window()) //if (longcondition) // strategy.entry("BUY", strategy.long, when = window()) //if (shortcondition) // strategy.entry("SELL", strategy.short, when = window())