संसाधन लोड हो रहा है... लोड करना...

FMZ PINE स्क्रिप्ट दस्तावेज़

लेखक:आविष्कारक मात्रा - छोटे सपने, बनाया गयाः 2022-05-06 14:27:06, अद्यतनः 2024-10-12 15:27:04

[TOC]

खोजशब्द, वाक्यविन्यास, सेटअप विवरण

कोड संरचना

पाइन में कोड का सामान्य संरचना का पालन करेंः

<version>
<declaration_statement>
<code>

टिप्पणी

FMZ के पाइन भाषा समर्थित टिप्पणी चिह्नः एकल पंक्ति टिप्पणी//कई पंक्तियों की टिप्पणी/* */उदाहरण के लिए, निम्नलिखित उदाहरणों में टिप्पणियों को कैसे लिखा जाता हैः

[macdLine, signalLine, histLine] = ta.macd(close, 12, 26, 9)  // 计算MACD指标

/*
plot函数在图表上画出指标线
*/
plot(macdLine, color = color.blue, title='macdLine')
plot(signalLine, color = color.orange, title='signalLine')
plot(histLine, color = color.red, title='histLine')

संस्करण

निम्नलिखित रूपों के संकलक निर्देशों से संकलक को पता चलता है कि पाइन के किस संस्करण में स्क्रिप्ट लिखी गई हैः

//@version=5

डिफ़ॉल्ट रूप से v5 संस्करण, कोड में छोड़ दिया जा सकता है//@version=5

घोषणा पत्र

  • indicator()
  • strategy()

बयान कथन स्क्रिप्ट के प्रकार को परिभाषित करता है, जो यह भी निर्धारित करता है कि इसमें क्या सामग्री की अनुमति है, और इसका उपयोग कैसे किया जाता है और निष्पादित किया जाता है। स्क्रिप्ट के महत्वपूर्ण गुणों को सेट करता है, जैसे कि इसका नाम, जब इसे चार्ट में जोड़ा जाता है तो यह कहां दिखाई देगा, इसके प्रदर्शित होने वाले मानों की सटीकता और प्रारूप, और कुछ संख्याओं को नियंत्रित करता है, जैसे कि यह चार्ट में प्रदर्शित होने वाले अधिकतम चित्र वस्तुओं की संख्या। नीतियों के लिए, गुणों में पैरामीटर शामिल हैं जो पुनः परीक्षण को नियंत्रित करते हैं, जैसे कि प्रारंभिक पूंजी, कमीशन, स्लाइडिंग बिंदु, आदि। FMZ के लिए पाइन एक रणनीति कोड में शामिल होने की आवश्यकता नहीं है।indicator()याstrategy()इस तरह के बयानों को स्वीकार करें।

कोड

स्क्रिप्ट में जो पंक्ति टिप्पणी या संकलक निर्देश नहीं है, वह वाक्य है, जो स्क्रिप्ट के एल्गोरिदम को लागू करता है। एक वाक्य इनमें से एक हो सकता है।

  • चर की घोषणा
  • चर का पुनर्वितरण
  • फ़ंक्शन घोषणा
  • अंतर्निहित फ़ंक्शन कॉल, उपयोगकर्ता द्वारा परिभाषित फ़ंक्शन कॉल
  • ifforwhileयाswitchसमरूप संरचना

