ڈوئل ٹائم فریم اسٹاکسٹک آسکیلیٹر آربٹریج ٹریڈنگ اسٹریٹجی

STOCH KDJ MA RSI VWMA SMA EMA WMA
تخلیق کی تاریخ: 2025-06-18 13:47:35 آخر میں ترمیم کریں: 2025-06-18 13:47:35
کاپی: 0 کلکس کی تعداد: 318
2
پر توجہ دیں
319
پیروکار

ڈوئل ٹائم فریم اسٹاکسٹک آسکیلیٹر آربٹریج ٹریڈنگ اسٹریٹجی ڈوئل ٹائم فریم اسٹاکسٹک آسکیلیٹر آربٹریج ٹریڈنگ اسٹریٹجی

جائزہ

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

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

حکمت عملی دوہری بے ترتیب زلزلے کے اشارے کے نظام کا استعمال کرتی ہے ، جسے بنیادی اشارے اور حوالہ اشارے کہا جاتا ہے:

  1. بنیادی طور پر بے ترتیب زلزلے کے اشارے کی ترتیبات:

    • ٹائم فریم: 15 سیکنڈ
    • K لائن کی لمبائی: 12
    • K لائن ہموار: 12
    • D لائن کی لمبائی: 12
  2. ریڈم شاک اشارے کی ترتیبات ملاحظہ کریں:

    • ٹائم فریم: 15 سیکنڈ
    • K لائن کی لمبائی: 12
    • K لائن ہموار: 15
    • D لائن کی لمبائی: 30

