
خود کار طریقے سے لچکدار کثیر اشارے رجحان ٹریکنگ ٹریڈنگ سسٹم ایک اعلی لچکدار مارکیٹ کے لئے ڈیزائن کیا گیا ایک مقداری ٹریڈنگ حکمت عملی ہے، جس میں متحرک ایڈجسٹ تکنیکی اشارے اور اعلی درجے کی خطرے کے انتظام کے طریقہ کار کو یکجا کیا گیا ہے۔ اس حکمت عملی کا بنیادی مرکز اے ٹی آر ((اوسط حقیقی لہر) کے ذریعے متحرک طور پر متحرک اوسط پیرامیٹرز کو ایڈجسٹ کرنا ہے ، جس سے مارکیٹ میں اتار چڑھاو کا خود بخود انتظام کیا جاسکتا ہے ، جبکہ آر ایس آئی اوور اوور خریدنے ، اوور سیل فلٹر ، پلیٹ فارم کی شکل ، متعدد وقت کی مدت کے رجحانات کی شناخت ، تصدیق اور مرحلہ وار پوزیشن (ڈی سی اے) وغیرہ کو مربوط کیا جاسکتا ہے۔ یہ حکمت عملی خاص طور پر فیوچر مارکیٹ جیسے اعلی اتار چڑھاؤ والے ماحول کے لئے موزوں ہے۔ یہ دن کے اندر تجارت اور لہر کے تجارتی سیشنوں کے لچکدار آپریٹنگ ماڈل فراہم کرتا ہے۔
اس حکمت عملی کے بنیادی اصول مندرجہ ذیل اہم ماڈیولز پر مبنی ہیں:
خود کار طریقے سے متحرک یکساں نظامحکمت عملی: تیز رفتار اور سست رفتار سادہ حرکت پذیر اوسط لکیریں ((SMA) کا استعمال کریں ، جس کی لمبائی اے ٹی آر کے ذریعہ متحرک طور پر ایڈجسٹ کی جائے۔ اعلی اتار چڑھاؤ والے ماحول میں ، اوسط لکیروں کی لمبائی مارکیٹ میں تیزی سے رد عمل ظاہر کرنے کے لئے مختصر کردی جاتی ہے۔ کم اتار چڑھاؤ والے ماحول میں ، اوسط لکیروں کی لمبائی شور کو کم کرنے کے لئے بڑھا دی جاتی ہے۔ لمبا سگنل تیز رفتار اوسط لکیروں پر سست رفتار اوسط لکیروں کو عبور کرنے اور قیمت کی تصدیق کے وقت پیدا ہوتا ہے۔ مختصر سگنل اس کے برعکس۔
RSI متحرک فلٹر: آر ایس آئی کے ذریعے داخلہ سگنل کی توثیق کریں ، اس بات کو یقینی بنائیں کہ تجارت کی سمت مارکیٹ کی حرکیات کے مطابق ہے۔ یہ خصوصیت اختیاری طور پر آن یا آف کی جاسکتی ہے ، اور اپنی مرضی کے مطابق آر ایس آئی پیرامیٹرز کی حمایت کرتی ہے (جیسے لمبائی 14 ، اوور بائی 60 ، اوور سیل 40) ۔
ٹوٹ پھوٹ کی شناخت: سسٹم مضبوط بیج یا بیج ڈوبنے والی شکلوں کو پہچاننے کے قابل ہے ، اور اس کی توثیق کرنے کے لئے حجم اور رینج کی طاقت کو جوڑتا ہے۔ غلط سگنل سے بچنے کے لئے ، جب دو مخالف شکلیں بیک وقت آتی ہیں تو سسٹم تجارت کو چھوڑ دیتا ہے۔
ملٹی ٹائم سائیکل رجحان کی تصدیق: ٹریڈنگ سگنل کو 15 منٹ کی مدت کے ایس ایم اے رجحانات کے ساتھ اختیاری طور پر سیدھ کریں ، تصدیق کے طریقہ کار کی ایک پرت شامل کریں ، اور تجارت کے معیار کو بہتر بنائیں۔
ڈی سی اے کا مرحلہ وار قیام: رجحانات کی سمت میں بہت سے داخلے کی اجازت دیں ، زیادہ سے زیادہ پہلے سے طے شدہ تعداد میں داخلے کی حمایت کریں (جیسے 4 بار) ، داخلہ وقفہ اے ٹی آر ضارب پر مبنی ہے۔ یہ طریقہ کار رجحانات کے جاری رہنے والے بازاروں میں اوسط لاگت کو بہتر بنانے میں معاون ہے۔
اعلی درجے کی خطرے کے انتظام:
ٹرانزیکشن پر عملدرآمد کی منطق: سسٹم منتقل اوسط یا گرنے والی شکل کے اشارے کو ترجیح دیتا ہے ((صارف کے انتخاب کے مطابق) ، اور ٹرانزیکشن ، اتار چڑھاؤ اور وقت کے فلٹرز کو لاگو کرتا ہے۔ داخلے کے معیار کو یقینی بنانے کے لئے ، ٹرانزیکشن کی چوٹی کی شرائط کو بھی بڑھایا گیا ہے۔ ((ٹرانزیکشن> 1.2*10 ایس ایم اے)
مارکیٹ کی لچکاے ٹی آر کے ذریعے تکنیکی اشارے کی پیرامیٹرز کو متحرک طور پر ایڈجسٹ کرنے سے حکمت عملی خود بخود مختلف مارکیٹ کے حالات کے مطابق ڈھال لی جاتی ہے ، جو اعلی اتار چڑھاؤ اور کم اتار چڑھاؤ والے ماحول میں موثر رہتی ہے۔
سگنل کے معیار کی فلٹرنگ: کثیر پرت فلٹرنگ میکانزم ((آر ایس آئی ، کثیر وقتی رجحانات ، حجم اور اتار چڑھاؤ) جعلی سگنل کو کم کرنے اور تجارت کے معیار کو بہتر بنانے کے لئے موثر ہے۔
لچکدار داخلے کا طریقہ کار: صارف کی ترجیحات کے مطابق موبائل اوسط یا گرنے والی شکل کے اشارے کو ترجیح دینے کی حمایت کریں ، اور رجحان کی سمت میں ڈی سی اے فنکشن کے ذریعہ انٹری پوائنٹ کو بہتر بنائیں۔
متحرک خطرے کے انتظام: اسٹاپ نقصان اور ٹریکنگ اسٹاپ نقصان مارکیٹ میں اتار چڑھاؤ اور ٹریڈنگ منافع کی حرکیات کے مطابق ایڈجسٹ کریں ، سرمایہ کی حفاظت کے ساتھ ساتھ رجحان کو کافی ترقی دینے کی اجازت دیں۔
بصری اور ڈیبگنگ ٹولزحکمت عملی: حکمت عملی میں گراف کی ایک وسیع پرت ، ریئل ٹائم ڈیش بورڈ اور ڈیبگ ٹیبلز شامل ہیں جو صارفین کو پیرامیٹرز کو بہتر بنانے اور تجارتی منطق کو سمجھنے میں مدد فراہم کرتے ہیں۔
ماڈیولر ڈیزائن: صارف اپنی ترجیحات کے مطابق مختلف افعال کو آن یا آف کرسکتا ہے (جیسے آر ایس آئی فلٹرنگ ، حادثے کی شکل کی شناخت ، کثیر وقتی رجحانات وغیرہ) ، انتہائی تخصیص کردہ۔
ٹھیک سے داخلہ کنٹرولٹرانزیکشن کی چوٹی کے فلٹر صرف اہم مارکیٹ کی سرگرمیوں کے دوران داخل ہونے کو یقینی بناتے ہیں ، اور ٹھنڈک کا نظام ضرورت سے زیادہ تجارت کو روکتا ہے۔
حل: وسیع پیمانے پر پیرامیٹرز کو بہتر بنانے کے لئے ٹیسٹ کریں ، لیکن زیادہ سے زیادہ اصلاح سے گریز کریں۔ حکمت عملی کی استحکام کی توثیق کرنے کے لئے واک فارورڈ ٹیسٹنگ اور نمونہ سے باہر ٹیسٹنگ کا استعمال کریں۔
حل: مارکیٹ کی حالت کی شناخت کے طریقہ کار کو شامل کرنے پر غور کریں ، مختلف مارکیٹ کے ماحول میں مختلف پیرامیٹرز کے سیٹ کا استعمال کریں۔ مجموعی طور پر خطرے کی پابندیوں کو نافذ کریں ، جیسے روزانہ کی زیادہ سے زیادہ نقصان یا مسلسل نقصان کے بعد تجارت کو روکنا۔
حل: ریٹرننگ میں حقیقی سلائڈ پوائنٹس اور کمیشن کا تخمینہ شامل کریں۔ کم لیکویڈیٹی کے اوقات میں تجارت سے گریز کریں۔ مارکیٹ کی قیمت کے بجائے حد کی فہرست استعمال کرنے پر غور کریں۔
حل: حکمت عملی کے ذریعہ فراہم کردہ ڈیبگنگ ٹولز کا استعمال کرتے ہوئے ہر جزو کی کارکردگی کی قریب سے نگرانی کریں۔ کوڈ کے اچھے تبصرے کو برقرار رکھیں؛ ماڈیولر ٹیسٹنگ کے لئے ہر جزو کے آزادانہ اثر پر غور کریں۔
حل: ٹھنڈک کی مدت اور کم سے کم انعقاد کا وقت مناسب طریقے سے ترتیب دیا گیا ہے۔ واپسی میں تجارت کے اخراجات پر سختی سے غور کیا گیا ہے۔ داخلے کے معیار کا باقاعدگی سے جائزہ لیا جاتا ہے اور اس کو بہتر بنایا جاتا ہے۔
مشین سیکھنے میں اضافہ: خود کو اپنانے والے پیرامیٹرز کی اصلاح کے الگورتھم متعارف کروائیں ، جیسے بیزس آپٹیمائزیشن یا جینیاتی الگورتھم ، جو مختلف مارکیٹ کے حالات کے لئے خود بخود بہترین پیرامیٹرز کا مجموعہ تلاش کرے گا۔ اس سے دستی اصلاح کی ضرورت کو کم کیا جائے گا اور مارکیٹ میں تبدیلیوں کے ل strategies حکمت عملیوں کی موافقت میں اضافہ ہوگا۔
مارکیٹ کے ماحول کی درجہ بندی: مارکیٹ کی حالت کی درجہ بندی کا نظام تیار کریں ((رجحانات ، جھٹکے ، اعلی اتار چڑھاؤ ، کم اتار چڑھاؤ وغیرہ) ، اور ہر حالت کے لئے بہترین پیرامیٹرز کی تشکیل کریں۔ اس طریقہ کار سے مارکیٹ میں تبدیلی کے وقت حکمت عملی کے عمل کو زیادہ تیزی سے ایڈجسٹ کیا جاسکتا ہے ، جس سے موافقت میں تاخیر کم ہوسکتی ہے۔
بہتر پوزیشن مینجمنٹ: زیادہ پیچیدہ پوزیشن مینجمنٹ الگورتھم متعارف کروائیں ، جیسے کیلی گائیڈ لائن یا متحرک طاقت پر مبنی متحرک پوزیشن ایڈجسٹمنٹ۔ اس سے فنڈز کے استعمال کو بہتر بنایا جاسکتا ہے ، مضبوط سگنل کے دوران نمائش میں اضافہ ہوتا ہے ، اور کمزور سگنل کے دوران خطرہ کم ہوتا ہے۔
متبادل انڈیکس انضمام: دیگر تکنیکی اشارے کی افادیت کی جانچ کرنا ، جیسے بولنگر بینڈ ، MACD یا Ichimoku کلاؤڈ چارٹ ، موجودہ نظام کی تکمیل یا متبادل کے طور پر۔ مختلف اشارے مخصوص مارکیٹ کے حالات میں زیادہ درست سگنل فراہم کرسکتے ہیں۔
جذباتی اعداد و شمار کا انضمام: مارکیٹ کے جذبات کے اشارے شامل کرنے پر غور کریں ، جیسے کہ وی آئی ایکس اتار چڑھاؤ انڈیکس یا آپشن مارکیٹ کے اعداد و شمار ، تاکہ مارکیٹ میں ممکنہ تبدیلیوں کی پیشگی شناخت کی جاسکے۔ یہ بیرونی اعداد و شمار کے ذرائع معلومات فراہم کرسکتے ہیں جو روایتی تکنیکی اشارے نہیں پکڑ سکتے۔
ملٹی اثاثہ وابستگی تجزیہ: اثاثوں کی کلاسوں کے مابین وابستگی کا تجزیہ تیار کرنا ، ایک مارکیٹ کے سگنل کو دوسرے متعلقہ مارکیٹ میں تجارتی فیصلوں کی توثیق یا تقویت دینے کے لئے استعمال کرنا۔ مثال کے طور پر ، متعلقہ اسٹاک سیکٹر میں رجحانات کی تصدیق کے لئے اجناس کی قیمتوں میں تبدیلی کا استعمال کرنا۔
کمپیوٹنگ کی کارکردگی کو بہتر بنائیں: کوڈ کو دوبارہ تشکیل دیں تاکہ حساب کتاب کی کارکردگی کو بہتر بنایا جاسکے ، خاص طور پر ہائی فریکوئینسی حکمت عملیوں کے لئے۔ اس میں اے ٹی آر کے حساب کتاب کو بہتر بنانا ، شرائط کی جانچ پڑتال کی ترتیب اور غیر ضروری دوہرا حساب کتاب کو کم کرنا شامل ہے۔
خود کو اپنانے والی اتار چڑھاؤ کی شرح کے ساتھ ملٹی اشارے ٹرینڈ ٹریکنگ ٹریڈنگ سسٹم ایک جامع اور لچکدار مقداری ٹریڈنگ طریقہ کار کی نمائندگی کرتا ہے ، جو متحرک پیرامیٹرز کی ایڈجسٹمنٹ اور ایک کثیر پرت فلٹرنگ میکانزم کے ذریعہ مختلف مارکیٹ کے حالات کا مؤثر طریقے سے جواب دیتا ہے۔ حکمت عملی کا بنیادی فائدہ اس کی خود کو اپنانے اور جامع خطرے کے انتظام کے فریم ورک میں ہے ، جو اسے خاص طور پر اعلی اتار چڑھاؤ والی فیوچر مارکیٹوں کے لئے موزوں بناتا ہے۔
اس حکمت عملی میں متعدد کلاسیکی تکنیکی تجزیہ ٹولز ((موبائل اوسط ، آر ایس آئی ، گرنے والی شکل) کو مربوط کیا گیا ہے ، جبکہ جدید مقداری ٹریڈنگ عناصر کو شامل کیا گیا ہے ((مطابقہ پیرامیٹرز ، کثیر وقت کی مدت کا تجزیہ ، ڈی سی اے) ، تاکہ ایک متوازن نظام تشکیل دیا جاسکے۔ داخلے کے وقت کو دھیان سے کنٹرول کرکے ، متعدد داخلے کی حکمت عملی کو بہتر بنانے اور روک تھام کی سطح کو متحرک طور پر ایڈجسٹ کرکے ، یہ حکمت عملی سرمایہ کی حفاظت کے ساتھ ساتھ ، مارکیٹ کے رجحانات کے مواقع سے بھر پور فائدہ اٹھانے کے قابل ہے۔
تاہم ، حکمت عملی کی پیچیدگی بھی پیرامیٹرز کی حساسیت اور نظام کی بحالی کے چیلنجوں کا باعث بنتی ہے۔ اس حکمت عملی کو نافذ کرنے سے پہلے ، سرمایہ کاروں کو کافی حد تک پیچھے کی جانچ اور آگے کی جانچ کرنا چاہئے ، اور مارکیٹ میں تبدیلیوں کے مطابق پیرامیٹرز کو ایڈجسٹ کرنے کے لئے تیار رہنا چاہئے۔ مستقبل میں اصلاح کی سمت میں مشین لرننگ ٹکنالوجی کو متعارف کرانے ، مارکیٹ کے ماحول کے درجہ بندی کے نظام میں شامل ہونے اور پوزیشن مینجمنٹ الگورتھم میں بہتری شامل ہے۔
مجموعی طور پر، یہ حکمت عملی ایک ٹھوس مقدار میں ٹریڈنگ فریم ورک فراہم کرتی ہے، جو تجربہ کار تاجروں کے لئے مناسب ہے جو مخصوص ضروریات اور خطرے کی ترجیحات کے مطابق اپنی مرضی کے مطابق ہے، جو آج کی تیزی سے بدلتی ہوئی مالیاتی مارکیٹوں میں مسلسل ٹریڈنگ کا فائدہ حاصل کرتی ہے.
/*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)