ہموار حرکت پذیر اوسط ربن حکمت عملی

مصنف:چاؤ ژانگ، تاریخ: 2023-12-11 14:48:35
ٹیگز:

img

جائزہ

یہ حکمت عملی ہموار چلتی اوسطوں کا استعمال کرتے ہوئے ہموار قیمت بینڈ بناتی ہے اور رجحان کو حقیقی وقت میں فلٹر کرنے کے لئے مختلف ہموار چلتی اوسطوں کو ضم کرتی ہے۔ یہ ایک عام رجحان کی پیروی کرنے والی حکمت عملی سے تعلق رکھتی ہے۔

حکمت عملی کا اصول

  1. ہموار چلتی اوسط کا استعمال کرتے ہوئے قیمتوں میں تبدیلیوں کو ٹریک کرنے کے لئے ہموار قیمت بینڈ کی تعمیر.
  2. حکمت عملی میں ہموار حرکت پذیر اوسط کے حساب کے طریقہ کار کے طور پر مختلف قسم کے چلتے ہوئے اوسط کی حمایت کی گئی ہے ، جیسے ای ایم اے ، ایس ایم ایم اے ، کیما وغیرہ۔
  3. یہ ان حرکت پذیر اوسطوں پر 1-5 تہوں کی اسٹیکنگ ہموار کی حمایت کرتا ہے تاکہ اس سے بھی زیادہ ہموار قیمت بینڈ حاصل کیا جاسکے۔
  4. یہ قیمتوں میں تبدیلیوں کو بہتر طور پر پکڑنے کے لئے قیمتوں اور چلتے ہوئے اوسط کے درمیان بولنگر بینڈ شامل کرنے کی بھی حمایت کرتا ہے۔
  5. ایک اضافی حرکت پذیر اوسط فلٹر کو فعال کرکے ، یہ اتار چڑھاؤ کو بہتر طور پر فلٹر کرسکتا ہے اور رجحان کی سمتوں کی نشاندہی کرسکتا ہے۔ فلٹر متعدد حرکت پذیر اوسط اقسام کی بھی حمایت کرتا ہے۔
  6. پیٹرن کی شناخت کے اشارے کے ساتھ مل کر، یہ خود بخود خرید اور فروخت سگنل کی شناخت کر سکتا ہے.

قیمتوں کے رجحانات کو پکڑنے کے لئے ہموار قیمت بینڈ کی تعمیر کرکے ، اور رجحان کی سمتوں کی تصدیق کے لئے ایک متحرک اوسط فلٹر کو مربوط کرکے ، یہ حکمت عملی ایک عام رجحان کی پیروی کرنے والی حکمت عملی سے تعلق رکھتی ہے۔ پیرامیٹرز کو ایڈجسٹ کرکے ، اسے مختلف مصنوعات اور ٹائم فریموں کے مطابق لچکدار طریقے سے ایڈجسٹ کیا جاسکتا ہے۔

فوائد

  1. قیمتوں کے بینڈ بنانے سے قیمتوں کے رجحان کی تبدیلیوں کو زیادہ آسانی سے ٹریک کیا جاسکتا ہے ، جس سے کھوئے ہوئے مواقع کا امکان کم ہوجاتا ہے۔
  2. متعدد چلتی اوسط اقسام کی حمایت کرنے سے مختلف ٹائم فریم اور مصنوعات کی بنیاد پر مناسب چلتی اوسط کا انتخاب ممکن ہوتا ہے ، جس سے حکمت عملی کی موافقت میں اضافہ ہوتا ہے۔
  3. 1-5 تہوں کی اسٹیکنگ ہموار قیمت کی تبدیلیوں کی نگرانی کی صلاحیت کو نمایاں طور پر بہتر بنا سکتی ہے اور رجحان کی تبدیلی کے مقامات کو زیادہ درست طریقے سے پکڑ سکتا ہے.
  4. چلتی اوسط فلٹر مؤثر طریقے سے غلط سگنل کو کم کر سکتا ہے اور جیت کی شرح کو بہتر بنا سکتا ہے.
  5. چلتی اوسط لمبائی کو ایڈجسٹ کرکے ، اسے مختلف ٹائم فریموں کے مطابق بنایا جاسکتا ہے۔ ملٹی ٹائم فریم کی تصدیق سے حکمت عملی کی کارکردگی میں مزید بہتری آسکتی ہے۔
  6. سیاہ شیشے کے ڈسپلے کی حمایت کرنے سے قیمتوں کے بینڈ کے رجحانات کا واضح اور بدیہی مشاہدہ ممکن ہوتا ہے۔

