दोहरी समय सीमा स्टोकेस्टिक ऑसिलेटर आर्बिट्रेज ट्रेडिंग रणनीति

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

इनपुट लॉजिक डिजाइन परिष्कृत है, सिग्नल की प्रभावशीलता की पुष्टि करने के लिए बहु-स्तरीयः

  • प्रवेश की शर्तेंः

    • %D लाइन के माध्यम से%K लाइन पर मुख्य संकेतक, और
    • %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% का मूल्य अंतर ऊपरी सीमा, आदि) विभिन्न बाजार स्थितियों के प्रति अतिसंवेदनशील हो सकते हैं और उन्हें अक्सर समायोजित करने की आवश्यकता होती है।

  4. समय सीमा के अवसर लागतकेवल सामान्य बाजार समय के दौरान व्यापार करने से कुछ महत्वपूर्ण पूर्व-बंद और पोस्ट-बंद अवसरों को याद किया जा सकता है, विशेष रूप से महत्वपूर्ण समाचारों के बाद बाजार की प्रतिक्रिया।

  5. तरलता पर निर्भरताउच्च आवृत्ति रणनीतियों में कम तरलता वाले बाजारों में स्लाइड पॉइंट्स की समस्या हो सकती है। वास्तविक निष्पादन मूल्य सिग्नल के निर्माण के समय के मूल्य से काफी भिन्न हो सकते हैं।

  6. तकनीकी संकेतक में देरी: यादृच्छिक उतार-चढ़ाव सूचक अपने आप में एक प्रकार का अंतराल है, विशेष रूप से तेजी से बदलते बाजारों में, जो समय पर टर्नओवर को पकड़ने में असमर्थ हो सकते हैं।

  7. अति-अनुरूपता का जोखिम: रणनीतिक मापदंडों के परिष्कृत समायोजन से ऐतिहासिक आंकड़ों को ओवरफिट किया जा सकता है और भविष्य के बाजार परिदृश्य में खराब प्रदर्शन हो सकता है।

रणनीति अनुकूलन दिशा

  1. अतिरिक्त रोकथामसबसे महत्वपूर्ण अनुकूलन बिंदु स्मार्ट स्टॉप सिस्टम को लागू करना है, एटीआर (औसत वास्तविक उतार-चढ़ाव की सीमा) के आधार पर स्टॉप रणनीति पर विचार किया जा सकता है, या तकनीकी स्तर (जैसे कि पूर्व-उच्च और निम्न) को स्टॉप पॉइंट के रूप में उपयोग किया जा सकता है, ताकि एक एकल लेनदेन के लिए अधिकतम नुकसान को सीमित किया जा सके।

  2. स्थिति प्रबंधन की शुरूआत: बाजार की अस्थिरता और खाते की जोखिम सहनशीलता के आधार पर व्यापार पैमाने को गतिशील रूप से समायोजित करें, विभिन्न संकेतों की ताकत के तहत विभिन्न स्थिति विन्यास का उपयोग करें ताकि पूंजी उपयोगिता और जोखिम-लाभ अनुपात को अनुकूलित किया जा सके।

  3. जोड़े गए लेनदेन की पुष्टि करें: सिस्टम में लेन-देन के संकेतकों को एकीकृत करने के लिए, यह आवश्यक है कि महत्वपूर्ण इनपुट सिग्नल को पर्याप्त लेन-देन समर्थन होना चाहिए, जो कम लेन-देन वाले वातावरण में अविश्वसनीय संकेतों को फ़िल्टर कर सके।

  4. बहु-सूचक एकीकरणअन्य गतिशीलता और रुझान संकेतकों जैसे कि आरएसआई, एमएसीडी या ब्रिन बैंड के संयोजन पर विचार करें, एक अधिक व्यापक बाजार परिप्रेक्ष्य का निर्माण करें और सिस्टम की स्थिरता में सुधार करें।

  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")