
फायदे:
- iBarShift की महंगी कार्यक्षमता जो कि सभी चक्रों को प्रतिस्थापित करती है, जो चोटियों को प्राप्त करने के लिए आवश्यक होती है।
- प्रत्येक बार के लिए ZZ बनाने के लिए आवश्यक सभी जानकारी न केवल हर क्षण में बल्कि प्रत्येक बाहरी कोड के लिए भी सुलभ है।
- कोई निलंबित चोटियाँ नहीं हैं।
- चोटियों को खोजने के लिए एक कुशल विधि उपलब्ध है।
- बहुत तेज।
- इतिहास में डेटा जोड़ने और TFs बदलने पर सही काम करता है।
- EA में उपयोग के लिए बिल्कुल सही।
नुकसान:
1. मेमोरी की आवश्यकताएँ। यह संकेतक अन्य समान कार्यान्वयनों की तुलना में 5 बफर का उपयोग करता है, जबकि अन्य केवल 2 (या यहां तक कि 1) का उपयोग करते हैं। लेकिन (मेरे अनुसार) यह फायदे #6 और #7 के लिए अच्छा मूल्य है। मैंने जितने भी तेज़ ज़िगज़ैग देखे हैं, उनमें से कोई भी इतिहास के जोड़ने को बिना पूर्ण पुनर्निर्माण के संसाधित नहीं कर सकता। मेरा ऐसा करता है। इसके अलावा, यह इसे कुशलता से करता है।
2. अतिरिक्त रेखाएं उपलब्ध हैं। यह किसी भी बाहरी कोड के लिए डेटा को दृश्य बनाने के लिए आवश्यक है। ये रेखाएं कभी भी दृश्य नहीं होनी चाहिए।
प्रिंसिपल:
ZZ चैनलिंग सिद्धांत द्वारा खींचा जाता है।
चैनल की चौड़ाई को पॉइंट्स (XLab_ZZ) या प्रतिशत (XLab_ZZP) में परिभाषित किया जा सकता है।
चोटियों की पुनर्प्राप्ति:
extern int ChannelWidth = 100; #property indicator_chart_window #property indicator_buffers 1 #property indicator_color1 Red #property indicator_width1 3 datetime LastTime; int init() { LastTime = 0; return(0); } bool GetValue(double dir, int bar, int prevBar, double& peak, int& peakBar, datetime& peakTime) { if (dir < 0) { datetime t = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 2, bar); int i = iBarShift(Symbol(), 0, t); if (i == prevBar) { t = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 2, bar + 1); i = iBarShift(Symbol(), 0, t); } double v = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 1, i); if (v == EMPTY_VALUE) { t = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 2, bar + 1); i = iBarShift(Symbol(), 0, t); v = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 1, i); } peak = v; peakBar = i; peakTime = t; } else if (dir > 0) { t = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 3, bar); i = iBarShift(Symbol(), 0, t); if (i == prevBar) { t = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 3, bar + 1); i = iBarShift(Symbol(), 0, t); } v = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 0, i); if (v == EMPTY_VALUE) { t = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 3, bar + 1); i = iBarShift(Symbol(), 0, t); v = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 0, i); } peak = v; peakBar = i; peakTime = t; } else { return (false); } return (true); } int start() { if (LastTime == Time[0]) return (0); LastTime = Time[0]; double dir = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 4, 1); double rdir = -dir; if (dir == EMPTY_VALUE) return (0); double v1, v2, v3, v4, v5; int i1, i2, i3, i4, i5; datetime t1, t2, t3, t4, t5; GetValue(dir, 1, 0, v1, i1, t1); GetValue(rdir, i1, 0, v2, i2, t2); GetValue(dir, i2, i1, v3, i3, t3); GetValue(rdir, i3, i2, v4, i4, t4); GetValue(dir, i4, i3, v5, i5, t5); SetPt("1", v1, t1); SetPt("2", v2, t2); SetPt("3", v3, t3); SetPt("4", v4, t4); SetPt("5", v5, t5); Print(v1, " ", v2, " ", v3, " ", v4, " ", v5, " ", i1, " ", i2, " ", i3, " ", i4, " ", i5); return(0); } void SetPt(string name, double price, datetime time) { ObjectCreate(name, OBJ_ARROW, 0, time, price); ObjectSet(name, OBJPROP_ARROWCODE, 108); ObjectSet(name, OBJPROP_PRICE1, price); ObjectSet(name, OBJPROP_TIME1, time); }
यह उदाहरण एक संकेतक है जो (बार के पहले समय में) पहले पांच चोटियों को चिन्हित करता है (वर्तमान बनाते समय सहित)
ध्यान दें! यदि 0th बार मोड चालू है तो यह कोड गलत काम कर सकता है।
0th बार मोड:
यह DrawZeroBar वेरिएबल के साथ सेट किया जाता है। डिफ़ॉल्ट रूप से बंद।
यह विकल्प का उपयोग करना अनुशंसित नहीं है, विशेषकर यदि संकेतक को EA में उपयोग किया जा रहा है।
इसे उपयोग करने का आनंद लें ;)। किसी भी प्रश्न के लिए बेझिझक पूछें।
यदि कोई बग पाया गया, तो कृपया मुझे सूचित करें। धन्यवाद।