Invalid stops (10016/130) — MT5/MT4 में SL
विषय सूची
- Invalid stops क्या है (10016 और 130 में अंतर)
- ① TRADE_RETCODE_INVALID_STOPS = 10016 (MT5 / `OrderSend()` का रिटर्न कोड)
- ② ERR_INVALID_STOPS = 130 (MT4 / `GetLastError()`)
- सबसे पहले 30 सेकंड में जांच करें
- कारण और समाधान (6 पैटर्न)
- ① SL/TP मौजूदा प्राइस के बहुत करीब है (स्टॉप लेवल से कम)
- ② SL/TP की दिशा उल्टी है (BUY/SELL की गड़बड़ी)
- ③ फ्रीज़ लेवल के अंदर ऑर्डर/पोज़िशन में बदलाव
- ④ प्राइस और पॉइंट (दूरी) की गड़बड़ी
- ⑤ मार्केट एक्ज़िक्यूशन ब्रोकर में एंट्री के समय SL/TP पास नहीं होता
- ⑥ सिंबल की अपनी खासियत (गोल्ड, इंडेक्स में स्टॉप लेवल ज़्यादा होता है)
- ब्रोकर के अनुसार अंतर (ध्यान देने योग्य बातें)
- MQL5 में इस एरर को रोकने वाला कोड (EA डेवलपर्स के लिए)
- ऑर्डर भेजने से पहले SL/TP को वेरिफाई और क्लैंप करें
- retcode 10016 को अलग से हैंडल करें
- ट्रेल मॉडिफिकेशन से पहले फ्रीज़ लेवल जांचें
- प्राथमिकता चेकलिस्ट
- सारांश
- FAQ
- Q: SL/TP की कैलकुलेशन सही होनी चाहिए, फिर भी Invalid stops आता है। क्यों?
- Q: 10016 और 130 में क्या अंतर है?
- Q: आम तौर पर नहीं आता, लेकिन इकॉनोमिक इवेंट के समय ही Invalid stops आता है।
- Q: SL/TP के बिना ऑर्डर पास हो जाता है, लेकिन SL/TP के साथ रिजेक्ट होता है।
- Q: EURUSD पर सही चलने वाला EA, गोल्ड पर बार-बार Invalid stops दे रहा है।
Invalid stops (10016/130) को पूरी तरह हल करें
EA चलाते समय Expert टैब में Invalid stops या OrderSend error 130 दिखने पर अक्सर लगता है कि "क्या SL की वैल्यू गलत है? पर कैलकुलेशन तो सही होनी चाहिए…" — लेकिन असल में इस एरर का अधिकांश हिस्सा SL/TP की कैलकुलेशन गलती नहीं, बल्कि "ब्रोकर द्वारा तय की गई न्यूनतम दूरी की नियम" का उल्लंघन होता है। वैल्यू खुद सही होने पर भी, अगर यह मौजूदा प्राइस के बहुत करीब है, दिशा उल्टी है, या मॉडिफिकेशन-प्रतिबंधित ज़ोन में है — तो इसे रिजेक्ट कर दिया जाता है।
यह आर्टिकल MT5/MT4 पर EA इस्तेमाल करने वालों और MQL5 में EA लिखने वालों — दोनों के लिए है, जिसमें Invalid stops की असल पहचान, 6 कारण, 30 सेकंड की जांच, और कोड स्तर पर स्थायी समाधान — सब कुछ एक जगह समेटा गया है। सभी एरर कोड्स की पूरी लिस्ट के लिए MQL5 / MT5 एरर कोड समाधान की संपूर्ण गाइड देखें।
यह आर्टिकल जुलाई 2026 के समय के MT5 (build 4xxx सीरीज़) को आधार मानकर लिखा गया है। स्टॉप लेवल की सटीक वैल्यू हर ब्रोकर और सिंबल के अनुसार अलग होती है।
Invalid stops क्या है (10016 और 130 में अंतर)
"अमान्य स्टॉप" को दर्शाने वाले दो अलग वैल्यू MT5 और MT4 (जनरेशन) में मौजूद हैं। यह पहचानना कि यह किस प्लेटफ़ॉर्म और किस स्टेज पर आया है, कारण खोजने की प्रक्रिया को काफी तेज़ कर देता है।
① TRADE_RETCODE_INVALID_STOPS = 10016 (MT5 / OrderSend() का रिटर्न कोड)
MQL5 के OrderSend() का नतीजा MqlTradeResult.retcode में आता है। अगर रिक्वेस्ट में दिया गया SL/TP (या पेंडिंग ऑर्डर की प्राइस से उसका संबंध) सर्वर के नियमों से मेल नहीं खाता, तो इसे 10016 (TRADE_RETCODE_INVALID_STOPS) के साथ रिजेक्ट किया जाता है। यह ट्रेडिंग सर्वर की ओर से आने वाला रिजेक्शन नोटिफिकेशन है।
अर्थ: रिक्वेस्ट में दिया गया स्टॉप (SL/TP) अमान्य है (Invalid stops in the request)
कॉन्स्टेंट: TRADE_RETCODE_INVALID_STOPS
वैल्यू : 10016
// लॉग में दिखने वाला सामान्य उदाहरण
2026.07.07 09:15:32.441 EA_NAME XAUUSD,M5: OrderSend error: retcode=10016 (invalid stops)
② ERR_INVALID_STOPS = 130 (MT4 / GetLastError())
MT4 (MQL4) जनरेशन में, OrderSend() / OrderModify() फेल होने के बाद GetLastError() 130 (ERR_INVALID_STOPS) रिटर्न करता है। Expert टैब में दिखने वाला OrderSend error 130 यही है। अगर आप MT4 वर्ज़न का EA भी साथ में इस्तेमाल कर रहे हैं, तो यह वैल्यू आपको दिख सकती है।
अर्थ: अमान्य स्टॉप (invalid stops)
कॉन्स्टेंट: ERR_INVALID_STOPS
वैल्यू : 130
व्यावहारिक अंतर:
| प्लेटफ़ॉर्म | स्रोत | वैल्यू | कब दिखता है |
|---|---|---|---|
| MT5 | MqlTradeResult.retcode | 10016 (TRADE_RETCODE_INVALID_STOPS) | OrderSend / PositionModify सर्वर से रिजेक्ट हुआ |
| MT5 | CTrade.ResultRetcode() | 10016 | CTrade के ज़रिए ऑर्डर/मॉडिफिकेशन रिजेक्ट हुआ |
| MT4 | GetLastError() | 130 (ERR_INVALID_STOPS) | OrderSend / OrderModify फेल होने के बाद |
नंबर अलग हैं, लेकिन अर्थ और कारण लगभग समान हैं, और समाधान भी एक जैसा ही है। ध्यान दें, MT5 में अक्सर इसके साथ कन्फ्यूज़ होने वाला 10015 (TRADE_RETCODE_INVALID_PRICE) असल में "ऑर्डर प्राइस खुद ही अमान्य होने" की समस्या है, जो अलग है। 10016 सिर्फ "SL/TP (स्टॉप) की पोज़िशन" की समस्या है।
सबसे पहले 30 सेकंड में जांच करें
MT5 में "Market Watch → सिंबल पर राइट-क्लिक → Specification" खोलें और इन दो चीज़ों को देखें।
स्टॉप लेवल (Stops level) : SL/TP को मौजूदा प्राइस से कितनी न्यूनतम दूरी (पॉइंट्स) पर रखना ज़रूरी है
फ्रीज़ लेवल (Freeze level) : एक्ज़िक्यूशन के करीब पहुंचे ऑर्डर में बदलाव/कैंसल प्रतिबंधित होने की दूरी (पॉइंट्स)
इसके बाद, जिस पल एरर आया, उस समय के लॉग में भेजी गई SL/TP वैल्यू और उस समय के Bid/Ask को साथ रखकर जांचें।
- SL या TP मौजूदा प्राइस से स्टॉप लेवल से कम दूरी पर है → अक्सर यही कारण होता है (कारण ①)।
- BUY में SL, Bid से ऊपर है / TP, Bid से नीचे है (SELL में उल्टा) → दिशा की गलती (कारण ②)।
- सिर्फ मौजूदा पोज़िशन का मॉडिफिकेशन फेल हो रहा है → फ्रीज़ लेवल या SL/TP बाद में सेट करने का सर्वर नियम (कारण ③・⑤)।
- SL की वैल्यू "50" जैसी स्पष्ट रूप से प्राइस न हो → प्राइस और पॉइंट की गड़बड़ी (कारण ④)।
कोड से जांचना हो तो सिर्फ एक लाइन काफी है।
Print("StopsLevel=", SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL),
" FreezeLevel=", SymbolInfoInteger(_Symbol, SYMBOL_TRADE_FREEZE_LEVEL));
कारण और समाधान (6 पैटर्न)
① SL/TP मौजूदा प्राइस के बहुत करीब है (स्टॉप लेवल से कम)
लक्षण: टाइट SL लगाने वाले स्कैल्पिंग EA या छोटे ट्रेल विड्थ वाले EA में अक्सर होता है। मैन्युअली भी "प्राइस के बहुत करीब" SL रखने की कोशिश करने पर ऑर्डर बटन काम नहीं करता या रिजेक्ट हो जाता है।
कारण: ब्रोकर हर सिंबल के लिए SYMBOL_TRADE_STOPS_LEVEL (पॉइंट यूनिट में न्यूनतम स्टॉप दूरी) सेट करता है, और मौजूदा प्राइस से इससे कम दूरी वाला SL/TP या पेंडिंग प्राइस सर्वर द्वारा बिना शर्त रिजेक्ट किया जाता है। वेरिफिकेशन का बेस प्राइस BUY पोज़िशन के SL/TP के लिए Bid, SELL के लिए Ask होता है। स्प्रेड बढ़ने पर Bid और Ask के बीच का गैप बढ़ जाता है, इसलिए सामान्य समय में पास होने वाली दूरी भी इवेंट टाइम या सुबह जल्दी अचानक रिजेक्ट हो सकती है।
समाधान:
- Specification विंडो में स्टॉप लेवल देखकर EA का SL/TP और ट्रेल विड्थ उससे ज़्यादा सेट करें
- EA साइड पर ऑर्डर भेजने से पहले वैल्यू को क्लैंप करें (आगे कोड में बताया गया है)
- अगर बहुत टाइट SL ज़रूरी हो, तो कम स्टॉप लेवल वाले ब्रोकर या अकाउंट टाइप पर विचार करें
② SL/TP की दिशा उल्टी है (BUY/SELL की गड़बड़ी)
लक्षण: किसी खास दिशा (सिर्फ खरीद या सिर्फ बिक्री) में हमेशा Invalid stops आता है। सेल्फ-मेड EA की पहली टेस्टिंग में सबसे आम पैटर्न।
कारण: नियम सीधा है — BUY का SL मौजूदा प्राइस (Bid) से नीचे होना चाहिए और TP ऊपर, जबकि SELL का SL मौजूदा प्राइस (Ask) से ऊपर होना चाहिए और TP नीचे। BUY का फॉर्मूला कॉपी करके SELL में इस्तेमाल करते समय साइन बदलना भूल जाना, price - sl और price + sl को उलट देना — जैसी सामान्य गलतियों पर सर्वर तुरंत 10016/130 रिटर्न कर देता है।
समाधान:
- एरर आने पर
PrintFormat("type=%s sl=%.5f tp=%.5f bid=%.5f ask=%.5f", ...)से असली वैल्यू प्रिंट करके दिशा को आंखों से जांचें - SL/TP कैलकुलेशन को BUY/SELL के लिए कॉमन फ़ंक्शन में बनाएं, ताकि साइन का बंटवारा एक ही जगह हो (कॉपी-पेस्ट गड़बड़ी से बचें)
③ फ्रीज़ लेवल के अंदर ऑर्डर/पोज़िशन में बदलाव
लक्षण: नया ऑर्डर देने में कोई समस्या नहीं, लेकिन TP के ठीक पहले, SL के ठीक पहले, या पेंडिंग एक्टिवेशन के ठीक पहले किए गए बदलाव/कैंसल ही रिजेक्ट होते हैं।
कारण: जिन सिंबल्स पर SYMBOL_TRADE_FREEZE_LEVEL सेट है, वहां एक्टिवेशन प्राइस (TP/SL या पेंडिंग ट्रिगर प्राइस) के मौजूदा प्राइस के एक निश्चित दूरी तक करीब आने पर, उस ऑर्डर में बदलाव/कैंसल फ्रीज़ हो जाता है। यह एक्ज़िक्यूशन प्रोसेस और मॉडिफिकेशन रिक्वेस्ट के टकराव को रोकने के लिए सर्वर का नियम है, और EA के ट्रेल में यह "TP के करीब एक और अपडेट करने की कोशिश करने पर रिजेक्ट होना" के रूप में सामने आता है।
समाधान:
- बदलाव से पहले
SYMBOL_TRADE_FREEZE_LEVELपढ़ें, और अगर एक्टिवेशन प्राइस तक की दूरी फ्रीज़ लेवल से कम है तो उस बार का बदलाव स्किप करें - ट्रेल के अपडेट इंटरवल और अपडेट विड्थ को बढ़ाकर एक्टिवेशन के करीब होने वाले अनावश्यक मॉडिफिकेशन रिक्वेस्ट कम करें
- रिजेक्ट होने पर भी कोई बड़ी समस्या नहीं (एक्टिवेशन के करीब मतलब जल्द ही एक्ज़िक्यूट होगा), इसलिए एरर को केवल लॉग करके छोड़ देना भी ठीक डिज़ाइन है
④ प्राइस और पॉइंट (दूरी) की गड़बड़ी
लक्षण: SL में 50 या 0.0050 जैसी "दूरी के तौर पर सोची गई वैल्यू" सीधे डाल दी गई है। लॉग में दिखने वाला sl=50.00000 स्पष्ट रूप से प्राइस नहीं लगता।
कारण: MqlTradeRequest.sl / .tp में डालनी होती है एब्सोल्यूट प्राइस ("एंट्री से 50 पॉइंट नीचे" नहीं)। दूरी के हिसाब से मैनेज करने वाले EA को entry ± distance * _Point में कन्वर्ट करके ही देना होगा। इसके उलट, MT4 युग के कुछ फ़ंक्शन की सोच के हिसाब से जहां एब्सोल्यूट प्राइस देनी चाहिए वहां दूरी दे देने पर वह प्राइस के रूप में सही नहीं बनता और 10016/130 आता है।
इसके अलावा pips और पॉइंट की गड़बड़ी भी आम है। 5-डिजिट ब्रोकर (उदाहरण: USDJPY 3-डिजिट, EURUSD 5-डिजिट डिस्प्ले) में 1 pip = 10 पॉइंट होता है। "SL 50" pips के हिसाब से है या पॉइंट के हिसाब से — इसके आधार पर दूरी में 10 गुना फर्क आ सकता है, जिससे वह स्टॉप लेवल से कम होकर रिजेक्ट हो सकता है।
समाधान:
- SL/TP हमेशा
NormalizeDouble(price ± dist * _Point, _Digits)के फॉर्मेट में बनाएं - इनपुट पैरामीटर की यूनिट (pips / points) को कमेंट में स्पष्ट लिखें, और अंदर
_Pointकन्वर्ज़न को एक ही जगह इकट्ठा रखें
⑤ मार्केट एक्ज़िक्यूशन ब्रोकर में एंट्री के समय SL/TP पास नहीं होता
लक्षण: SL/TP के बिना ऑर्डर एक्ज़िक्यूट होता है, लेकिन SL/TP के साथ नया ऑर्डर देने पर ही Invalid stops आता है। खासकर ECN/मार्केट एक्ज़िक्यूशन (Market Execution) टाइप के अकाउंट पर होता है।
कारण: मार्केट एक्ज़िक्यूशन में "रिक्वेस्ट के समय की प्राइस" और "असली एक्ज़िक्यूशन प्राइस" में फर्क आ जाता है, इसलिए कुछ सर्वर नए ऑर्डर रिक्वेस्ट में दिए गए SL/TP को स्वीकार नहीं करते और एक्ज़िक्यूशन के बाद पोज़िशन मॉडिफिकेशन से SL/TP सेट करने की प्रक्रिया की मांग करते हैं (यह MT4 युग के ECN अकाउंट में error 130 बार-बार आने वाला पुराना नियम है, और MT5 में भी कुछ सर्वर पर यही व्यवहार बना हुआ है)।
समाधान:
- पहले SL/TP के बिना ऑर्डर दें → एक्ज़िक्यूशन कन्फर्म होने के बाद
PositionModify()(CTrade मेंtrade.PositionModify()) से SL/TP सेट करें — इस दो-चरण वाली प्रक्रिया में बदलें - इस तरीके में "ऑर्डर तो सफल रहा पर SL सेट करने में फेल हुआ" वाला पल बन सकता है, इसलिए SL सेट होने तक रिट्राई करें, और तय संख्या तक फेल होने पर तुरंत पोज़िशन बंद कर दें — यह सुरक्षा ज़रूर लगाएं (SL के बिना पोज़िशन छोड़ देना सबसे खराब परिणाम है)
- एक्ज़िक्यूशन का तरीका
SymbolInfoInteger(_Symbol, SYMBOL_TRADE_EXEMODE)से चेक किया जा सकता है
⑥ सिंबल की अपनी खासियत (गोल्ड, इंडेक्स में स्टॉप लेवल ज़्यादा होता है)
लक्षण: वही EA EURUSD पर सही चलता है, लेकिन XAUUSD (गोल्ड) या स्टॉक इंडेक्स CFD पर लगाते ही Invalid stops बार-बार आने लगता है।
कारण: स्टॉप लेवल हर सिंबल के लिए अलग सेट होता है, और गोल्ड, इंडेक्स, एग्ज़ॉटिक करेंसी में यह मेजर करेंसी से ज़्यादा रखा जाना आम बात है। मेजर FX के लिए एडजस्ट किया गया टाइट SL/ट्रेल विड्थ वैसे ही इस्तेमाल करने पर सिंबल की न्यूनतम दूरी तक नहीं पहुंच पाता और रिजेक्ट हो जाता है। डिजिट की संख्या भी सिंबल के अनुसार अलग होती है (गोल्ड में 2~3 डिजिट आदि), इसलिए _Digits को हार्डकोड करने वाला कोड भी टूट सकता है।
समाधान:
- सिंबल बदलने पर हमेशा Specification विंडो में स्टॉप लेवल और डिजिट की संख्या जांचें
- SL/TP विड्थ को फिक्स्ड पॉइंट की जगह ATR जैसी वोलैटिलिटी आधारित दूरी बनाएं, जिससे सिंबल बदलने पर भी समस्या कम हो
- कोड में
_Point/_Digits/SYMBOL_TRADE_STOPS_LEVELहमेशा डायनामिकली लें (हार्डकोड न करें)
ब्रोकर के अनुसार अंतर (ध्यान देने योग्य बातें)
स्टॉप लेवल और फ्रीज़ लेवल ब्रोकर और सिंबल के हर कॉम्बिनेशन के हिसाब से पूरी तरह अलग होते हैं। एक ही EA और एक ही सेटिंग होने पर भी, ब्रोकर A में कभी न आने वाली एरर ब्रोकर B में रोज़ आना सामान्य बात है।
इसके अलावा ध्यान देने वाली बात यह है कि कुछ ब्रोकर स्टॉप लेवल "0" दिखाते हैं। 0 का मतलब "कोई सीमा नहीं" नहीं होता, बल्कि अक्सर इसका मतलब "डायनामिक रूप से तय होता है" होता है — सामान्य समय में कितना भी करीब SL पास हो जाता है, लेकिन इकॉनोमिक इवेंट या सुबह जल्दी जब स्प्रेड बढ़ता है, उसी समय अचानक रिजेक्ट होता है। "कभी-कभी आने वाला Invalid stops" ज़्यादातर यही होता है।
जांच हमेशा असली अकाउंट पर ही करें।
long stops = SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL); // पॉइंट
long freeze = SymbolInfoInteger(_Symbol, SYMBOL_TRADE_FREEZE_LEVEL); // पॉइंट
सटीक वैल्यू हर ब्रोकर के अकाउंट टाइप और सिंबल स्पेसिफिकेशन पर निर्भर करती है, इसलिए इस आर्टिकल में इसे नहीं बताया गया है। अपने अकाउंट पर ऊपर दिया गया कोड चलाकर मिली वैल्यू ही एकमात्र सही जवाब है।
MQL5 में इस एरर को रोकने वाला कोड (EA डेवलपर्स के लिए)
सही डिज़ाइन "एरर आने पर ठीक करना" नहीं, बल्कि ऑर्डर भेजने से पहले ही SL/TP को ब्रोकर की न्यूनतम दूरी तक क्लैंप कर देना, ताकि 10016 आए ही न — यही है।
ऑर्डर भेजने से पहले SL/TP को वेरिफाई और क्लैंप करें
// ऑर्डर भेजने से पहले SL/TP को स्टॉप लेवल से ज़्यादा दूरी तक क्लैंप करना
// रिटर्न वैल्यू false = दिशा उल्टी है (डिज़ाइन गलती) इसलिए ऑर्डर न भेजें
bool ClampStops(ENUM_ORDER_TYPE type, double &sl, double &tp)
{
double point = SymbolInfoDouble(_Symbol, SYMBOL_POINT);
int digits = (int)SymbolInfoInteger(_Symbol, SYMBOL_DIGITS);
long stopsPt = SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL);
double spread = SymbolInfoDouble(_Symbol, SYMBOL_ASK)
- SymbolInfoDouble(_Symbol, SYMBOL_BID);
// स्टॉप लेवल + स्प्रेड जितना बफर (stops=0 वाले डायनामिक ब्रोकर के लिए सुरक्षा)
double minDist = stopsPt * point + spread;
double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
if(type == ORDER_TYPE_BUY)
{
// BUY का SL/TP Bid के आधार पर वेरिफाई होता है
if(sl > 0 && sl >= bid) return false; // दिशा उल्टी है
if(tp > 0 && tp <= bid) return false;
if(sl > 0 && (bid - sl) < minDist) sl = bid - minDist;
if(tp > 0 && (tp - bid) < minDist) tp = bid + minDist;
}
else if(type == ORDER_TYPE_SELL)
{
// SELL का SL/TP Ask के आधार पर वेरिफाई होता है
if(sl > 0 && sl <= ask) return false; // दिशा उल्टी है
if(tp > 0 && tp >= ask) return false;
if(sl > 0 && (sl - ask) < minDist) sl = ask + minDist;
if(tp > 0 && (ask - tp) < minDist) tp = ask - minDist;
}
sl = NormalizeDouble(sl, digits);
tp = NormalizeDouble(tp, digits);
return true;
}
तीन मुख्य बातें हैं।
SYMBOL_TRADE_STOPS_LEVELऔरSYMBOL_POINTको हर बार डायनामिकली लें (सिंबल और ब्रोकर से स्वतंत्र बनेगा)- स्प्रेड जितना बफर जोड़ें (स्टॉप लेवल 0 वाले डायनामिक ब्रोकर पर भी आसानी से पास होगा)
- आखिर में हमेशा
NormalizeDouble(price, _Digits)से डिजिट मिलाएं (एक्स्ट्रा डेसिमल डिजिट भी रिजेक्शन का कारण बन सकता है)
retcode 10016 को अलग से हैंडल करें
रिजेक्ट होने पर "क्या भेजा था, उस समय दूरी कितनी थी" लॉग में रखने से कारण ①~⑥ में से कौन सा है, तुरंत पता चल जाता है।
MqlTradeRequest req; MqlTradeResult res;
ZeroMemory(req); ZeroMemory(res);
// ... req को तैयार करें (sl/tp ClampStops से गुज़र चुके हों) ...
if(!OrderSend(req, res) || res.retcode != TRADE_RETCODE_DONE)
{
if(res.retcode == TRADE_RETCODE_INVALID_STOPS) // 10016
PrintFormat("Invalid stops: sl=%s tp=%s bid=%s stopsLevel=%d",
DoubleToString(req.sl, _Digits),
DoubleToString(req.tp, _Digits),
DoubleToString(SymbolInfoDouble(_Symbol, SYMBOL_BID), _Digits),
(int)SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL));
else
PrintFormat("OrderSend failed: retcode=%d, lastError=%d", res.retcode, GetLastError());
}
ट्रेल मॉडिफिकेशन से पहले फ्रीज़ लेवल जांचें
// पोज़िशन मॉडिफिकेशन से पहले, एक्टिवेशन प्राइस फ्रीज़ ज़ोन में तो नहीं है यह जांचें
bool CanModify(double triggerPrice)
{
long freeze = SymbolInfoInteger(_Symbol, SYMBOL_TRADE_FREEZE_LEVEL);
if(freeze <= 0) return true;
double dist = MathAbs(SymbolInfoDouble(_Symbol, SYMBOL_BID) - triggerPrice);
return (dist > freeze * SymbolInfoDouble(_Symbol, SYMBOL_POINT));
}
MT4 वर्ज़न के EA में MarketInfo(Symbol(), MODE_STOPLEVEL) / MODE_FREEZELEVEL से वही वैल्यू मिलती है। सोचने का तरीका बिल्कुल समान है।
FXEA365 द्वारा दिए जाने वाले EA में यह ऑर्डर से पहले SL/TP वेरिफिकेशन, स्टॉप लेवल क्लैंपिंग, और सिंबल-स्वतंत्र डायनामिक वैल्यू लेना — यह सब मानक रूप से लागू किया गया है, जिससे ब्रोकर या सिंबल बदलने पर भी Invalid stops से रुकावट नहीं आती।
प्राथमिकता चेकलिस्ट
| प्राथमिकता | जांच | समाधान |
|---|---|---|
| 🚨 पहले | SL/TP और मौजूदा प्राइस के बीच की दूरी < स्टॉप लेवल है? | SL/TP विड्थ बढ़ाएं / क्लैंपिंग लागू करें |
| 🚨 पहले | BUY/SELL में SL/TP की दिशा उल्टी तो नहीं? | लॉग में असली वैल्यू निकालकर आंखों से जांचें |
| ⚠️ अगला | सिर्फ मॉडिफिकेशन फेल हो रहा है → फ्रीज़ लेवल में है? | एक्टिवेशन के करीब होने वाला मॉडिफिकेशन स्किप करें |
| ⚠️ अगला | sl/tp में दूरी (पॉइंट) तो नहीं डाल दी? | एब्सोल्यूट प्राइस price ± dist*_Point में कन्वर्ट करें |
| ✅ जांचें | मार्केट एक्ज़िक्यूशन में SL/TP बाद में सेट करना ज़रूरी है? | ऑर्डर → PositionModify का दो-चरण तरीका |
| 🛠 डेवलपमेंट | सिंबल स्पेसिफिकेशन डायनामिकली लिया जा रहा है? | ऊपर दिया ClampStops लागू करें |
सारांश
Invalid stopsका मतलब है MT5 = 10016 (TRADE_RETCODE_INVALID_STOPS), MT4 = 130 (ERR_INVALID_STOPS)। नंबर अलग हैं पर अर्थ और समाधान एक जैसा है।- ज़्यादातर कारण कैलकुलेशन गलती नहीं होते, बल्कि स्टॉप लेवल से कम दूरी, दिशा उल्टी होना, फ्रीज़ लेवल, प्राइस और पॉइंट की गड़बड़ी, SL/TP बाद में सेट करने का नियम, और सिंबल की अपनी खासियत — यही 6 कारण होते हैं।
- डेवलपर्स "ऑर्डर से पहले
SYMBOL_TRADE_STOPS_LEVELपढ़कर क्लैंप +NormalizeDouble" लागू करके इसे स्थायी रूप से हल कर सकते हैं। स्टॉप लेवल 0 वाले ब्रोकर के लिए भी स्प्रेड जितना बफर जोड़कर संभाला जा सकता है।
सभी एरर कोड्स के लिए MQL5 / MT5 एरर कोड समाधान की संपूर्ण गाइड देखें। इसी तरह ऑर्डर रिजेक्ट होने की एक और सामान्य एरर "फंड की कमी" के बारे में ERR_NO_MONEY (134/10019) की विस्तृत जानकारी में दी गई है।
FAQ
Q: SL/TP की कैलकुलेशन सही होनी चाहिए, फिर भी Invalid stops आता है। क्यों?
वैल्यू सही होने के बावजूद, मौजूदा प्राइस से दूरी की वजह से रिजेक्ट हो रहा हो सकता है। ब्रोकर की न्यूनतम स्टॉप दूरी (स्टॉप लेवल) से कम वाला SL/TP, वैल्यू सटीक होने पर भी बिना शर्त रिजेक्ट होता है। Specification विंडो या SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL) से न्यूनतम दूरी जांचें।
Q: 10016 और 130 में क्या अंतर है?
10016 (TRADE_RETCODE_INVALID_STOPS) MT5 के OrderSend() / PositionModify() का रिज़ल्ट कोड है, जबकि 130 (ERR_INVALID_STOPS) MT4 के GetLastError() से मिलने वाली वैल्यू है। प्लेटफ़ॉर्म अलग है, बस अर्थ (SL/TP की पोज़िशन अमान्य होना) और समाधान एक जैसा है।
Q: आम तौर पर नहीं आता, लेकिन इकॉनोमिक इवेंट के समय ही Invalid stops आता है।
इसका कारण स्प्रेड का बढ़ना है। BUY का SL/TP Bid के आधार पर और SELL का Ask के आधार पर वेरिफाई होता है, इसलिए स्प्रेड बढ़ने के उसी पल दूरी कम पड़ जाती है। स्टॉप लेवल 0 वाले ब्रोकर में भी अचानक बदलाव के समय ही डायनामिक रूप से रिजेक्ट होने का व्यवहार होता है। SL/TP की दूरी में स्प्रेड जितना बफर जोड़ें (मुख्य लेख का कोड देखें)।
Q: SL/TP के बिना ऑर्डर पास हो जाता है, लेकिन SL/TP के साथ रिजेक्ट होता है।
मार्केट एक्ज़िक्यूशन (Market Execution) टाइप के अकाउंट में, नए ऑर्डर रिक्वेस्ट में दिए गए SL/TP को स्वीकार न करने वाला सर्वर हो सकता है। SL/TP के बिना ऑर्डर दें और एक्ज़िक्यूशन के बाद PositionModify() से सेट करने वाले दो-चरण तरीके में बदलें। लेकिन SL सेट करने में फेल होने पर रिट्राई और लगातार फेल होने पर तुरंत पोज़िशन बंद करने की सुरक्षा ज़रूर लगाएं।
Q: EURUSD पर सही चलने वाला EA, गोल्ड पर बार-बार Invalid stops दे रहा है।
गोल्ड और स्टॉक इंडेक्स में स्टॉप लेवल मेजर करेंसी से ज़्यादा सेट होना सामान्य बात है, और डिजिट की संख्या भी अलग होती है। SL/ट्रेल विड्थ को सिंबल स्पेसिफिकेशन के अनुसार बढ़ाएं, या ATR आधारित वोलैटिलिटी-लिंक्ड विड्थ में बदलें।
संबंधित
📧 कीमत बढ़ने से पहले अलर्ट + मुफ्त 5-दिवसीय ईमेल कोर्स
सभी EA लॉन्च मूल्य पर हैं और बिक्री के साथ चरणों में बढ़ते हैं। हर बढ़ोतरी से पहले सूचना पाएं, साथ ही एल्गो ट्रेडिंग, बैकटेस्ट पढ़ने और ब्रोकर चुनने पर रोज़ एक ईमेल।
* गोपनीयता कड़ाई से संरक्षित। आप किसी भी समय सदस्यता समाप्त कर सकते हैं।