4
ध्यान केंद्रित करना
1076
समर्थक

आविष्कारक मात्रात्मक PINE भाषा परिचय ट्यूटोरियल

में बनाया: 2022-05-30 16:23:43, को अपडेट: 2022-09-28 17:10:21
comments   0
hits   8860

रिणाम चार्ट पर सभी बार के समापन मूल्य का योग है (जब तक कि सबसे दाईं ओर नहीं चलाया जाता है, केवल वर्तमान बार में जमा किया जाता है) ।

समय-क्रम पर चर भी ऑपरेटरों का उपयोग करके गणना की जा सकती है, उदाहरण के लिए कोडःta.sma(high - low, 14)और आप अपने अंतर्निहित चरhigh(K लाइन Bar अधिकतम मूल्य) घटायाlow(के-लाइन बार न्यूनतम मूल्य), अंतिम उपयोगta.smaफ़ंक्शन को औसत पर ले जाएँ.

  • फ़ंक्शन कॉल के परिणाम भी समय अनुक्रम में मानों के निशान छोड़ते हैं
  v1 = ta.highest(high, 10)[1]
  v2 = ta.highest(high[1], 10)
  plot(v1, title="v1", overlay=true)
  plot(v2, title="v2", overlay=true)

यह परीक्षण कोड परीक्षण चल रहा है जब वापस मापने, यह देखा जा सकता हैv1औरv2फ़ंक्शन कॉल के परिणामों की गणना समय-क्रम में मूल्य के निशान छोड़ती है, उदाहरण के लिए कोडta.highest(high, 10)[1]उनमें सेta.highest(high, 10)फ़ंक्शन कॉल के परिणामों का भी उपयोग किया जा सकता है[1] अपने ऐतिहासिक मानों को संदर्भित करने के लिए.ta.highest(high, 10)तो यह है किta.highest(high[1], 10)तोta.highest(high[1], 10)औरta.highest(high, 10)[1]पूरी तरह से समान।

एक और चित्र फ़ंक्शन का उपयोग करके जानकारी को सत्यापित करेंः

  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, overlay=true)
  plotchar(true, title="b", char=str.tostring(b), location=location.belowbar, color=color.green, overlay=true)

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

आविष्कारक मात्रात्मक PINE भाषा परिचय ट्यूटोरियल

स्क्रिप्ट संरचना

सामान्य संरचना

ट्यूटोरियल के शुरुआती भाग में हमने एफएमजेड पर पाइन और ट्रेडिंग व्यू पर पाइन भाषा के उपयोग के बारे में कुछ अंतरों को संक्षेप में प्रस्तुत किया है।indicator()strategy()और अस्थायी रूप से समर्थन नहींlibrary()बेशक, पाइन स्क्रिप्ट के पहले संस्करणों के साथ संगतता के लिए, रणनीति को लिखते समय, इस तरह के लेख लिखेंः//@version=5indicator()strategy()यह भी ठीक है. कुछ नीति सेटिंग्सstrategy()फ़ंक्शन में पैरामीटर सेट करना

<version>
<declaration_statement>
<code>

<version>संस्करण नियंत्रण जानकारी को छोड़ दिया जा सकता है.

टिप्पणी

पाइन भाषा//एक पंक्ति टिप्पणी के रूप में, क्योंकि पाइन भाषा में कोई बहु-पंक्ति टिप्पणी नहीं है./**/बहु-पंक्ति टिप्पणी के लिए।

कोड

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

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

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

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

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

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")

आइडेंटिफायर और ऑपरेटर

पहचानकर्ता

चर को समझने से पहले, हमें पहले पता होना चाहिए कि क्या एक चर है। सामान्य रूप से, एक चर के रूप में एक चर के रूप में एक चर के रूप में एक चर के रूप में एक चर के रूप में एक चर का उपयोग किया जाता है।समारोहऔरचरके नाम का ((नामकरण चर, फ़ंक्शन के लिए)) ।समारोहऔर जैसा कि हम बाद के पाठों में देखेंगे, हम पहले सीखते हैं कि क्या है तिल का प्रतीक 。

  • 1. पहचानकर्ता बड़े अक्षरों में होना चाहिए(A-Z)या छोटा लिखें(a-z)अक्षर या रेखांकित(_)शुरुआत, पहचानकर्ता के पहले अक्षर के रूप में ▽
  • 2. पहचानकर्ता के पहले अक्षर के बाद अगला अक्षर हो सकता हैअक्षरनीचे की रेखायासंख्याएँ
  • 3. पहचानकर्ता का नाम बड़े और छोटे अक्षरों में लिखा गया है।

