ایلرز فوری رجحان لائن کی حکمت عملی

مصنف:چاؤ ژانگ، تاریخ: 2023-12-20 16:51:05
ٹیگز:

img

جائزہ

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

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

اس حکمت عملی کا مرکز فوری رجحان لائن (آئی ٹی) کا حساب کتاب ہے۔ آئی ٹی کے لئے فارمولا یہ ہے:

it := (a-((a*a)/4.0))*src+0.5*a*a*src[1]-(a-0.75*a*a)*src[2]+2*(1-a )*it[1]-(1-a )*(1-a )*it[2]

جہاں src قیمت ہے، a ایک ہموار کرنے والا عنصر ہے، ڈیفالٹ 0.07 پر۔ یہ فارمولا ایک دوسرا آرڈر فلٹر ہے جو قیمت کو ہموار کرسکتا ہے اور رجحانات پیدا کرسکتا ہے۔

ایک اور اہم اشارے تاخیر کی لکیر ہے، جس کا حساب:

lag = 2.0 * it - nz(it[2])

لیگ لائن آئی ٹی لائن سے ایک بار پیچھے رہتی ہے۔ جب قیمت لیگ لائن سے اوپر کی طرف بڑھتی ہے تو ، اس سے اوپر کی طرف توڑ کا اشارہ ہوتا ہے ، طویل ہوجاتا ہے۔ جب قیمت لیگ لائن سے نیچے کی طرف بڑھتی ہے تو ، اس سے نیچے کی طرف توڑ کا اشارہ ہوتا ہے ، مختصر ہوجاتا ہے۔

اس کے علاوہ، حکمت عملی خطرات کو کنٹرول کرنے کے لئے سٹاپ نقصان کے احکامات مقرر کرتی ہے.

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

اس حکمت عملی کے فوائد میں شامل ہیں:

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

خطرے کا تجزیہ

اس حکمت عملی کے ساتھ کچھ خطرات بھی ہیں:

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

ان خطرات کو کم کیا جا سکتا ہے:

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

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

اس حکمت عملی کو مندرجہ ذیل پہلوؤں میں مزید بہتر بنایا جاسکتا ہے:

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

نتیجہ

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


/*backtest
start: 2022-12-13 00:00:00
end: 2023-12-19 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("Ehlers Instantaneous Trendline Strategy", shorttitle = "Ehlers Instantaneous Trendline Strategy", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100.0, pyramiding = 1, backtest_fill_limits_assumption = 1)
src = input(hl2, title="Source")
a = input(0.07, title="Alpha", step=0.01) 
fr = input(false, title="Fill Trend Region")
it = na
if (na(it[2]) or na(it[1]))
    it := (src + 2 * src[1] + src[2]) / 4.0
else
    it := (a-((a*a)/4.0))*src+0.5*a*a*src[1]-(a-0.75*a*a)*src[2]+2*(1-a )*it[1]-(1-a )*(1-a )*it[2]
lag = 2.0 * it - nz(it[2])
rngFrac = input(0.35)
revPct = input(0.015)
stopType = input(title="Stop type", defval = "stop-order", options = ["stop-order", "market-order", "None"])

diff = input(0.5, title = "Spread")
LongPrice(p) =>
    LongPrice = diff == 0 ? p : floor(p / diff) * diff

ShortPrice(p) =>
    ShortPrice = diff == 0 ? p : ceil(p / diff) * diff

strategy.cancel_all()
reverseTrade = false
if stopType == "market-order" 
    if  strategy.position_size > 0 and close < strategy.position_avg_price * (1 - revPct) 
        strategy.order("StopLoss open short", strategy.short, 2 * strategy.position_size, limit = close - 2 * diff)
        reverseTrade := true
    if  strategy.position_size < 0 and close > strategy.position_avg_price * (1 + revPct) 
        strategy.order("StopLoss open long", strategy.long, -2 * strategy.position_size, limit = close + 2 * diff)
        reverseTrade := true
    
if lag > it and not reverseTrade
    price = LongPrice(max(close - (high - low) * rngFrac, low))
    if strategy.position_size <= 0
        strategy.order("Open long", strategy.long, strategy.equity / price - strategy.position_size, limit = price)
        if stopType == "stop-order"
            strategy.order("StopLoss open long", strategy.short, 2 * strategy.equity / price, stop = ShortPrice(price * (1 - revPct)))
    else
        if stopType == "stop-order"
            strategy.order("StopLoss open short", strategy.short, 2 * strategy.position_size, stop = ShortPrice(strategy.position_avg_price * (1 - revPct)))
if lag < it and not reverseTrade
    price = ShortPrice(min(close - (high - low) * rngFrac, high))
    if strategy.position_size >= 0
        strategy.order("Open short", strategy.short, strategy.equity / price + strategy.position_size, limit = price)
        if stopType == "stop-order"
            strategy.order("StopLoss open short", strategy.long, 2 * strategy.equity / price, stop = LongPrice(price * (1 + revPct)))
    else
        if stopType == "stop-order"
            strategy.order("StopLoss open long", strategy.long, -2 * strategy.position_size, stop = LongPrice(strategy.position_avg_price * (1 + revPct)))


itPlot=plot(it, color=red, linewidth=1, title="Trend")
lagPlot=plot(lag, color=blue, linewidth=1, title="Trigger")
fill(itPlot, lagPlot, it < lag ? green : red,  transp=70)

// === Backtesting Dates ===
testPeriodSwitch = input(false, "Custom Backtesting Dates")
testStartYear = input(2018, "Backtest Start Year")
testStartMonth = input(9, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testStartHour = input(0, "Backtest Start Hour")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0)
testStopYear = input(2018, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(14, "Backtest Stop Day")
testStopHour = input(14, "Backtest Stop Hour")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0)
testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
isPeriod = testPeriodSwitch == true ? testPeriod() : true
// === /END
if not isPeriod
    strategy.cancel_all()
    strategy.close_all()

مزید