ڈبل رینج فلٹر ٹرینڈ ٹریکنگ کی حکمت عملی

مصنف:چاؤ ژانگ، تاریخ: 2024-02-05 11:15:28
ٹیگز:

img

جائزہ

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

حکمت عملی منطق

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

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

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

فوائد کا تجزیہ

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

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

خطرے کا تجزیہ

اس حکمت عملی کے ساتھ کچھ خطرات بھی ہیں، بنیادی طور پر مندرجہ ذیل پہلوؤں میں:

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

ان خطرات سے نمٹنے کے لئے، پیرامیٹرز کو مناسب طریقے سے بہتر بنانے، جھوٹے بریک آؤٹ کو روکنے، رجحان کی طاقت کا اندازہ کرنے جیسے طریقوں کو ان کو حل کرنے کے لئے استعمال کیا جا سکتا ہے.

اصلاح کے لیے تجاویز

ڈبل رینج فلٹر ٹرینڈ ٹریکنگ کی حکمت عملی میں مزید اصلاح کی بھی صلاحیت ہے ، جس میں اصلاح کی اہم سمتوں میں شامل ہیں:

  1. موم بتی کے اتار چڑھاؤ کی حد کو ہموار کرنے کے لئے ATR پیرامیٹرز کو بہتر بنائیں
  2. جھوٹے بریک آؤٹ سے بچنے کے لئے حجم کے اشارے شامل کریں
  3. ایک بار کے وقفے اور پائیدار رجحانات میں فرق کرنے کے لئے رجحان کی طاقت کا اندازہ کریں
  4. منافع کو یقینی بناتے ہوئے طویل رجحانات کو ٹریک کرنے کے لئے اسٹاپ نقصان کی قیمت کو بہتر بنائیں

ان اصلاحات کے ذریعے، حکمت عملی زیادہ مارکیٹ کے ماحول میں مستحکم منافع حاصل کر سکتی ہے.

خلاصہ

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