उदाहरण के लिए, निम्न नाम वाले आइडेंटिफ़ायर:

fmzVar
_fmzVar
fmz666Var
funcName
MAX_LEN
max_len
maxLen
3barsDown  // 错误的命名!使用了数字字符作为标识符的开头字符

अधिकांश प्रोग्रामिंग भाषाओं की तरह, पाइन भाषा में लेखन सुझाव भी हैं। आमतौर पर पहचानकर्ताओं के नामकरण के लिए सिफारिश की जाती हैः

  • 1। सभी अक्षरों को बड़े अक्षरों में नामकरण स्थिरांक के लिए लिखा जाता है।
  • 2. उपयोग करेंकमलपिक नियमअन्य पहचानकर्ताओं के लिए नामित।
// 命名变量、常量
GREEN_COLOR = #4CAF50
MAX_LOOKBACK = 100
int fastLength = 7

// 命名函数
zeroOne(boolValue) => boolValue ? 1 : 0

ऑपरेटर

ऑपरेटर प्रोग्रामिंग भाषाओं में अभिव्यक्ति बनाने के लिए उपयोग किए जाने वाले ऑपरेटरों के कुछ प्रतीक हैं, और अभिव्यक्ति एक प्रकार की गणना के लिए डिज़ाइन किए गए गणना नियम हैं जब हम एक रणनीति लिखते हैं। पाइन भाषा में ऑपरेटरों को कार्य के अनुसार वर्गीकृत किया गया हैः

मान संचालक, अंकगणित संचालक, तुलना संचालक, तर्क संचालक? :त्रिमूर्ति संचालक[]इतिहास संदर्भ ऑपरेटर

अंकगणित ऑपरेटर*उदाहरण के लिए, ट्रेडिंग व्यू पर पाइन भाषा ऑपरेटर द्वारा लौटाए गए परिणामों के कारण होने वाले प्रकार के प्रश्नों के विपरीत, निम्न परीक्षण कोड हैः

//@version=5
indicator("")
lenInput = input.int(14, "Length")
factor = year > 2020 ? 3 : 1
adjustedLength = lenInput * factor
ma = ta.ema(close, adjustedLength)  // Compilation error!
plot(ma)

ट्रेडिंग व्यू में इस स्क्रिप्ट को चलाने के दौरान एक त्रुटि का संकलन होता है क्योंकिadjustedLength = lenInput * factorऔर हम इसे गुणा करते हैंseries intप्रकार (सीरीज), हालांकिta.emaफ़ंक्शन का दूसरा पैरामीटर इस प्रकार का समर्थन नहीं करता है। लेकिन एफएमजेड पर इस तरह के सख्त प्रतिबंध नहीं हैं, उपरोक्त कोड सामान्य रूप से काम कर सकता है।

नीचे हम विभिन्न प्रकार के ऑपरेटरों के उपयोग पर एक नज़र डालते हैं:


मानगणक

दो प्रकार के मूल्य-निर्धारण संचालक हैंः=:=और हमने इसे कुछ उदाहरणों में भी देखा है, जो इस ट्यूटोरियल के शुरुआती भाग में हैं।

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

a = close           // 使用内置变量赋值给a
b = 10000           // 使用数值赋值
c = "test"          // 使用字符串赋值
d = color.green     // 使用颜色值赋值
plot(a, title="a")
plot(b, title="b")
plotchar(true, title="c", char=str.tostring(c), color=d, overlay=true)

