.3, सीमा=3)
यदि नहीं barstate.ishistory और बंद < खुला
strategy.cancel ((
---------------------------
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
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
सुपरट्रेंड इंडिकेटर की गणना करने के लिए सूचक कार्य। इनमें से:
डिफ़ॉल्ट रूप से, फ़ंक्शन पाइन भाषा रणनीति स्क्रीन पर दो पैरामीटर नियंत्रण सेट करता है, जैसा कि नीचे दिखाया गया हैः
जैसा कि हम देख सकते हैं, नियंत्रण पर डिफ़ॉल्ट मान नियंत्रण के पहले पैरामीटर हैinput
कार्य औरinput
कार्यों की श्रृंखला (यहां हैinput.int
इन दो कार्यों के साथ, हम तब पैरामीटर सेट कर सकते हैंta.supertrend
रणनीति स्क्रीन पर कार्य करता है।supertrend
फ़ंक्शन मूल्य डेटा की गणना करता हैsupertrend
और एक दिशा डेटाdirection
. फिर हम उपयोग करते हैंplot
एक चार्ट खींचने के लिए समारोह, ध्यान दें कि जब चार्ट खींचने, यह सुपरट्रेंड संकेतक की दिशा पर आधारित है, केवल वर्तमान दिशा खींचा जाता है।direction
-1, वर्तमान बाजार की प्रवृत्ति ऊपर की ओर है, जबdirection
1 है, वर्तमान बाजार प्रवृत्ति नीचे है। तो हम देख सकते हैं किplot
कार्य चार्ट खींचता है जब निर्णयdirection
0 से अधिक या उससे कम है
अगला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)
चलो कुछ पाइन भाषा रणनीति डिजाइन उदाहरणों के साथ जारी है, इस बार हम एक गतिशील संतुलन रणनीति सीखना होगा. एक गतिशील संतुलन रणनीति है कि हमेशा संतुलन की मात्रा हैBaseCurrency
और राशिQuoteCurrency
. जो भी परिसंपत्ति की सापेक्ष मूल्य में वृद्धि होती है, खाते में आयोजित मूल्य बढ़ता है और परिसंपत्ति बेची जाती है। यदि किसी परिसंपत्ति की सापेक्ष मूल्य में कमी आती है, तो खाते में आयोजित मूल्य कम हो जाता है और परिसंपत्ति खरीदी जाती है। इसे गतिशील संतुलन रणनीति के रूप में जाना जाता है। वास्तव में, गतिशील संतुलन रणनीति एक प्रकार की ग्रिड रणनीति है जो दोलन बाजारों में अच्छी तरह से प्रदर्शन करती है। लेकिन प्रवृत्ति बाजार में, यह पैसा खोना जारी रखेगा, हमें लाभ के लिए नुकसान को धीरे-धीरे कम करने के लिए कीमत वापस आने की प्रतीक्षा करने की आवश्यकता है, लेकिन लाभ यह है कि गतिशील संतुलन रणनीति हमेशा बाजार के दोलन प्रवृत्ति को पकड़ सकती है।
इस रणनीति के बैकटेस्ट चार्ट पर दिखाए गए नुकसान के रूप में, इस रणनीति में सामान्य मूल्य प्रवृत्ति के चरण के दौरान एक बड़ा फ्लोटिंग नुकसान है। इसलिए यह रणनीति स्पॉट रणनीतियों के लिए ठीक है, लेकिन आपको वायदा के लिए जोखिम को नियंत्रित करने की आवश्यकता है।
आइए रणनीति कोड डिजाइन पर एक नज़र डालें:
हम एक सरल डिजाइन का उपयोग करते हैं जो एकbalance
(यानी, QuoteCurrency परिसंपत्तियों की संख्या) औरstocks
(यानी, बेस करेंसी परिसंपत्तियों की संख्या) रणनीति में संतुलन की जानकारी। हम खाते में परिसंपत्तियों की वास्तविक संख्या नहीं पढ़ते हैं, हम बस उचित खरीद और बिक्री की गणना करने के लिए अनुकरणीय राशि का उपयोग करते हैं। फिर इस गतिशील संतुलन रणनीति द्वारा खींचा गया ग्रिड को प्रभावित करने वाला प्रमुख पैरामीटर हैmaxDiffValue
वर्तमान मूल्य पर, केवल तभी जब विचलनBaseCurrency
औरQuoteCurrency
अधिक होता हैmaxDiffValue
क्या संतुलन प्रक्रिया होती है, संपत्ति को उच्च मूल्य पर बेचकर और संपत्ति को पुनः संतुलित करने के लिए कम मूल्य पर संपत्ति खरीदकर।
रणनीति व्यापार संकेत ट्रिगर वास्तविक समय BAR चरण में होना चाहिए, तो अगर रणनीति व्यापार की शर्तों में निर्णय के साथ सेट कर रहे हैंnot barstate.ishistory
खरीदें जबbalance
मूल्य से अधिकstocks
मूल्य वर्तमान मूल्य गणना के आधार पर है। इसके विपरीत, एक बिक्री ऑपरेशन किया जाता है।balance
औरstocks
चर अद्यतन कर रहे हैं और फिर अगले संतुलन ट्रिगर की प्रतीक्षा.
रणनीति बैकटेस्ट की उपरोक्त जानकारी रणनीति बैकटेस्ट के प्रारंभ समय पर प्रजातियों की कीमत शामिल है, कीमत 1458 है, इसलिए मैं पैरामीटर सेटbalance
करने के लिएः 4374 (1458*3) जानबूझकर, पैरामीटर सेटstocks
3. परिसंपत्ति को संतुलन में शुरू करने दें।
पिछले पाठ्यक्रम में हमनेstrategy.exit
स्थिति से बाहर निकलने के समारोह, जो हम एक उदाहरण नहीं था ट्रैकिंग बंद करो और लाभ लेने के समारोह को समझाने के लिए। इस रणनीति डिजाइन उदाहरण में, हम उपयोग करेंगेstrategy.exit
एक सुपर ट्रेंड रणनीति को अनुकूलित करने के लिए कार्य।
सबसे पहले आइए स्टॉप-लॉस और ले-प्रॉफिट पैरामीटर को देखें।strategy.exit
कार्य:
trail_price
: वह स्थिति जो ट्रैकिंग स्टॉप-लॉस और स्टॉप-लॉस क्लोज ऑर्डर (मूल्य द्वारा निर्दिष्ट स्थिति पर) लगाने की तार्किक क्रिया को ट्रिगर करती है।trail_offset
: ट्रेकिंग स्टॉप-लॉस और टेक-प्रॉफिट एक्शन के निष्पादन के बाद रखे गए बंद पद की उच्चतम (लंबी होने पर) या निम्नतम (लघु होने पर) कीमत से दूरी।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")
तत्काल लंबी प्रविष्टि जब रणनीति निष्पादित करने के लिए शुरू होता है, और फिर तुरंत एक रखा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)