ڈبل چینل ٹریکنگ ریورسنگ حکمت عملی

مصنف:چاؤ ژانگ، تاریخ: 2023-11-02 16:31:50
ٹیگز:

img

جائزہ

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

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

  1. بولنگر بینڈ کے لئے درمیانی، اوپری اور نچلی بینڈ کا حساب لگائیں

    • وسط بینڈ قریبی SMA استعمال کرتا ہے
    • اوپری اور نچلی بینڈ درمیانی بینڈ ± سایڈست معیاری انحراف کے کئی گنا ہیں
  2. Keltner چینلز کے لئے وسط، اوپری اور نچلے بینڈ کا حساب لگائیں

    • وسط بینڈ قریبی SMA استعمال کرتا ہے
    • اوپری اور نچلی بینڈ درمیانی بینڈ ± ایڈجسٹ ای ٹی آر ملٹیپل ہیں
  3. اس بات کا تعین کریں کہ کیا بولنگر بینڈ Keltner چینلز کے اندر ہیں

    • جب نچلے BB > نچلے KC اور اوپری BB < اوپری KC پر دباؤ
    • دوسری صورت میں دور دبائیں
  4. BB اور KC midpoints کے خلاف بند کے لکیری رجعت ڈھلوان والو کا حساب لگائیں

    • VAL > 0 قریب بڑھتی ہوئی ہے کا مطلب ہے، VAL < 0 کم ہوتا ہے کا مطلب ہے
  5. بندش کے لئے ROC اور EMA کا حساب لگائیں

    • اس بات کا تعین کریں کہ آیا تبدیلی کی شرح ایڈجسٹ ہونے والی حد سے زیادہ ہے
    • حد سے اوپر موجودہ رجحان کی نشاندہی کرتا ہے
  6. جب دباؤ میں، طویل وقت تک جب ویلیو > 0 اور ROC حد سے تجاوز کرتا ہے

    • مختصر کے لئے الٹا
  7. سٹاپ نقصان اور منافع لینے کی شرائط مقرر کریں

فوائد

  1. ریورسنگ کے لئے ڈبل چینل سسٹم کو یکجا کرکے بہتر درستگی

  2. لکیری رجسٹریشن اور تبدیلی کی شرح کا استعمال کرتے ہوئے جھوٹے سگنل سے بچیں

  3. مصنوعات کے درمیان اصلاح کے لئے لچکدار سایڈست پیرامیٹرز

  4. اسٹاپ نقصان / منافع لینے کے ساتھ ہر تجارت کے لئے مؤثر رسک کنٹرول

  5. حکمت عملی کی قابل عمل تصدیق کے لئے کافی بیک ٹسٹ ڈیٹا

خطرات اور حل

  1. دباؤ ہمیشہ مؤثر الٹ کے نتیجے میں نہیں ہے

    • پیرامیٹرز کو بہتر بنائیں اور دباؤ کے معیار کو سخت کریں
  2. جھوٹے بھاگنے سے غلط سگنل پیدا ہوتے ہیں

    • رجحان کی سمت کا تعین کرنے کے لئے لکیری رجسٹریشن شامل کریں
  3. اسٹاپ نقصان بہت وسیع ہے جس کی وجہ سے ایک ہی نقصان میں بہت زیادہ اضافہ ہوتا ہے

    • سٹاپ نقصان کے مقامات کو بہتر بنائیں اور ہر تجارت کے نقصان پر کنٹرول کریں
  4. ناکافی ٹیسٹ کی مدت

    • طویل مدتی قابل عمل ثابت کرنے کے لئے زیادہ مدت میں ٹیسٹنگ کو بڑھانا

بہتر مواقع

  1. زیادہ مصنوعات کے لئے پیرامیٹر کی اصلاح

  2. سپورٹ / مزاحمت کی نشاندہی کے لئے مشین لرننگ شامل کریں

  3. بریک آؤٹ کی موزونیت کو بہتر بنانے کے لئے حجم کی تبدیلی کو شامل کریں

  4. رجحان کی مستقل مزاجی کے لئے کثیر ٹائم فریم تجزیہ انجام دیں

  5. متحرک سٹاپ نقصان / منافع لے لو کو بہتر بنائیں

نتیجہ

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


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

//@version=4
// Credit for the initial Squeeze Momentum code to LazyBear, rate of change code is from Kiasaki
strategy("Squeeze X BF 🚀", overlay=false, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.0)

/////////////// Time Frame ///////////////
testStartYear = input(2012, "Backtest Start Year") 
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)

testPeriod() => true

/////////////// Squeeeeze ///////////////
length = input(20, title="BB Length")
mult = input(2.0,title="BB MultFactor")
lengthKC=input(22, title="KC Length")
multKC = input(1.5, title="KC MultFactor")
 
useTrueRange = input(true, title="Use TrueRange (KC)")
 
// Calculate BB
source = close
basis = sma(source, length)
dev = mult * stdev(source, length)
upperBB = basis + dev
lowerBB = basis - dev

// Calculate KC
ma = sma(source, lengthKC)
range = useTrueRange ? tr : (high - low)
rangema = sma(range, lengthKC)
upperKC = ma + rangema * multKC
lowerKC = ma - rangema * multKC

sqzOn  = (lowerBB > lowerKC) and (upperBB < upperKC)
sqzOff = (lowerBB < lowerKC) and (upperBB > upperKC)
noSqz  = (sqzOn == false) and (sqzOff == false)

val = linreg(source - avg(avg(highest(high, lengthKC), lowest(low, lengthKC)),sma(close,lengthKC)), lengthKC,0)

///////////// Rate Of Change ///////////// 
roclength = input(30, minval=1), pcntChange = input(7, minval=1)
roc = 100 * (source - source[roclength]) / source[roclength]
emaroc = ema(roc, roclength / 2)
isMoving() => emaroc > (pcntChange / 2) or emaroc < (0 - (pcntChange / 2))

/////////////// Strategy ///////////////
long = val > 0 and isMoving()
short = val < 0 and isMoving()

last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

sl_inp = input(100.0, title='Stop Loss %') / 100
tp_inp = input(5000.0, title='Take Profit %') / 100
 
take_level_l = strategy.position_avg_price * (1 + tp_inp)
take_level_s = strategy.position_avg_price * (1 - tp_inp)

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) 
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) 

slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na

/////////////// Execution ///////////////
if testPeriod()
    strategy.entry("Long",  strategy.long, when=long)
    strategy.entry("Short", strategy.short, when=short)
    strategy.exit("Long Ex", "Long", stop=long_sl, limit=take_level_l, when=since_longEntry > 0)
    strategy.exit("Short Ex", "Short", stop=short_sl, limit=take_level_s, when=since_shortEntry > 0)
    
/////////////// Plotting ///////////////
bcolor = iff(val > 0, iff(val > nz(val[1]), color.lime, color.green), iff(val < nz(val[1]), color.red, color.maroon))
plot(val, color=bcolor, linewidth=4)
bgcolor(not isMoving() ? color.white : long ? color.lime : short ? color.red : na, transp=70)
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=50)
hline(0, color = color.white)

مزید