रिणाम चार्ट पर सभी बार के समापन मूल्य का योग है (जब तक कि सबसे दाईं ओर नहीं चलाया जाता है, केवल वर्तमान बार में जमा किया जाता है) ।
समय-क्रम पर चर भी ऑपरेटरों का उपयोग करके गणना की जा सकती है, उदाहरण के लिए कोडः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 के मान संबंधित बार के ऊपर और नीचे दिखाई देते हैं। इस आरेख कोड को सीखने के दौरान संरक्षित किया जा सकता है, क्योंकि परीक्षण और प्रयोग के दौरान अक्सर चार्ट पर जानकारी को देखने के लिए आउटपुट करने की आवश्यकता हो सकती है।
ट्यूटोरियल के शुरुआती भाग में हमने एफएमजेड पर पाइन और ट्रेडिंग व्यू पर पाइन भाषा के उपयोग के बारे में कुछ अंतरों को संक्षेप में प्रस्तुत किया है।indicator()
、strategy()
और अस्थायी रूप से समर्थन नहींlibrary()
बेशक, पाइन स्क्रिप्ट के पहले संस्करणों के साथ संगतता के लिए, रणनीति को लिखते समय, इस तरह के लेख लिखेंः//@version=5
,indicator()
,strategy()
यह भी ठीक है. कुछ नीति सेटिंग्सstrategy()
फ़ंक्शन में पैरामीटर सेट करना
<version>
<declaration_statement>
<code>
<version>
संस्करण नियंत्रण जानकारी को छोड़ दिया जा सकता है.
पाइन भाषा//
एक पंक्ति टिप्पणी के रूप में, क्योंकि पाइन भाषा में कोई बहु-पंक्ति टिप्पणी नहीं है./**/
बहु-पंक्ति टिप्पणी के लिए।
स्क्रिप्ट में टिप्पणी या कंपाइलर निर्देशों की पंक्तियाँ नहीं हैं, जो कथन हैं, जो स्क्रिप्ट के एल्गोरिदम को लागू करते हैं। एक कथन इनमें से एक हो सकता है।
if
,for
,while
या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")
चर को समझने से पहले, हमें पहले पता होना चाहिए कि क्या एक चर है। सामान्य रूप से, एक चर के रूप में एक चर के रूप में एक चर के रूप में एक चर के रूप में एक चर के रूप में एक चर का उपयोग किया जाता है।समारोहऔरचरके नाम का ((नामकरण चर, फ़ंक्शन के लिए)) ।समारोहऔर जैसा कि हम बाद के पाठों में देखेंगे, हम पहले सीखते हैं कि क्या है तिल का प्रतीक 。
(A-Z)
या छोटा लिखें(a-z)
अक्षर या रेखांकित(_)
शुरुआत, पहचानकर्ता के पहले अक्षर के रूप में ▽उदाहरण के लिए, निम्न नाम वाले आइडेंटिफ़ायर:
fmzVar
_fmzVar
fmz666Var
funcName
MAX_LEN
max_len
maxLen
3barsDown // 错误的命名!使用了数字字符作为标识符的开头字符
अधिकांश प्रोग्रामिंग भाषाओं की तरह, पाइन भाषा में लेखन सुझाव भी हैं। आमतौर पर पहचानकर्ताओं के नामकरण के लिए सिफारिश की जाती हैः
// 命名变量、常量
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) । अन्य चरb
、c
、d
एफएमजेड पर फीडबैक सिस्टम में परीक्षण किया जा सकता है, परिणाम चित्रों से देखा जा सकता है।
:=
एक मौजूदा चर के लिए एक मूल्य को फिर से असाइन करने के लिए उपयोग किया जाता है, और इसे सरलता से समझा जा सकता है:=
ऑपरेटरों को पहले से ही घोषित और आरंभिक चर के मानों को संशोधित करने के लिए उपयोग किया जाता है।
अगर इस्तेमाल किया:=
ऑपरेटरों को एक अपरिवर्तित या घोषित चर को असाइन करने से त्रुटि उत्पन्न होती है, उदाहरण के लिएः
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 के बारे में विस्तार से बताना होगा:var
、varip
वास्तव में, यह एक ऐसा शब्द है जिसे हमने पिछले ट्यूटोरियल में देखा और इस्तेमाल किया था, लेकिन हमने उस समय इस पर विस्तार से चर्चा नहीं की थी।
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 ((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 चरण में विभाजित किया गया है?var
、varip
घोषित चरi
、ii
रणनीति कोड के प्रत्येक दौर के निष्पादन के दौरान वृद्धिशील ऑपरेशन किया जाता है। इसलिए यह देखा जा सकता है कि 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
जैसा कि आप देख सकते हैं, तुलना ऑपरेटर का उपयोग करना बहुत आसान है, लेकिन यह सबसे अधिक उपयोग किया जाने वाला ऑपरेटर है जब हम रणनीतियों को लिखते हैं। आप मानों की तुलना कर सकते हैं, लेकिन आप अंतर्निहित चर की तुलना भी कर सकते हैं, जैसेclose
、open
इंतज़ार।
एफएमजेड पर ट्रेडिंग व्यू के पाइन से भिन्नता है, जैसा कि ऑपरेटिंग ऑपरेटरों के साथ होता है, एफएमजेड में विशेष रूप से सख्त आवश्यकता प्रकार नहीं होते हैं, इसलिए इस तरह के बयान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
मेंvalueWhenConditionIsTrue
、valueWhenConditionIsFalse
, इसके बजाय अन्य त्रिमूर्ति अभिव्यक्ति का उपयोग करें।
इतिहास ऑपरेटर का उपयोग करें[]
, संदर्भ समय अनुक्रम पर इतिहास मूल्यों ये इतिहास मूल्यों चर के रूप में वर्तमान 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 का उपयोग करते हैंna
、nz
तो हम पहले से ही इस तरह के एक फंक्शन के बारे में बात कर रहे हैं।nz
、na
फ़ंक्शंस, क्या आपको याद है कि किस अध्याय में?
close > nz(close[1], open) // 当引用close内置变量前一个BAR的历史值时,如果不存在,则使用open内置变量
यह एक प्रकार का व्यवहार है जो शून्य मानों को संदर्भित कर सकता है।
हम पाइन भाषा के कई ऑपरेटरों को सीख चुके हैं, जो विभिन्न प्रकार के संयोजनों और ऑपरेशनों के माध्यम से अभिव्यक्तियों का निर्माण करते हैं। तो अभिव्यक्ति में गणना करते समय, इन ऑपरेशनों की प्राथमिकता क्या है? जैसे कि हम स्कूल में सीखे थे, चार नियम ऑपरेशन, गुणांकन को प्राथमिकता देने के लिए गुणांकन, और फिर जोड़ और घटाव की गणना करने के लिए। पाइन भाषा में अभिव्यक्ति समान है।
प्राथमिकता | ऑपरेटर |
---|---|
9 | [] |
8 | `+ 、 - 、 、 、 、 、 `、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 ` |
7 | * 、/ 、% |
6 | द्विआधारी ऑपरेटरों के लिए + , - |
5 | > 、< 、>= 、<= |
4 |