सूचनाa = closeमूल्य निर्धारण कथन, प्रत्येक बार पर चर a वर्तमान बंद मूल्य है जो उस बार के लिए है ((close) । अन्य चरbcdएफएमजेड पर फीडबैक सिस्टम में परीक्षण किया जा सकता है, परिणाम चित्रों से देखा जा सकता है।

:=एक मौजूदा चर के लिए एक मूल्य को फिर से असाइन करने के लिए उपयोग किया जाता है, और इसे सरलता से समझा जा सकता है:=ऑपरेटरों को पहले से ही घोषित और आरंभिक चर के मानों को संशोधित करने के लिए उपयोग किया जाता है। अगर इस्तेमाल किया:=ऑपरेटरों को एक अपरिवर्तित या घोषित चर को असाइन करने से त्रुटि उत्पन्न होती है, उदाहरण के लिएः

a := 0

तो,:=एक असाइनमेंट ऑपरेटर आमतौर पर एक मौजूदा चर को पुनः असाइन करने के लिए उपयोग किया जाता है, उदाहरण के लिएः

a = close > open 
b = 0 
if a
    b := b + 1

plot(b)

निर्णय यदिclose > open(अर्थात वर्तमान BAR सूर्य रेखा है), a चर सही है ((true)) । यह if कथन के स्थानीय ब्लॉक में कोड निष्पादित करता हैb := b + 1, एस्केप ऑपरेटर का उपयोग करें:=b को फिर से मान दें, 1 जोड़ें। फिर प्लॉट फ़ंक्शन का उपयोग करें और समय-क्रम में प्रत्येक BAR पर चर b के मानों को रेखांकित करें।

क्या हम मान रहे हैं कि जब एक घातांक BAR होता है, तो b लगातार 1 जोड़ता रहता है? बेशक नहीं, यहाँ हम किसी भी कुंजी शब्द का उपयोग नहीं करते हैं जब हम चर b को 0 के रूप में आरंभ करते हैं।b=0तो आप देख सकते हैं कि इस कोड के निष्पादन का परिणाम है कि हर बार b को 0 पर रीसेट किया जाता है यदि a सही है, तोclose > openतो इस दौर के कोड को निष्पादित करते समय, b को 1 से जोड़ दिया जाता है, और प्लॉट फ़ंक्शन को 1 पर आरेखित किया जाता है, लेकिन अगले दौर के कोड को निष्पादित करते समय, b को 0 पर फिर से असाइन किया जाता है।

जब हम assignment operators के बारे में बात करते हैं, तो हमें दो keywords के बारे में विस्तार से बताना होगा:varvarip

  • var

वास्तव में, यह एक ऐसा शब्द है जिसे हमने पिछले ट्यूटोरियल में देखा और इस्तेमाल किया था, लेकिन हमने उस समय इस पर विस्तार से चर्चा नहीं की थी।

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

हम इस उदाहरण का उपयोग करते हैं, लेकिन हम इसे b के लिए करते हैंvarकुंजी शब्द

  a = close > open 
  var b = 0 
  if a
      b := b + 1

  plot(b)

varकुंजी शब्द b को केवल पहले पहले असाइनमेंट को निष्पादित करता है, और फिर हर बार जब रणनीति तर्क निष्पादित किया जाता है, तो b को फिर से 0 पर नहीं रखा जाता है, इसलिए चलती समय से खींची गई रेखा को देखा जा सकता है b यानी वर्तमान K लाइन BAR के समय पर आने वाले y लाइन BAR की संख्या को वापस मापने के लिए।

var घोषणाओं के चर को न केवल वैश्विक स्तर पर लिखा जा सकता है, बल्कि कोड के ब्लॉक में भी लिखा जा सकता है, जैसे कि इस उदाहरण मेंः

  strategy(overlay=true)
  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’ श्रृंखला में पहले नीलमणि नीलमणि मूल्य पट्टी के समापन मूल्य को बनाए रखता है। चर ‘c’ श्रृंखला में दसवें स्ट्राबेरी के समापन मूल्य को बनाए रखता है।

  • varip

varipहम पहली बार इस शब्द को देख रहे हैं, और हम इस शब्द का वर्णन देख सकते हैंः

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

क्या यह समझना मुश्किल है? कोई बात नहीं, हम इसे उदाहरणों के माध्यम से समझाते हैं, यह समझना आसान है।

  strategy(overlay=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
  i := i + 1
  ii := ii + 1

यह परीक्षण कोड क्लोजर प्राइस मॉडल और रीयल-टाइम प्राइस मॉडल में अलग-अलग प्रदर्शन करता हैः

वास्तविक समय मूल्य मॉडल: याद रखें कि हमने पहले कहा था कि रणनीति के निष्पादन के समय को ऐतिहासिक BAR चरण और वास्तविक समय BAR चरण में विभाजित किया गया है?varvaripघोषित चरiiiरणनीति कोड के प्रत्येक दौर के निष्पादन के दौरान वृद्धिशील ऑपरेशन किया जाता है। इसलिए यह देखा जा सकता है कि KBAR लाइन पर प्रदर्शित संख्याओं में से प्रत्येक में वृद्धि होती है। जब ऐतिहासिक K लाइन चरण समाप्त हो जाती है, तो वास्तविक समय K लाइन चरण शुरू होता है। var, varp घोषणाओं के चर में अलग-अलग परिवर्तन होने लगते हैं। क्योंकि यह वास्तविक समय मूल्य मॉडल है, एक K लाइन BAR के भीतर हर बार मूल्य परिवर्तन के लिए रणनीति कोड को एक बार निष्पादित किया जाता है,i := i + 1औरii := ii + 1सभी को एक बार निष्पादित किया जाएगा。 अंतर यह है कि ii हर बार संशोधित किया जाएगा。 i हालांकि हर बार संशोधित किया जाएगा, लेकिन अगले दौर के निष्पादन रणनीति तर्क के दौरान पिछले मूल्य को बहाल किया जाएगा ((याद पिछले “मॉडल निष्पादन” अध्याय में हम समझाया गया है कि वापस रोल तंत्र?), जब तक कि वर्तमान KBAR लाइन खत्म हो जाता है i के मूल्य को अद्यतन करने के लिए निर्धारित किया गया है (यानी, अगले दौर के निष्पादन रणनीति तर्क के दौरान पहले मूल्य को बहाल नहीं किया जाएगा) ।) तो आप देख सकते हैं कि चर i अभी भी हर बार 1 की वृद्धि है。 लेकिन चर ii हर बार कई बार जोड़ा गया है。

समापन मूल्य मॉडल: चूंकि समापन मूल्य मॉडल प्रत्येक K लाइन BAR के लिए एक रणनीति तर्क निष्पादित करता है। इसलिए, समापन मूल्य मॉडल में, ऐतिहासिक K लाइन चरण और वास्तविक समय K लाइन चरण, var, varp के बयानों के चर उपरोक्त उदाहरणों में पूरी तरह से एक समान प्रदर्शन करते हैं, प्रत्येक K लाइन BAR में वृद्धि होती है।


अंकगणित ऑपरेटर
ऑपरेटर उदाहरण देकर स्पष्ट करना
+ गफा
- घटाव
* गुणन
/ उन्मूलन
% आदर्शों की तलाश

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

1, अंकगणित ऑपरेटर दोनों पक्षों में संख्यात्मक प्रकार हैं, परिणाम संख्यात्मक प्रकार, पूर्णांक या फ्लोटिंग पॉइंट संख्या है जो ऑपरेशन के परिणामों पर निर्भर करता है। 2. यदि कोई ऑपरेशन संख्या एक स्ट्रिंग है, तो ऑपरेटर है+, को एक स्ट्रिंग के रूप में गणना की जाती है, संख्यात्मक मान को स्ट्रिंग के रूप में परिवर्तित किया जाता है, और फिर स्ट्रिंग को एक साथ जोड़ा जाता है। यदि यह अन्य अंकगणित ऑपरेटर है, तो स्ट्रिंग को संख्यात्मक मान में परिवर्तित करने का प्रयास किया जाता है, और फिर ऑपरेशन किया जाता है। 3। यदि कोई ऑपरेशन संख्या na है, तो गणना परिणाम शून्य n है, और एफएमजेड पर मुद्रित होने पर NaN दिखाई देगा।

a = 1 + 1 
b = 1 + 1.1
c = 1 + "1.1"
d = "1" + "1.1"
e = 1 + na 

runtime.log("a:", a, ", b:", b, ", c:", c, ", d:", d, ", e:", e)   
// a: 2 , b: 2.1 , c: 11.1 , d: 11.1 , e: NaN

एफएमजेड पर पाइन भाषा यहाँ और ट्रेडिंग व्यू पर पाइन भाषा में थोड़ा अंतर है, एफएमजेड पर पाइन भाषा चर प्रकार के लिए बहुत कठोर नहीं है। उदाहरण के लिएः

a = 1 * "1.1"
b = "1" / "1.1"
c = 5 % "A" 

plot(a)
plot(b)
plot(c)

एफएमजेड पर यह चल सकता है, लेकिन ट्रेडिंग दृश्य पर यह टाइप एरर रिपोर्ट करता है। जब अंकगणित ऑपरेटर के दोनों ओर ऑपरेशन स्ट्रिंग होते हैं, तो सिस्टम स्ट्रिंग को संख्यात्मक मान में परिवर्तित कर देता है। यदि गैर-संख्यात्मक स्ट्रिंग की गणना नहीं की जा सकती है, तो सिस्टम ऑपरेशन परिणाम शून्य होगा।


तुलना ऑपरेटर

तुलना ऑपरेटर द्विआधारी ऑपरेटर हैं.

ऑपरेटर उदाहरण देकर स्पष्ट करना
< से कम
> से बड़ा
<= से कम बराबर है
>= अधिक से अधिक
== समकक्ष
!= असमानता

परीक्षण उदाहरण:

a = 1 > 2 
b = 1 < 2 
c = "1" <= 2 
d = "1" >= 2 
e = 1 == 1 
f = 2 != 1 
g = open > close 
h = na > 1 
i = 1 > na

runtime.log("a:", a, ", b:", b, ", c:", c, ", d:", d, ", e:", e, ", f:", f, ", g:", g, ", h:", h, ", i:", i)   
// a: false , b: true , c: true , d: false , e: true , f: true , g: false , h: false , i: false

जैसा कि आप देख सकते हैं, तुलना ऑपरेटर का उपयोग करना बहुत आसान है, लेकिन यह सबसे अधिक उपयोग किया जाने वाला ऑपरेटर है जब हम रणनीतियों को लिखते हैं। आप मानों की तुलना कर सकते हैं, लेकिन आप अंतर्निहित चर की तुलना भी कर सकते हैं, जैसेcloseopenइंतज़ार। एफएमजेड पर ट्रेडिंग व्यू के पाइन से भिन्नता है, जैसा कि ऑपरेटिंग ऑपरेटरों के साथ होता है, एफएमजेड में विशेष रूप से सख्त आवश्यकता प्रकार नहीं होते हैं, इसलिए इस तरह के बयानd = "1" >= 2एफएमजेड पर कोई त्रुटि नहीं है, निष्पादन में स्ट्रिंग को पहले संख्यात्मक मान में परिवर्तित किया जाता है, और फिर तुलनात्मक संचालन किया जाता है। ट्रेडिंग व्यू पर, त्रुटि रिपोर्ट की जाती है।


लॉजिक ऑपरेटर
ऑपरेटर संकेतक उदाहरण देकर स्पष्ट करना
नहीं not ऑपरेटर नहीं
और and द्विआधारी ऑपरेटर
या or द्विआधारी ऑपरेटर, या ऑपरेटिंग

तर्क ऑपरेटरों के बारे में बात करते हुए, हम वास्तविक मान तालिकाओं के बारे में भी बात करते हैं। जैसा कि हमने हाई स्कूल में सीखा था, केवल यहां हम परीक्षण और सीखने के लिए प्रतिक्रिया प्रणाली का उपयोग करते हैंः

a = 1 == 1  // 使用比较运算符构成的表达式,结果为布尔值
b = 1 != 1
c = not b   // 逻辑非操作符
d = not a   // 逻辑非操作符

runtime.log("测试逻辑操作符:and", "#FF0000")
runtime.log("a:", a, ", c:", c, ", a and c:", a and c)
runtime.log("a:", a, ", b:", b, ", a and b:", a and b)
runtime.log("b:", b, ", c:", c, ", b and c:", b and c)
runtime.log("d:", d, ", b:", b, ", d and b:", d and b)

runtime.log("测试逻辑操作符:or", "#FF0000")
runtime.log("a:", a, ", c:", c, ", a or c:", a or c)
runtime.log("a:", a, ", b:", b, ", a or b:", a or b)
runtime.log("b:", b, ", c:", c, ", b or c:", b or c)
runtime.log("d:", d, ", b:", b, ", d or b:", d or b)

runtime.error("stop")

हम इस तरह के एक उपकरण का उपयोग कर रहे हैं, ताकि यह पता लगाया जा सके कि क्या हम वास्तव में उस समय के बारे में बात कर रहे हैं जब हम एक बार फिर से एक बार फिर से प्रिंट कर रहे थे।runtime.error("stop")वाक्य एक बार प्रिंट करने के बाद, एक असामान्य त्रुटि फेंकी जाती है ताकि प्रतिक्रिया बंद हो जाए, और फिर आप आउटपुट की जानकारी देख सकते हैं, यह पाया जा सकता है कि प्रिंट की सामग्री और वास्तविक तालिका वास्तव में समान है।


त्रिमूर्ति संचालक

त्रिमितीय ऑपरेटर का उपयोग करना? :त्रिमूर्ति अभिव्यक्ति जो ऑपरेटिंग संख्याओं के साथ मिलकर बनती हैcondition ? valueWhenConditionIsTrue : valueWhenConditionIsFalseहम पहले के पाठों में भी इससे परिचित हो चुके हैं. तथाकथित त्रिपद अभिव्यक्ति, त्रिपद संचालक का अर्थ है कि इसमें कुल तीन संचालक हैं.

condition ? valueWhenConditionIsTrue : valueWhenConditionIsFalseक्या आप जानते हैं?conditionयह निर्णय करने की शर्त है कि यदि सत्य के लिए अभिव्यक्ति का मान है:valueWhenConditionIsTrueयदिconditionएक मिथ्या अभिव्यक्ति के लिएvalueWhenConditionIsFalse

हालांकि इसका कोई व्यावहारिक उपयोग नहीं है, लेकिन इसे दिखाने के लिए कुछ आसान उदाहरण हैंः

a = close > open
b = a ? "阳线" : "阴线"
c = not a ? "阴线" : "阳线"
plotchar(a, location=location.abovebar, color=color.red, char=b, overlay=true)
plotchar(not a, location=location.belowbar, color=color.green, char=c, overlay=true)

यदि आप एक क्रॉसस्टार को देखते हैं, तो कोई फर्क नहीं पड़ता! त्रिकोणात्मक अभिव्यक्ति को भी एम्बेडेड किया जा सकता है, जैसा कि हमने पिछले ट्यूटोरियल में किया था।

a = close > open
b = a ? math.abs(close-open) > 30 ? "阳线" : "十字星" : math.abs(close-open) > 30 ? "阴线" : "十字星"
c = not a ? math.abs(close-open) > 30 ? "阴线" : "十字星" : math.abs(close-open) > 30 ? "阳线" : "十字星"
plotchar(a, location=location.abovebar, color=color.red, char=b, overlay=true)
plotchar(not a, location=location.belowbar, color=color.green, char=c, overlay=true)

वास्तव में, यहcondition ? valueWhenConditionIsTrue : valueWhenConditionIsFalseमेंvalueWhenConditionIsTruevalueWhenConditionIsFalse, इसके बजाय अन्य त्रिमूर्ति अभिव्यक्ति का उपयोग करें।


इतिहास ऑपरेटर

इतिहास ऑपरेटर का उपयोग करें[], संदर्भ समय अनुक्रम पर इतिहास मूल्यों ये इतिहास मूल्यों चर के रूप में वर्तमान K लाइन BAR से पहले K लाइन BAR पर स्क्रिप्ट चल रहा है []चर, अभिव्यक्ति, फ़ंक्शन कॉल के बाद ऑपरेटरों का उपयोग करें।[]इस वर्ग के कोष्ठक में मूल्य है कि हम संदर्भित करने के लिए ऐतिहासिक डेटा की दूरी वर्तमान K लाइन BAR की विस्थापन की मात्रा है. उदाहरण के लिए, मैं पिछले K लाइन BAR के समापन मूल्य का हवाला देते हैं, तो यह लिखा हैःclose[1]

हमने पिछले पाठों में इस तरह के लेखन को देखा हैः

high[10]
ta.sma(close, 10)[1]
ta.highest(high, 10)[20]
close > nz(close[1], open)

[]ऑपरेटर को एक ही मान पर एक बार ही इस्तेमाल किया जा सकता है, इसलिए यह गलत है, यह त्रुटि देगाः

a = close[1][2]   // 错误

आप देख सकते हैं यहाँ, कुछ छात्रों ने कहा कि ऑपरेटर[]यह एक श्रृंखला संरचना के लिए है, यह एक श्रृंखला संरचना के समान है, और यह एक सरणी के समान है! नीचे हम एक उदाहरण के माध्यम से पिन भाषा में श्रृंखला और सरणी के बीच अंतर को समझाते हैं।

strategy("test", overlay=true)

a = close
b = close[1]
c = b[1]

plot(a, title="a")
plot(b, title="b")
plot(c, title="c")

हालांकि कहाa = close[1][2]यह गलत हो सकता है, लेकिनः

b = close[1]
c = b[1]

और यह अलग-अलग लिखने में कोई गलती नहीं है, अगर हम इसे सामान्य सरणी के अनुसार समझते हैं, तो हम इसे अलग-अलग कर सकते हैं।b = close[1]तो b एक संख्या होना चाहिए.c = b[1], b फिर से इतिहास ऑपरेटर का उपयोग करके इतिहास मानों को संदर्भित किया जा सकता है। पाइन भाषा में श्रृंखला की अवधारणा सरणी के रूप में सरल नहीं है। इसे क्लोज़ के पिछले बार पर इतिहास मान के रूप में समझा जा सकता है। यह b को एक समय अनुक्रम संरचना के रूप में भी समझा जा सकता है। और इसके इतिहास मानों को संदर्भित करना जारी रख सकता है। इसलिए हम तीन रेखाओं a, b, c में देखते हैं, b एक BAR से धीमी है, b एक BAR से धीमी है।

हम चार्ट को सबसे बाईं ओर खींच सकते हैं और देख सकते हैं कि पहली K लाइन पर, b और c के मान शून्य हैं ((na) । ऐसा इसलिए है क्योंकि जब स्क्रिप्ट पहली K लाइन BAR पर निष्पादित होती है, तो एक या दो चक्रों के इतिहास का कोई संदर्भ नहीं होता है, यह मौजूद नहीं है। इसलिए हमें लेखन रणनीति में अक्सर ध्यान देने की आवश्यकता होती है कि क्या हम ऐतिहासिक डेटा का हवाला देते समय शून्य को संदर्भित करते हैं, यदि हम सावधानी से शून्य का उपयोग नहीं करते हैं तो गणना में कई अंतर पैदा हो सकते हैं, और यह वास्तविक समय को भी प्रभावित कर सकता है। आमतौर पर हम कोड में BAR का उपयोग करते हैंnanzतो हम पहले से ही इस तरह के एक फंक्शन के बारे में बात कर रहे हैं।nznaफ़ंक्शंस, क्या आपको याद है कि किस अध्याय में?

close > nz(close[1], open)    // 当引用close内置变量前一个BAR的历史值时,如果不存在,则使用open内置变量

यह एक प्रकार का व्यवहार है जो शून्य मानों को संदर्भित कर सकता है।


ऑपरेटर प्राथमिकता

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

प्राथमिकता ऑपरेटर
9 []
8 `+- 、 ` 、 `
7 */%
6 द्विआधारी ऑपरेटरों के लिए +, -
5 ><>=<=
4