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

एफएमजेड क्वांट का पाइन भाषा परिचयात्मक ट्यूटोरियल

लेखक:FMZ~Lydia, बनाया गयाः 2022-09-23 15:23:34, अद्यतनः 2024-02-27 16:47:41

.3, सीमा=3)

यदि नहीं barstate.ishistory और बंद < खुला strategy.cancel ((long1) strategy.cancel ((long2) strategy.cancel ((long3) isStop:= सच


---------------------------

6. ```strategy.cancel_all```

The ```strategy.cancel_all``` function is similar to the ```strategy.cancel``` function. It can cancel/stop all pre-listed commands. The ```when``` parameter can be specified.

Parameters:

- ```when```: Execution conditions.

```pine
/*backtest
start: 2022-07-03 00:00:00
end: 2022-07-09 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/

strategy("strategy.cancel Demo", pyramiding=3)

var isStop = false 
if isStop 
    runtime.error("stop")

strategy.entry("long1", strategy.long, 0.1, limit=1)
strategy.entry("long2", strategy.long, 0.2, limit=2)
strategy.entry("long3", strategy.long, 0.3, limit=3)

if not barstate.ishistory and close < open 
    strategy.cancel_all()
    isStop := true 

  1. strategy.order

की कार्यक्षमता और पैरामीटर सेटिंग्सstrategy.orderकार्य लगभग समान हैंstrategy.entryअंतर यह है किstrategy.orderकार्य को प्रभावित नहीं करता हैpyramidingपैरामीटर सेटिंग्सstrategyकार्य, और कोई आदेश संख्या सीमा नहीं है।

पैरामीटर:

  • id: यह संदर्भ के लिए एक ट्रेडिंग स्थिति को एक नाम देने के रूप में समझा जा सकता है। आदेश रद्द करने, संशोधित करने और बंद पदों के लिए आईडी को संदर्भित किया जा सकता है।
  • direction: यदि आदेश की दिशा लंबी है (खरीदें), तो अंतर्निहित चर में पास करेंstrategy.long, और यदि आप शॉर्ट (बेचना) जाना चाहते हैं, चर में पारितstrategy.short.
  • qty: रखे जाने वाले आदेशों की राशि निर्दिष्ट करें, यदि यह पैरामीटर पारित नहीं किया जाता है, तो आदेशों की डिफ़ॉल्ट राशि का उपयोग किया जाएगा।
  • when: निष्पादन शर्त, आप इस पैरामीटर को निर्दिष्ट कर सकते हैं यह नियंत्रित करने के लिए कि यह वर्तमान आदेश ऑपरेशन ट्रिगर किया जाता है या नहीं।
  • limit: आदेश सीमा मूल्य निर्दिष्ट करें।
  • stopस्टॉप लॉस की कीमत।

हम उस सुविधा का उपयोग करेंगे जोstrategy.orderआदेशों की संख्या पर कोई सीमा नहीं है,strategy.exitग्रिड ट्रेडिंग के समान एक स्क्रिप्ट बनाने के लिए सशर्त निकास फ़ंक्शन। उदाहरण बहुत सरल है और केवल सीखने के उद्देश्यों के लिए हैः

/*backtest
start: 2021-03-01 00:00:00
end: 2022-08-30 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"ETH_USDT"}]
args: [["ZPrecision",0,358374]]
*/

varip beginPrice = -1

if not barstate.ishistory
    if beginPrice == -1 or (math.abs(close - beginPrice) > 1000 and strategy.opentrades == 0) 
        beginPrice := close
    
    for i = 0 to 20
        strategy.order("buy"+i, strategy.long, 0.01, limit=beginPrice-i*200, when=(beginPrice-i*200)<close)
        strategy.exit("coverBuy"+i, "buy"+i, qty=0.01, profit=200)
        
        strategy.order("sell"+i, strategy.short, 0.01, limit=beginPrice+i*200, when=(beginPrice+i*200)>close)
        strategy.exit("coverSell"+i, "sell"+i, qty=0.01, profit=200)

रणनीति के उदाहरण

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

सुपर ट्रेंड इंडिकेटर रणनीति

strategy("supertrend", overlay=true)

[supertrend, direction] = ta.supertrend(input(5, "factor"), input.int(10, "atrPeriod"))

plot(direction < 0 ? supertrend : na, "Up direction", color = color.green, style=plot.style_linebr)
plot(direction > 0 ? supertrend : na, "Down direction", color = color.red, style=plot.style_linebr)

if direction < 0
    if supertrend > supertrend[2]
        strategy.entry("entry long", strategy.long)
    else if strategy.position_size < 0
        strategy.close_all()
else if direction > 0
    if supertrend < supertrend[3]
        strategy.entry("entry short", strategy.short)
    else if strategy.position_size > 0
        strategy.close_all()

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

सबसे पहले, रणनीति कोड कुछ सरल सेटिंग्स के साथ शुरू होता हैstrategyकार्य:strategy("supertrend", overlay=true)``, which just sets a strategy title "supertrend". Theओवरलेparameter is set toसच, so that the drawn indicator lines and other content are displayed on the main chart. The first thing we need to look at when designing a Pine strategy or learning a Pine strategy script is the strategy interface parameter design. Let's look at the source code of the ''supertrend indicator strategy'', which has theइनपुट ` ` फ़ंक्शन हमने पिछले कोर्स में सीखा

[सुपरट्रेंड, दिशा] = ta.सुपरट्रेंड(इनपुट(5, कारक),input.int(10, त्रिअवधि))

..inputफ़ंक्शन कॉल सीधे पैरामीटर के रूप में उपयोग किया जाता हैta.supertrendसुपरट्रेंड इंडिकेटर की गणना करने के लिए सूचक कार्य। इनमें से:

  • इनपुट ((5, कारक)
  • input.int(10, atrPeriod)

डिफ़ॉल्ट रूप से, फ़ंक्शन पाइन भाषा रणनीति स्क्रीन पर दो पैरामीटर नियंत्रण सेट करता है, जैसा कि नीचे दिखाया गया हैः

img

जैसा कि हम देख सकते हैं, नियंत्रण पर डिफ़ॉल्ट मान नियंत्रण के पहले पैरामीटर हैinputकार्य औरinputकार्यों की श्रृंखला (यहां हैinput.intइन दो कार्यों के साथ, हम तब पैरामीटर सेट कर सकते हैंta.supertrendरणनीति स्क्रीन पर कार्य करता है।supertrendफ़ंक्शन मूल्य डेटा की गणना करता हैsupertrendऔर एक दिशा डेटाdirection. फिर हम उपयोग करते हैंplotएक चार्ट खींचने के लिए समारोह, ध्यान दें कि जब चार्ट खींचने, यह सुपरट्रेंड संकेतक की दिशा पर आधारित है, केवल वर्तमान दिशा खींचा जाता है।direction-1, वर्तमान बाजार की प्रवृत्ति ऊपर की ओर है, जबdirection1 है, वर्तमान बाजार प्रवृत्ति नीचे है। तो हम देख सकते हैं किplotकार्य चार्ट खींचता है जब निर्णयdirection0 से अधिक या उससे कम है

अगलाif... else ifतर्क व्यापार संकेत का निर्णय है। जब अभिव्यक्तिdirection < 0यह सच है, इसका मतलब यह है कि वर्तमान बाजार ऊपर की ओर है।supertrendसुपर ट्रेंड इंडिकेटर में सुपर ट्रेंड इंडिकेटर की कीमत दो पिछले BAR पर अधिक है (यानी,supertrend[2], remember that the historical operator refers to the historical data of a variable), यह लंबे समय तक जाने के लिए एक प्रवेश संकेत के रूप में उपयोग किया जाएगा। याद रखें कि? यदि कोई वर्तमान स्थिति है, तो रिवर्स ऑर्डर फ़ंक्शन को कॉल करने से पहले पिछली स्थिति बंद हो जाएगी, और फिर वर्तमान ट्रेडिंग दिशा के अनुसार स्थिति खोलेगी। इसके अलावा, यहां तक कि अगर स्थितिsupertrend > supertrend[2]नहीं मिले हैं, जब तकstrategy.position_size < 0लघु पदों को पकड़ने, यह ट्रिगर करेगाstrategy.close_all()सभी पदों को बंद करने के लिए फ़ंक्शन निष्पादन।

direction > 0यदि कोई लंबी स्थिति है, तो सभी स्थिति बंद हो जाएगी, और फिर जब स्थिति नीचे की ओर प्रवृत्ति चरण में है।supertrend < supertrend[3]से मिल जाता है, तो एक छोटा संकेत ट्रिगर किया जाएगा.[3]पिछले अंक के तीसरे BAR पर सुपर ट्रेंड इंडिकेटर के मूल्य डेटा का संदर्भ देने के लिए? यह रणनीति लेखक का इरादा हो सकता है। आखिरकार, कुछ बाजारों में, जैसे कि अनुबंध व्यापार बाजार में, लघु जोखिम लंबे जोखिम से थोड़ा अधिक है।

के लिएta.supertrendसंकेतक, क्या किसी को यह जानने में दिलचस्पी है कि वर्तमान प्रवृत्ति ऊपर की ओर है या नीचे की ओर?

वास्तव में, इस सूचक को पाइन भाषा में कस्टम फ़ंक्शन के रूप में भी लागू किया जा सकता हैः

pine_supertrend(factor, atrPeriod) =>
	src = hl2
	atr = ta.atr(atrPeriod)
	upperBand = src + factor * atr
	lowerBand = src - factor * atr
	prevLowerBand = nz(lowerBand[1])
	prevUpperBand = nz(upperBand[1])

	lowerBand := lowerBand > prevLowerBand or close[1] < prevLowerBand ? lowerBand : prevLowerBand
	upperBand := upperBand < prevUpperBand or close[1] > prevUpperBand ? upperBand : prevUpperBand
	int direction = na
	float superTrend = na
	prevSuperTrend = superTrend[1]
	if na(atr[1])
		direction := 1
	else if prevSuperTrend == prevUpperBand
		direction := close > upperBand ? -1 : 1
	else
		direction := close < lowerBand ? 1 : -1
	superTrend := direction == -1 ? lowerBand : upperBand
	[superTrend, direction]

यह कस्टम फ़ंक्शन बिल्ट-इन फ़ंक्शन के समान ही एल्गोरिथ्म हैta.supertrend, और निश्चित रूप से गणना किए गए सूचक डेटा भी बिल्कुल समान हैं। जैसा कि हम इस कस्टम फ़ंक्शन एल्गोरिथ्म से देख सकते हैं, पाइन के अंतर्निहित सुपर प्रवृत्ति संकेतक का उपयोग करके गणना की जाती हैhl2अंतर्निहित चर (उच्चतम और निम्नतम कीमतों को एक साथ जोड़कर 2 से विभाजित किया जाता है, अर्थात उच्चतम और निम्नतम कीमतों का औसत), और फिर पैरामीटर atrPeriod के आधार पर एक निश्चित अवधि के लिए ATR संकेतक (अस्थिरता) की गणना की जाती है। फिर ऊपरी और निचले ट्रैक hl2 और ATR का उपयोग करके बनाए जाते हैं।

अद्यतन करेंlowerBandऔरupperBandकोड में तृतीयक अभिव्यक्तियों के अनुसार।

    lowerBand := lowerBand > prevLowerBand or close[1] < prevLowerBand ? lowerBand : prevLowerBand
    upperBand := upperBand < prevUpperBand or close[1] > prevUpperBand ? upperBand : prevUpperBand

lowerBand: lowerBand, यह निर्धारित करने के लिए प्रयोग किया जाता है कि ऊपर की ओर रुझान बदल गया है या नहीं. upperBand: upperBand, यह निर्धारित करने के लिए उपयोग किया जाता है कि नीचे की ओर रुझान बदल गया है या नहीं. lowerBand और upperBand हमेशा गणना की जाती है, केवल वर्तमान रुझान दिशा इस कस्टम फ़ंक्शन के अंत में निर्धारित की जाती है।

    else if prevSuperTrend == prevUpperBand
        direction := close > upperBand ? -1 : 1
    else
        direction := close < lowerBand ? 1 : -1

यहाँ यह माना जाता है कि यदि सुपर ट्रेंड पर अंतिम BAR का मूल्य मूल्य हैprevUpperBand, यानी ऊपरी बैंड, इसका मतलब है कि वर्तमान एक नीचे की ओर प्रवृत्ति है।closeसे अधिक हैupperBandमूल्य ब्रेकआउट, प्रवृत्ति इस बिंदु पर स्थानांतरित हो गया है और एक अपट्रेंड में परिवर्तित माना जाता है। दिशा चरdirection-1 (उतरती प्रवृत्ति) पर सेट है। अन्यथा यह अभी भी 1 (नीचे की प्रवृत्ति) पर सेट है। यही कारण है कि आप सुपर प्रवृत्ति रणनीति में देखते हैंif direction < 0जब संकेत की स्थिति लंबे समय तक जाने के लिए ट्रिगर किया जाता है.direction > 0, सिग्नल की स्थिति को कम करने के लिए ट्रिगर किया जाता है।

    superTrend := direction == -1 ? lowerBand : upperBand
    [superTrend, direction]

अंत में, दिशा चयन के आधार पर विशिष्ट सुपर ट्रेंड इंडिकेटर मूल्य डेटा और दिशा डेटा लौटाए जाते हैं।

गतिशील संतुलन रणनीति

/*backtest
start: 2021-03-01 00:00:00
end: 2022-09-08 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Binance","currency":"ETH_USDT"}]
args: [["v_input_1",4374],["v_input_2",3],["v_input_3",300],["ZPrecision",0,358374]]
*/

varip balance = input(50000, "balance")
varip stocks = input(0, "stocks")

maxDiffValue = input(1000, "maxDiffValue")


if balance - close * stocks > maxDiffValue and not barstate.ishistory
    // more balance , open long 
    tradeAmount = (balance - close * stocks) / 2 / close
    strategy.order("long", strategy.long, tradeAmount)
    balance := balance - tradeAmount * close
    stocks := stocks + tradeAmount
    runtime.log("balance:", balance, ", stocks:", stocks, ", tradeAmount:", tradeAmount)

else if close * stocks - balance > maxDiffValue and not barstate.ishistory
    // more stocks , open short 
    tradeAmount = (close * stocks - balance) / 2 / close
    strategy.order("short", strategy.short, tradeAmount)
    balance := balance + tradeAmount * close
    stocks := stocks - tradeAmount
    runtime.log("balance:", balance, ", stocks:", stocks, ", tradeAmount:", tradeAmount)

plot(balance, title="balance value(quoteCurrency)", color=color.red)
plot(stocks*close, title="stocks value(quoteCurrency)", color=color.blue)

img

img

चलो कुछ पाइन भाषा रणनीति डिजाइन उदाहरणों के साथ जारी है, इस बार हम एक गतिशील संतुलन रणनीति सीखना होगा. एक गतिशील संतुलन रणनीति है कि हमेशा संतुलन की मात्रा हैBaseCurrencyऔर राशिQuoteCurrency. जो भी परिसंपत्ति की सापेक्ष मूल्य में वृद्धि होती है, खाते में आयोजित मूल्य बढ़ता है और परिसंपत्ति बेची जाती है। यदि किसी परिसंपत्ति की सापेक्ष मूल्य में कमी आती है, तो खाते में आयोजित मूल्य कम हो जाता है और परिसंपत्ति खरीदी जाती है। इसे गतिशील संतुलन रणनीति के रूप में जाना जाता है। वास्तव में, गतिशील संतुलन रणनीति एक प्रकार की ग्रिड रणनीति है जो दोलन बाजारों में अच्छी तरह से प्रदर्शन करती है। लेकिन प्रवृत्ति बाजार में, यह पैसा खोना जारी रखेगा, हमें लाभ के लिए नुकसान को धीरे-धीरे कम करने के लिए कीमत वापस आने की प्रतीक्षा करने की आवश्यकता है, लेकिन लाभ यह है कि गतिशील संतुलन रणनीति हमेशा बाजार के दोलन प्रवृत्ति को पकड़ सकती है।

इस रणनीति के बैकटेस्ट चार्ट पर दिखाए गए नुकसान के रूप में, इस रणनीति में सामान्य मूल्य प्रवृत्ति के चरण के दौरान एक बड़ा फ्लोटिंग नुकसान है। इसलिए यह रणनीति स्पॉट रणनीतियों के लिए ठीक है, लेकिन आपको वायदा के लिए जोखिम को नियंत्रित करने की आवश्यकता है।

आइए रणनीति कोड डिजाइन पर एक नज़र डालें:

हम एक सरल डिजाइन का उपयोग करते हैं जो एकbalance(यानी, QuoteCurrency परिसंपत्तियों की संख्या) औरstocks(यानी, बेस करेंसी परिसंपत्तियों की संख्या) रणनीति में संतुलन की जानकारी। हम खाते में परिसंपत्तियों की वास्तविक संख्या नहीं पढ़ते हैं, हम बस उचित खरीद और बिक्री की गणना करने के लिए अनुकरणीय राशि का उपयोग करते हैं। फिर इस गतिशील संतुलन रणनीति द्वारा खींचा गया ग्रिड को प्रभावित करने वाला प्रमुख पैरामीटर हैmaxDiffValueवर्तमान मूल्य पर, केवल तभी जब विचलनBaseCurrencyऔरQuoteCurrencyअधिक होता हैmaxDiffValueक्या संतुलन प्रक्रिया होती है, संपत्ति को उच्च मूल्य पर बेचकर और संपत्ति को पुनः संतुलित करने के लिए कम मूल्य पर संपत्ति खरीदकर।

रणनीति व्यापार संकेत ट्रिगर वास्तविक समय BAR चरण में होना चाहिए, तो अगर रणनीति व्यापार की शर्तों में निर्णय के साथ सेट कर रहे हैंnot barstate.ishistoryखरीदें जबbalanceमूल्य से अधिकstocksमूल्य वर्तमान मूल्य गणना के आधार पर है। इसके विपरीत, एक बिक्री ऑपरेशन किया जाता है।balanceऔरstocksचर अद्यतन कर रहे हैं और फिर अगले संतुलन ट्रिगर की प्रतीक्षा.

रणनीति बैकटेस्ट की उपरोक्त जानकारी रणनीति बैकटेस्ट के प्रारंभ समय पर प्रजातियों की कीमत शामिल है, कीमत 1458 है, इसलिए मैं पैरामीटर सेटbalanceकरने के लिएः 4374 (1458*3) जानबूझकर, पैरामीटर सेटstocks3. परिसंपत्ति को संतुलन में शुरू करने दें।

स्टॉप लॉस और टेक प्रॉफिट के साथ सुपर ट्रेंड रणनीति

पिछले पाठ्यक्रम में हमनेstrategy.exitस्थिति से बाहर निकलने के समारोह, जो हम एक उदाहरण नहीं था ट्रैकिंग बंद करो और लाभ लेने के समारोह को समझाने के लिए। इस रणनीति डिजाइन उदाहरण में, हम उपयोग करेंगेstrategy.exitएक सुपर ट्रेंड रणनीति को अनुकूलित करने के लिए कार्य।

सबसे पहले आइए स्टॉप-लॉस और ले-प्रॉफिट पैरामीटर को देखें।strategy.exitकार्य:

  1. पैरामीटरtrail_price: वह स्थिति जो ट्रैकिंग स्टॉप-लॉस और स्टॉप-लॉस क्लोज ऑर्डर (मूल्य द्वारा निर्दिष्ट स्थिति पर) लगाने की तार्किक क्रिया को ट्रिगर करती है।
  2. पैरामीटरtrail_offset: ट्रेकिंग स्टॉप-लॉस और टेक-प्रॉफिट एक्शन के निष्पादन के बाद रखे गए बंद पद की उच्चतम (लंबी होने पर) या निम्नतम (लघु होने पर) कीमत से दूरी।
  3. पैरामीटरtrail_pointsजैसे:trail_priceपैरामीटर, सिवाय इसके कि यह निर्दिष्ट स्थिति के रूप में लाभ अंक लेता है।

क्या यह समझना आसान नहीं है? इससे कोई फर्क नहीं पड़ता! आइए समझने के लिए एक रणनीति बैकटेस्टिंग परिदृश्य से गुजरें, जो वास्तव में काफी सरल है।

/*backtest
start: 2022-09-23 00:00:00
end: 2022-09-23 08:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Binance","currency":"ETH_USDT"}]
args: [["RunMode",1,358374],["ZPrecision",0,358374]]
*/

strategy("test", overlay = true)

varip a = na
varip highPrice = na
varip isTrade = false 
varip offset = 30

if not barstate.ishistory and not isTrade
    strategy.entry("test 1", strategy.long, 1)
    strategy.exit("exit 1", "test 1", 1, trail_price=close+offset, trail_offset=offset)
    a := close + offset
    runtime.log("the price per point is:", syminfo.mintick, ", current close:", close)
    isTrade := true 

if close > a and not barstate.ishistory
    highPrice := na(highPrice) ? close : highPrice
    highPrice := close > highPrice ? close : highPrice

plot(a, "trail_price trigger line")    
plot(strategy.position_size>0 ? highPrice : na, "current highest price")
plot(strategy.position_size>0 ? highPrice-syminfo.mintick*offset : na, "moving stop trigger line")

img

img

img

तत्काल लंबी प्रविष्टि जब रणनीति निष्पादित करने के लिए शुरू होता है, और फिर तुरंत एक रखाstrategy.exitबाहर निकलने के आदेश (यह ट्रैकिंग स्टॉप-लॉस और ले-प्रॉफिट मापदंडों को निर्दिष्ट करता है), जब बाजार परिवर्तन की कीमत ट्रेल_प्राइस ट्रिगर लाइन से ऊपर बढ़ जाती है, तो ट्रेलिंग स्टॉप-लॉस और ले-प्रॉफिट लॉजिक, स्टॉप-लॉस और ले-प्रॉफिट लाइन (नीला) का कार्यान्वयन उच्चतम मूल्य गतिशील समायोजन का पालन करना शुरू कर देता है, नीली रेखा की स्थिति स्थिति को बंद करने के लिए स्टॉप-लॉस और ले-प्रॉफिट ट्रिगर है, और अंत में जब बाजार मूल्य नीली रेखा से नीचे गिर जाता है जो स्थिति के बंद होने को ट्रिगर करती है। चार्ट पर खींची गई रेखा के साथ संयुक्त, यह समझना बहुत आसान है।

फिर हम इस सुविधा का उपयोग एक सुपर ट्रेंडिंग रणनीति का अनुकूलन करने के लिए, हम बस एक असाइनstrategy.exitआउटप्लान ऑर्डर को रणनीति प्रवेश ऑर्डर में यह ट्रेलिंग स्टॉप-लॉस और टेक-प्रॉफिट सुविधा जोड़ने के लिए।

if not barstate.ishistory and findOrderIdx("open") >= 0 and state == 1
    trail_price := strategy.position_size > 0 ? close + offset : close - offset
    strategy.exit("exit", "open", 1, trail_price=trail_price, trail_offset=offset)
    runtime.log("the price per point is:", syminfo.mintick, ", current close:", close, ",trail_price:", trail_price)
    state := 2 
    tradeBarIndex := bar_index

पूर्ण रणनीति कोडः

/*backtest
start: 2022-05-01 00:00:00
end: 2022-09-27 00:00:00
period: 1d
basePeriod: 5m
exchanges: [{"eid":"Binance","currency":"ETH_USDT"}]
args: [["RunMode",1,358374],["ZPrecision",0,358374]]
*/

varip trail_price = na
varip offset = input(50, "offset")
varip tradeBarIndex = 0
// 0 : idle , 1 current_open , 2 current_close
varip state = 0  

findOrderIdx(idx) =>
    ret = -1 
    if strategy.opentrades == 0 
        ret
    else 
        for i = 0 to strategy.opentrades - 1 
            if strategy.opentrades.entry_id(i) == idx
                ret := i 
                break
        ret

if strategy.position_size == 0 
    trail_price := na 
    state := 0

[superTrendPrice, dir] = ta.supertrend(input(2, "atr coefficient"), input(20, "atr period"))

if ((dir[1] < 0 and dir[2] > 0) or (superTrendPrice[1] > superTrendPrice[2])) and state == 0 and tradeBarIndex != bar_index
    strategy.entry("open", strategy.long, 1)
    state := 1
else if ((dir[1] > 0 and dir[2] < 0) or (superTrendPrice[1] < superTrendPrice[2])) and state == 0 and tradeBarIndex != bar_index
    strategy.entry("open", strategy.short, 1)
    state := 1


// Reverse signal, close all positions
if strategy.position_size > 0 and dir[2] < 0 and dir[1] > 0
    strategy.cancel_all()
    strategy.close_all()
    runtime.log("trend reversal, long positions all closed")
else if strategy.position_size < 0 and dir[2] > 0 and dir[1] < 0
    strategy.cancel_all()
    strategy.close_all()
    runtime.log("trend reversal, short positions all closed")


if not barstate.ishistory and findOrderIdx("open") >= 0 and state == 1
    trail_price := strategy.position_size > 0 ? close + offset : close - offset
    strategy.exit("exit", "open", 1, trail_price=trail_price, trail_offset=offset)
    runtime.log("the price per point is:", syminfo.mintick, ", current close:", close, ", trail_price:", trail_price)
    state := 2 
    tradeBarIndex := bar_index


plot(superTrendPrice, "superTrendPrice", color=dir>0 ? color.red : color.green, overlay=true)

अधिक