Series कैंडल से जुड़ी हिस्ट्री रखता है। कभी आप तय करना चाहते हैं कि कौन-सी वैल्यू किस क्रम में लें और कब हटाएँ। इसके लिए ऐरे इस्तेमाल कर सकते हैं।

ऐरे क्या रखता है?

ऐरे क्रम में रखे तत्वों से बनता है। हर तत्व का इंडेक्स है; पहला शून्य है।

एक ऐरे में एक ही टाइप के तत्व हैं। नंबर या टेक्स्ट का ऐरे हो सकता है, लेकिन नंबर ऐरे में टेक्स्ट नहीं रखते। एक टाइप का अर्थ समान वैल्यू नहीं: 100, 103 और 101 एक ऐरे के अलग नंबर हैं।

इसी क्रम में 100, 103, 101 डालें तो इंडेक्स 0 पर 100, 1 पर 103 और 2 पर 101 है। इंडेक्स जगह बताता है। अपने आप पिछली कैंडल नहीं दर्शाता।

close[1] पिछली क्लोज़ है। array.get(prices, 1), prices का दूसरा तत्व है। कितनी पुरानी वैल्यू है यह भरने के तरीके से तय होता है।

array नेमस्पेस

array.new_float(0) खाली नंबर ऐरे बनाता है। शून्य शुरुआती तत्व संख्या है, शुरुआती कीमत नहीं।

कामभूमिका
array.push(prices, close)अंत में नया तत्व
array.size(prices)तत्वों की संख्या
array.shift(prices)पहला तत्व हटाकर लौटाना
array.get(prices, 0)पहला तत्व पढ़ना
array.avg(prices)रखे नंबर का औसत

array.get का इंडेक्स मौजूद तत्व का हो। तीन तत्व में 0, 1, 2 सही, 3 नहीं।

पाँच नई कीमतें रखना

recent_prices.py बनाएँ:

"""
@pyne edge
"""
from pynecore import Persistent
from pynecore.lib import array, close, color, plot, script, ta


@script.indicator("Recent Prices", overlay=True)
def main():
    prices: Persistent[list[float]] = array.new_float(0)
    array.push(prices, close)
    if array.size(prices) > 5:
        array.shift(prices)
    stored_average = array.avg(prices)
    full_average = ta.sma(close, 5)
    plot(stored_average, "Stored average", color=color.blue, linewidth=2)
    plot(full_average, "SMA 5", color=color.orange)

list[float] नंबर वाले ऐरे का टाइप है। Persistent अगली कैंडल तक ऐरे रखता है। हर कैंडल पर नया नहीं बनाते।

काम array नेमस्पेस से करते हैं। सामान्य Python लाइब्रेरी इंपोर्ट या अपना लिस्ट लिटरल नहीं चाहिए।

डेमो पर चलाएँ। नीली लाइन अब तक जमा कीमतों का औसत है। पहली पर एक, दूसरी पर दो, फिर तीन और चार कीमत हैं। पाँचवीं से पाँच बचती हैं।

recent_prices.py के ग्राफ़ पर बची कीमतों का नीला औसत और नारंगी पाँच वाली SMA है।
अपने ऐरे के औसत को पूरी पाँच-तत्व विंडो की SMA से मिलाते हैं।

जोड़ने और हटाने का क्रम

छठी कैंडल पर पहले छठी क्लोज़ डालते हैं। अब छह तत्व हैं। if सत्य है, इसलिए पहला और सबसे पुराना निकालते हैं। औसत के समय दूसरी से छठी की पाँच क्लोज़ हैं।

यहाँ शुरुआत में सबसे पुरानी बची कीमत और अंत में नई है। इसलिए पाँच तत्व होने से array.get(prices, 0) चार कैंडल पुरानी है, वर्तमान नहीं।

सबसे नई के लिए आखिरी इंडेक्स array.size(prices) - 1 है। शून्य से शुरू गिनती के कारण आखिरी इंडेक्स तत्व संख्या से एक कम है।

अधूरी और पूरी विंडो

दोनों औसत शुरू में अलग हैं। ऐरे का औसत अब तक जमा चार या कम कीमत से भी निकलता है। ta.sma(close, 5) पूरी पाँच-वैल्यू विंडो पर ही देता है।

पाँचवीं से दोनों वही पाँच क्लोज़ लेते हैं। वहाँ से संख्यात्मक सटीकता की सीमा में मिलना चाहिए।

इसलिए ऐरे का औसत तैयार मूविंग एवरेज की सीधी जगह नहीं है। शुरुआती विंडो का नियम आपको तय करना है।

आकार सीमित क्यों?

हर कैंडल पर केवल जोड़ें तो ऐरे डेटा के साथ बढ़ता है। अंत में सारी प्रोसेस क्लोज़ रखेगा।

यहाँ केवल अंतिम पाँच चाहिए, इसलिए पुराने हटाते हैं। गणना के समय आकार पाँच से अधिक नहीं। असली संग्रह में भी कौन-सा डेटा कब तक रखना है तय करें।

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

तीन कीमत रखने वाला रूप बनाएँ। तैयार SMA भी तीन करें। फिर सबसे पुराना बचा तत्व तीसरी लाइन में दिखाएँ।

अभ्यास का हल

हटाने की शर्त:

if array.size(prices) > 3:
    array.shift(prices)

तैयार औसत और नई लाइन:

full_average = ta.sma(close, 3)
oldest_price = array.get(prices, 0)
plot(oldest_price, "Oldest stored price", color=color.gray)

हर कैंडल पर पढ़ने से पहले array.push है, इसलिए कम से कम एक तत्व है। तीन भर जाने पर सबसे पुरानी कीमत दो कैंडल पुरानी है।

ऐरे लिखकर देखें

पाँच के बजाय तीन बचने वाले तत्व और कीमतें 100, 103, 101, 105 लेकर हर चार कैंडल के बाद सामग्री लिखें। चौथी के बाद 103, 101 और 105 इसी क्रम में हों।