
स्व-अनुकूली अस्थिरता बहु-संकेतक प्रवृत्ति ट्रैकिंग ट्रेडिंग सिस्टम एक उच्च अस्थिरता वाले बाजार के लिए डिज़ाइन की गई एक मात्रात्मक ट्रेडिंग रणनीति है, जो गतिशील रूप से समायोजित तकनीकी संकेतकों और उन्नत जोखिम प्रबंधन तंत्र को जोड़ती है। इस रणनीति का मुख्य भाग एटीआर (औसत वास्तविक तरंगों की चौड़ाई) के माध्यम से गतिशील रूप से समायोजित करने के लिए है, जो बाजार में उतार-चढ़ाव के लिए खुद को अनुकूलित करता है, जबकि आरएसआई ओवर-ओवर खरीद, ओवर-बिक्री फ़िल्टर, स्टैंड-बाय पैटर्न, बहु-समय अवधि की प्रवृत्ति की पहचान और चरणबद्ध स्टॉक निर्माण (डीसीए) जैसी सुविधाओं को एकीकृत करता है। यह रणनीति विशेष रूप से उच्च अस्थिरता वाले वातावरण जैसे कि वायदा बाजार के लिए उपयुक्त है, जो दिन के भीतर व्यापार और लहरों के व्यापार के लिए एक लचीला ऑपरेशन मोड प्रदान करता है।
इस रणनीति के मूल सिद्धांत निम्नलिखित प्रमुख मॉड्यूल पर आधारित हैंः
अनुकूलनशील गतिशील समरेखा प्रणालीरणनीतिः तेज और धीमी गति से सरल चलती औसत रेखा (एसएमए) का उपयोग करें, जिसकी लंबाई एटीआर के माध्यम से गतिशील रूप से समायोजित की जाती है। उच्च अस्थिरता वाले वातावरण में, बाजार में बदलाव के लिए तेजी से प्रतिक्रिया करने के लिए औसत रेखा की लंबाई कम हो जाती है; कम अस्थिरता वाले वातावरण में, औसत रेखा की लंबाई को शोर को कम करने के लिए बढ़ाया जाता है। लंबे सिग्नल तेज औसत रेखा पर धीमी गति से औसत रेखा को पार करने और कीमत की पुष्टि करने पर उत्पन्न होते हैं; इसके विपरीत, लघु सिग्नल।
आरएसआई गतिशीलता फ़िल्टरप्रवेश संकेतों को आरएसआई के माध्यम से सत्यापित करें, यह सुनिश्चित करने के लिए कि व्यापार की दिशा बाजार की गतिशीलता के अनुरूप है। इस सुविधा को चालू या बंद किया जा सकता है, और कस्टम आरएसआई पैरामीटर का समर्थन करता है, जैसे कि लंबाई 14, ओवरबॉय 60, ओवरबॉय 40) ।
आकृति पहचान: सिस्टम मजबूत बेंचमार्क या बेंचमार्क स्वैपिंग पैटर्न को पहचानने में सक्षम है, और ट्रेड वॉल्यूम और रेंज की ताकत के संयोजन के साथ सत्यापन करता है। झूठे संकेतों से बचने के लिए, सिस्टम एक साथ दो विपरीत पैटर्न होने पर ट्रेडों को छोड़ देता है।
बहु-अवधि प्रवृत्ति की पुष्टि: ट्रेडिंग सिग्नल को 15 मिनट के समय चक्र के SMA रुझान के साथ वैकल्पिक रूप से संरेखित करें, ट्रेडिंग गुणवत्ता में सुधार के लिए एक पुष्टिकरण तंत्र की एक परत जोड़ें।
डीसीए तंत्र: प्रवृत्ति की दिशा में कई प्रविष्टियों की अनुमति दी, एक पूर्वनिर्धारित संख्या में प्रविष्टियों के लिए अधिकतम समर्थन (जैसे 4 बार), प्रविष्टि अंतराल एटीआर गुणांक के आधार पर सेट किया गया। यह तंत्र प्रवृत्ति के निरंतर बाजार में औसत लागत का अनुकूलन करने में मदद करता है।
उच्च जोखिम प्रबंधन:
लेनदेन निष्पादन तर्क: सिस्टम ने गतिशील औसत रेखा या गिरने वाले सिग्नल को प्राथमिकता दी ((उपयोगकर्ता के चयन के अनुसार), और लेनदेन मात्रा, अस्थिरता और समय फ़िल्टर लागू किए। प्रवेश की गुणवत्ता सुनिश्चित करने के लिए, लेनदेन मात्रा शिखर शर्तें भी बढ़ाई गई हैं ((लेनदेन मात्रा> 1.2*10 एसएमए)
बाजार अनुकूलनशीलएटीआर के माध्यम से गतिशील रूप से तकनीकी संकेतक पैरामीटर को समायोजित करने के लिए, रणनीति को विभिन्न बाजार स्थितियों के लिए स्वचालित रूप से अनुकूलित किया जा सकता है, जो उच्च अस्थिरता और कम अस्थिरता वाले वातावरण में प्रभावी रहता है।
सिग्नल गुणवत्ता फ़िल्टरिंगबहु-स्तरित फ़िल्टरिंग तंत्र (आरएसआई, बहु-समय चक्र की प्रवृत्ति, लेन-देन की मात्रा और अस्थिरता) का उपयोग करने से झूठे संकेतों को कम करने और व्यापार की गुणवत्ता में सुधार करने में मदद मिलती है।
लचीला प्रवेश तंत्र: उपयोगकर्ता की वरीयताओं के अनुसार मोबाइल समरेखा या गिरने वाले सिग्नल को प्राथमिकता देने और DCA फ़ंक्शन के माध्यम से प्रवृत्ति की दिशा में प्रवेश बिंदुओं को अनुकूलित करने का समर्थन करता है।
गतिशील जोखिम प्रबंधन: स्टॉप लॉस और ट्रैकिंग स्टॉप लॉस बाजार में उतार-चढ़ाव और ट्रेडिंग मुनाफे की गतिशीलता के साथ समायोजन करते हैं, पूंजी की रक्षा करते हुए प्रवृत्ति को पर्याप्त विकास की जगह देते हैं।
विज़ुअलाइज़ेशन और डिबगिंग उपकरण: रणनीति एक समृद्ध चार्ट कवर परत, वास्तविक समय टायरबोर्ड और डीबगिंग तालिका प्रदान करती है जो उपयोगकर्ताओं को पैरामीटर को अनुकूलित करने और व्यापारिक तर्क को समझने में मदद करती है।
मॉड्यूलर डिजाइन: उपयोगकर्ता अपनी पसंद के अनुसार विभिन्न सुविधाओं को चालू या बंद कर सकता है (जैसे कि आरएसआई फ़िल्टर, ब्रेकडाउन पैटर्न पहचान, बहु-समय चक्र रुझान, आदि), अत्यधिक अनुकूलन योग्य।
सूक्ष्म प्रवेश नियंत्रणलेन-देन के चरम पर फ़िल्टर केवल महत्वपूर्ण बाजार गतिविधियों के दौरान प्रवेश सुनिश्चित करता है, जबकि शीतलन अवधि की व्यवस्था अत्यधिक व्यापार को रोकती है।
समाधान: व्यापक पैरामीटर अनुकूलन परीक्षण करें, लेकिन अति-अनुकूलन से बचें; रणनीति की स्थिरता को सत्यापित करने के लिए वॉक-फॉरवर्ड परीक्षण और आउट-ऑफ-नमूना परीक्षण का उपयोग करें।
समाधान: बाजार की स्थिति की पहचान करने के लिए एक तंत्र को जोड़ने पर विचार करें, विभिन्न बाजार स्थितियों में विभिन्न पैरामीटर सेट का उपयोग करें; कुल जोखिम प्रतिबंधों को लागू करें, जैसे कि प्रति दिन अधिकतम नुकसान या लगातार नुकसान के बाद व्यापार को रोकना।
*समाधान*वास्तविक स्लिप पॉइंट और कमीशन अनुमानों को रिटर्न्स में शामिल करना; कम तरलता वाले समय में व्यापार करने से बचना; बाजार मूल्य के बजाय सीमा सूची का उपयोग करने पर विचार करना।
समाधान: रणनीति द्वारा प्रदान किए गए डिबगिंग टूल का उपयोग करके प्रत्येक घटक के प्रदर्शन की बारीकी से निगरानी करें; अच्छा कोड एनोटेशन बनाए रखें; मॉड्यूलर परीक्षण के लिए प्रत्येक घटक की स्वतंत्र प्रभावशीलता पर विचार करें
समाधान: उचित शीतलन अवधि और न्यूनतम होल्डिंग समय सेट करें; ट्रेडिंग लागतों को रीट्रेसमेंट में सख्ती से विचार करें; नियमित रूप से प्रवेश मानदंडों की समीक्षा और अनुकूलन करें।
मशीन लर्निंग: अनुकूलनशील पैरामीटर अनुकूलन एल्गोरिदम जैसे कि बेयज़ ऑप्टिमाइज़ेशन या आनुवंशिक एल्गोरिदम को स्वचालित रूप से विभिन्न बाजार स्थितियों के लिए इष्टतम पैरामीटर संयोजन खोजने के लिए पेश करना। यह मैनुअल अनुकूलन की आवश्यकता को कम करेगा और बाजार में परिवर्तन के लिए रणनीति की अनुकूलनशीलता को बढ़ाएगा।
बाज़ार परिवेश वर्गीकरण: बाजार की स्थिति वर्गीकरण प्रणाली विकसित करना ((प्रवृत्ति, उतार-चढ़ाव, उच्च उतार-चढ़ाव, कम उतार-चढ़ाव, आदि) और प्रत्येक स्थिति के लिए सबसे अच्छा पैरामीटर विन्यास प्रदान करना। इस पद्धति से बाजार में बदलाव के दौरान रणनीतिक व्यवहार को अधिक तेज़ी से समायोजित किया जा सकता है और अनुकूलन में देरी को कम किया जा सकता है।
बढ़ी हुई स्थिति प्रबंधन: अधिक जटिल स्थिति प्रबंधन एल्गोरिदम की शुरूआत, जैसे कि कैली नियम या गतिशीलता की ताकत के आधार पर गतिशील स्थिति समायोजन। इससे धन का उपयोग अनुकूलित किया जा सकता है, मजबूत संकेतों के दौरान जोखिम बढ़ाया जा सकता है और कमजोर संकेतों के दौरान जोखिम कम किया जा सकता है।
वैकल्पिक सूचकांक एकीकरण: अन्य तकनीकी संकेतकों की प्रभावशीलता का परीक्षण करें, जैसे कि बोलिंगर बैंड, एमएसीडी या इचिमोकू क्लाउड चार्ट, मौजूदा प्रणालियों के पूरक या विकल्प के रूप में। विभिन्न संकेतकों से विशिष्ट बाजार स्थितियों में अधिक सटीक संकेत मिल सकते हैं।
भावनात्मक डेटा एकीकरण: संभावित बाजार परिवर्तनों की पूर्व पहचान करने के लिए बाजार की भावना के संकेतकों जैसे कि VIX अस्थिरता सूचकांक या विकल्प बाजार के आंकड़ों को शामिल करने पर विचार करें। ये बाहरी डेटा स्रोत ऐसी जानकारी प्रदान कर सकते हैं जो पारंपरिक तकनीकी संकेतकों द्वारा कैप्चर नहीं की जा सकती है।
बहु-संपत्ति संबंध विश्लेषण: परिसंपत्ति वर्गों के बीच सहसंबंध विश्लेषण विकसित करना, एक बाजार के संकेतों का उपयोग करके दूसरे संबंधित बाजार के व्यापारिक निर्णयों को सत्यापित या मजबूत करना। उदाहरण के लिए, संबंधित स्टॉक सेक्टर के रुझानों की पुष्टि करने के लिए वस्तुओं की कीमतों में बदलाव का उपयोग करना।
गणना दक्षता का अनुकूलन: विशेष रूप से उच्च आवृत्ति रणनीतियों के लिए गणना दक्षता बढ़ाने के लिए कोड को फिर से बनाना। इसमें एटीआर गणना, शर्त मूल्यांकन अनुक्रम को अनुकूलित करना और अनावश्यक दोहराव को कम करना शामिल है।
स्व-अनुकूली अस्थिरता बहु-सूचक ट्रेंड ट्रैकिंग ट्रेडिंग सिस्टम एक व्यापक और लचीला मात्रात्मक ट्रेडिंग दृष्टिकोण का प्रतिनिधित्व करता है जो गतिशील पैरामीटर समायोजन और बहु-स्तरित फ़िल्टरिंग तंत्र के माध्यम से विभिन्न बाजार स्थितियों के लिए प्रभावी रूप से प्रतिक्रिया करता है। रणनीति की मुख्य ताकत इसकी स्व-अनुकूली और व्यापक जोखिम प्रबंधन ढांचे में है, जो इसे उच्च अस्थिरता वाले वायदा बाजारों के लिए विशेष रूप से उपयुक्त बनाता है।
इस रणनीति में कई क्लासिक तकनीकी विश्लेषण उपकरण शामिल हैं (चलने वाली औसत, आरएसआई, मंदी) और आधुनिक क्वांटिटेटिव ट्रेडिंग तत्वों को शामिल किया गया है (अनुकूली पैरामीटर, बहु-समय चक्र विश्लेषण, डीसीए), एक संतुलित प्रणाली बनाने के लिए। प्रवेश के समय को बारीकी से नियंत्रित करके, कई प्रवेश रणनीतियों को अनुकूलित करके और रोकथाम के स्तर को गतिशील रूप से समायोजित करके, यह रणनीति पूंजी की रक्षा करते हुए, बाजार की प्रवृत्ति के अवसरों का पूरा लाभ उठाने में सक्षम है।
हालांकि, रणनीतियों की जटिलता के साथ-साथ पैरामीटर संवेदनशीलता और सिस्टम रखरखाव की चुनौतियां भी हैं। निवेशकों को रणनीति को लागू करने से पहले पर्याप्त बैक-एंड-फॉरवर्ड परीक्षण करना चाहिए और बाजार में बदलाव के अनुसार पैरामीटर को समायोजित करने के लिए तैयार रहना चाहिए। भविष्य के अनुकूलन दिशाओं में मशीन लर्निंग तकनीक के स्वचालित अनुकूलन पैरामीटर की शुरूआत, बाजार परिवेश वर्गीकरण प्रणाली में शामिल होना और स्थिति प्रबंधन एल्गोरिदम में सुधार शामिल हैं, जो रणनीतियों की स्थिरता और अनुकूलनशीलता को और बढ़ाएंगे।
कुल मिलाकर, यह रणनीति एक ठोस, मात्रात्मक ट्रेडिंग फ्रेमवर्क प्रदान करती है, जो अनुभवी व्यापारियों के लिए उपयुक्त है, जो आज के तेजी से बदलते वित्तीय बाजारों में एक सुसंगत व्यापारिक लाभ की तलाश में विशिष्ट आवश्यकताओं और जोखिम वरीयताओं के अनुसार अनुकूलित हैं।
/*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)