تجارتی نظام کے بعد انکولی اتار چڑھاؤ ملٹی انڈیکیٹر ٹرینڈ

ATR SMA RSI DCA 烛台模式 趋势跟踪 波动率适应 多时间周期 止损 止盈
تخلیق کی تاریخ: 2025-04-11 13:41:56 آخر میں ترمیم کریں: 2025-04-11 13:41:56
کاپی: 3 کلکس کی تعداد: 378
2
پر توجہ دیں
319
پیروکار

تجارتی نظام کے بعد انکولی اتار چڑھاؤ ملٹی انڈیکیٹر ٹرینڈ تجارتی نظام کے بعد انکولی اتار چڑھاؤ ملٹی انڈیکیٹر ٹرینڈ

جائزہ

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

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

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

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

  2. RSI متحرک فلٹر: آر ایس آئی کے ذریعے داخلہ سگنل کی توثیق کریں ، اس بات کو یقینی بنائیں کہ تجارت کی سمت مارکیٹ کی حرکیات کے مطابق ہے۔ یہ خصوصیت اختیاری طور پر آن یا آف کی جاسکتی ہے ، اور اپنی مرضی کے مطابق آر ایس آئی پیرامیٹرز کی حمایت کرتی ہے (جیسے لمبائی 14 ، اوور بائی 60 ، اوور سیل 40) ۔

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

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

  5. ڈی سی اے کا مرحلہ وار قیام: رجحانات کی سمت میں بہت سے داخلے کی اجازت دیں ، زیادہ سے زیادہ پہلے سے طے شدہ تعداد میں داخلے کی حمایت کریں (جیسے 4 بار) ، داخلہ وقفہ اے ٹی آر ضارب پر مبنی ہے۔ یہ طریقہ کار رجحانات کے جاری رہنے والے بازاروں میں اوسط لاگت کو بہتر بنانے میں معاون ہے۔

  6. اعلی درجے کی خطرے کے انتظام

    • ابتدائی نقصان: اے ٹی آر کی ترتیب پر مبنی ((عام طور پر 2 سے 3.5 گنا) ، داخلے کے ستون پر وسیع تر فکسڈ سٹاپ نقصان کے ضارب کا اطلاق ((جیسے 1.3)) ۔
    • ٹریک اسٹاپ نقصان: اے ٹی آر کی بنیاد پر انحراف اور ضرب کا استعمال کرتے ہوئے ، منافع میں اضافے کے ساتھ متحرک ایڈجسٹمنٹ (جیسے جب منافع اے ٹی آر سے زیادہ ہو تو ضرب 0.5 سے کم ہو کر 0.3) ۔
    • اسٹاپ ٹارگٹ: داخلہ قیمت ± اے ٹی آر کے مخصوص ضرب ((جیسے 1.2) پر طے کریں۔
    • ٹھنڈک کا وقت: باہر نکلنے کے بعد توقف کا وقت (۰-۵ منٹ) ، زیادہ تجارت سے بچنے کے لئے
    • کم از کم پوزیشن کا وقت: اس بات کو یقینی بنائیں کہ تجارت ایک خاص تعداد میں کالموں ((جیسے 2-10)) پر جاری رہے۔
  7. ٹرانزیکشن پر عملدرآمد کی منطق: سسٹم منتقل اوسط یا گرنے والی شکل کے اشارے کو ترجیح دیتا ہے ((صارف کے انتخاب کے مطابق) ، اور ٹرانزیکشن ، اتار چڑھاؤ اور وقت کے فلٹرز کو لاگو کرتا ہے۔ داخلے کے معیار کو یقینی بنانے کے لئے ، ٹرانزیکشن کی چوٹی کی شرائط کو بھی بڑھایا گیا ہے۔ ((ٹرانزیکشن> 1.2*10 ایس ایم اے)

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

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

  2. سگنل کے معیار کی فلٹرنگ: کثیر پرت فلٹرنگ میکانزم ((آر ایس آئی ، کثیر وقتی رجحانات ، حجم اور اتار چڑھاؤ) جعلی سگنل کو کم کرنے اور تجارت کے معیار کو بہتر بنانے کے لئے موثر ہے۔

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

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

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

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

  7. ٹھیک سے داخلہ کنٹرولٹرانزیکشن کی چوٹی کے فلٹر صرف اہم مارکیٹ کی سرگرمیوں کے دوران داخل ہونے کو یقینی بناتے ہیں ، اور ٹھنڈک کا نظام ضرورت سے زیادہ تجارت کو روکتا ہے۔

اسٹریٹجک رسک

  1. پیرامیٹر کی حساسیت: حکمت عملی میں متعدد پیرامیٹرز استعمال کیے جاتے ہیں (جیسے اوسط لمبائی ، اے ٹی آر سائیکل ، آر ایس آئی تھریڈ وغیرہ) ، ان پیرامیٹرز کی ترتیبات کی کارکردگی پر نمایاں اثر پڑتا ہے ، اور پیرامیٹرز کا غلط مجموعہ تاریخی اعداد و شمار کو زیادہ سے زیادہ ایڈجسٹ کرنے کا سبب بن سکتا ہے۔

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

  1. مارکیٹ میں تبدیلی کا خطرہ: مارکیٹ کے نمونے میں تیزی سے تبدیلیوں کے دوران (جیسے رجحان سے ہلچل) ، حکمت عملی نئے ماحول کو اپنانے سے پہلے مسلسل نقصانات کا سبب بن سکتی ہے۔

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

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

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

  1. نظام کی پیچیدگیاس کے علاوہ ، یہ بھی کہا گیا ہے کہ اس کی حکمت عملی کو سمجھنے اور برقرار رکھنے میں دشواری کا سامنا کرنا پڑتا ہے۔

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

  1. زیادہ تجارت کا خطرہڈی سی اے میکانزم اور بار بار سگنل کی پیداوار کے نتیجے میں زیادہ تجارت ہوسکتی ہے ، جس سے لین دین کی لاگت میں اضافہ ہوتا ہے۔

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

اصلاح کی سمت

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

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

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

  4. متبادل انڈیکس انضمام: دیگر تکنیکی اشارے کی افادیت کی جانچ کرنا ، جیسے بولنگر بینڈ ، MACD یا Ichimoku کلاؤڈ چارٹ ، موجودہ نظام کی تکمیل یا متبادل کے طور پر۔ مختلف اشارے مخصوص مارکیٹ کے حالات میں زیادہ درست سگنل فراہم کرسکتے ہیں۔

  5. جذباتی اعداد و شمار کا انضمام: مارکیٹ کے جذبات کے اشارے شامل کرنے پر غور کریں ، جیسے کہ وی آئی ایکس اتار چڑھاؤ انڈیکس یا آپشن مارکیٹ کے اعداد و شمار ، تاکہ مارکیٹ میں ممکنہ تبدیلیوں کی پیشگی شناخت کی جاسکے۔ یہ بیرونی اعداد و شمار کے ذرائع معلومات فراہم کرسکتے ہیں جو روایتی تکنیکی اشارے نہیں پکڑ سکتے۔

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

  7. کمپیوٹنگ کی کارکردگی کو بہتر بنائیں: کوڈ کو دوبارہ تشکیل دیں تاکہ حساب کتاب کی کارکردگی کو بہتر بنایا جاسکے ، خاص طور پر ہائی فریکوئینسی حکمت عملیوں کے لئے۔ اس میں اے ٹی آر کے حساب کتاب کو بہتر بنانا ، شرائط کی جانچ پڑتال کی ترتیب اور غیر ضروری دوہرا حساب کتاب کو کم کرنا شامل ہے۔

خلاصہ کریں۔

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

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

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

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

حکمت عملی کا ماخذ کوڈ
/*backtest
start: 2024-04-11 00:00:00
end: 2025-04-10 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

//@version=6
strategy('Dskyz Adaptive Futures Elite (DAFE) - Updated', 
         overlay=true, 
         default_qty_type=strategy.fixed, 
         initial_capital=1000000, 
         commission_value=0, 
         slippage=1, 
         pyramiding=10)

// === INPUTS ===

// Moving Average Settings
fastLength       = input.int(9, '[MA] Fast MA Length', minval=1)
slowLength       = input.int(19, '[MA] Slow MA Length', minval=1)

// RSI Settings
useRSI           = input.bool(false, '[RSI Settings] Use RSI Filter')
rsiLength        = input.int(14, 'RSI Length', minval=1)
rsiOverbought    = input.int(60, 'RSI Overbought', minval=50, maxval=100)
rsiOversold      = input.int(40, 'RSI Oversold', minval=0, maxval=50)
rsiLookback      = input.int(1, 'RSI Lookback', minval=1)

// Pattern Settings
usePatterns      = input.bool(true, '[Pattern Settings] Use Candlestick Patterns')
patternLookback  = input.int(19, 'Pattern Lookback Bars', minval=1)

// Filter Settings
useTrendFilter   = input.bool(true, '[Filter Settings] Use 15m Trend Filter')
minVolume        = input.int(10, 'Minimum Volume', minval=1)
volatilityThreshold = input.float(1.0, 'Volatility Threshold (%)', minval=0.1, step=0.1) / 100
tradingStartHour = input.int(9, 'Trading Start Hour (24h)', minval=0, maxval=23)
tradingEndHour   = input.int(16, 'Trading End Hour (24h)', minval=0, maxval=23)

// DCA Settings
useDCA           = input.bool(false, '[DCA Settings] Use DCA')
maxTotalEntries  = input.int(4, 'Max Total Entries per Direction', minval=1)
dcaMultiplier    = input.float(1.0, 'DCA ATR Multiplier', minval=0.1, step=0.1)

// Signal Settings
signalPriority   = input.string('MA', '[Signal Settings] Signal Priority', options=['Pattern', 'MA'])
minBarsBetweenSignals = input.int(5, 'Min Bars Between Signals', minval=1)
plotMode         = input.string('Potential Signals', 'Plot Mode', options=['Potential Signals', 'Actual Entries'])

// Exit Settings
trailOffset      = input.float(0.5, '[Exit Settings] Trailing Stop Offset ATR Multiplier', minval=0.01, step=0.01)
trailPointsMult  = input.float(0.5, 'Trailing Stop Points ATR Multiplier', minval=0.01, step=0.01)
profitTargetATRMult = input.float(1.2, 'Profit Target ATR Multiplier', minval=0.1, step=0.1)  // Profit target factor
fixedStopMultiplier  = input.float(1.3, 'Fixed Stop Multiplier', minval=0.5, step=0.1)    // Fixed stop multiplier

// General Settings
debugLogging     = input.bool(true, '[General Settings] Enable Debug Logging')
fixedQuantity    = input.int(2, 'Trade Quantity', minval=1)
cooldownMinutes  = input.int(0, 'Cooldown Minutes', minval=0)

// ATR Settings – Use Dynamic ATR or fixed value
useDynamicATR    = input.bool(true, title="Use Dynamic ATR")
userATRPeriod    = input.int(7, title="ATR Period (if not using dynamic)", minval=1)
defaultATR       = timeframe.isminutes and timeframe.multiplier <= 2 ? 5 :
                   timeframe.isminutes and timeframe.multiplier <= 5 ? 7 : 10
atrPeriod        = useDynamicATR ? defaultATR : userATRPeriod

// === TRADE TRACKING VARIABLES ===
var int lastSignalBar   = 0
var int lastSignalType  = 0         // 1 for long, -1 for short
var int entryBarIndex   = 0
var bool inLongTrade    = false
var bool inShortTrade   = false

// DCA Tracking Variables
var int longEntryCount  = 0
var int shortEntryCount = 0
var float longInitialEntryPrice = na
var float shortInitialEntryPrice = na
var float longEntryATR  = na
var float shortEntryATR = na
var float long_stop_price = na
var float short_stop_price = na

// Signal Plotting Variables
var int lastLongPlotBar = 0
var int lastShortPlotBar = 0

// === CALCULATIONS ===

// Volume and Time Filters
volumeOk    = volume >= minVolume
currentHour = hour(time)
timeWindow  = currentHour >= tradingStartHour and currentHour <= tradingEndHour

// Additional Entry Filter: Volume Spike Condition
volumeSpike = volume > 1.2 * ta.sma(volume, 10)

// ATR & Volatility Calculations
atr         = ta.atr(atrPeriod)
volatility  = nz(atr / close, 0)
volatilityOk= volatility <= volatilityThreshold

// Adaptive MA Lengths
fastLengthAdaptive = math.round(fastLength / (1 + volatility))
slowLengthAdaptive = math.round(slowLength / (1 + volatility))
fastLengthSafe     = math.max(1, not na(atr) ? fastLengthAdaptive : fastLength)
slowLengthSafe     = math.max(1, not na(atr) ? slowLengthAdaptive : slowLength)
fastMA             = ta.sma(close, fastLengthSafe)
slowMA             = ta.sma(close, slowLengthSafe)

// RSI Calculation
rsi               = ta.rsi(close, rsiLength)
rsiCrossover      = ta.crossover(rsi, rsiOversold)
rsiCrossunder     = ta.crossunder(rsi, rsiOverbought)
rsiLongOk         = not useRSI or (rsiCrossover and rsi[rsiLookback] < 70)
rsiShortOk        = not useRSI or (rsiCrossunder and rsi[rsiLookback] > 30)

// 15m Trend Filter
[fastMA15m, slowMA15m] = request.security(syminfo.tickerid, '15', [ta.sma(close, fastLength), ta.sma(close, slowLength)])
trend15m = fastMA15m > slowMA15m ? 1 : fastMA15m < slowMA15m ? -1 : 0

// Candlestick Patterns
isBullishEngulfing() =>
    close[1] < open[1] and close > open and open < close[1] and close > open[1] and (close - open) > (open[1] - close[1]) * 0.8

isBearishEngulfing() =>
    close[1] > open[1] and close < open and open > close[1] and close < open[1] and (open - close) > (close[1] - open[1]) * 0.8

// Pattern Strength Calculation
patternStrength(isBull) =>
    bull = isBull ? 1 : 0
    bear = isBull ? 0 : 1
    volumeStrength = volume > ta.sma(volume, 10) ? 1 : 0
    rangeStrength  = (high - low) > ta.sma(high - low, 10) ? 1 : 0
    strength = bull * (volumeStrength + rangeStrength) - bear * (volumeStrength + rangeStrength)
    strength

bullStrength = patternStrength(true)
bearStrength = patternStrength(false)

// Detect Patterns
bullishEngulfingOccurred = ta.barssince(isBullishEngulfing()) <= patternLookback and bullStrength >= 1
bearishEngulfingOccurred = ta.barssince(isBearishEngulfing()) <= patternLookback and bearStrength <= -1
patternConflict          = bullishEngulfingOccurred and bearishEngulfingOccurred

// MA Conditions with Trend & RSI Filters
maAbove      = close > fastMA and fastMA > slowMA and close > close[1]
maBelow      = close < fastMA and fastMA < slowMA and close < close[1]
trendLongOk  = not useTrendFilter or trend15m >= 0
trendShortOk = not useTrendFilter or trend15m <= 0

// Signal Priority Logic
bullPattern  = usePatterns and bullishEngulfingOccurred
bearPattern  = usePatterns and bearishEngulfingOccurred
bullMA       = maAbove and trendLongOk and rsiLongOk
bearMA       = maBelow and trendShortOk and rsiShortOk

longCondition  = false
shortCondition = false

if signalPriority == 'Pattern'
    longCondition  := bullPattern or (not bearPattern and bullMA)
    shortCondition := bearPattern or (not bullPattern and bearMA)
else
    longCondition  := bullMA or (not bearMA and bullPattern)
    shortCondition := bearMA or (not bullMA and bearPattern)

// Apply Filters and require volume spike for quality entries
longCondition  := longCondition and volumeOk and volumeSpike and timeWindow and volatilityOk and not patternConflict
shortCondition := shortCondition and volumeOk and volumeSpike and timeWindow and volatilityOk and not patternConflict

// Update Trade Status
if strategy.position_size > 0
    inLongTrade := true
    inShortTrade := false
else if strategy.position_size < 0
    inShortTrade := true
    inLongTrade := false
else
    inLongTrade := false
    inShortTrade := false

// Entry Checks
canTrade      = strategy.position_size == 0
validQuantity = fixedQuantity > 0
quantity      = fixedQuantity

// Prevent Multiple Alerts Per Bar
var bool alertSent = false
if barstate.isnew
    alertSent := false

// Cooldown Logic
var float lastExitTime = na
if strategy.position_size == 0 and strategy.position_size[1] != 0
    lastExitTime := time
canEnter = na(lastExitTime) or ((time - lastExitTime) / 60000 >= cooldownMinutes)

// === ENTRY LOGIC ===
if canTrade and validQuantity and not alertSent and canEnter and barstate.isconfirmed
    if longCondition and not shortCondition and (lastSignalBar != bar_index or lastSignalType != 1)
        strategy.entry('Long', strategy.long, qty=quantity)
        longInitialEntryPrice := close
        longEntryATR         := atr
        longEntryCount       := 1
        alert('Enter Long', alert.freq_once_per_bar)
        alertSent            := true
        lastSignalBar        := bar_index
        lastSignalType       := 1
        entryBarIndex        := bar_index

    else if shortCondition and not longCondition and (lastSignalBar != bar_index or lastSignalType != -1)
        strategy.entry('Short', strategy.short, qty=quantity)
        shortInitialEntryPrice := close
        shortEntryATR          := atr
        shortEntryCount        := 1
        alert('Enter Short', alert.freq_once_per_bar)
        alertSent             := true
        lastSignalBar         := bar_index
        lastSignalType        := -1
        entryBarIndex         := bar_index


// === DCA LOGIC (IF ENABLED) ===
if useDCA
    if strategy.position_size > 0 and longEntryCount < maxTotalEntries and bullMA and rsi < 70
        nextDCALevel = longInitialEntryPrice - longEntryCount * longEntryATR * dcaMultiplier
        if close <= nextDCALevel
            strategy.entry('Long DCA ' + str.tostring(longEntryCount), strategy.long, qty=quantity)
            longEntryCount := longEntryCount + 1
    if strategy.position_size < 0 and shortEntryCount < maxTotalEntries and bearMA and rsi > 30
        nextDCALevel = shortInitialEntryPrice + shortEntryATR * shortEntryCount * dcaMultiplier
        if close >= nextDCALevel
            strategy.entry('Short DCA ' + str.tostring(shortEntryCount), strategy.short, qty=quantity)
            shortEntryCount := shortEntryCount + 1

// === RESET DCA VARIABLES ON EXIT ===
if strategy.position_size == 0 and strategy.position_size[1] != 0
    longEntryCount := 0
    shortEntryCount := 0
    longInitialEntryPrice := na
    shortInitialEntryPrice := na
    longEntryATR := na
    shortEntryATR := na

// === FIXED STOP-LOSS CALCULATION (WIDER INITIAL STOP) ===
long_stop_price  := strategy.position_avg_price - atr * fixedStopMultiplier
short_stop_price := strategy.position_avg_price + atr * fixedStopMultiplier

// === ADJUST TRAILING POINTS BASED ON PROFIT ===
profitLong  = strategy.position_size > 0 ? close - strategy.position_avg_price : 0
profitShort = strategy.position_size < 0 ? strategy.position_avg_price - close : 0
trailPointsMultAdjusted       = profitLong > atr ? 0.3 : profitLong > atr * 0.66 ? 0.4 : trailPointsMult      // For long positions
trailPointsMultAdjustedShort  = profitShort > atr ? 0.3 : profitShort > atr * 0.66 ? 0.4 : trailPointsMult   // For short positions
trailPointsLong  = atr * trailPointsMultAdjusted
trailPointsShort = atr * trailPointsMultAdjustedShort

// === EXIT LOGIC ===
// On the entry bar, always use the fixed stop; thereafter, use a combination of fixed stop, trailing stop, and a profit target.
// Profit Target: For longs, exit at avg_entry + atr * profitTargetATRMult; for shorts, exit at avg_entry - atr * profitTargetATRMult.
if strategy.position_size > 0
    if bar_index == entryBarIndex
        if debugLogging
            log.info("Long exit on entry bar: fixed stop applied. Price=" + str.tostring(close))
        strategy.exit('Long Exit', 'Long', stop=long_stop_price)
    else
        if debugLogging
            log.info("Long Trade: profit=" + str.tostring(profitLong) + ", ATR=" + str.tostring(atr))
        strategy.exit('Long Exit', 'Long', 
             stop=long_stop_price, 
             limit = strategy.position_avg_price + atr * profitTargetATRMult,
             trail_points=trailPointsLong, 
             trail_offset=atr * trailOffset)
            
if strategy.position_size < 0
    if bar_index == entryBarIndex
        if debugLogging
            log.info("Short exit on entry bar: fixed stop applied. Price=" + str.tostring(close))
        strategy.exit('Short Exit', 'Short', stop=short_stop_price)
    else
        if debugLogging
            log.info("Short Trade: profit=" + str.tostring(profitShort) + ", ATR=" + str.tostring(atr))
        strategy.exit('Short Exit', 'Short', 
             stop=short_stop_price, 
             limit = strategy.position_avg_price - atr * profitTargetATRMult,
             trail_points=trailPointsShort, 
             trail_offset=atr * trailOffset)

// === FORCE CLOSE ON LAST BAR (OPTIONAL) ===
if barstate.islast
    if strategy.position_size > 0
        strategy.close('Long', comment='Forced Exit')
    if strategy.position_size < 0
        strategy.close('Short', comment='Forced Exit')

// === SIGNAL PLOTTING LOGIC ===
plotLongSignal  = longCondition and canTrade and (bar_index - lastLongPlotBar >= minBarsBetweenSignals or lastLongPlotBar == 0)
plotShortSignal = shortCondition and canTrade and (bar_index - lastShortPlotBar >= minBarsBetweenSignals or lastShortPlotBar == 0)

if plotLongSignal
    lastLongPlotBar := bar_index
if plotShortSignal
    lastShortPlotBar := bar_index

// Define plotting conditions based on plotMode
plotLongShape  = plotMode == 'Potential Signals' ? plotLongSignal : strategy.position_size > 0 and strategy.position_size[1] <= 0
plotShortShape = plotMode == 'Potential Signals' ? plotShortSignal : strategy.position_size < 0 and strategy.position_size[1] >= 0

// === VISUALIZATION ===
plot(fastMA, color=color.blue, linewidth=2, title='Fast MA')
plot(slowMA, color=color.red, linewidth=2, title='Slow MA')

var float longSL  = na
var float shortSL = na
if strategy.position_size > 0
    longSL := math.max(longSL, high - trailPointsLong)
else
    longSL := na
plot(longSL, color=color.green, style=plot.style_stepline, title='Long SL')

if strategy.position_size < 0
    shortSL := math.min(shortSL, low + trailPointsShort)
else
    shortSL := na
plot(shortSL, color=color.red, style=plot.style_stepline, title='Short SL')

bgcolor(timeWindow ? color.new(color.blue, 95) : na, title="Trading Hours Highlight")
if plotLongShape
    label.new(bar_index, low, "Buy", yloc=yloc.belowbar, color=color.green, textcolor=color.white, style=label.style_label_up)
if plotShortShape
    label.new(bar_index, high, "Sell", yloc=yloc.abovebar, color=color.red, textcolor=color.white, style=label.style_label_down)

// === DEBUG TABLE ===
var table debugTable = table.new(position.top_right, 3, 10, bgcolor=color.rgb(0, 0, 0, 80), border_color=color.white, border_width=1)
if barstate.islast
    table.cell(debugTable, 0, 0, 'Signal', text_color=color.rgb(168, 168, 168), bgcolor=color.rgb(50, 50, 50))
    table.cell(debugTable, 1, 0, 'Status', text_color=color.rgb(168, 168, 168), bgcolor=color.rgb(50, 50, 50))
    table.cell(debugTable, 2, 0, 'Priority', text_color=color.rgb(168, 168, 168), bgcolor=color.rgb(50, 50, 50))

    table.cell(debugTable, 0, 1, 'MA Long', text_color=color.blue)
    table.cell(debugTable, 1, 1, bullMA ? 'Yes' : 'No', text_color=bullMA ? color.green : color.red)
    table.cell(debugTable, 2, 1, signalPriority == 'MA' ? 'High' : 'Low', text_color=color.white)

    table.cell(debugTable, 0, 2, 'MA Short', text_color=color.blue)
    table.cell(debugTable, 1, 2, bearMA ? 'Yes' : 'No', text_color=bearMA ? color.green : color.red)
    table.cell(debugTable, 2, 2, signalPriority == 'MA' ? 'High' : 'Low', text_color=color.white)

    table.cell(debugTable, 0, 3, 'Bull Pattern', text_color=color.blue)
    table.cell(debugTable, 1, 3, bullPattern ? 'Yes' : 'No', text_color=bullPattern ? color.green : color.red)
    table.cell(debugTable, 2, 3, signalPriority == 'Pattern' ? 'High' : 'Low', text_color=color.white)

    table.cell(debugTable, 0, 4, 'Bear Pattern', text_color=color.blue)
    table.cell(debugTable, 1, 4, bearPattern ? 'Yes' : 'No', text_color=bearPattern ? color.green : color.red)
    table.cell(debugTable, 2, 4, signalPriority == 'Pattern' ? 'High' : 'Low', text_color=color.white)

    table.cell(debugTable, 0, 5, 'Filters', text_color=color.rgb(168, 168, 168), bgcolor=color.rgb(50, 50, 50))
    table.cell(debugTable, 1, 5, 'Status', text_color=color.rgb(168, 168, 168), bgcolor=color.rgb(50, 50, 50))
    table.cell(debugTable, 2, 5, '', text_color=color.white, bgcolor=color.rgb(50, 50, 50))

    table.cell(debugTable, 0, 6, 'Time Window', text_color=color.blue)
    table.cell(debugTable, 1, 6, timeWindow ? 'OK' : 'Closed', text_color=timeWindow ? color.green : color.red)
    table.cell(debugTable, 2, 6, str.tostring(currentHour) + 'h', text_color=color.white)

    table.cell(debugTable, 0, 7, 'Volume', text_color=color.blue)
    table.cell(debugTable, 1, 7, volumeOk ? 'OK' : 'Low', text_color=volumeOk ? color.green : color.red)
    table.cell(debugTable, 2, 7, str.tostring(volume, '#'), text_color=color.white)

    table.cell(debugTable, 0, 8, 'Volatility', text_color=color.blue)
    table.cell(debugTable, 1, 8, volatilityOk ? 'OK' : 'High', text_color=volatilityOk ? color.green : color.red)
    table.cell(debugTable, 2, 8, str.tostring(volatility * 100, '#.##') + '%', text_color=color.white)

    table.cell(debugTable, 0, 9, 'Signals', text_color=color.blue)
    table.cell(debugTable, 1, 9, longCondition and not shortCondition ? 'LONG' : shortCondition and not longCondition ? 'SHORT' : longCondition and shortCondition ? 'CONFLICT' : 'NONE', text_color=longCondition and not shortCondition ? color.green : shortCondition and not longCondition ? color.red : color.yellow)
    table.cell(debugTable, 2, 9, canEnter ? alertSent ? 'Sent' : 'Ready' : 'Cooldown', text_color=canEnter ? alertSent ? color.yellow : color.green : color.gray)

// === PERFORMANCE DASHBOARD ===
var table dashboard = table.new(position.bottom_left, 3, 3, bgcolor=color.rgb(0, 0, 0, 80), border_color=color.white, border_width=1)
if barstate.islast
    table.cell(dashboard, 0, 0, 'Position', text_color=color.rgb(168, 168, 168), bgcolor=color.rgb(50, 50, 50))
    table.cell(dashboard, 1, 0, 'P/L', text_color=color.rgb(168, 168, 168), bgcolor=color.rgb(50, 50, 50))
    table.cell(dashboard, 2, 0, 'Statistics', text_color=color.rgb(168, 168, 168), bgcolor=color.rgb(50, 50, 50))

    table.cell(dashboard, 0, 1, strategy.position_size > 0 ? 'Long' : strategy.position_size < 0 ? 'Short' : 'Flat', text_color=strategy.position_size > 0 ? color.green : strategy.position_size < 0 ? color.red : color.blue)
    table.cell(dashboard, 1, 1, str.tostring(strategy.netprofit, '#.##'), text_color=strategy.netprofit >= 0 ? color.green : color.red)
    table.cell(dashboard, 2, 1, 'Win Rate', text_color=color.white)

    table.cell(dashboard, 0, 2, strategy.position_size != 0 ? 'Bars: ' + str.tostring(bar_index - entryBarIndex) : '', text_color=color.white)
    table.cell(dashboard, 1, 2, strategy.position_size != 0 ? 'Cooldown: ' + str.tostring(cooldownMinutes) + 'm' : '', text_color=color.white)
    table.cell(dashboard, 2, 2, strategy.closedtrades > 0 ? str.tostring(strategy.wintrades / strategy.closedtrades * 100, '#.##') + '%' : 'N/A', text_color=color.white)

// === CHART TITLE ===
var table titleTable = table.new(position.bottom_right, 1, 1, bgcolor=color.rgb(0, 0, 0, 80), border_color=color.rgb(0, 50, 137), border_width=1)
table.cell(titleTable, 0, 0, "Dskyz - DAFE Trading Systems", text_color=color.rgb(159, 127, 255, 80), text_size=size.large)