خطرات

  1. طویل مدتی رجحانات کو ٹریک کرنے میں مضبوط ، لیکن قلیل مدتی اتار چڑھاؤ کو ٹریک کرنے اور اس پر رد عمل ظاہر کرنے میں کمزور ، جس سے رینج سے منسلک مارکیٹوں میں زیادہ غلط سگنل پیدا ہوتے ہیں۔
  2. قیمتوں میں زبردست اضافے اور گرنے کی صورت میں ، ہموار حرکت پذیر اوسط کی پسماندگی بہترین انٹری ٹائمنگ کو کھو سکتی ہے۔
  3. حرکت پذیر اوسطوں کا زیادہ ڈھیر لگانا قیمتوں کی تبدیلیوں کو زیادہ ہموار کرسکتا ہے اور خرید اور فروخت کے مقامات کی غلط شناخت کا سبب بن سکتا ہے۔
  4. اگر فعال چلتی اوسط لمبائی کے پیرامیٹرز کو غلط طریقے سے مقرر کیا جاتا ہے، تو یہ بہت سے غلط سگنل پیدا کرسکتا ہے.

حل:

  1. قیمتوں میں تبدیلیوں پر ردعمل کو تیز کرنے کے لئے مناسب طریقے سے چلتی اوسط لمبائی کو کم کریں.
  2. زیادہ ہموار کو کم کرنے کے لئے stacking اوقات کو ایڈجسٹ کریں.
  3. زیادہ سے زیادہ پیرامیٹرز کو منتخب کرنے کے لئے حرکت پذیر اوسط کے مجموعے کو بہتر بنائیں اور جانچیں۔
  4. جھوٹے سگنل کو کم کرنے کے لئے دیگر اشارے کے ساتھ ملٹی ٹائم فریم کی تصدیق کا استعمال کریں۔

اصلاح کی ہدایات

  1. بہترین پیرامیٹرز کو منتخب کرنے کے لئے چلتی اوسط کی اقسام کے مجموعے کی جانچ اور اصلاح کریں.
  2. زیادہ سے زیادہ مصنوعات اور ٹائم فریموں کو اپنانے کے لئے چلتی اوسط لمبائی پیرامیٹرز کی جانچ اور اصلاح کریں.
  3. بہترین توازن نقطہ تلاش کرنے کے لئے مختلف stacking ہموار اوقات کی کوشش کریں.
  4. ایک معاون اشارے کے طور پر بولنگر بینڈ شامل کرنے کی کوشش کریں.
  5. فلٹر کے طور پر مختلف اضافی چلتی اوسط ٹیسٹ.
  6. دوسرے اشارے کے ساتھ مل کر متعدد ٹائم فریم کی تصدیق کا استعمال کریں۔

نتیجہ

یہ حکمت عملی ایک عام رجحان کی پیروی کرنے والی حکمت عملی سے تعلق رکھتی ہے جو ہموار حرکت پذیر اوسط بینڈ کی تعمیر کے ذریعہ قیمت کے رجحانات کو مستقل طور پر ٹریک کرتی ہے اور معاون فلٹرز کے ساتھ غلط سگنلز سے بچتی ہے۔ اس کا فائدہ قیمت کے رجحانات میں موڑ کو بہتر طور پر پکڑنے کے لئے ہموار قیمت بینڈ کی تعمیر میں ہے۔ اس میں پیچھے رہ جانے کے کچھ خطرات بھی ہیں۔ پیرامیٹر کی اصلاح اور اشارے کی اصلاح کے ذریعہ ، حکمت عملی کی کارکردگی کو مستقل طور پر بہتر بنایا جاسکتا ہے اور مزید تحقیق کے قابل ہے۔