वाक्यों को कई तरीकों से व्यवस्थित किया जा सकता है

  • कुछ कथन एक पंक्ति के साथ व्यक्त किए जा सकते हैं, जैसे कि अधिकांश चर घोषणाएँ, केवल एक पंक्ति या एकल पंक्ति वाले फ़ंक्शन कॉल के साथ। अन्य, जैसे संरचनाएं, हमेशा कई पंक्तियों की आवश्यकता होती हैं क्योंकि उन्हें एक स्थानीय ब्लॉक की आवश्यकता होती है।
  • स्क्रिप्ट के वैश्विक दायरे के बयान (यानी भागों का हिस्सा नहीं) के साथ नहीं किया जा सकता है空格या制表符(टैब कुंजी) शुरू होता है. उनका पहला वर्ण भी उस पंक्ति का पहला वर्ण होना चाहिए. पंक्ति में पहले स्थान से शुरू होने वाली पंक्ति, परिभाषा के अनुसार, स्क्रिप्ट के वैश्विक दायरे का हिस्सा बन जाती है.
  • संरचना या बहु-पंक्ति फ़ंक्शन घोषणाओं को हमेशा एकlocal blockएक स्थानीय ब्लॉक को एक तालिका या चार स्थानों में संकुचित किया जाना चाहिए (अन्यथा, इसे पिछले पंक्ति के सीरियल कोड के रूप में हल किया जाता है, यानी पिछले पंक्ति के कोड के निरंतर सामग्री के रूप में परिभाषित किया जाता है) और प्रत्येक स्थानीय ब्लॉक एक अलग स्थानीय क्षेत्र को परिभाषित करता है।
  • कई एकल-पंक्ति वाले वाक्य को एक पंक्ति में कॉमा ((,) का उपयोग करके विभाजक के रूप में जोड़ा जा सकता है।
  • एक पंक्ति में टिप्पणी हो सकती है या सिर्फ टिप्पणी हो सकती है।
  • पंक्तियों को भी एक साथ रखा जा सकता है (बहु पंक्तियों पर जारी रखें) ।

उदाहरण के लिए, तीन लोकल शामिल हैं, एक कस्टम फ़ंक्शन घोषणा में, दो चर घोषणा में यदि संरचना का उपयोग करते हैं, निम्न कोड के साथः

indicator("", "", true)             // 声明语句(全局范围),可以省略不写

barIsUp() =>                        // 函数声明(全局范围)
    close > open                    // 本地块(本地范围)

plotColor = if barIsUp()            // 变量声明 (全局范围)
    color.green                     // 本地块 (本地范围)
else
    color.red                       // 本地块 (本地范围)

runtime.log("color", color = plotColor)  // 调用一个内置函数输出日志 (全局范围)

कोड बदलने के लिए

लंबी पंक्तियों को कई पंक्तियों में विभाजित किया जा सकता है, या उन्हें "बंद" किया जा सकता है। बंडल की गई पंक्तियों को किसी भी संख्या में रिक्त स्थानों में संकुचित किया जाना चाहिए, जब तक कि यह 4 का गुणक न हो ((इन सीमाओं का उपयोग स्थानीय खंडों को संकुचित करने के लिए किया जाता है) ।)

a = open + high + low + close

इसे इस तरह से पैक किया जा सकता है (ध्यान दें कि प्रत्येक पंक्ति में संकुचित किए गए रिक्त स्थान की संख्या 4 के गुणक नहीं है):

a = open +
      high +
          low +
             close

एक लंबा प्लॉट ((() कॉल को में पैक किया जा सकता है।

close1 = request.security(syminfo.tickerid, "D", close)      // syminfo.tickerid 当前交易对的日线级别收盘价数据系列
close2 = request.security(syminfo.tickerid, "240", close)    // syminfo.tickerid 当前交易对的240分钟级别收盘价数据系列
plot(ta.correlation(close, open, 100),                       // 一行长的plot()调用可以被包装
   color = color.new(color.purple, 40),
   style = plot.style_area,
   trackprice = true)

उपयोगकर्ता द्वारा परिभाषित फ़ंक्शन की घोषणा में एक कथन को भी पैक किया जा सकता है। हालांकि, चूंकि स्थानीय ब्लॉक को वाक्यविन्यास में एक संकुचन के साथ शुरू होना चाहिए ((4 रिक्त स्थान या 1 पैरामीटर), जब इसे अगली पंक्ति में विभाजित किया जाता है, तो कथन के निरंतर भाग को एक से अधिक संकुचन के साथ शुरू होना चाहिए ((4 रिक्त स्थान के गुणकों के बराबर नहीं है) । उदाहरण के लिएः

test(c, o) =>
    ret = c > o ?
       (c > o+5000 ? 
          1 :
              0):
       (c < o-5000 ? 
          -1 : 
              0)

a = test(close, open)
plot(a, title="a")

समयक्रम

समय अनुक्रम एक डेटा प्रकार या प्रारूप नहीं है, समय अनुक्रम एक बुनियादी संरचना का एक अवधारणा है; यह समय के साथ लगातार बदलते मानों को संग्रहीत करने के लिए उपयोग किया जाता है, प्रत्येक मान एक समय बिंदु से मेल खाता है। समय अनुक्रम इस अवधारणा का एक संरचना है जो समय के साथ बदलते डेटा को संसाधित करने और रिकॉर्ड करने के लिए उपयुक्त है। अंतर्निहित चरopenउदाहरण के लिए,openअंतर्निहित चर प्रत्येक K लाइन BAR के लिए शुरुआती कीमतों को रिकॉर्ड करता है, यदि यहopenयह 5 मिनट के लाइन चक्र का डेटा है.openचर में दर्ज किया गया है कि प्रत्येक 5 मिनट के लिए K लाइन BAR (स्तंभ) की शुरुआती कीमत है। जब आपका नीति कार्यक्रम निष्पादित होता है तो कोड में संदर्भित होता हैopenयानी वर्तमान में स्थित K-लाइन BAR के शुरुआती मूल्य को संदर्भित करता है. समय अनुक्रम में पहले के मूल्य (अतीत मूल्य) को संदर्भित करने के लिए हम उपयोग करते हैं[]इतिहास ऑपरेटर, जब कोई नीति किसी K-लाइन BAR पर निष्पादित होती है, तोopen[1]इसका मतलब है कि वर्तमान K लाइन BAR के पहले K लाइन BAR के शुरुआती मूल्य का संदर्भ है।

हालांकिसमयक्रमयह "सरणी" के रूप में डेटा संरचनाओं के बारे में सोचने के लिए आसान है, हालांकि पिन भाषा में भी सरणी प्रकार हैं; लेकिन वे समय अनुक्रम से पूरी तरह से अलग अवधारणाएं हैं।

PINE भाषा में इस तरह से डिज़ाइन किए गए समय अनुक्रमों के साथ, रणनीति कोड में समापन मूल्य के संचयी मान को आसानी से गणना की जा सकती है, और इसके लिए for जैसे लूपिंग संरचनाओं का उपयोग करने की आवश्यकता नहीं है, केवल PINE भाषा का उपयोग करके अंतर्निहित कार्यों का उपयोग करना।ta.cum(close)एक और उदाहरण के रूप में, हमें अंतिम 14 K-लाइन BAR (अर्थात, कोड निष्पादन के समय वर्तमान समय में सबसे निकटतम 14 K-लाइन BAR) के लिए अधिकतम मूल्य और न्यूनतम मूल्य अंतर का औसत गणना करने की आवश्यकता है, जिसे लिखा जा सकता हैःta.sma(high - low, 14)

एक समय अनुक्रम पर एक फ़ंक्शन को कॉल करने के परिणाम भी समय अनुक्रम पर एक निशान छोड़ देते हैं, और इसी तरह इस्तेमाल किया जा सकता है[]इतिहास ऑपरेटर पूर्ववर्ती मानों को संदर्भित करता है. उदाहरण के लिए, जब वर्तमान K-लाइन BAR का समापन मूल्य अंतिम 10 K-लाइन BAR में सबसे अधिक मूल्य से अधिक है ((वर्तमान K-लाइन BAR को छोड़कर) । हम लिख सकते हैं किbreach = close > ta.highest(close, 10)[1]यह भी लिखा जा सकता हैbreach = close > ta.highest(close[1], 10)इसलिए।ta.highest(close, 10)[1]औरta.highest(close[1], 10)यह एक समान है।

यह कोड का उपयोग करके सत्यापित किया जा सकता हैः

strategy("test pine", "test", true) 

a = ta.highest(close, 10)[1]
b = ta.highest(close[1], 10)

plotchar(true, title="a", char=str.tostring(a), location=location.abovebar, color=color.red)
plotchar(true, title="b", char=str.tostring(b), location=location.belowbar, color=color.green)

उपरोक्त परीक्षण कोड प्रत्येक BAR पर a और b के लिए उनके संबंधित समय अनुक्रम के मानों को आउटपुट करता है, जैसा कि आप देख सकते हैं कि a और b के मान हमेशा समान होते हैं, इसलिए ये दोनों प्रतिनिधित्व विधियां समान हैं।

पाइन भाषा लेन-देन क्लासरूम टेम्पलेट पैरामीटर

पाइन नीति के लिए निर्मित टेम्पलेट "पाइन भाषा लेन-देन पुस्तकालय" के लिए पैरामीटर सेटिंग निर्देश।

img

लेन-देन सेटअप

  • निष्पादन समापन मूल्य मॉडलः वर्तमान बार समाप्त होने के बाद ही मॉडल निष्पादित किया जाता है और नीचे के मूल बार के शुरू होने पर ही लेनदेन निष्पादित किया जाता है। वास्तविक समय मूल्य मॉडलः प्रत्येक मूल्य परिवर्तन के साथ मॉडल निष्पादित होता है, और संकेत तुरंत लेनदेन निष्पादित करने के लिए होते हैं।
  • डिफ़ॉल्ट ट्रेड संख्याः यदि ट्रेडिंग निर्देश में ट्रेड संख्या निर्दिष्ट नहीं है, तो ट्रेडों को उस सेटिंग के अनुसार निष्पादित किया जाता है।
  • अधिकतम एकमुश्त ऑर्डर मात्राः वास्तविक डिब्बे के आधार पर, इस पैरामीटर सेटिंग के साथ संयोजन में, प्रत्येक ऑर्डर के लिए अधिकतम संख्या निर्धारित करें, ताकि डिब्बे के प्रभाव से बचा जा सके।
  • स्लाइडिंग मूल्य बिंदुओं की संख्याः定价货币精度पैरामीटर और यह पैरामीटर ऑर्डर के समय स्लाइड मूल्य निर्धारित करता है; उदाहरण के लिए, मूल्य निर्धारण मुद्रा सटीकता सेट 2 है, अर्थात्, दूसरे स्थान पर घन बिंदु तक सटीक, 0.01 तक सटीक; तो स्लाइड मूल्य बिंदु प्रत्येक बिंदु का प्रतिनिधित्व करता है 0.01 मूल्य निर्धारण इकाई; इस समय स्लाइड मूल्य बिंदु सेट 5 है, और ऑर्डर के समय स्लाइड मूल्य 0.05 है ((स्लाइड मूल्य ऑर्डर के लिए बेहतर है और ऑर्डर के लेनदेन के लिए ओवरफ्लो मूल्य का हिस्सा डिस्क) ।) ।
  • चर के सबसे लंबे चक्रों की संख्याः चार्ट के K-लाइन BAR की संख्या को प्रभावित करता है, औरjavascriptरणनीति में कॉल करेंSetMaxBarLenफ़ंक्शन का कार्य समान है।

वायदा विकल्प

  • किस्म कोडः अनुबंध कोड, जब एक्सचेंज ऑब्जेक्ट्स गैर-ऑन-स्टॉक एक्सचेंज ऑब्जेक्ट्स के लिए सेट किए जाने की आवश्यकता होती है।
  • न्यूनतम अनुबंध संख्याः अनुबंध के लिए न्यूनतम लेनदेन राशि जब आदेश दिया जाता है।

डिस्क विकल्प

  • ऑटो-रीस्टोर प्रोग्रेसः ऑटो-रीस्टोर पिछले पॉलिसी को रोकने से पहले की स्थिति में।
  • ऑर्डर पुनः प्रयासों की संख्याः यदि कोई लेनदेन नहीं होता है, तो ऑर्डर रद्द कर दिया जाता है और फिर से ऑर्डर करने का प्रयास किया जाता है। यह पैरामीटर अधिकतम पुनः प्रयासों की संख्या को सीमित करने के लिए उपयोग किया जाता है।
  • नेटवर्क क्वेरी अंतराल (मिलीसेकंड): केवल REST प्रोटोकॉल के लिए प्रभावी, नेटवर्क अनुरोध अंतराल को नियंत्रित करता है, बहुत बार अनुरोधों से बचने के लिए, एक्सचेंज सीमा से परे।
  • खाता सिंक्रनाइज़ेशन का समय (सेकंड): खाता डेटा के सिंक्रनाइज़ेशन का समय चक्र।
  • पोस्ट-ऑपरेशन पोजीशन सिंक समय (एमएस): केवल कुछ एक्सचेंजों के डेटा में देरी के कारण दोहराए गए पोजीशन के लिए, सिंक समय को बड़ा सेट करना इस तरह के मुद्दों को कम कर सकता है।
  • लीवरेज गुणांक: लीवरेज गुणांक सेट करें.

नकदी लेनदेन, अन्य सेटिंग्स

  • एक हाथ का लेनदेनः डिफ़ॉल्ट रूप से एक हाथ का लेनदेन, केवल नकदी के लिए मान्य है।
  • न्यूनतम लेनदेन मात्राः न्यूनतम लेनदेन मात्रा।
  • मुद्रा मूल्य निर्धारण सटीकताः मूल्य सटीकता, यानी कीमत के छोटे अंक।
  • लेन-देन की विविधता की सटीकताः निम्न मात्रा की सटीकता, यानी निम्न मात्रा के छोटे अंक।
  • प्रसंस्करण शुल्कः इस सेटिंग के आधार पर कुछ डेटा के लिए गणना की जाती है, 0.002 एक हजारवें भाग का 2 है।
  • लाभ और हानि के आंकड़ों का अंतरालः केवल वास्तविक डिस्क पर लाभ और हानि के आंकड़ों का उपयोग दिखाया गया है।
  • असफल पुनः प्रयास (मिलीसेकंड): नेटवर्क अनुरोध विफल होने पर पुनः प्रयास करने का अंतराल।
  • एजेंट का उपयोग करनाः केवल REST प्रोटोकॉल के लिए मान्य है।
  • सामान्य वेब त्रुटियों को छिपाएंः लॉग क्षेत्र में सामान्य गलतियों को छिपाएं।
  • बेस एड्रेस स्विच करेंः केवल REST प्रोटोकॉल के लिए मान्य है.
  • संदेश भेजेंः संदेश को ई-मेल बॉक्स में भेजें।

अनुसूची सौदा

खोलना

strategy(title = "open long example", pyramiding = 3)                                // pyramiding 允许的同方向下单的次数
strategy.entry("long1", strategy.long, 0.01)                                         // 市价开多仓,指定分组标签为long1
strategy.entry("long2", strategy.long, 0.02, when = close > ta.ema(close, 10))       // 条件触发,执行下单,市价开多仓
strategy.entry("long3", strategy.long, 0.03, limit = 30000)                          // 指定(较低的)价格,计划下买单订单,等待成交开仓,限价开仓

समतल

strategy(title = "close long example", pyramiding = 2)                              // pyramiding 允许的同方向下单的次数
strategy.entry("long1", strategy.long, 0.1)                                         // 市价开多仓,指定分组标签为long1
strategy.entry("long2", strategy.long, 0.1)                                         // 市价开多仓,指定分组标签为long2
strategy.close("long1", when = strategy.position_size > 0.1, qty_percent = 50, comment = "close buy entry for 50%")   // 平仓,指定平掉分组标签为long1的仓位的50%持仓
strategy.close("long2", when = strategy.position_size > 0.1, qty_percent = 80, comment = "close buy entry for 80%")   // 平仓,指定平掉分组标签为long2的仓位的80%持仓

लेनदेन तंत्र

PINE भाषा में होल्डिंग का तंत्र एकतरफा होल्डिंग के समान है। उदाहरण के लिए, जब एक बहुमुखी स्थिति ("बहुमुखी होल्डिंग") हो, तो यदि बिक्री के आदेश, योजना सूची, आदि हैं, तो यह पहले बहुमुखी स्थिति ("सभी बहुमुखी होल्डिंगों को समतल करना) को समाप्त कर देता है, और फिर निष्पादित होता है।

कार्यक्रम सूची

यदि कोई मूल्य निर्दिष्ट नहीं किया जाता है, तो डिफ़ॉल्ट रूप से बाजार मूल्य सूची का उपयोग करें। बाजार मूल्य सूची के अलावा, योजना सूची के माध्यम से भी आदेश दिया जा सकता है, योजना सूची तुरंत आदेश को संचालित नहीं करती है। योजना सूची एक कार्यक्रम की योजना के लिए एक कार्यवाही कतार में मौजूद है जब कोई ट्रिगर नहीं किया जाता है।वास्तविक डिस्क / पुनः परीक्षणसमय की स्थिति की जानकारी (यानी, रणनीति चल रही स्थिति टैब) "योजना आदेश" तालिका के विभाजन में दिखाई देती है। जब बाजार वास्तविक समय के मूल्य की शर्तों को पूरा करता है तो सिस्टम वास्तव में इन योजनाओं को ट्रिगर करता है। इसलिए इन आदेशों में लेनदेन की कीमतों में मामूली विचलन सामान्य स्थिति है। उपयोगstrategy.entryऔर जब हम फ़ंक्शन को क्रमबद्ध करते हैं, तो हम निर्दिष्ट कर सकते हैंlimitstopपैरामीटर ।

var isTrade = false 
if not barstate.ishistory and not isTrade
    isTrade := true 
    strategy.entry("test 1", strategy.long, 0.1, stop=close*1.3, comment="test 1 order")                     // stop
    strategy.entry("test 2", strategy.long, 0.2, limit=close*0.7, comment="test 2 order")                    // limit
    strategy.entry("test 3", strategy.short, 0.3, stop=close*0.6, limit=close*1.4, comment="test 3 order")   // stop-limit    
  • सीमा आदेश

    ऑर्डर के लिए सीमा निर्धारित करें, जब ऑर्डर भुगतान के लिए है (यानी)directionपैरामीटर हैstrategy.longयह केवल तब होता है जब बाजार की वर्तमान कीमत उस कीमत से कम होती है। जब ऑर्डर बिक्री के लिए होता है (यानी)directionपैरामीटर हैstrategy.short), ऑर्डर केवल तभी ट्रिगर होता है जब बाजार का वर्तमान मूल्य उस मूल्य से अधिक हो।

  • रोकें आदेश

    ऑर्डर का स्टॉप-लॉस मूल्य सेट करें, जब ऑर्डर एक भुगतान है, तो ऑर्डर केवल तभी ट्रिगर होता है जब बाजार का वर्तमान मूल्य उस मूल्य से अधिक होता है। जब ऑर्डर एक बिक्री ऑर्डर है, तो ऑर्डर केवल तभी ट्रिगर होता है जब बाजार में वर्तमान मूल्य उस मूल्य से कम हो।

  • रोक-सीमा आदेश

    एक साथ सेट कर सकते हैंlimitstopपैरामीटर, ऑर्डर पहले मूल्य पर ट्रिगर किया जाता है जो शर्तों को पूरा करता है।

अधिकारों का प्रतिशत

//@version=5
strategy("Percent of Equity Order", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)  

// 简单的均线交叉策略
longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))  

// 如果均线交叉条件满足,则买入或卖出
if (longCondition)
    strategy.entry("Long", strategy.long)  

if (shortCondition)
    strategy.entry("Short", strategy.short)
  

निर्दिष्ट करेंdefault_qty_type=strategy.percent_of_equityबाद में, सेट करेंdefault_qty_valueप्रतिशत संख्या ((0-100), 1 या 1% के लिए; खाता में बोली जाने वाली मुद्राओं की संख्या के आधार पर एकमुश्त राशि की गणना करें; उदाहरण के लिएः वर्तमान खाते में 10000 USDT है, 1% जमा करने के लिए सेट करें, यानी 100 USDT के पैमाने पर एकमुश्त राशि जमा करने के लिए; बिक्री के समय वर्तमान मूल्य के आधार पर गणना करें) ।

घोषणा, तार्किक संरचना कीवर्ड

विर

var एक प्रकार का कुंजी शब्द है जिसका उपयोग आवंटन और एक बार में आरंभ करने वाले चर के लिए किया जाता है। आम तौर पर, चर असाइनमेंट सिंटैक्स जिसमें कीवर्ड var शामिल नहीं होता है, का परिणाम यह होता है कि वे प्रत्येक बार डेटा को अपडेट करते समय चर के मान को कवर करते हैं। इसके विपरीत, जब वे कीवर्ड var का उपयोग करते हैं, तो वे डेटा को अपडेट करने के बावजूद स्थिति को बनाए रख सकते हैं, और इसे केवल तब बदल सकते हैं जब यह if-expressions में स्थितियों को पूरा करता है।

var variable_name = expression

स्पष्टीकरणः

  • variable_name- पाइन स्क्रिप्ट में अनुमति प्राप्त उपयोगकर्ता चर का कोई भी नाम ((लाटिन अक्षरों, संख्याओं और रेखांकनों को बड़े और छोटे अक्षरों में शामिल कर सकता है, लेकिन संख्याओं से शुरू नहीं हो सकता है)) ।
  • expression- कोई भी अंकगणितीय अभिव्यक्ति, जैसे कि एक नियमित चर को परिभाषित करना।

उदाहरण

// Var keyword example
var a = close
var b = 0.0
var c = 0.0
var green_bars_count = 0
if close > open
    var x = close
    b := x
    green_bars_count := green_bars_count + 1
    if green_bars_count >= 10
        var y = close
        c := y
plot(a, title = "a")
plot(b, title = "b")
plot(c, title = "c")

चर a श्रृंखला में प्रत्येक स्तंभ रेखा के पहले स्तंभ रेखा के समापन मूल्य को बनाए रखता है. परिवर्तनीय कण b कणों ने श्रृंखला में पहले कणों की हरी कणों की कीमतों के बंद होने की कीमतों को बरकरार रखा। परिवर्तनीय एसी एसी ने श्रृंखला में दसवें एसी ग्रीन एसी के समापन मूल्य को बरकरार रखा।

एफएमजेड पर, इसे वास्तविक समय मूल्य मॉडल, समापन मूल्य मॉडल और वास्तविक समय मूल्य मॉडल के रूप में विभाजित किया गया है।varvaripहम निम्नलिखित कोड का उपयोग करके परीक्षण करते हैं।

strategy("test pine", "test 1", true) 

// 测试 var varip
var i = 0
varip ii = 0

// 将策略逻辑每轮改变的i、ii打印在图上
plotchar(true, title="ii", char=str.tostring(ii), location=location.abovebar, color=color.red)
plotchar(true, title="i", char=str.tostring(i), location=location.belowbar, color=color.green)

// 每轮逻辑执行都给i、ii递增1
if true
    i := i + 1
    ii := ii + 1
  • वास्तविक समय मूल्य मॉडल उपरोक्त परीक्षण कोड को निष्पादन के समय दो चरणों में विभाजित किया गया हैः १, ऐतिहासिक के-लाइन चरण; २, वास्तविक समय के-लाइन चरण; जब वास्तविक समय मूल्य मॉडल, ऐतिहासिक के-लाइन चरण,varvaripघोषणा किए गए चर i, ii को नीति कोड के प्रत्येक चरण के निष्पादन के दौरान वृद्धिशील ऑपरेशन किया जाता है क्योंकिif trueतो निश्चित रूप से निष्पादित करने के लिए संबंधित शर्त कोड ब्लॉक) । इसलिए आप देख सकते हैं कि पुनरावृत्ति के परिणाम K लाइन BAR पर दिखाए गए संख्याओं में से प्रत्येक में 1 की वृद्धि होती है । जब ऐतिहासिक K लाइन चरण समाप्त होता है, तो वास्तविक समय K लाइन चरण शुरू होता है ।varvaripयह एक वास्तविक समय मूल्य मॉडल है, क्योंकि एक K-लाइन BAR में प्रत्येक मूल्य परिवर्तन के लिए एक बार रणनीति कोड निष्पादित किया जाता है।i := i + 1औरii := ii + 1यह भिन्नता यह है कि ii हर बार संशोधित होता है. i हालांकि प्रत्येक बार संशोधित होता है, लेकिन नीति लॉजिक के अगले चरण के निष्पादन के दौरान पिछले मूल्य को बहाल कर देता है, जब तक कि वर्तमान K लाइन BAR समाप्त न हो जाए।

  • समापन मूल्य मॉडल चूंकि समापन मूल्य मॉडल में प्रत्येक K-लाइन BAR के समाप्त होने पर एक रणनीति तर्क निष्पादित किया जाता है। इसलिए समापन मूल्य मॉडल में, ऐतिहासिक K-लाइन चरण और वास्तविक समय K-लाइन चरण, दोनों के लिए समान हैं।varvaripउपरोक्त उदाहरणों में, जो चर घोषित किए गए हैं, वे पूरी तरह से समान हैं, प्रत्येक K-लाइन BAR के लिए 1 की वृद्धि के साथ।

विविधता

varip (var intrabar persist) एक कुंजी है जो आवंटन और एक बार में आरंभ करने वाले चर के लिए उपयोग की जाती है। यह var कुंजी के समान है, लेकिन varip घोषणा का उपयोग करने वाले चर को वास्तविक समय में K लाइन अपडेट के बीच अपना मान बनाए रखना चाहिए।

varip variable_name = expression

स्पष्टीकरणः

  • variable_name- पाइन स्क्रिप्ट में अनुमति प्राप्त उपयोगकर्ता चर का कोई भी नाम ((लाटिन अक्षरों, संख्याओं और रेखांकनों को बड़े और छोटे अक्षरों में शामिल कर सकता है, लेकिन संख्याओं से शुरू नहीं हो सकता है)) ।
  • expression- कोई भी अंकगणितीय अभिव्यक्ति, जैसे कि नियमित चर को परिभाषित करते समय। पहली K पंक्ति पर, अभिव्यक्ति केवल एक बार गणना करती है और इसे एक बार चर को सौंपती है।

उदाहरण

// varip
varip int v = -1
v := v + 1
plot(v)

जब var का उपयोग किया जाता है, तो ग्राफ bar_index का मान लौटाता है; जब varip का उपयोग किया जाता है, तो इतिहास K लाइन पर समान व्यवहार होता है, लेकिन वास्तविक समय K लाइन पर, यह ग्राफ एक मान लौटाता है, जो प्रत्येक टिक के लिए एक बढ़ जाता है।

नोट्सकेवल सरल प्रकारों जैसे float, int, boole, string और इन प्रकारों के सरणियों के साथ प्रयोग किया जा सकता है।

सच

एक Boolean प्रकार के चर के मूल्य को दर्शाता है, या जब अभिव्यक्ति का उपयोगतुलनायातर्कऑपरेटर के लिए गणना करने योग्य मान।

नोट्सकृपया देखेंतुलनाऑपरेटर औरतर्कऑपरेटर का वर्णन ।

अलविदा bool

झूठी

एक बुल प्रकार के चर का मान, और तुलना ऑपरेशन या तार्किक ऑपरेशन के परिणामों को दर्शाता है।

नोट्सकृपया देखेंतुलनाऑपरेटर औरतर्कऑपरेटर का वर्णन ।

अलविदा bool

यदि

यदि कथन एक वाक्य खंड को परिभाषित करता है जिसे अभिव्यक्ति की शर्तों को पूरा करने के लिए निष्पादित किया जाना चाहिए। चौथे संस्करण के पाइन स्क्रिप्टिंग भाषा में आपको else if सिंक का उपयोग करने की अनुमति है।

सामान्य कोडः

var_declarationX = if condition
    var_decl_then0
    var_decl_then1
    ...
    var_decl_thenN
    return_expression_then
else if [optional block]
    var_decl_else0
    var_decl_else1
    ...
    var_decl_elseN
    return_expression_else
else
    var_decl_else0
    var_decl_else1
    ...
    var_decl_elseN
    return_expression_else

नोट्स var_declarationX- यह चर यदि कथन का मान प्राप्त करता हैcondition- यदि शर्त सच है, तो वाक्य ब्लॉक का उपयोग करेंthenतर्क में ((var_decl_then0var_decl_then1आदि) ⇒ यदि शर्त false है, तो वाक्य खंड का उपयोग करेंelse ifयाelseतर्क में ((var_decl_else0var_decl_else1आदि) ।return_expression_then , return_expression_else- मॉड्यूल में अंतिम अभिव्यक्ति या ब्लॉकelse से अभिव्यक्ति कथन का अंतिम मान लौटाएगी. यदि चर अंत में घोषित किया गया है, तो इसका मान परिणाम मान होगा.

यदि कथन का लौटाया गया मान के प्रकार पर निर्भर करता हैreturn_expression_thenऔरreturn_expression_elseप्रकार. ट्रेडिंग व्यू पर चलने पर, उनके प्रकारों का मिलान होना चाहिएः जब आपके पासelse ब्लॉक में एक स्ट्रिंग मान होता है, तो then कथन ब्लॉक से एक पूर्णांक मान वापस करना असंभव होता है. FMZ पर चलने पर, निम्नलिखित उदाहरण त्रुटि नहीं देते हैं, जब y मान "open" लिया जाता है, तो प्लॉट ग्राफ में n/a मान होता है।

उदाहरण

// This code compiles
x = if close > open
    close
else
    open  

// This code doesn’t compile by trading view
// y = if close > open
//     close
// else
//     "open"
plot(x)

छोड़ सकते हैंelseब्लॉक. इस स्थिति में, यदि शर्त false है, तो var_declarationX चर को एक empty threshold ((na、false या ) आवंटित किया जाता हैः

उदाहरण

// if
x = if close > open
    close
// If current close > current open, then x = close.
// Otherwise the x = na.
plot(x)

आप कई else if ब्लॉक का उपयोग कर सकते हैं या बिल्कुल भी उपयोग नहीं कर सकते हैं. then , else if , else if के ब्लॉक को चार रिक्त स्थानों में स्थानांतरित किया जाता हैः

उदाहरण

// if
x = if open > close
    5
else if high > low
    close
else
    open
plot(x)

अनदेखा किया जा सकता हैifकथन का परिणाम मान ((var_declarationX= को छोड़ दिया जा सकता है) । यदि आपको अभिव्यक्ति के दुष्प्रभावों की आवश्यकता है, तो यह उपयोगी हो सकता है, उदाहरण के लिए रणनीतिक लेनदेन मेंः

उदाहरण

if (ta.crossover(high, low))
    strategy.entry("BBandLE", strategy.long, stop=low)
else
    strategy.cancel(id="BBandLE")

यदि वाक्यांश एक दूसरे को शामिल कर सकते हैंः

उदाहरण

// if
float x = na
if close > open
    if close > close[1]
        x := close
    else
        x := close[1]
else
    x := open
plot(x)

के लिए

'for' स्ट्रक्चर कई कथन को दोहराने की अनुमति देता हैः

[var_declaration =] for counter = from_num to to_num [by step_num]
    statements | continue | break
    return_expression

var_declaration- एक वैकल्पिक चर घोषणा, जिसे return_expression के मूल्य के रूप में निर्दिष्ट किया जाएगा।counter- रिवर्स लूप के प्रत्येक पुनरावृत्ति के दौरान 1 या step_num मान को बढ़ा/घटाकर रिवर्स लूप के काउंटर के मान के चर को संग्रहीत करता है।from_num- काउंटर का आरंभिक मान.to_num- काउंटर का अंतिम मान; जब काउंटर to_num से बड़ा होता है ((या from_num > to_num के मामले में to_num से छोटा होता है) तो लूप टूट जाता है; hsseries int/float thresholds/expressions का उपयोग करने की अनुमति है, लेकिन वे केवल लूप के पहले पुनरावृत्ति पर मूल्यांकन करते हैं।step_num- काउंटर का वृद्धि / घटाव. यह वैकल्पिक है. डिफ़ॉल्ट मान +1 या -1 है, जो कि from_num या to_num में से सबसे बड़ा है. जब मान का उपयोग किया जाता है, तो काउंटर भी from_num या to_num में से सबसे बड़ा के आधार पर वृद्धि / घटाव करता है, इसलिए step_num का +/- प्रतीक वैकल्पिक है.statements | continue | break- किसी भी संख्या में वाक्यांश, या 4 रिक्त स्थान या एक टैब तक संकुचित करने के लिए एक निरंतर या ब्रेक टैब कुंजी शब्द।return_expression- लूप का रिटर्न मान, यदि मौजूद हो, तो var_declaration में दिए गए चर को दिया जाता है। यदि लूप को "continue" या "break" कीवर्ड के कारण छोड़ दिया जाता है, तो लूप का रिटर्न मान उस अंतिम चर का रिटर्न मान है जिसे लूप से बाहर निकलने से पहले आवंटित किया गया था।continue- केवल एक कुंजी शब्द का उपयोग करने के लिए वापस लौटाया जा सकता है. इस कारण के लिए अगली बार फिर से दोहराया जा सकता है।break- वापस सर्कल से बाहर निकलने के लिए कुंजी शब्द ।

उदाहरण

// Here, we count the quantity of bars in a given 'lookback' length which closed above the current bar's close
qtyOfHigherCloses(lookback) =>
    int result = 0
    for i = 1 to lookback
        if close[i] > close
            result += 1
    result
plot(qtyOfHigherCloses(14))

अलविदा for...in while

के लिए... में

for...inसंरचनाएँ सरणी के प्रत्येक तत्व के लिए कई कथन दोहराने की अनुमति देती हैं। यह किसी भी पैरामीटर के साथ इस्तेमाल किया जा सकता हैःarray_element, या दो पैरामीटर के साथ प्रयोग किया जा सकता हैः[index, array_element]दूसरा रूप लूप के कामकाज को प्रभावित नहीं करता है। यह तत्व समूह के पहले चर में वर्तमान पुनरावृत्ति के सूचकांक को ट्रैक करता है।

[var_declaration =] for array_element in array_id
    statements | continue | break
    return_expression

[var_declaration =] for [index, array_element] in array_id
    statements | continue | break
    return_expression

var_declaration- एक वैकल्पिक चर घोषणा, जो लूप के लिए दिया जाएगाreturn_expressionका मान है।index- वर्तमान पुनरावर्ती सूचकांक के लिए एक वैकल्पिक चर को ट्रैक करें. सूचकांक 0 से शुरू होता है. चर लूप में अपरिवर्तनीय है. जब इसका उपयोग किया जाता है, तो इसे एक में शामिल किया जाना चाहिए.array_elementइस तरह के एक समूह में।array_element- प्रत्येक निरंतर सरणी तत्व के चर को शामिल करता है जिसे चक्र में संसाधित किया जाना है। यह चर चक्र में अपरिवर्तनीय है।array_id- घुमावदार पुनरावृत्ति के साथ सरणी आईडी।statements | continue | break- किसी भी संख्या में वाक्यांश, या 4 रिक्त स्थान या एक टैब तक संकुचित करने के लिए एक निरंतर या ब्रेक टैब कुंजी शब्द।return_expression- लूप का रिटर्न मान आवंटित किया गया हैvar_declarationयदि कोई लूप के भीतर का चर है, यदि यह मौजूद है. यदि लूप के बाहर निकलने का कारण "continue" या "break" कीवर्ड है, तो लूप का लौटाया गया मान उस चर का है जिसे लूप से बाहर निकलने से पहले अंतिम रूप दिया गया है.continue- केवल एक कुंजी शब्द का उपयोग करने के लिए वापस लौटाया जा सकता है. इस कारण के लिए अगली बार फिर से दोहराया जा सकता है।break- वापस सर्कल से बाहर निकलने के लिए कुंजी शब्द ।

लूप के दौरान सरणी के तत्वों या उनके आकार को संशोधित करने की अनुमति देता है। यहाँ हम उपयोग करते हैंfor...inएक सिंगल पैरामीटर के रूप में, यह निर्धारित किया जाता है कि प्रत्येक K लाइन पर कितने K लाइनों का OHLC SMA है, जो कि kclose threshold से बड़ा हैः

उदाहरण

// Here we determine on each bar how many of the bar's OHLC values are greater than the SMA of 'close' values
float[] ohlcValues = array.from(open, high, low, close)
qtyGreaterThan(value, array) =>
    int result = 0
    for currentElement in array
        if currentElement > value
            result += 1
        result
plot(qtyGreaterThan(ta.sma(close, 20), ohlcValues))

यहाँ, हम दो पैरामीटर के रूप में इस्तेमाल किया है for...in हमारेisPosसमवर्ती मान सेट किया गया हैtrueजब वे हमारे पास होते हैं,valuesArrayअंकगणित में समकक्ष मान सही समय पर हैः

उदाहरण

// for...in
var valuesArray = array.from(4, -8, 11, 78, -16, 34, 7, 99, 0, 55)
var isPos = array.new_bool(10, false)  

for [index, value] in valuesArray
    if value > 0
        array.set(isPos, index, true)  

if barstate.islastconfirmedhistory
    runtime.log(str.tostring(isPos))

अलविदा for while array.sum array.min array.max

जबकि

whileकथन स्थानीय कोड ब्लॉक की शर्तों को दोहराने की अनुमति देता है।

variable_declaration = while boolean_expression
    ...
    continue
    ...
    break
    ...
    return_expression

स्पष्टीकरणःvariable_declaration- वैकल्पिक चर घोषणाएं ।return expressionइस चर के लिए एक आरंभिक मान प्रदान किया जा सकता है.boolean_expression- यदि सच है, तो निष्पादित करेंwhileवाक्य का स्थानीय ब्लॉक. यदि गलत है, तोwhileवाक्य के बाद स्क्रिप्ट को निष्पादित करना जारी रखें।continue - continueएक कुंजी शब्द अगले पुनरावृत्ति के लिए एक पुनरावर्ती शाखा का कारण बनता है।break - breakकुंजी शब्द लूप को समाप्त कर देता है.whileयह वाक्य के बाद फिर से शुरू होता है।return_expression- उपलब्ध करायाwhileवाक्य का वैकल्पिक मान लौटता है ।

उदाहरण

// This is a simple example of calculating a factorial using a while loop.
int i_n = input.int(10, "Factorial Size", minval=0)
int counter   = i_n
int factorial = 1
while counter > 0
    factorial := factorial * counter
    counter   := counter - 1

plot(factorial)

नोट्सआरंभिकwhileपंक्तियों के बाद स्थानीय कोड ब्लॉक को चार रिक्त स्थान या एक टाइमर के रूप में संकुचित किया जाना चाहिए।whileचक्र,whileबाद के बुल अभिव्यक्ति को अंततः गलत होना चाहिए या निष्पादित होना चाहिएbreak

स्विच करना

स्विच ऑपरेटर शर्तों और अभिव्यक्ति के मानों के आधार पर नियंत्रण को कुछ कथनों में से एक में स्थानांतरित करता है।

[variable_declaration = ] switch expression
    value1 => local_block
    value2 => local_block
    ...
    => default_local_block

[variable_declaration = ] switch
    boolean_expression1 => local_block
    boolean_expression2 => local_block
    ...
    => default_local_block

एक अभिव्यक्ति के साथ स्विचः

उदाहरण

// Switch using an expression

string i_maType = input.string("EMA", "MA type", options = ["EMA", "SMA", "RMA", "WMA"])

float ma = switch i_maType
    "EMA" => ta.ema(close, 10)
    "SMA" => ta.sma(close, 10)
    "RMA" => ta.rma(close, 10)
    // Default used when the three first cases do not match.
    => ta.wma(close, 10)

plot(ma)

बिना अभिव्यक्ति वाले स्विचः

उदाहरण

strategy("Switch without an expression", overlay = true)

bool longCondition  = ta.crossover( ta.sma(close, 14), ta.sma(close, 28))
bool shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))

switch
    longCondition  => strategy.entry("Long ID", strategy.long)
    shortCondition => strategy.entry("Short ID", strategy.short)

लौटाता हैनिष्पादित स्थानीय वाक्य खंड में अंतिम अभिव्यक्ति का मान।

नोट्सकेवल निष्पादित करेंlocal_blockउदाहरण याdefault_local_blockएक है।default_local_blockकेवल=>चिह्न एक साथ पेश किए जाते हैं, और केवल तभी निष्पादित किए जाते हैं जब पिछले ब्लॉक को निष्पादित नहीं किया जाता है; यदिswitchकथन का परिणाम एक चर को सौंपा गया है और निर्दिष्ट नहीं किया गया हैdefault_local_blockयदि यह नहीं किया जाता हैlocal_blockयह वाक्य वापस आ जाता हैna◎ होगाswitchजब हम किसी variable को statement का result assign करते है, तो सभी variable को statement का result assign करते है.local_blockउदाहरण को एक ही प्रकार का मान लौटा देना चाहिए.

अलविदा if ?:

सीरीज

series एक कीवर्ड है जो डेटा श्रृंखला प्रकार को दर्शाता है।seriesयह अक्सर एक अनावश्यक खोजशब्द होता है।

ऑपरेटर

=

चर को असाइन करने के लिए प्रयोग किया जाता है, लेकिन केवल जब चर घोषित किया जाता है (पहली बार उपयोग किया जाता है) ।

:=

वैल्यूएशन ऑपरेटर, जो बायीं ओर के चर को वैल्यूएशन देता है. इसे पहले घोषित किए गए चर के लिए प्रयोग किया जाता है.

!=

नहीं है । किसी भी प्रकार के अभिव्यक्ति के लिए लागू होता है ।

expr1 != expr2

लौटाता हैबुल मान, या बुल मानों की एक श्रृंखला।

%

मॉड्यूल ((पूर्णांक शेष संख्याएँ) ⇒ संख्यात्मक अभिव्यक्ति के लिए प्रयोग किया जाता है ⇒

expr1 % expr2

लौटाता हैपूर्णांक या फ्लोटिंग मान, या मानों की एक श्रृंखला।

नोट्सपाइन स्क्रिप्ट में, पूर्णांक के शेष की गणना करते समय, व्यापारी को काट दिया जाता है; यानी, इसका चौथाई से पांचवां सबसे कम पूर्ण मूल्य तक काट दिया जाता है; प्राप्त मूल्य में लाभांश के समान प्रतीक होते हैं।

उदाहरण: -1 % 9 = -1 - 9 * truncate ((-1/9) = -1 - 9 * truncate ((-0.111) = -1 - 9 * 0 = -1.

%=

मॉड्यूल निर्दिष्ट करना↑ संख्यात्मक अभिव्यक्ति के लिए उपयुक्त है↑

expr1 %= expr2

उदाहरण

// Equals to expr1 = expr1 % expr2.
a = 3
b = 3
a %= b
// Result: a = 0.
plot(a)

लौटाता हैपूर्णांक या फ्लोटिंग मान, या मानों की एक श्रृंखला।

*

गुणन । यह संख्यात्मक अभिव्यक्ति के लिए है ।

expr1 * expr2

लौटाता हैपूर्णांक या फ्लोटिंग मान, या मानों की एक श्रृंखला।

*=

गुणन निर्दिष्ट करना↑ संख्यात्मक अभिव्यक्ति के लिए लागू है↑

expr1 *= expr2

उदाहरण

// Equals to expr1 = expr1 * expr2.
a = 2
b = 3
a *= b
// Result: a = 6.
plot(a)

लौटाता हैपूर्णांक या फ्लोटिंग मान, या मानों की एक श्रृंखला।

+

जोड़ा या एकमुश्त वास्तविक संख्याएँ.

expr1 + expr2
+ expr

लौटाता हैस्ट्रिंग का द्विआधारीकरण+एक्सप्रेस 1 और एक्सप्रेस 2 का संयोजन लौटाता है संख्याएँ पूर्णांक या फ्लोटिंग बिंदु मान, या मानों की एक श्रृंखला लौटाती हैंः द्विआधारी क्लोन + 'expr1 + expr2 वापस आता है. एक यूनीट + एक यूनीट एक्सप्रेस देता है ((एक यूनीट ऑपरेटर के सममिति के लिए कुछ भी नहीं जोड़ता है) ।) ।

नोट्सआप संख्याओं के साथ अंकगणितीय ऑपरेटरों का उपयोग कर सकते हैं और साथ ही चरों की संख्याएँ भी कर सकते हैं। संख्याओं की संख्याओं का उपयोग करने के मामले में, ऑपरेटरों को तत्वों पर लागू किया जाता है।

+=

संकेतकों को जोड़ें.

expr1 += expr2

उदाहरण

// Equals to expr1 = expr1 + expr2.
a = 2
b = 3
a += b
// Result: a = 5.
plot(a)

लौटाता हैस्ट्रिंग के लिए, एक्सप्रेस1 और एक्सप्रेस2 की श्रृंखला लौटाता है. संख्याओं के लिए, पूर्णांक या फ्लोटिंग बिंदु मान, या मानों की एक श्रृंखला लौटाता है.

नोट्सआप संख्याओं के साथ अंकगणितीय ऑपरेटरों का उपयोग कर सकते हैं और साथ ही चरों की संख्याएँ भी कर सकते हैं। संख्याओं की संख्याओं का उपयोग करने के मामले में, ऑपरेटरों को तत्वों पर लागू किया जाता है।

-

घटाव विधि या एकात्मक ऋणात्मक संख्या.

expr1 - expr2
- expr

लौटाता हैपूर्णांक या फ्लोटिंग बिंदु मान, या मानों की एक श्रृंखला लौटाता हैः द्विआधारी क्लोन + 'expr1 घटाकर expr2 देता है. एक युआन-Expr का नकारात्मक शब्द वापस करता है.

नोट्सआप संख्याओं के साथ अंकगणितीय ऑपरेटरों का उपयोग कर सकते हैं और साथ ही चरों की संख्याएँ भी कर सकते हैं। संख्याओं की संख्याओं का उपयोग करने के मामले में, ऑपरेटरों को तत्वों पर लागू किया जाता है।

-=

घटाव विधि निर्दिष्ट करना.

expr1 -= expr2

उदाहरण

// Equals to expr1 = expr1 - expr2.
a = 2
b = 3
a -= b
// Result: a = -1.
plot(a)

लौटाता हैपूर्णांक या फ्लोटिंग मान, या मानों की एक श्रृंखला।

/

अपवादों में से एक है ।

expr1 / expr2

लौटाता हैपूर्णांक या फ्लोटिंग मान, या मानों की एक श्रृंखला।

/=

अपवाद निर्दिष्ट करना. संख्यात्मक अभिव्यक्ति के लिए लागू करना.

expr1 /= expr2

उदाहरण

// Equals to expr1 = expr1 / expr2.
a = 3
b = 3
a /= b
// Result: a = 1.
plot(a)

लौटाता हैपूर्णांक या फ्लोटिंग मान, या मानों की एक श्रृंखला।

<

से छोटा । संख्यात्मक अभिव्यक्ति के लिए लागू ।

expr1 < expr2

लौटाता हैबुल मान, या बुल मानों की एक श्रृंखला।

<=

से कम या बराबर है । संख्यात्मक अभिव्यक्ति के लिए लागू होता है ।

expr1 <= expr2

लौटाता हैबुल मान, या बुल मानों की एक श्रृंखला।

==

यह किसी भी प्रकार के अभिव्यक्ति के लिए लागू होता है।

expr1 == expr2

लौटाता हैबुल मान, या बुल मानों की एक श्रृंखला।

=>

'=>' ऑपरेटर उपयोगकर्ता द्वारा परिभाषित फ़ंक्शन घोषणाओं औरswitchयह एक बहुत ही दिलचस्प लेख है।

फ़ंक्शन की घोषणा का वाक्यविन्यास हैः

<identifier>([<parameter_name>[=<default_value>]], ...) =>
    <local_block>
    <function_result>

एक<local_block>शून्य या अधिक पाइन वाक्यांश हैं।<function_result>एक चर, एक अभिव्यक्ति या एक तत्व है।

उदाहरण

// single-line function
f1(x, y) => x + y
// multi-line function
f2(x, y) => 
    sum = x + y
    sumChange = ta.change(sum, 10)
    // Function automatically returns the last expression used in it
plot(f1(30, 8) + f2(1, 3))

नोट्सआप यूजर मैनुअल में उपयोगकर्ता परिभाषित फ़ंक्शन के बारे में अधिक जानकारी प्राप्त कर सकते हैं।

>

अधिक से अधिक । संख्यात्मक अभिव्यक्ति के लिए लागू होता है ।

expr1 > expr2

लौटाता हैबुल मान, या बुल मानों की एक श्रृंखला।

>=

से बड़ा या बराबर है.

expr1 >= expr2

लौटाता हैबुल मान, या बुल मानों की एक श्रृंखला।

?:

त्रिमूली शर्त ऑपरेटर ।

expr1 ? expr2 : expr3

उदाहरण

// Draw circles at the bars where open crosses close
s2 = ta.cross(open, close) ? math.avg(open,close) : na
plot(s2, style=plot.style_circles, linewidth=2, color=color.red)  

// Combination of ?: operators for 'switch'-like logic
c = timeframe.isintraday ? color.red : timeframe.isdaily ? color.green : timeframe.isweekly ? color.blue : color.gray
plot(hl2, color=c)

लौटाता हैयदि एक्सप्रेस 1 का मूल्यांकन true किया जाता है, तो एक्सप्रेस 2 का मूल्यांकन किया जाता है, अन्यथा एक्सप्रेस 3 का मूल्यांकन किया जाता है। शून्य मान ((0 और NaN+, Infinity,-Infinity) गलत माना जाता है, अन्य सभी मान true हैं।

नोट्सयदि आपको इसकी आवश्यकता नहीं है, तो कृपया na को else शाखा के रूप में उपयोग करें. आप दो या अधिक का उपयोग कर सकते हैंः ऑपरेटरों को जोड़ने के लिए, एक वाक्य को लागू करने के लिए, जो कि स्विच बटन के समान है ((उपरोक्त उदाहरण देखें) ।) । आप संख्याओं के साथ अंकगणितीय ऑपरेटरों का उपयोग कर सकते हैं और साथ ही चरों की संख्याएँ भी कर सकते हैं। संख्याओं की संख्याओं का उपयोग करने के मामले में, ऑपरेटरों को तत्वों पर लागू किया जाता है।

अलविदा na

[]

श्रृंखला उपशीर्षक──expr1 श्रृंखला के पिछले मानों तक पहुँच प्रदान करता है─expr2 पिछले k पंक्तियों की संख्या है, जो संख्या होनी चाहिए─फ्लोटिंग को नीचे की ओर मोड़ दिया जाएगा─

expr1[expr2]

उदाहरण

// [] can be used to "save" variable value between bars
a = 0.0 // declare `a`
a := a[1] // immediately set current value to the same as previous. `na` in the beginning of history
if high == low // if some condition - change `a` value to another
    a := low
plot(a)

लौटाता हैएक संख्यात्मक श्रृंखला।

अलविदा math.floor

और

तर्क AND↑ बुल अभिव्यक्ति के लिए लागू होता है↑

expr1 and expr2

लौटाता हैबुल मान, या बुल मानों की एक श्रृंखला।

या

तर्क OR↑ बुल अभिव्यक्ति के लिए लागू होता है↑

expr1 or expr2

लौटाता हैबुल मान, या बुल मानों की एक श्रृंखला।

नहीं

तार्किक उल्टा (NOT) ।

not expr1

लौटाता हैबुल मान, या बुल मानों की एक श्रृंखला।

डेटा प्रकार कीवर्ड

बोल

"Bool" प्रकार के कीवर्ड जो एक स्पष्ट रूप से घोषित चर या पैरामीटर के लिए उपयोग किए जाते हैं. "Bool" चर का मान true, false या na हो सकता है.

उदाहरण

// bool
bool b = true    // Same as `b = true`
b := na
plot(b ? open : close)

नोट्सप्रकार के बारे में स्पष्ट रूप से उल्लेख करना वैकल्पिक है, जब तक कि यह na के साथ आरंभ न हो; प्रकार प्रणाली के उपयोगकर्ता पुस्तिका पृष्ठ पर पाइन प्रकार के बारे में अधिक जानकारी प्राप्त करें।

अलविदा var varip int float color string true false

इंट

int ((पूर्णांक) प्रकार के कुंजीशब्दों का उपयोग स्पष्ट रूप से एक चर या पैरामीटर घोषित करने के लिए किया जाता है।

उदाहरण

// int
int i = 14    // Same as `i = 14`
i := na
plot(i)

नोट्सप्रकार के बारे में स्पष्ट रूप से उल्लेख करना वैकल्पिक है, जब तक कि यह na के साथ आरंभ न हो; प्रकार प्रणाली के उपयोगकर्ता पुस्तिका पृष्ठ पर पाइन प्रकार के बारे में अधिक जानकारी प्राप्त करें।

अलविदा var varip float bool color string

तैरना

फ्लोट (फ्लोट) प्रकार के कीवर्ड जो स्पष्ट रूप से एक चर या पैरामीटर घोषित करते हैं।

उदाहरण

// float
float f = 3.14    // Same as `f = 3.14`
f := na
plot(f)

नोट्सकिसी प्रकार का स्पष्ट रूप से उल्लेख करना वैकल्पिक है, जब तक कि यह na के साथ आरंभ न हो।

अलविदा var varip int bool color string

स्ट्रिंग

"string" प्रकार के कुंजीशब्दों का उपयोग स्पष्ट रूप से एक चर या पैरामीटर घोषित करने के लिए किया जाता है.

उदाहरण

// string
string s = "Hello World!"    // Same as `s = "Hello world!"`
// string s = na // same as "" 
plot(na, title=s)

नोट्सप्रकार के बारे में स्पष्ट रूप से उल्लेख करना वैकल्पिक है, जब तक कि यह na के साथ आरंभ न हो; प्रकार प्रणाली के उपयोगकर्ता पुस्तिका पृष्ठ पर पाइन प्रकार के बारे में अधिक जानकारी प्राप्त करें।

अलविदा var varip int float bool str.tostring str.format

रंग

"color" प्रकार के लिए उपयोग किया जाने वाला कीवर्ड जो स्पष्ट रूप से चर या पैरामीटर घोषित करता है.

उदाहरण

// color
color textColor = color.green
if barstate.islastconfirmedhistory
    runtime.log("test", textcolor = textColor)

नोट्सरंग अक्षरों का निम्न प्रारूप हैः #RRGGBB या #RRGGBBAA;; अक्षरों का प्रतिनिधित्व 00 से FF तक के सोलह अंकों के लिए किया जाता है (दस अंकों के 0 से 255) जिसमें RR, GG और BB रंगों के लाल, हरे और नीले घटकों के मान हैं;; AA रंग पारदर्शिता (या अल्फा घटकों) के लिए एक वैकल्पिक मान है, जिसमें 00 अदृश्य है, FF अपारदर्शी है;; जब AA नहीं दिया जाता है, तो FF का उपयोग किया जाता है;; सोलह अंकों का उपयोग बड़े या छोटे अक्षरों में किया जा सकता है;; प्रकार के बारे में स्पष्ट रूप से उल्लेख करना वैकल्पिक है, जब तक कि यह na के साथ आरंभ न हो; प्रकार प्रणाली के उपयोगकर्ता पुस्तिका पृष्ठ पर पाइन प्रकार के बारे में अधिक जानकारी प्राप्त करें।

अलविदा var varip int float string color.rgb color.new

सरणी

चर या पैरामीटर को स्पष्ट रूप से घोषित करने के लिए उपयोग किए जाने वाले सरणी सरणी के प्रकार के लिए कुंजीशब्द; इस्तेमाल किया जा सकता हैarray.new<type>,array.fromफ़ंक्शन सरणी ऑब्जेक्ट (या आईडी) बनाता है।

उदाहरण

// array
array<float> a = na
a := array.new<float>(1, close)
plot(array.get(a, 0))

नोट्ससरणी के ऑब्जेक्ट हमेशा सरणी के सरणी के रूप में होते हैं।

अलविदा var array.new array.from

वस्तुएँ

PINE भाषा के ऑब्जेक्ट्स उपयोगकर्ता परिभाषित प्रकार (UDT) के उदाहरण हैं, जिन्हें विधिहीन वर्ग के रूप में समझा जा सकता है, जो उपयोगकर्ताओं को एक इकाई में अलग-अलग मानों को संगठित करने के लिए नीति में एक कस्टम प्रकार बनाने की अनुमति देता है।

प्रकार परिभाषित करें

हम एक आदेश प्रकार को परिभाषित करते हैं जिसमें आदेश जानकारी संग्रहीत की जाती हैः

type order
    float price
    float amount
    string symbol
  • उपयोगtypeखोजशब्द घोषणा प्रकार
  • type कीवर्ड के बाद प्रकार का नाम होता है.
  • पहली पंक्ति type प्रकार के नाम को परिभाषित करता है, और उसके बाद चार फ़ील्डों को संकुचित करके उस प्रकार के क्षेत्र को परिभाषित करता है।
  • प्रत्येक फ़ील्ड को अपने डेटा प्रकार की घोषणा करने की आवश्यकता होती है, जैसे कि int, float, string।

ऑब्जेक्ट बनाना

घोषित किए गए प्रकारों का उपयोग करके कॉल करेंnew()फ़ंक्शन ऑब्जेक्ट बनाने के लिएः

order1 = order.new()
order1 = order.new(100, 0.1, "BTC_USDT")
order1 = order.new(amount = 0.1, symbol = "BTC_USDT", price = 100)

आप खाली ऑब्जेक्ट भी बना सकते हैंः

order order1 = na

यहाँ हम एक वास्तविक उदाहरण देखते हैंः

type order
    float price
    float amount
    string symbol

if strategy.position_size == 0 and open > close
    strategy.entry("long", strategy.long, 1)

order1 = order.new(strategy.opentrades.entry_price(strategy.opentrades - 1), strategy.opentrades.size(strategy.opentrades - 1), syminfo.ticker)
// runtime.log(order1)   // 输出 {"data":{"price":46002.8,"amount":1,"symbol":"swap"},"_meta":0,"_type":"order"}

उदाहरण के लिएः

order1 = order.new(strategy.opentrades.entry_price(strategy.opentrades - 1), strategy.opentrades.size(strategy.opentrades - 1), syminfo.ticker)

यह भी लिखा जा सकता हैः

order order1 = na
order1 := order.new(strategy.opentrades.entry_price(strategy.opentrades - 1), strategy.opentrades.size(strategy.opentrades - 1), syminfo.ticker)

var कीवर्ड के लिए ऑब्जेक्ट प्रकार का उपयोग

//@version=5
indicator("Objects using `var` demo")

//@type A custom type to hold index, price, and volume information.
type BarInfo
    int   index = bar_index
    float price = close
    float vol   = volume

//@variable A `BarInfo` instance whose fields persist through all iterations, starting from the first bar.
var BarInfo firstBar = BarInfo.new()
//@variable A `BarInfo` instance declared on every bar.
BarInfo currentBar = BarInfo.new()

// Plot the `index` fields of both instances to compare the difference.
plot(firstBar.index, "firstBar")
plot(currentBar.index, "currentBar")

जब var कीवर्ड घोषणा का उपयोग करके उपयोगकर्ता द्वारा परिभाषित प्रकार के ऑब्जेक्ट के लिए एक चर को असाइन किया जाता है, तो यह कीवर्ड स्वचालित रूप से उस ऑब्जेक्ट के सभी क्षेत्रों पर लागू होता है। इसका मतलब है कि var कीवर्ड द्वारा घोषित ऑब्जेक्ट प्रत्येक पुनरावृत्ति के बीच अपनी स्थिति बनाए रखेगा, बिना प्रत्येक पुनरावृत्ति में अपने क्षेत्र के मूल्य को फिर से आरंभ करने की आवश्यकता के।

  • firstBar ऑब्जेक्ट को var कीवर्ड के साथ घोषित किया गया है, इसलिए इसके फ़ील्ड ((index, price, vol) प्रत्येक पुनरावृत्ति में अपना मान बनाए रखेंगे, पहली प्रविष्टि से शुरू होकर अंतिम प्रविष्टि तक।
  • currentBar ऑब्जेक्ट में var कीवर्ड घोषणा का उपयोग नहीं किया गया है, इसलिए इसके फ़ील्ड को प्रत्येक प्रविष्टि पर पुनः आरंभ किया जाएगा, और प्रत्येक पुनरावृत्ति में एक नया ऑब्जेक्ट होगा।

आप दो वस्तुओं के लिए एक index फ़ील्ड बनाकर उनके बीच के अंतर की तुलना कर सकते हैं; firstBar.index प्रत्येक पुनरावृत्ति में पहले से सेट मान बनाए रखेगा, जबकि currentBar.index प्रत्येक पुनरावृत्ति में वर्तमान प्रविष्टि के लिए bar_index मान के रूप में पुनः आरंभ करेगा।

varip कीवर्ड के लिए ऑब्जेक्ट प्रकार का उपयोग

//@version=5
indicator("Objects using `varip` fields demo")

//@type A custom type that counts the bars and ticks in the script's execution.
type Counter
    int       bars  = 0
    varip int ticks = 0

//@variable A `Counter` object whose reference persists throughout all bars.
var Counter counter = Counter.new()

// Add 1 to the `bars` and `ticks` fields. The `ticks` field is not subject to rollback on unconfirmed bars.
counter.bars  += 1
counter.ticks += 1

// Plot both fields for comparison.
plot(counter.bars, "Bar counter", color.blue, 3)
plot(counter.ticks, "Tick counter", color.purple, 3)

पाइन में, वैरिप कीवर्ड का उपयोग करके ऑब्जेक्ट के फ़ील्ड को निर्देशित किया जा सकता है कि वे स्क्रिप्ट निष्पादन के दौरान लगातार मौजूद रहें, बिना किसी अनिर्धारित स्तंभ में वापस रोल करें। काउंटर प्रकार की घोषणा में, bars फ़ील्ड में varip कीवर्ड का उपयोग नहीं किया गया है, इसलिए यह प्रत्येक अनिर्धारित स्तंभ में वापस चला जाएगा; जबकि ticks फ़ील्ड में varip कीवर्ड का उपयोग किया गया है, इसलिए यह अनिर्धारित स्तंभों में वापस नहीं जाएगा। counter ऑब्जेक्ट var कीवर्ड का उपयोग करके घोषित किया जाता है, इसलिए यह पूरे स्क्रिप्ट निष्पादन के दौरान मौजूद रहेगा। प्रत्येक पुनरावृत्ति में, bars फ़ील्ड और ticks फ़ील्ड में 1 की वृद्धि होती है। bars फ़ील्ड प्रत्येक अनिर्धारित स्तंभ में वापस चला जाता है, जबकि ticks फ़ील्ड वापस नहीं चलाता है। अंत में, counter.bars और counter.ticks फ़ील्डों को चित्रित करके, उनके बीच के अंतर की तुलना की जा सकती है। counter.bars का मान प्रत्येक अनिर्धारित स्तंभ में वापस चला जाएगा, जबकि counter.ticks का मान स्क्रिप्ट निष्पादन समाप्त होने तक लगातार बढ़ता रहेगा।

फ़ील्ड मान बदलें

type order
    float price
    float amount
    string symbol

if strategy.position_size == 0 and open > close
    strategy.entry("long", strategy.long, 1)
    
order1 = order.new(strategy.opentrades.entry_price(strategy.opentrades - 1), strategy.opentrades.size(strategy.opentrades - 1), syminfo.ticker)

if strategy.position_size != 0
    runtime.log(order1)
    order1.price := 999
    order1.amount := 100
    runtime.log(order1)
    runtime.error("stop")

इस्तेमाल किया जा सकता है:=पुनः असाइनमेंट ऑपरेटर ऑब्जेक्ट फ़ील्ड के मान को बदल देता है.

ऑब्जेक्ट सेट

उदाहरण एक खाली सरणी का दावा करता है जो उपयोगकर्ता द्वारा परिभाषित ऑर्डर प्रकार के ऑब्जेक्ट को संग्रहीत करेगाः

type order
    float price
    float amount
    string symbol

arrOrder = array.new<order>()

order1 = order.new(99, 1, "BTC_USDT")
order2 = order.new(100, 2, "ETH_USDT")

array.push(arrOrder, order1)
array.push(arrOrder, order2)

runtime.log(arrOrder)
runtime.error("stop")

या

type order
    float price
    float amount
    string symbol

var array<order> arrOrder = na
arrOrder := array.new<order>()

order1 = order.new(99, 1, "BTC_USDT")
order2 = order.new(100, 2, "ETH_USDT")

array.push(arrOrder, order1)
array.push(arrOrder, order2)

runtime.log(arrOrder)
runtime.error("stop")

प्रतिलिपि वस्तु

पाइन में, ऑब्जेक्ट्स को संदर्भ द्वारा असाइन किया जाता है. जब मौजूदा ऑब्जेक्ट्स को नए वेरिएंट्स को असाइन किया जाता है, तो दोनों एक ही ऑब्जेक्ट को इंगित करते हैं.

//@version=5
indicator("")
type pivotPoint
    int x
    float y
pivot1 = pivotPoint.new()
pivot1.x := 1000
pivot2 = pivot1
pivot2.x := 2000
// Both plot the value 2000.
plot(pivot1.x)
plot(pivot2.x)

नीचे दिए गए उदाहरण में, हम एक pivot1 ऑब्जेक्ट बनाते हैं और उसके x फ़ील्ड को 1000 पर सेट करते हैं। फिर हम एक pivot2 को उस pivot1 ऑब्जेक्ट के संदर्भ वाले चर के रूप में घोषित करते हैं, इसलिए दोनों एक ही उदाहरण को इंगित करते हैं। इसलिए, pivot2.x को बदलना pivot1.x को भी बदल देगा, क्योंकि दोनों x को उसी ऑब्जेक्ट के संदर्भ में संदर्भित करते हैं।

मूल ऑब्जेक्ट से स्वतंत्र प्रतिलिपि बनाने के लिए, इस मामले में हम अंतर्निहित कॉपी ((() विधि का उपयोग कर सकते हैं। इस उदाहरण में, हम pivot2 को pivot1 ऑब्जेक्ट के प्रतिकृति उदाहरण के चर को संदर्भित करते हैं। अब, pivot2.x को बदलना pivot1.x को नहीं बदलता है, क्योंकि यह x को एक अलग ऑब्जेक्ट के क्षेत्र को संदर्भित करता हैः

//@version=5
indicator("")
type pivotPoint
    int x
    float y
pivot1 = pivotPoint.new()
pivot1.x := 1000
pivot2 = pivotPoint.copy(pivot1)
pivot2.x := 2000
// Plots 1000 and 2000.
plot(pivot1.x)
plot(pivot2.x)

यह ध्यान रखना महत्वपूर्ण है कि ट्रेडिंग व्यू का कॉपी करने का तरीका बेस कॉपी है. यदि किसी ऑब्जेक्ट में विशेष प्रकार के फ़ील्ड (जैसे array) हैं, तो उस ऑब्जेक्ट की बेस कॉपी में ये फ़ील्ड उस ऑब्जेक्ट के समान उदाहरण की ओर इशारा करेंगे. एफएमजेड प्लेटफ़ॉर्म सीधे डीप कॉपी को लागू करता है, बिना किसी अतिरिक्त प्रसंस्करण की आवश्यकता होती है, उदाहरण के लिएः

गहरी प्रतिलिपि

//@version=5

indicator("test deepCopy")

type orderInfo
    float price
    float amount

type labelInfo
    orderInfo order
    string labelMsg

labelInfo1 = labelInfo.new(orderInfo.new(100, 0.1), "test labelInfo1")
labelInfo2 = labelInfo.copy(labelInfo1)

labelInfo1.labelMsg := "labelInfo1->2"    // 修改 labelInfo1 的基础类型字段,看是否影响 labelInfo2
labelInfo1.order.price := 999             // 修改 labelInfo1 的复合类型字段,看是否影响 labelInfo2

runtime.log(labelInfo1)
runtime.log(labelInfo2)
runtime.error("stop")

परीक्षण के परिणाम, labelInfo.copy ((labelInfo1) को निष्पादित करते समय गहरी प्रतिलिपि के रूप में, labelInfo1 में कोई भी फ़ील्ड बदलना labelInfo2 को प्रभावित नहीं करेगा।

पद्धति

पाइन भाषा में विधियाँ विशिष्ट उदाहरणों के अंतर्निहित या उपयोगकर्ता-परिभाषित प्रकारों से संबंधित विशेष कार्य हैं। वे अधिकांश मामलों में नियमित कार्यों के समान हैं, लेकिन कम, अधिक सुविधाजनक सिंटैक्स प्रदान करते हैं। उपयोगकर्ता सीधे चर पर बिंदु चिह्नों का उपयोग करके विधियों तक पहुंच सकते हैं, जैसे कि पाइन ऑब्जेक्ट के फ़ील्ड तक पहुंच। पाइन में सभी विशेष प्रकार के अंतर्निहित विधियां शामिल हैं, जिनमें समूह संख्या, मैट्रिक्स, मैपिंग, लाइन, भरने की लाइन आदि शामिल हैं। ये विधियां उपयोगकर्ताओं को स्क्रिप्ट में इन प्रकार के विशेष कार्यक्रमों को कॉल करने का एक अधिक संक्षिप्त तरीका प्रदान करती हैं।

अंतर्निहित

उदाहरण के लिए, इस तरह के एक स्क्रिप्ट कोडः

//@version=5
indicator("Custom Sample BB", overlay = true)

float sourceInput  = input.source(close, "Source")
int   samplesInput = input.int(20, "Samples")
int   n            = input.int(10, "Bars")
float multiplier   = input.float(2.0, "StdDev")

var array<float> sourceArray = array.new<float>(samplesInput)
var float        sampleMean  = na
var float        sampleDev   = na

// Identify if `n` bars have passed.
if bar_index % n == 0
    // Update the queue.
    array.push(sourceArray, sourceInput)
    array.shift(sourceArray)
    // Update the mean and standard deviaiton values.
    sampleMean := array.avg(sourceArray)
    sampleDev  := array.stdev(sourceArray) * multiplier

// Calculate bands.
float highBand = sampleMean + sampleDev
float lowBand  = sampleMean - sampleDev

plot(sampleMean, "Basis", color.orange)
plot(highBand, "Upper", color.lime)
plot(lowBand, "Lower", color.red)

यह शब्द इस तरह से लिखा जा सकता हैः

//@version=5
indicator("Custom Sample BB", overlay = true)

float sourceInput  = input.source(close, "Source")
int   samplesInput = input.int(20, "Samples")
int   n            = input.int(10, "Bars")
float multiplier   = input.float(2.0, "StdDev")

var array<float> sourceArray = array.new<float>(samplesInput)
var float        sampleMean  = na
var float        sampleDev   = na

// Identify if `n` bars have passed.
if bar_index % n == 0
    // Update the queue.
    sourceArray.push(sourceInput)
    sourceArray.shift()
    // Update the mean and standard deviaiton values.
    sampleMean := sourceArray.avg()
    sampleDev  := sourceArray.stdev() * multiplier

// Calculate band values.
float highBand = sampleMean + sampleDev
float lowBand  = sampleMean - sampleDev

plot(sampleMean, "Basis", color.orange)
plot(highBand, "Upper", color.lime)
plot(lowBand, "Lower", color.red)

आप पाइन समर्थन देख सकते हैं।Methodsइसके बाद, कोडarray.avg(sourceArray)उपयोगकर्ता के लिए, यह विधि के रूप में लिखा जा सकता हैःsourceArray.avg().. ध्यान दें कि FMZ अभी समर्थित नहीं हैarray.avgइस तरह के कॉल।

उपयोगकर्ता द्वारा परिभाषित विधि

पाइन उपयोगकर्ता को किसी भी अंतर्निहित या उपयोगकर्ता-परिभाषित प्रकार के ऑब्जेक्ट के साथ उपयोग करने के लिए एक कस्टम विधि को परिभाषित करने की अनुमति देता है। परिभाषित विधि अनिवार्य रूप से परिभाषित फ़ंक्शन के समान है, लेकिन दो महत्वपूर्ण अंतर हैंः

१, method कीवर्ड को फ़ंक्शन नाम से पहले होना चाहिए. 2. विधि के पैरामीटर, जिनमें से पहले पैरामीटर का प्रकार स्पष्ट रूप से घोषित किया जाना चाहिए, क्योंकि यह उस वस्तु के प्रकार को दर्शाता है जिसके साथ विधि जुड़ी होगी।

उदाहरण के लिए, निम्न कोड में, ब्रीनिंग सूचक के लिए कोड को उपयोगकर्ता द्वारा अनुकूलित तरीके के रूप में पैक करेंः

//@version=5
indicator("Custom Sample BB", overlay = true)

float sourceInput  = input.source(close, "Source")
int   samplesInput = input.int(20, "Samples")
int   n            = input.int(10, "Bars")
float multiplier   = input.float(2.0, "StdDev")

var array<float> sourceArray = array.new<float>(samplesInput)
var float        sampleMean  = na
var float        sampleDev   = na

// Identify if `n` bars have passed.
if bar_index % n == 0
    // Update the queue.
    sourceArray.push(sourceInput)
    sourceArray.shift()
    // Update the mean and standard deviaiton values.
    sampleMean := sourceArray.avg()
    sampleDev  := sourceArray.stdev() * multiplier

// Calculate band values.
float highBand = sampleMean + sampleDev
float lowBand  = sampleMean - sampleDev

plot(sampleMean, "Basis", color.orange)
plot(highBand, "Upper", color.lime)
plot(lowBand, "Lower", color.red)

बदल दिया गयाः

//@version=5
indicator("Custom Sample BB", overlay = true)

float sourceInput  = input.source(close, "Source")
int   samplesInput = input.int(20, "Samples")
int   n            = input.int(10, "Bars")
float multiplier   = input.float(2.0, "StdDev")

var array<float> sour

अधिक

वूहुओयनएक ही समय में कई लेनदेन कैसे चलेंगे?

हल्के बादलकृपया मुझे बताएं, क्या पाइन अधिक लेनदेन कर सकता है? या JS की तरह लेनदेन को पार कर सकता है? धन्यवाद.

लिसा20231अधिक जानकारी के लिए धन्यवाद।

कलात्मकताओह, यह पाइन स्क्रिप्ट प्लेटफॉर्म पर ओकेएक्स के सिमुलेटर का उपयोग कैसे करती है?

कलात्मकतायह ट्रेडिंग व्यू प्लेटफॉर्म की रणनीति को सीधे आविष्कारक प्लेटफॉर्म पर कॉपी करने के बराबर है!

आविष्कारक मात्रा - छोटे सपनेPINE भाषा केवल एकल-प्रजाति रणनीतियों को कर सकती है, बहु-प्रजाति रणनीतियों के लिए सबसे अच्छा है या पायथन, जावास्क्रिप्ट, सी ++ में डिजाइन लिखना।

आविष्कारक मात्रा - छोटे सपनेओह, हाँ, ओकेएक्स विशेष है, उनके एनालॉग वातावरण और वास्तविक डिस्क वातावरण एक ही पते पर हैं, केवल एक अंतर है।

हल्के बादलokx एनालॉग डिस्क का उपयोग नहीं किया जा सकता है ।

आविष्कारक मात्रा - छोटे सपनेइस विविध वास्तुकला समस्या का समाधान नहीं किया जा सकता है, क्योंकि प्रत्येक एक्सचेंज का इंटरफ़ेस अलग है, और इंटरफ़ेस आवृत्ति सीमाएं अलग नहीं हैं, जिससे कई समस्याएं उत्पन्न होती हैं।

आविष्कारक मात्रा - छोटे सपनेठीक है, सुझाव देने के लिए धन्यवाद, और इस आवश्यकता को रिपोर्ट करें।

हल्के बादलमुझे लगता है कि JS के साथ मिश्रण करना बेहतर है, क्योंकि JS विभिन्न प्रकार के लेनदेन के लिए बेहतर अनुकूल है।

ट्रेंडिंग शिकारीक्या आप बाद में कई किस्मों पर विचार करेंगे?

आविष्कारक मात्रा - छोटे सपनेअशिष्टता।

हल्के बादलअच्छा, शुक्रिया ड्रीम डैड।

आविष्कारक मात्रा - छोटे सपनेनमस्ते, अभी के लिए, PINE भाषा नीति केवल एक ही किस्म का काम करती है।

आविष्कारक मात्रा - छोटे सपनेअजनबी, आपके समर्थन के लिए धन्यवाद. दस्तावेज को और भी बेहतर किया जाएगा.

आविष्कारक मात्रा - छोटे सपनेहाँ।

आविष्कारक मात्रा - छोटे सपनेPINE टेम्पलेट क्लासरूम, पैरामीटर पर स्विच एक्सचेंज बेस एड्रेस सेट किया जा सकता है.