ان پٹ لاجسٹک ڈیزائن میں بہتری آئی ہے، جس میں سگنل کی افادیت کی تصدیق کی کئی سطحیں ہیں:

  • متعدد داخلے کی شرائط

    • اہم اشارے٪ K لائن پر٪ D لائن سے گزرتا ہے ، اور
    • ریفرنس اشارے٪ D ویلیو ≥ 50 یا < 20 ، یا
    • اہم اشارے٪ K ریفرنس اشارے٪ D کے قریب ((0.15 کے اندر فرق)
    • قیمت ایک منتقل اوسط کے اوپر ہے (اگر ایم اے فلٹر کو چالو کیا گیا ہے)
    • تجارت کا وقت معمول کے بازار کے اوقات میں ہونا ضروری ہے (9:30 AM - 4:00 PM ET)
  • خالی سر داخلے کی شرط:

    • اہم اشارے٪ K لائن کے نیچے٪ D لائن کو پار کرتا ہے ، اور
    • ریفرنس اشارے٪ D کے گنجائش کے اندر اندر، یا مخصوص نیچے پہننے کے حالات کو پورا
    • قیمتوں میں منتقل اوسط سے نیچے
    • تجارت کا وقت عام مارکیٹ کے اوقات میں ہونا ضروری ہے

وقت اور تکنیکی سگنل کے مجموعے پر مبنی باہر نکلنے کی منطق:

  • باہر نکلنے کا وقت:
    • ایسٹرنل ٹائم کے مطابق دوپہر 3:30 بجے (مارکیٹ کے باقاعدہ اوقات ختم ہونے سے پہلے)
  • ٹیک آؤٹ:
    • ملٹی ہیڈ پوزیشن: جب بنیادی اشارے٪ K کے نیچے ریفرنس اشارے٪ D
    • خالی سر پوزیشن: جب بنیادی اشارے٪ K پر ریفرنس اشارے٪ D پہنیں اور ریفرنس اشارے٪ D> 20

اس حکمت عملی میں شکل کی شناخت کی خصوصیات بھی شامل ہیں:

  • اعلی کم نقطہ شکل: موجودہ اوپری پھاڑنے والے نقطہ کی٪ K قدر پچھلے اوپری پھاڑنے والے نقطہ کی٪ K قدر سے زیادہ ہے ((بچھڑنا جاری شکل)
  • کم اونچائی کی شکل: موجودہ نچلے پنکھے کا٪ K قدر پچھلے پنکھے کے٪ K قدر سے کم ہے ((بڑھتی ہوئی شکل)

اسٹریٹجک فوائد

  1. ملٹی لیول تصدیق میکانزم: دو مختلف ترتیبات کے بے ترتیب کمپن اشارے کے ذریعہ باہمی تصدیق ، ایک ہی اشارے سے پیدا ہونے والے جھوٹے سگنل کو کم کریں ، سگنل کی وشوسنییتا کو بہتر بنائیں۔

  2. درست داخلے اور باہر نکلنے کے قواعداس کی حکمت عملی میں داخلہ اور باہر نکلنے کی واضح شرائط کی وضاحت کی گئی ہے ، جس سے تجارتی فیصلوں کی ذاتیت ختم ہوجاتی ہے ، اور تجارت کو مکمل طور پر منظم کیا جاتا ہے۔

  3. شکل کی شناخت کی صلاحیتاس کے علاوہ ، یہ ایک ایسی خصوصیت ہے جو مارکیٹ میں “اعلی کم” اور “نیچی اونچائی” کی شکلوں کی نشاندہی کرنے کی صلاحیت رکھتی ہے ، جس سے رجحانات کو جاری رکھنے کے مواقع پر قبضہ کیا جاسکتا ہے ، جو بہت ساری آسان حکمت عملیوں سے حاصل نہیں کیا جاسکتا ہے۔

  4. وقت فلٹر: ٹریڈنگ کے اوقات کو معمول کے بازار کے اوقات تک محدود کرکے ، اوپن اور بند ہونے سے پہلے کے اعلی اتار چڑھاؤ اور کم لیکویڈیٹی کے اوقات سے گریز کریں ، جس سے سلائڈ پوائنٹس اور لاگت کو کم کیا جاسکے۔

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

  6. قیمت کے فرق اور گنجائش کے فرق کے پیرامیٹرز: حکمت عملی میں قیمتوں میں تبدیلی کی شدت اور اشارے کے اختلافات کی حد کو کنٹرول کرنے کے لئے متعدد پیرامیٹرز متعارف کروائے گئے ہیں ، جو معمولی اتار چڑھاؤ سے پیدا ہونے والے شور سگنل کو مؤثر طریقے سے فلٹر کرتے ہیں۔

  7. متحرک منطق تبادلوں: نظام مارکیٹ کی حالت کی بنیاد پر متحرک طور پر ایڈجسٹ کرنے کے قابل ہے جس میں کثیر سر سے خالی سر اور خالی سر سے کثیر سر تک منتقلی کی شرائط ، زیادہ لچکدار ہے۔

  8. مکمل الرٹ سسٹماس حکمت عملی میں ٹریڈنگ کی نگرانی اور اس پر عملدرآمد کے لیے انتباہ کی ایک وسیع رینج شامل ہے۔

اسٹریٹجک رسک

  1. مختصر ٹائم فریم کے ساتھ ہائی فریکوئینسی ٹریڈنگ کے خطراتحکمت عملی: 15 سیکنڈ کے ٹائم فریم کا استعمال کرتے ہوئے بہت زیادہ سگنل پیدا ہوسکتے ہیں ، جس کی وجہ سے تجارت کی کثرت ہوتی ہے ، تجارت کی لاگت میں اضافہ ہوتا ہے ، اور مارکیٹ میں بڑے اتار چڑھاؤ کی صورت میں بہت سارے جھوٹے سگنل پیدا ہوسکتے ہیں۔

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

  3. پیرامیٹر کی حساسیتحکمت عملی میں استعمال ہونے والے متعدد عین مطابق پیرامیٹرز (جیسے 0.15 کا فرق کم سے کم ، 0.1٪ کی قیمت میں فرق کی حد وغیرہ) مختلف مارکیٹ کے حالات کے ل too بہت حساس ہوسکتے ہیں اور ان کو کثرت سے ایڈجسٹ کرنے کی ضرورت ہوگی۔

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

  5. لیکویڈیٹی انحصار: ہائی فریکوئینسی حکمت عملی کو کم لیکویڈیٹی والے بازاروں میں سلائڈ پوائنٹ کا سامنا کرنا پڑ سکتا ہے ، اور اصل میں عملدرآمد کی قیمت سگنل کی تخلیق کے وقت کی قیمت سے نمایاں طور پر مختلف ہوسکتی ہے۔

  6. تکنیکی اشارے میں تاخیراس کے علاوہ ، یہ بھی کہا گیا ہے کہ یہ اشارے خود بخود پیچھے رہ جاتے ہیں ، خاص طور پر تیزی سے بدلتے ہوئے بازاروں میں ، اور یہ کہ وہ موڑ کے نقطہ کو وقت پر نہیں پکڑ سکتے ہیں۔

  7. ملاپ کا خطرہ: حکمت عملی کے پیرامیٹرز کو ٹھیک سے ایڈجسٹ کرنے سے تاریخی اعداد و شمار کو زیادہ فٹ ہونے کا سبب بن سکتا ہے ، جو مستقبل کے بازار کے ماحول میں خراب کارکردگی کا مظاہرہ کرے گا۔

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

  1. نقصان کی روک تھام میں اضافہسب سے اہم نقطہ نظر ایک ذہین اسٹاپ سسٹم کو نافذ کرنا ہے ، جس میں اے ٹی آر (اوسط حقیقی اتار چڑھاؤ کی حد) پر مبنی اسٹاپ حکمت عملی پر غور کیا جاسکتا ہے ، یا تکنیکی سطح (جیسے پچھلے دور کی اونچائی اور کم) کو اسٹاپ نقصان کے طور پر استعمال کیا جاسکتا ہے تاکہ کسی ایک تجارت میں زیادہ سے زیادہ نقصان کو محدود کیا جاسکے۔

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

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

  4. ملٹی میڈیکل انضمامRSI، MACD یا برلن بینڈ جیسے دیگر متحرک اور رجحاناتی اشارے کے ساتھ مل کر ، مارکیٹ کے زیادہ جامع نقطہ نظر کی تعمیر اور نظام کی استحکام کو بہتر بنانا۔

  5. وقت کی حد کو بہتر بنائیں: مختلف بنیادی ٹائم فریموں کی جانچ کریں ، جیسے 1 منٹ یا 5 منٹ ، ممکنہ طور پر شور کو کم کریں جبکہ کافی تجارتی مواقع کو برقرار رکھیں ، سگنل کے معیار اور مقدار کے لئے بہترین توازن تلاش کریں۔

  6. ریٹرننگ کے اعدادوشمار میں اضافہ: حکمت عملی کی کارکردگی کا زیادہ سائنسی انداز میں جائزہ لینے کے لئے زیادہ سے زیادہ واپسی ، شارپ تناسب ، جیت کی شرح ، نقصان کی شرح وغیرہ جیسے زیادہ سے زیادہ پیمائش کی کارکردگی کے اشارے حاصل کریں۔

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

  8. مارکیٹ کے ماحول کو فلٹر کرنا: مارکیٹ کے حالات کے فلٹرنگ کی شرائط کے طور پر VIX ((تذبذب کا اشارے) یا اسی طرح کے اشارے شامل کریں ، اعلی اتار چڑھاؤ کے ماحول میں حکمت عملی کے پیرامیٹرز کو ایڈجسٹ کریں یا تجارت کو روکیں۔

خلاصہ کریں۔

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

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

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

حکمت عملی کا ماخذ کوڈ
/*backtest
start: 2025-01-01 00:00:00
end: 2025-06-17 00:00:00
period: 4h
basePeriod: 4h
exchanges: [{"eid":"Binance","currency":"ETH_USDT"}]
*/

//@version=6
strategy("Dual TF Stochastic Strategy", overlay=false)

// Input parameters with updated defaults
primaryLen = input.int(12, "Primary Stoch K Length", minval=1)  // Changed from 14 to 12
primarySmooth = input.int(12, "Primary Stoch K Smoothing", minval=1)  // Changed from 3 to 12
primaryDLen = input.int(12, "Primary Stoch D Length", minval=1)  // Changed from 3 to 12
primaryRes = input.timeframe("15S", "Primary Timeframe")  // Changed from "" to "15S"

refLen = input.int(12, "Reference Stoch K Length", minval=1)  // Changed from 14 to 12
refSmooth = input.int(15, "Reference Stoch K Smoothing", minval=1)  // Changed from 3 to 15
refDLen = input.int(30, "Reference Stoch D Length", minval=1)  // Changed from 3 to 30
refRes = input.timeframe("15S", "Reference Timeframe")  // Changed from "D" to "15S"

tolerance = input.float(0.1, "Ref D Tolerance %", minval=0.1, maxval=10.0, step=0.1)  // Changed from 1.0 to 0.1
maxPriceDiff = input.float(0.1, "Maximum Price % Difference", minval=0.1, maxval=5.0, step=0.1)  // Changed from 1.0 to 0.1
closeKThreshold = input.float(0.7, "Close %K Tolerance %", minval=0.1, maxval=10.0, step=0.1)  // Changed from 5.0 to 0.7
minPriceDiffShort = input.float(0.1, "Min Price % Diff for Close %K Short", minval=0.1, maxval=5.0, step=0.1)  // Changed from 0.5 to 0.1
showLabels = input.bool(true, "Show Crossover/Crossunder Labels")

// Time Filters (America/New_York timezone, UTC-4)
is_premarket = hour(time, "America/New_York") < 9
is_postmarket = hour(time, "America/New_York") >= 16
is_regular_hours = hour(time, "America/New_York") >= 9 and hour(time, "America/New_York") < 16
is_exit_time = hour(time, "America/New_York") >= 15 and minute(time, "America/New_York") >= 30  // 3:30 PM ET

// Moving Average Settings
useMAFilter = input.bool(true, "Use Moving Average Filter")
maLength = input.int(200, "Moving Average Length", minval=1)
maType = input.string("SMA", "Moving Average Type", options=["SMA", "EMA", "WMA", "VWMA"])
maTimeframe = input.timeframe("", "Moving Average Timeframe")

// Stochastic Calculations
primaryHighest = ta.highest(high, primaryLen)
primaryLowest = ta.lowest(low, primaryLen)
primaryK_raw = 100 * (close - primaryLowest) / (primaryHighest - primaryLowest)
primaryK = ta.sma(primaryK_raw, primarySmooth)
primaryD = ta.sma(primaryK, primaryDLen)
[primaryK_tf, primaryD_tf] = request.security(syminfo.tickerid, primaryRes, [primaryK, primaryD])

refHighest = ta.highest(high, refLen)
refLowest = ta.lowest(low, refLen)
refK_raw = 100 * (close - refLowest) / (refHighest - refLowest)
refK = ta.sma(refK_raw, refSmooth)
refD = ta.sma(refK, refDLen)
[refK_tf, refD_tf] = request.security(syminfo.tickerid, refRes, [refK, refD])

// Calculate Moving Average
var float ma = na
if useMAFilter
    if maType == "SMA"
        ma := request.security(syminfo.tickerid, maTimeframe, ta.sma(close, maLength))
    else if maType == "EMA"
        ma := request.security(syminfo.tickerid, maTimeframe, ta.ema(close, maLength))
    else if maType == "WMA"
        ma := request.security(syminfo.tickerid, maTimeframe, ta.wma(close, maLength))
    else if maType == "VWMA"
        ma := request.security(syminfo.tickerid, maTimeframe, ta.vwma(close, maLength))

// Price relative to MA
priceAboveMA = not useMAFilter or close > ma
priceBelowMA = not useMAFilter or close < ma

// Crossover Detection and Tracking
crossOver = ta.crossover(primaryK_tf, primaryD_tf)
crossUnder = ta.crossunder(primaryK_tf, primaryD_tf)

// Separate tracking for crossover and crossunder %K and price
var float lastCrossOverK = na
var float lastCrossOverPrice = na
var float currentCrossOverK = na
var float currentCrossOverPrice = na

var float lastCrossUnderK = na
var float lastCrossUnderPrice = na
var float currentCrossUnderK = na
var float currentCrossUnderPrice = na

// Update crossover tracking variables
if crossOver
    lastCrossOverK := nz(currentCrossOverK, primaryK_tf[1])
    lastCrossOverPrice := nz(currentCrossOverPrice, close[1])
    currentCrossOverK := primaryK_tf
    currentCrossOverPrice := close

// Update crossunder tracking variables
if crossUnder
    lastCrossUnderK := nz(currentCrossUnderK, primaryK_tf[1])
    lastCrossUnderPrice := nz(currentCrossUnderPrice, close[1])
    currentCrossUnderK := primaryK_tf
    currentCrossUnderPrice := close

// Calculate differences separately
crossOverPriceDiffPercent = math.abs((currentCrossOverPrice - lastCrossOverPrice) / lastCrossOverPrice * 100)
crossOverKDiffPercent = math.abs((currentCrossOverK - lastCrossOverK) / lastCrossOverK * 100)
crossUnderPriceDiffPercent = math.abs((currentCrossUnderPrice - lastCrossUnderPrice) / lastCrossUnderPrice * 100)
crossUnderKDiffPercent = math.abs((currentCrossUnderK - lastCrossUnderK) / lastCrossUnderK * 100)

isKCloseCrossUnder = crossUnderKDiffPercent <= closeKThreshold and not na(lastCrossUnderK)

// New condition for long entry based on %K and refD_tf difference
kAndRefDDiffClose = crossOver and math.abs(currentCrossOverK - refD_tf) <= 0.15

// Labels for crossover and crossunder (optional)
if showLabels
    if crossOver
        diffKandRefD = math.abs(currentCrossOverK - refD_tf)
        label.new(bar_index, 50, "CrossOver\nDiff K-RefD: " + str.tostring(diffKandRefD, "#.###"), color=color.green, textcolor=color.black, style=label.style_label_up)
    if crossUnder
        diffKandRefD = math.abs(currentCrossUnderK - refD_tf)
        label.new(bar_index, 50, "CrossUnder\nDiff K-RefD: " + str.tostring(diffKandRefD, "#.###"), color=color.red, textcolor=color.black, style=label.style_label_down)

// Entry Conditions
longKCondition = crossOver and (na(lastCrossOverK) or currentCrossOverK > lastCrossOverK)
shortKCondition = crossUnder and (crossUnderPriceDiffPercent <= maxPriceDiff)
closeKShortCondition = crossUnder and isKCloseCrossUnder and (crossUnderPriceDiffPercent > minPriceDiffShort)
crossUnderBetween50and45 = crossUnder and currentCrossUnderK <= 50 and currentCrossUnderK > 45

// Long to Short if crossunder %K > 80 OR < 60
longToShortCondition = crossUnder and (currentCrossUnderK > 80 or currentCrossUnderK < 60) and strategy.position_size > 0 and is_regular_hours

upperLimit = refD_tf * (1 + tolerance/100)
lowerLimit = refD_tf * (1 - tolerance/100)
withinToleranceLong = primaryK_tf >= lowerLimit and primaryK_tf <= upperLimit
withinToleranceShort = primaryK_tf >= lowerLimit and primaryK_tf <= upperLimit

// Final Entry Conditions with MA filter
longCondition = ((longKCondition and (refD_tf >= 50 or refD_tf < 20)) or kAndRefDDiffClose) and is_regular_hours and not is_exit_time and priceAboveMA
shortCondition = (shortKCondition or (crossUnder and withinToleranceShort and (crossUnderPriceDiffPercent <= maxPriceDiff)) or closeKShortCondition or longToShortCondition or crossUnderBetween50and45) and is_regular_hours and not is_exit_time and priceBelowMA

// Short-to-Long Transition Condition with MA filter
shortToLongCondition = crossOver and currentCrossOverK < 25 and strategy.position_size < 0 and is_regular_hours and not is_exit_time and priceAboveMA

// Tracking for %K crossing under refD_tf
var float lastPrimaryKCrossUnderRefD = na
var float currentPrimaryKCrossUnderRefD = na
var bool isPrimaryKCrossUnderRefD = false

// Check if primary %K crosses under reference %D
isPrimaryKCrossUnderRefD := ta.crossunder(primaryK_tf, refD_tf)

// Update tracking for %K crossing under refD
if isPrimaryKCrossUnderRefD
    lastPrimaryKCrossUnderRefD := currentPrimaryKCrossUnderRefD
    currentPrimaryKCrossUnderRefD := primaryK_tf

// Exit Conditions
if is_exit_time
    strategy.close("Long")
    strategy.close("Short")
else if isPrimaryKCrossUnderRefD and not na(lastPrimaryKCrossUnderRefD) and currentPrimaryKCrossUnderRefD < lastPrimaryKCrossUnderRefD
    strategy.close("Long")
else if (ta.crossunder(primaryK_tf, primaryD_tf) and primaryK_tf < refD_tf and refD_tf < 60)
    strategy.close("Long")

if (ta.crossover(primaryK_tf, primaryD_tf) and primaryK_tf > refD_tf and refD_tf > 20) and not is_exit_time
    strategy.close("Short")

// Track if crossunder happens above 85
var bool crossUnderAbove85 = false

// Detect crossunder above 85
if crossUnder and currentCrossUnderK > 85
    crossUnderAbove85 := true

// Reset condition if %K crosses over %D
if ta.crossover(primaryK_tf, primaryD_tf)
    crossUnderAbove85 := false

// Track previous crossover/crossunder values for Higher Low/Lower High detection
var float prevCrossOverK = na
var float prevCrossUnderK = na

// Update previous values on new crossovers/crossunders
if crossOver
    prevCrossOverK := currentCrossOverK
if crossUnder
    prevCrossUnderK := currentCrossUnderK

// Higher Low and Lower High conditions
higherLowCondition = crossOver and not na(prevCrossOverK) and currentCrossOverK > prevCrossOverK
lowerHighCondition = crossUnder and not na(prevCrossUnderK) and currentCrossUnderK < prevCrossUnderK

// Strategy Entries and Transitions
if longCondition
    strategy.entry("Long", strategy.long)

if shortCondition
    if strategy.position_size > 0  // If in a long position, close it first
        strategy.close("Long")
    strategy.entry("Short", strategy.short)

if shortToLongCondition
    strategy.close("Short")
    if ((longKCondition and (refD_tf >= 50 or refD_tf < 20)) or kAndRefDDiffClose)  // Check full longCondition minus time (already checked)
        strategy.entry("Long", strategy.long)

// Add label for Short to Long Transition
if shortToLongCondition
    label.new(bar_index, na, "T", color=color.green, textcolor=color.white, style=label.style_label_up)

// Add label for Long to Short Transition
if longToShortCondition
    label.new(bar_index, na, "T", color=color.red, textcolor=color.white, style=label.style_label_down)

// Plotting
plot(primaryK_tf, "Primary %K", color=color.white, linewidth=1)
plot(primaryD_tf, "Primary %D", color=color.orange, linewidth=1)
plot(refK_tf, "Reference %K", color=color.navy, linewidth=1)
plot(refD_tf, "Reference %D", color=color.rgb(33, 233, 243), linewidth=2)

// Plot current and last %K only for crossUnder when isKCloseCrossUnder is true and currentCrossUnderK < lastCrossUnderK
plot(crossUnder and isKCloseCrossUnder and currentCrossUnderK < lastCrossUnderK ? currentCrossUnderK : na, "Current CrossUnder %K (Close)", color=color.green, style=plot.style_cross, linewidth=2)
plot(crossUnder and isKCloseCrossUnder and currentCrossUnderK < lastCrossUnderK ? lastCrossUnderK : na, "Last CrossUnder %K (Close)", color=color.red, style=plot.style_cross, linewidth=2)

h0 = hline(85, "Upper Band", color=color.rgb(242, 187, 21))
hline(50, "Middle Band", color=#eaff04)
h1 = hline(20, "Lower Band", color=color.rgb(242, 187, 21))
h2 = hline(40, "Lower Band", color=#787B86)
h3 = hline(60, "Lower Band", color=#787B86)
h = hline(0, "Lower Band", color=#787B86)
h5 = hline(100, "Lower Band", color=#787B86)
fill(h0, h1, color=color.rgb(33, 150, 243, 90), title="Background")
fill(h, h1, color=#1be2781d, title="Background")
fill(h0, h5, color=#e21b742d, title="Background")

// Plot the MA if enabled
plot(useMAFilter ? ma : na, "Moving Average", color=color.yellow, linewidth=2)

// Add plot for visualization (optional)
plot(isPrimaryKCrossUnderRefD ? primaryK_tf : na, "Primary %K CrossUnder RefD", color=color.purple, style=plot.style_cross, linewidth=2)
plot(isPrimaryKCrossUnderRefD and not na(lastPrimaryKCrossUnderRefD) ? lastPrimaryKCrossUnderRefD : na, "Last Primary %K CrossUnder RefD", color=color.fuchsia, style=plot.style_cross, linewidth=2)

// Add new alert conditions
alertcondition(higherLowCondition, title="Stoch Higher Low", message="Stoch Higher Low Pattern Detected")
alertcondition(lowerHighCondition, title="Stoch Lower High", message="Stoch Lower High Pattern Detected")

// Plot markers for Higher Low and Lower High patterns
plot(higherLowCondition ? currentCrossOverK : na, "Higher Low", color=color.green, style=plot.style_cross, linewidth=2)
plot(lowerHighCondition ? currentCrossUnderK : na, "Lower High", color=color.red, style=plot.style_cross, linewidth=2)

// Alert conditions
alertcondition(crossOver, title="Stochastic %K Crossed Over %D", message="Stochastic %K crossed over %D")
alertcondition(crossUnder, title="Stochastic %K Crossed Under %D", message="Stochastic %K crossed under %D")
alertcondition(crossOver and primaryK_tf > 50, title="Stochastic %K Crossed Over %D Above 50", message="Stochastic %K crossed over %D above 50")
alertcondition(crossOver and primaryK_tf > refD_tf, title="Stochastic %K Crossed Over %D Above Reference %D", message="Stochastic %K crossed over %D above Reference %D")
alertcondition(longCondition, title="Long Entry Signal", message="Long entry signal triggered")
alertcondition(shortCondition, title="Short Entry Signal", message="Short entry signal triggered")
alertcondition(shortToLongCondition, title="Short to Long Transition", message="Short to Long transition triggered")
alertcondition(longToShortCondition, title="Long to Short Transition", message="Long to Short transition triggered")
alertcondition(isPrimaryKCrossUnderRefD, title="Primary %K Crossed Under Reference %D", message="Primary %K crossed under Reference %D")
alertcondition(crossOver and primaryK_tf > refD_tf, title="Bullish Crossover Above Ref %D", message="Bull: Dual Stoch")
alertcondition(crossUnder and primaryK_tf < refD_tf, title="Bearish Crossunder Below Ref %D", message="Bear: Dual Stoch")