अब क्लोज़ के साथ ओपन कीमत भी दिखाएँगे। इसके लिए पिछले अध्याय के प्रोग्राम में एक और डेटा लाइब्रेरी से लेंगे और एक अतिरिक्त ड्रॉइंग कॉल लिखेंगे।

बदलाव से पहले हर लाइन देखेंगे, ताकि उसका काम समझ आए।

कोड एक सटीक विवरण है

प्रोग्राम में कंप्यूटर को निर्देश देते हैं। जैसे: “कैंडल की क्लोज़ कीमत लें और नीली लाइन से दिखाएँ।” इसके लिए कंप्यूटर को सही नाम और चिह्न चाहिए।

Pyne code में ये निर्देश Python सिंटैक्स से लिखते हैं। फ़ंक्शन कॉल के कोष्ठक, कोलन और लाइन का इंडेंटेशन इसी का हिस्सा हैं। अगले हिस्सों में इनका काम जानेंगे।

दूसरे अध्याय में बनी first_chart.py खोलें। इंडिकेटर का नाम बदल दिया हो, तो भी आगे की व्याख्या वही है।

फ़ाइल की शुरुआत का Pyne मार्कर

फ़ाइल की पहली तीन लाइनें:

"""
@pyne edge
"""

तीन उद्धरण चिह्न टेक्स्ट ब्लॉक की शुरुआत और अंत बताते हैं। फ़ाइल की शुरुआत में इस ब्लॉक में प्रोग्राम का विवरण भी लिख सकते हैं। Python इसे डॉकस्ट्रिंग कहता है।

PyneCore इसमें से @pyne मार्कर पढ़ता है। यह बताता है कि फ़ाइल में Pyne code है और सामान्य Python से अलग नियम लगाने हैं। चलाने से पहले PyneCore कोड बदलता है, ताकि पिछली कैंडल की वैल्यू मिल सके या वेरिएबल अगली कैंडल तक अपनी वैल्यू बचा सके। इनके अलग अध्याय हैं।

अकेला @pyne भी वैध मार्कर है। Pyne code फ़ाइल इस तरह भी शुरू हो सकती है:

"""
@pyne
"""

साथ में edge का क्या मतलब है?

edge बताता है कि प्रोग्राम Pyne code के तय सीमित हिस्से का इस्तेमाल करता है। @pyne कैंडल-दर-कैंडल व्यवहार चालू करता है; edge तय करता है कि उसके लिए कौन-से भाषा तत्व और फ़ंक्शन उपलब्ध हैं। सीमा से बाहर जाने पर PyneIDE बताता है।

@pyne वाले प्रोग्राम Python की अतिरिक्त सुविधाएँ और लाइब्रेरी भी इस्तेमाल कर सकते हैं। @pyne edge वाले प्रोग्राम Pyne के अनुमत साधनों पर आधारित हैं और मनचाही Python लाइब्रेरी इंपोर्ट नहीं करते। इसी वजह से सामान्य Python वातावरण न रखने वाले रनटाइम भी इन्हें प्रोसेस कर सकते हैं।

किताब के सभी पूरे प्रोग्राम में @pyne edge रहेगा और इसी सीमा में काम करेंगे।

साधन चुनना

अगली लाइन:

from pynecore.lib import close, color, plot, script

from … import … दी गई सूची के नाम प्रोग्राम में उपलब्ध करता है। यहाँ pynecore.lib से चार साधन लेते हैं:

  • close: वर्तमान कैंडल की क्लोज़ कीमत;
  • color: उपलब्ध रंग;
  • plot: ग्राफ़ पर वैल्यू दिखाना;
  • script: प्रोग्राम का प्रकार और शुरुआती सेटिंग तय करना।

नामों को कॉमा अलग करता है। बड़े और छोटे अक्षर मायने रखते हैं: close और Close अलग नाम हैं।

खाली लाइनें कोड को हिस्सों में बाँटती हैं। इससे साधनों की सूची का अंत और प्रोग्राम की शुरुआत पहचानना आसान है।

प्रोग्राम का नाम और दिखावट

@script.indicator("My First Chart", overlay=True)

यह लाइन बताती है कि हम इंडिकेटर बना रहे हैं। इंडिकेटर डेटा से गणना करके कुछ दिखाता है। यहाँ क्लोज़ कीमत दिखा रहे हैं।

कोष्ठक में इंडिकेटर की सेटिंग देते हैं:

  • उद्धरण चिह्न में "My First Chart" उसका नाम है।
  • overlay=True कहता है कि ड्रॉइंग कैंडल वाले ग्राफ़ पर ही दिखे।

True का अर्थ सत्य है। इसका उल्टा False है। overlay को False करें तो इंडिकेटर अलग पैनल में आता है। अपने गणना वाले अध्याय में यह भी इस्तेमाल करेंगे।

गणना कहाँ होती है?

def main():
    plot(close, "Close", color=color.blue, linewidth=2)

def एक फ़ंक्शन की शुरुआत बताता है। फ़ंक्शन नाम वाला कामों का क्रम है। यहाँ उसका नाम main है।

PyneCore डेटा की कैंडल पर main() का शरीर, यानी बॉडी, चलाता है। यह हमारे प्रोग्राम का प्रवेश बिंदु है। दोनों कोष्ठक के बाद कोलन है; नीचे अंदर से शुरू लाइन फ़ंक्शन की बॉडी में आती है।