/*backtest
start: 2023-01-29 00:00:00
end: 2024-02-04 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Range Filter [DW] & Labels", shorttitle="RF [DW] & Labels", overlay=true)

//Conditional Sampling EMA Function 
Cond_EMA(x, cond, n)=>
    var val     = array.new_float(0)
    var ema_val = array.new_float(1)
    if cond
        array.push(val, x)
        if array.size(val) > 1
            array.remove(val, 0)
        if na(array.get(ema_val, 0))
            array.fill(ema_val, array.get(val, 0))
        array.set(ema_val, 0, (array.get(val, 0) - array.get(ema_val, 0))*(2/(n + 1)) + array.get(ema_val, 0))
    EMA = array.get(ema_val, 0)
    EMA

//Conditional Sampling SMA Function
Cond_SMA(x, cond, n)=>
    var vals = array.new_float(0)
    if cond
        array.push(vals, x)
        if array.size(vals) > n
            array.remove(vals, 0)
    SMA = array.avg(vals)
    SMA

//Standard Deviation Function
Stdev(x, n)=>
    sqrt(Cond_SMA(pow(x, 2), 1, n) - pow(Cond_SMA(x, 1, n), 2))

//Range Size Function
rng_size(x, scale, qty, n)=> 
    ATR      = Cond_EMA(tr(true), 1, n)
    AC       = Cond_EMA(abs(x - x[1]), 1, n)
    SD       = Stdev(x, n)
    rng_size = scale=="Pips" ? qty*0.0001 : scale=="Points" ? qty*syminfo.pointvalue : scale=="% of Price" ? close*qty/100 : scale=="ATR" ? qty*ATR :
               scale=="Average Change" ? qty*AC : scale=="Standard Deviation" ? qty*SD : scale=="Ticks" ? qty*syminfo.mintick : qty   

//Two Type Range Filter Function
rng_filt(h, l, rng_, n, type, smooth, sn, av_rf, av_n)=>
    rng_smooth = Cond_EMA(rng_, 1, sn)
    r          = smooth ? rng_smooth : rng_
    var rfilt  = array.new_float(2, (h + l)/2)
    array.set(rfilt, 1, array.get(rfilt, 0))
    if type=="Type 1"
        if h - r > array.get(rfilt, 1)
            array.set(rfilt, 0, h - r)
        if l + r < array.get(rfilt, 1)
            array.set(rfilt, 0, l + r)
    if type=="Type 2"
        if h >= array.get(rfilt, 1) + r
            array.set(rfilt, 0, array.get(rfilt, 1) + floor(abs(h - array.get(rfilt, 1))/r)*r)
        if l <= array.get(rfilt, 1) - r
            array.set(rfilt, 0, array.get(rfilt, 1) - floor(abs(l - array.get(rfilt, 1))/r)*r)
    rng_filt1 = array.get(rfilt, 0)
    hi_band1  = rng_filt1 + r
    lo_band1  = rng_filt1 - r
    rng_filt2 = Cond_EMA(rng_filt1, rng_filt1 != rng_filt1[1], av_n)
    hi_band2  = Cond_EMA(hi_band1, rng_filt1 != rng_filt1[1], av_n)
    lo_band2  = Cond_EMA(lo_band1, rng_filt1 != rng_filt1[1], av_n)
    rng_filt  = av_rf ? rng_filt2 : rng_filt1
    hi_band   = av_rf ? hi_band2 : hi_band1
    lo_band   = av_rf ? lo_band2 : lo_band1
    [hi_band, lo_band, rng_filt]
 
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Inputs
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Filter Type
f_type = input(defval="Type 1", options=["Type 1", "Type 2"], title="Filter Type")

//Movement Source
mov_src = input(defval="Close", options=["Wicks", "Close"], title="Movement Source")

//Range Size Inputs
rng_qty   = input(defval=2.618, minval=0.0000001, title="Range Size")
rng_scale = input(defval="Average Change", options=["Points", "Pips", "Ticks", "% of Price", "ATR", "Average Change", "Standard Deviation", "Absolute"], title="Range Scale")

//Range Period
rng_per = input(defval=14, minval=1, title="Range Period (for ATR, Average Change, and Standard Deviation)")

//Range Smoothing Inputs
smooth_range = input(defval=true, title="Smooth Range")
smooth_per   = input(defval=27, minval=1, title="Smoothing Period")

//Filter Value Averaging Inputs
av_vals    = input(defval=true, title="Average Filter Changes")
av_samples = input(defval=2, minval=1, title="Number Of Changes To Average")

// New inputs for take profit and stop loss
take_profit_percent = input(defval=100.0, minval=0.1, maxval=1000.0, title="Take Profit Percentage", step=0.1)
stop_loss_percent = input(defval=100, minval=0.1, maxval=1000.0, title="Stop Loss Percentage", step=0.1)

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Definitions
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//High And Low Values
h_val = mov_src=="Wicks" ? high : close
l_val = mov_src=="Wicks" ? low : close

//Range Filter Values
[h_band, l_band, filt] = rng_filt(h_val, l_val, rng_size((h_val + l_val)/2, rng_scale, rng_qty, rng_per), rng_per, f_type, smooth_range, smooth_per, av_vals, av_samples)

//Direction Conditions
var fdir = 0.0
fdir    := filt > filt[1] ? 1 : filt < filt[1] ? -1 : fdir
upward   = fdir==1 ? 1 : 0
downward = fdir==-1 ? 1 : 0

//Colors
filt_color = upward ? #05ff9b : downward ? #ff0583 : #cccccc
bar_color  = upward and (close > filt) ? (close > close[1] ? #05ff9b : #00b36b) :
             downward and (close < filt) ? (close < close[1] ? #ff0583 : #b8005d) : #cccccc

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Outputs
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Filter Plot
filt_plot = plot(filt, color=filt_color, transp=0, linewidth=3,  title="Filter")

//Band Plots
h_band_plot = plot(h_band, color=#05ff9b, transp=100, title="High Band")
l_band_plot = plot(l_band, color=#ff0583, transp=100, title="Low Band")

//Band Fills
fill(h_band_plot, filt_plot, color=#00b36b, transp=85, title="High Band Fill")
fill(l_band_plot, filt_plot, color=#b8005d, transp=85, title="Low Band Fill")

//Bar Color
barcolor(bar_color)

//External Trend Output
plot(fdir, transp=100, editable=false, display=display.none, title="External Output - Trend Signal")

// Trading Conditions Logic
longCond = close > filt and close > close[1] and upward > 0 or close > filt and close < close[1] and upward > 0 
shortCond = close < filt and close < close[1] and downward > 0 or close < filt and close > close[1] and downward > 0

CondIni = 0
CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1]
longCondition = longCond and CondIni[1] == -1
shortCondition = shortCond and CondIni[1] == 1

// Strategy Entry and Exit
strategy.entry("Buy", strategy.long, when = longCondition)
strategy.entry("Sell", strategy.short, when = shortCondition)

// New: Close conditions based on percentage change
long_take_profit_condition = close > strategy.position_avg_price * (1 + take_profit_percent / 100)
short_take_profit_condition = close < strategy.position_avg_price * (1 - take_profit_percent / 100)

long_stop_loss_condition = close < strategy.position_avg_price * (1 - stop_loss_percent / 100)
short_stop_loss_condition = close > strategy.position_avg_price * (1 + stop_loss_percent / 100)

strategy.close("Buy", when = shortCondition or long_take_profit_condition or long_stop_loss_condition)
strategy.close("Sell", when = longCondition or short_take_profit_condition or short_stop_loss_condition)

// Plot Buy and Sell Labels
plotshape(longCondition, title = "Buy Signal", text ="BUY", textcolor = color.white, style=shape.labelup, size = size.normal, location=location.belowbar, color = color.green, transp = 0)
plotshape(shortCondition, title = "Sell Signal", text ="SELL", textcolor = color.white, style=shape.labeldown, size = size.normal, location=location.abovebar, color = color.red, transp = 0)

// Alerts
alertcondition(longCondition, title="Buy Alert", message = "BUY")
alertcondition(shortCondition, title="Sell Alert", message = "SELL")


مزید