[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()
इस तरह के बयानों को स्वीकार करें।
स्क्रिप्ट में जो पंक्ति टिप्पणी या संकलक निर्देश नहीं है, वह वाक्य है, जो स्क्रिप्ट के एल्गोरिदम को लागू करता है। एक वाक्य इनमें से एक हो सकता है।
if
,for
,while
या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 के मान हमेशा समान होते हैं, इसलिए ये दोनों प्रतिनिधित्व विधियां समान हैं।
पाइन नीति के लिए निर्मित टेम्पलेट "पाइन भाषा लेन-देन पुस्तकालय" के लिए पैरामीटर सेटिंग निर्देश।
定价货币精度
पैरामीटर और यह पैरामीटर ऑर्डर के समय स्लाइड मूल्य निर्धारित करता है; उदाहरण के लिए, मूल्य निर्धारण मुद्रा सटीकता सेट 2 है, अर्थात्, दूसरे स्थान पर घन बिंदु तक सटीक, 0.01 तक सटीक; तो स्लाइड मूल्य बिंदु प्रत्येक बिंदु का प्रतिनिधित्व करता है 0.01 मूल्य निर्धारण इकाई; इस समय स्लाइड मूल्य बिंदु सेट 5 है, और ऑर्डर के समय स्लाइड मूल्य 0.05 है ((स्लाइड मूल्य ऑर्डर के लिए बेहतर है और ऑर्डर के लेनदेन के लिए ओवरफ्लो मूल्य का हिस्सा डिस्क) ।) ।javascript
रणनीति में कॉल करेंSetMaxBarLen
फ़ंक्शन का कार्य समान है।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
और जब हम फ़ंक्शन को क्रमबद्ध करते हैं, तो हम निर्दिष्ट कर सकते हैंlimit
、stop
पैरामीटर ।
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
), ऑर्डर केवल तभी ट्रिगर होता है जब बाजार का वर्तमान मूल्य उस मूल्य से अधिक हो।
रोकें आदेश
ऑर्डर का स्टॉप-लॉस मूल्य सेट करें, जब ऑर्डर एक भुगतान है, तो ऑर्डर केवल तभी ट्रिगर होता है जब बाजार का वर्तमान मूल्य उस मूल्य से अधिक होता है। जब ऑर्डर एक बिक्री ऑर्डर है, तो ऑर्डर केवल तभी ट्रिगर होता है जब बाजार में वर्तमान मूल्य उस मूल्य से कम हो।
रोक-सीमा आदेश
एक साथ सेट कर सकते हैंlimit
、stop
पैरामीटर, ऑर्डर पहले मूल्य पर ट्रिगर किया जाता है जो शर्तों को पूरा करता है।
//@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")
चर
एफएमजेड पर, इसे वास्तविक समय मूल्य मॉडल, समापन मूल्य मॉडल और वास्तविक समय मूल्य मॉडल के रूप में विभाजित किया गया है।var
、varip
हम निम्नलिखित कोड का उपयोग करके परीक्षण करते हैं।
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
वास्तविक समय मूल्य मॉडल
उपरोक्त परीक्षण कोड को निष्पादन के समय दो चरणों में विभाजित किया गया हैः १, ऐतिहासिक के-लाइन चरण; २, वास्तविक समय के-लाइन चरण; जब वास्तविक समय मूल्य मॉडल, ऐतिहासिक के-लाइन चरण,var
、varip
घोषणा किए गए चर i, ii को नीति कोड के प्रत्येक चरण के निष्पादन के दौरान वृद्धिशील ऑपरेशन किया जाता है क्योंकिif true
तो निश्चित रूप से निष्पादित करने के लिए संबंधित शर्त कोड ब्लॉक) । इसलिए आप देख सकते हैं कि पुनरावृत्ति के परिणाम K लाइन BAR पर दिखाए गए संख्याओं में से प्रत्येक में 1 की वृद्धि होती है । जब ऐतिहासिक K लाइन चरण समाप्त होता है, तो वास्तविक समय K लाइन चरण शुरू होता है ।var
、varip
यह एक वास्तविक समय मूल्य मॉडल है, क्योंकि एक K-लाइन BAR में प्रत्येक मूल्य परिवर्तन के लिए एक बार रणनीति कोड निष्पादित किया जाता है।i := i + 1
औरii := ii + 1
यह भिन्नता यह है कि ii हर बार संशोधित होता है. i हालांकि प्रत्येक बार संशोधित होता है, लेकिन नीति लॉजिक के अगले चरण के निष्पादन के दौरान पिछले मूल्य को बहाल कर देता है, जब तक कि वर्तमान K लाइन BAR समाप्त न हो जाए।
समापन मूल्य मॉडल
चूंकि समापन मूल्य मॉडल में प्रत्येक K-लाइन BAR के समाप्त होने पर एक रणनीति तर्क निष्पादित किया जाता है। इसलिए समापन मूल्य मॉडल में, ऐतिहासिक K-लाइन चरण और वास्तविक समय K-लाइन चरण, दोनों के लिए समान हैं।var
、varip
उपरोक्त उदाहरणों में, जो चर घोषित किए गए हैं, वे पूरी तरह से समान हैं, प्रत्येक 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
यदि कथन एक वाक्य खंड को परिभाषित करता है जिसे अभिव्यक्ति की शर्तों को पूरा करने के लिए निष्पादित किया जाना चाहिए। चौथे संस्करण के पाइन स्क्रिप्टिंग भाषा में आपको
सामान्य कोडः
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_then0
,var_decl_then1
आदि) ⇒ यदि शर्त false है, तो वाक्य खंड का उपयोग करेंelse if
याelse
तर्क में ((var_decl_else0
,var_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 चर को एक
उदाहरण
// if
x = if close > open
close
// If current close > current open, then x = close.
// Otherwise the x = na.
plot(x)
आप कई
उदाहरण
// if
x = if open > close
5
else if high > low
close
else
open
plot(x)
अनदेखा किया जा सकता हैif
कथन का परिणाम मान ((
उदाहरण
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 को
अलविदा
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 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
खोजशब्द घोषणा प्रकारऑब्जेक्ट बनाना
घोषित किए गए प्रकारों का उपयोग करके कॉल करें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 कीवर्ड द्वारा घोषित ऑब्जेक्ट प्रत्येक पुनरावृत्ति के बीच अपनी स्थिति बनाए रखेगा, बिना प्रत्येक पुनरावृत्ति में अपने क्षेत्र के मूल्य को फिर से आरंभ करने की आवश्यकता के।
आप दो वस्तुओं के लिए एक 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 टेम्पलेट क्लासरूम, पैरामीटर पर स्विच एक्सचेंज बेस एड्रेस सेट किया जा सकता है.