इंडेंटेशन बताता है कि कौन-सी लाइनें साथ हैं। एक स्तर के लिए चार स्पेस रखते हैं। लाइन की शुरुआत में Tab दबाएँ: PyneIDE की डिफ़ॉल्ट सेटिंग में इससे एक साथ चार स्पेस का इंडेंट मिलता है। Shift + Tab एक स्तर वापस लाता है। कोलन पर खत्म लाइन के बाद Enter दबाने पर Visual Studio Code आमतौर पर अगली लाइन को अपने आप इंडेंट करता है।

plot से क्या चाहते हैं?

plot(...) एक फ़ंक्शन कॉल है। कोष्ठक में काम के लिए वैल्यू और सेटिंग देते हैं:

  • close: यह वैल्यू दिखाएँ;
  • "Close": ड्रॉइंग का नाम यह हो;
  • color=color.blue: रंग नीला हो;
  • linewidth=2: लाइन की मोटाई 2 हो।

पहली दो वैल्यू का काम उनका क्रम बताता है। color= और linewidth= नाम से बताते हैं कि कौन-सी सेटिंग भेज रहे हैं। इन्हें पैरामीटर कहते हैं।

color.blue का बिंदु बताता है कि color के अंदर का blue रंग लें। कोड में यह नाम तक पहुँचने का हिस्सा है; इसे कॉमा से न बदलें।

दो लाइनें बनाएँ

क्लोज़ कीमत के लिए close इस्तेमाल किया था। ओपन कीमत open से मिलती है।

फ़ाइल की कॉपी scripts में two_lines.py नाम से बनाएँ। इससे दूसरे अध्याय का उदाहरण भी बचा रहेगा। कॉपी में:

  1. इंपोर्ट में open जोड़ें।
  2. इंडिकेटर का नाम "Open and Close" करें।
  3. main() में दूसरी plot कॉल जोड़ें।

पूरा प्रोग्राम:

"""
@pyne edge
"""
from pynecore.lib import close, color, open, plot, script


@script.indicator("Open and Close", overlay=True)
def main():
    plot(close, "Close", color=color.blue, linewidth=2)
    plot(open, "Open", color=color.orange, linewidth=2)

चलाने से पहले अनुमान लगाएँ कि दोनों लाइनें कैंडल से कहाँ मिलेंगी। फ़ाइल सेव करें और Run Pyne code दबाएँ। पहले वाला नमूना डेटा ही लें।

two_lines.py के साथ DEMO कीमत ग्राफ़ पर अलग Close और Open लाइनें हैं।
दो plot कॉल, दो लाइनें: Close क्लोज़ और Open ओपन कीमत उसी ग्राफ़ पर दिखाती हैं।

क्या देखें?

नीली लाइन क्लोज़ और नारंगी लाइन ओपन कीमतें जोड़ती है। ड्रॉइंग के नाम Close और Open हैं। बाद में रंग बदलें, तब भी नाम से उन्हें पहचान सकते हैं।

दोनों plot कॉल चार स्पेस के समान इंडेंट से शुरू हैं, क्योंकि एक ही main() फ़ंक्शन में हैं।

open के नीचे त्रुटि हो, तो देखें कि इंपोर्ट में जोड़ा है। नया साधन इस्तेमाल करने के लिए उसका नाम उपलब्ध करना होता है।

कोड में टिप्पणियाँ

एक # से शुरू लाइन टिप्पणी है:

    # Show the opening price of each candle.
    plot(open, "Open", color=color.orange, linewidth=2)

टिप्पणी कोई काम निष्पादित नहीं करती। इससे किसी चरण का उद्देश्य अपने लिए या बाद में कोड पढ़ने वाले के लिए बता सकते हैं। उदाहरणों की टिप्पणियाँ अंग्रेज़ी में हैं; किताब में व्याख्या हिंदी में है।

स्टेटमेंट के अंत में भी टिप्पणी लिख सकते हैं:

    plot(open, "Open", color=color.orange, linewidth=2)  # Show the opening price.

इसमें plot(...) चलता है। उसके बाद # से लाइन के अंत तक टेक्स्ट टिप्पणी है, जिसे रनटाइम छोड़ देता है। पढ़ने में आसानी के लिए कोड और # के बीच दो स्पेस रखते हैं।

स्वयं करके देखें

तीसरी लाइन बनाएँ जो हर कैंडल की सबसे ऊँची कीमत दिखाए। यह high है। ड्रॉइंग का नाम "High" और रंग color.green रखें।

सोचें कि किन दो जगह प्रोग्राम बढ़ाना है। पहले अनुमान लगाएँ: क्या High अपनी कैंडल के ओपन या क्लोज़ से नीचे हो सकता है?

अभ्यास का हल

इंपोर्ट में भी high जोड़ना है:

from pynecore.lib import close, color, high, open, plot, script

main() में दूसरी दोनों कॉल जितने इंडेंट से यह लाइन जोड़ें:

    plot(high, "High", color=color.green, linewidth=2)

कैंडल का हाई उसकी ओपन और क्लोज़ कीमत से कम नहीं हो सकता। इसलिए उस कैंडल पर High का बिंदु दोनों में से किसी के नीचे नहीं होगा। बिंदु जोड़ने वाले रेखाखंड हमेशा संबंधित कैंडल की जगह पर समझें।

अपने बदलाव जाँचें

तीन लाइन वाले प्रोग्राम को देखें। इंपोर्ट डेटा, इंडिकेटर का नाम और ड्रॉइंग कॉल पहचान सकते हैं? जाँचें कि हर नए डेटा का नाम इंपोर्ट में है और तीनों कॉल का इंडेंट समान है।

कीमतों पर अपनी गणना करने से पहले देखेंगे कि फ़ंक्शन इस्तेमाल करने में PyneIDE कैसे मदद करता है।