/*backtest
start: 2023-12-03 00:00:00
end: 2023-12-10 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// Copyright (c) 2007-present Jurik Research and Consulting. All rights reserved.
// Copyright (c) 2018-present, Alex Orekhov (everget)
// Thanks to everget for code for more advanced moving averages
// Smooth Moving Average Ribbon [STRATEGY] @PuppyTherapy script may be freely distributed under the MIT license.
strategy( title="Smooth Moving Average Ribbon [STRATEGY] @PuppyTherapy", overlay=true )

// ---- CONSTANTS ----
lsmaOffset = 1
almaOffset = 0.85
almaSigma  = 6
phase = 2
power = 2

// ---- GLOBAL FUNCTIONS ----
kama(src, len)=>
    xvnoise = abs(src - src[1])
    nfastend = 0.666
    nslowend = 0.0645
    nsignal = abs(src - src[len])
    nnoise = sum(xvnoise, len)
    nefratio = iff(nnoise != 0, nsignal / nnoise, 0)
    nsmooth = pow(nefratio * (nfastend - nslowend) + nslowend, 2)
    nAMA = 0.0
    nAMA := nz(nAMA[1]) + nsmooth * (src - nz(nAMA[1]))

t3(src, len)=>
    xe1_1 = ema(src,    len)
    xe2_1 = ema(xe1_1,  len)
    xe3_1 = ema(xe2_1,  len)
    xe4_1 = ema(xe3_1,  len)
    xe5_1 = ema(xe4_1,  len)
    xe6_1 = ema(xe5_1,  len)
    b_1 = 0.7
    c1_1 = -b_1*b_1*b_1
    c2_1 = 3*b_1*b_1+3*b_1*b_1*b_1
    c3_1 = -6*b_1*b_1-3*b_1-3*b_1*b_1*b_1
    c4_1 = 1+3*b_1+b_1*b_1*b_1+3*b_1*b_1
    nT3Average_1 = c1_1 * xe6_1 + c2_1 * xe5_1 + c3_1 * xe4_1 + c4_1 * xe3_1
    
// The general form of the weights of the (2m + 1)-term Henderson Weighted Moving Average
getWeight(m, j) =>
    numerator = 315 * (pow(m + 1, 2) - pow(j, 2)) * (pow(m + 2, 2) - pow(j, 2)) * (pow(m + 3, 2) - pow(j, 2)) * (3 * pow(m + 2, 2) - 11 * pow(j, 2) - 16)
    denominator = 8 * (m + 2) * (pow(m + 2, 2) - 1) * (4 * pow(m + 2, 2) - 1) * (4 * pow(m + 2, 2) - 9) * (4 * pow(m + 2, 2) - 25)

    denominator != 0
         ? numerator / denominator
         : 0

hwma(src, termsNumber) =>
    sum = 0.0
    weightSum = 0.0
    
    termMult = (termsNumber - 1) / 2

    for i = 0 to termsNumber - 1
        weight = getWeight(termMult, i - termMult)
        sum := sum + nz(src[i]) * weight
        weightSum := weightSum + weight

    sum / weightSum

get_jurik(length, phase, power, src)=>
    phaseRatio = phase < -100 ? 0.5 : phase > 100 ? 2.5 : phase / 100 + 1.5
    beta = 0.45 * (length - 1) / (0.45 * (length - 1) + 2)
    alpha = pow(beta, 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])

variant(src, type, len ) =>
    v1 = sma(src, len)                                                  // Simple
    v2 = ema(src, len)                                                  // Exponential
    v3 = 2 * v2 - ema(v2, len)                                          // Double Exponential
    v4 = 3 * (v2 - ema(v2, len)) + ema(ema(v2, len), len)               // Triple Exponential
    v5 = wma(src, len)                                                  // Weighted
    v6 = vwma(src, len)                                                 // Volume Weighted
    v7 = na(v5[1]) ? sma(src, len) : (v5[1] * (len - 1) + src) / len    // Smoothed
    v8 = wma(2 * wma(src, len / 2) - wma(src, len), round(sqrt(len)))   // Hull
    v9 = linreg(src, len, lsmaOffset)                                   // Least Squares
    v10 = alma(src, len, almaOffset, almaSigma)                         // Arnaud Legoux
    v11 = kama(src, len)                                                // KAMA
    ema1 = ema(src, len)
    ema2 = ema(ema1, len)
    v13 = t3(src, len)                                                  // T3
    v14 = ema1+(ema1-ema2)                                              // Zero Lag Exponential
    v15 = hwma(src, len)                                                // Henderson Moving average thanks to  @everget
    ahma = 0.0
    ahma := nz(ahma[1]) + (src - (nz(ahma[1]) + nz(ahma[len])) / 2) / len //Ahrens Moving Average 
    v16 = ahma
    v17 = get_jurik( len, phase, power, src) 
    type=="EMA"?v2 : type=="DEMA"?v3 : type=="TEMA"?v4 : type=="WMA"?v5 : type=="VWMA"?v6 :
     type=="SMMA"?v7 : type=="Hull"?v8 : type=="LSMA"?v9 : type=="ALMA"?v10 : type=="KAMA"?v11 :
     type=="T3"?v13 : type=="ZEMA"?v14 : type=="HWMA"?v15 : type=="AHMA"?v16 : type=="JURIK"?v17 : v1

smoothMA(o, h, l, c, maLoop, type, len) =>
	ma_o = 0.0
	ma_h = 0.0
	ma_l = 0.0
	ma_c = 0.0
	if maLoop == 1
		ma_o := variant(o, type, len)
		ma_h := variant(h, type, len)
		ma_l := variant(l, type, len)
		ma_c := variant(c, type, len)
	if maLoop == 2
		ma_o := variant(variant(o ,type, len),type, len)
		ma_h := variant(variant(h ,type, len),type, len)
		ma_l := variant(variant(l ,type, len),type, len)
		ma_c := variant(variant(c ,type, len),type, len)
	if maLoop == 3
		ma_o := variant(variant(variant(o ,type, len),type, len),type, len)
		ma_h := variant(variant(variant(h ,type, len),type, len),type, len)
		ma_l := variant(variant(variant(l ,type, len),type, len),type, len)
		ma_c := variant(variant(variant(c ,type, len),type, len),type, len)
	if maLoop == 4
		ma_o := variant(variant(variant(variant(o ,type, len),type, len),type, len),type, len)
		ma_h := variant(variant(variant(variant(h ,type, len),type, len),type, len),type, len)
		ma_l := variant(variant(variant(variant(l ,type, len),type, len),type, len),type, len)
		ma_c := variant(variant(variant(variant(c ,type, len),type, len),type, len),type, len)
	if maLoop == 5
		ma_o := variant(variant(variant(variant(variant(o ,type, len),type, len),type, len),type, len),type, len)
		ma_h := variant(variant(variant(variant(variant(h ,type, len),type, len),type, len),type, len),type, len)
		ma_l := variant(variant(variant(variant(variant(l ,type, len),type, len),type, len),type, len),type, len)
		ma_c := variant(variant(variant(variant(variant(c ,type, len),type, len),type, len),type, len),type, len)
    [ma_o, ma_h, ma_l, ma_c]

smoothHA( o, h, l, c ) =>
    hao = 0.0
    hac = ( o + h + l + c ) / 4
    hao := na(hao[1])?(o + c / 2 ):(hao[1] + hac[1])/2
    hah = max(h, max(hao, hac))
    hal = min(l, min(hao, hac))
	[hao, hah, hal, hac]

// ---- Main Ribbon ----
haSmooth   = input(true, title=" Use HA as source ? " )
length     = input(11, title=" MA1 Length", minval=1, maxval=1000)
maLoop     = input(3, title=" Nr. of MA1 Smoothings ", minval=1, maxval=5)
type       = input("EMA", title="MA Type", options=["SMA", "EMA", "DEMA", "TEMA", "WMA", "VWMA", "SMMA", "Hull", "LSMA", "ALMA", "KAMA", "ZEMA", "HWMA", "AHMA", "JURIK", "T3"])
haSmooth2  = input(true, title=" Use HA as source ? " )

// ---- Trend ----
ma_use    = input(true, title=" ----- Use MA Filter ( For Lower Timeframe Swings / Scalps ) ? ----- " )
ma_source = input(defval = close, title = "MA - Source", type = input.source)
ma_length = input(100,title="MA - Length", minval=1 )
ma_type   = input("SMA", title="MA - Type", options=["SMA", "EMA", "DEMA", "TEMA", "WMA", "VWMA", "SMMA", "Hull", "LSMA", "ALMA", "KAMA", "ZEMA", "HWMA", "AHMA", "JURIK", "T3"])
ma_useHA  = input(defval = false, title = "Use HA Candles as Source ?")
ma_rsl    = input(true, title = "Use Rising / Falling Logic ?" )

// ---- BODY SCRIPT ----
[ ha_open, ha_high, ha_low, ha_close ] = smoothHA(open, high, low, close)

_open_ma  = haSmooth ? ha_open : open
_high_ma  = haSmooth ? ha_high : high
_low_ma   = haSmooth ? ha_low : low
_close_ma = haSmooth ? ha_close : close

[ _open, _high, _low, _close ] = smoothMA( _open_ma, _high_ma, _low_ma, _close_ma, maLoop, type, length)
[ ha_open2, ha_high2, ha_low2, ha_close2 ] = smoothHA(_open, _high, _low, _close)

_open_ma2  = haSmooth2 ? ha_open2 : _open
_high_ma2  = haSmooth2 ? ha_high2 : _high
_low_ma2   = haSmooth2 ? ha_low2 : _low
_close_ma2 = haSmooth2 ? ha_close2 : _close

ribbonColor = _close_ma2 > _open_ma2 ? color.lime : color.red
p_open  = plot(_open_ma2,  title="Ribbon - Open",   color=ribbonColor, transp=70)
p_close = plot(_close_ma2, title="Ribbon - Close",  color=ribbonColor, transp=70)
fill(p_open, p_close, color = ribbonColor, transp = 40 )

// ----- FILTER

ma = 0.0
if ma_use == true
    ma := variant( ma_useHA ? ha_close : ma_source, ma_type,  ma_length )

maFilterShort = ma_use ? ma_rsl ? falling(ma,1) : ma_useHA ? ha_close : close < ma : true 
maFilterLong  = ma_use ? ma_rsl ? rising(ma,1) : ma_useHA ? ha_close : close > ma : true 


colorTrend = rising(ma,1) ? color.green : color.red
plot( ma_use ? ma : na, title="MA Trend",  color=colorTrend, transp=80, transp=70, linewidth = 5)

long     = crossover(_close_ma2, _open_ma2 ) and maFilterLong
short    = crossunder(_close_ma2, _open_ma2 ) and maFilterShort
closeAll = cross(_close_ma2, _open_ma2 )

plotshape( short , title="Short", color=color.red,  transp=80, style=shape.triangledown, location=location.abovebar, size=size.small)
plotshape( long ,  title="Long",  color=color.lime, transp=80, style=shape.triangleup,   location=location.belowbar, size=size.small)

//* Backtesting Period Selector | Component *//
//* Source: https://www.tradingview.com/script/eCC1cvxQ-Backtesting-Period-Selector-Component *//
testStartYear   = input(2018, "Backtest Start Year",minval=1980)
testStartMonth  = input(1, "Backtest Start Month",minval=1,maxval=12)
testStartDay    = input(1, "Backtest Start Day",minval=1,maxval=31)
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)
testStopYear    = 9999 //input(9999, "Backtest Stop Year",minval=1980)
testStopMonth   = 12 // input(12, "Backtest Stop Month",minval=1,maxval=12)
testStopDay     = 31 //input(31, "Backtest Stop Day",minval=1,maxval=31)
testPeriodStop  = timestamp(testStopYear,testStopMonth,testStopDay,0,0)
testPeriod() => time >= testPeriodStart and time <= testPeriodStop ? true : false

if testPeriod() and long
    strategy.entry( "long", strategy.long )

if testPeriod() and short
    strategy.entry( "short", strategy.short )
    
if closeAll
    strategy.close_all( when = closeAll )


مزید