.3, সীমা=3)
যদি না হয় তাহলে বারস্ট্যাট.ইশস্টরি এবং বন্ধ < খোলা
কৌশল. বাতিল ((
---------------------------
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
: যদি অর্ডারের দিকটি দীর্ঘ হয় (buy), অন্তর্নির্মিত ভেরিয়েবলটি পাস করুন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.supertrend ((input ((5,
factor input.int(10,), atrPeriod ))
দ্যinput
ফাংশন কল সরাসরি একটি পরামিতি হিসাবে ব্যবহার করা হয়ta.supertrend
সুপারট্রেন্ড সূচক গণনা করার জন্য সূচক ফাংশন। এর মধ্যে রয়েছেঃ
ডিফল্টরূপে, ফাংশনটি পাইন ভাষার কৌশল পর্দায় দুটি পরামিতি কন্ট্রোল সেট করে, যা নীচে দেখানো হয়েছেঃ
আমরা দেখতে পাচ্ছি, কন্ট্রোলের ডিফল্ট মান হলinput
ফাংশন এবংinput
ফাংশন সিরিজ (এখানেinput.int
), যা পূর্ববর্তী বিভাগেও ব্যাখ্যা করা হয়েছে। এই দুটি ফাংশন দিয়ে আমরা তারপর প্যারামিটারগুলি সেট করতে পারিta.supertrend
কৌশল পর্দায় ফাংশন।supertrend
ফাংশন একটি মূল্য তথ্য গণনা করেsupertrend
এবং একটি দিক তথ্যdirection
তারপর আমরাplot
একটি চার্ট অঙ্কন করার জন্য ফাংশন, মনে রাখবেন যে যখন চার্ট অঙ্কন, এটি সুপার ট্রেন্ড সূচক দিক উপর ভিত্তি করে, শুধুমাত্র বর্তমান দিক আঁকা হয়। যখনdirection
-১, বর্তমান বাজারের প্রবণতা বাড়ছে, যখনdirection
1, বর্তমান বাজার প্রবণতা নিচে হয়. তাই আমরা দেখতে পারেন যেplot
ফাংশন চার্ট আঁকে যখন রায়direction
০ এর চেয়ে বড় বা কম।
পরেরটা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 দ্বারা বিভক্ত করা হয়, অর্থাৎ সর্বোচ্চ এবং সর্বনিম্ন মূল্যের গড়), এবং তারপর ATR সূচক (অস্থিরতা) একটি নির্দিষ্ট সময়ের জন্য প্যারামিটার atrPeriod উপর ভিত্তি করে গণনা করা হয়। তারপর উপরের এবং নিম্ন ট্র্যাক hl2 এবং ATR ব্যবহার করে নির্মিত হয়।
আপডেটlowerBand
এবংupperBand
কোডের টেরনারি এক্সপ্রেশন অনুযায়ী।
lowerBand := lowerBand > prevLowerBand or close[1] < prevLowerBand ? lowerBand : prevLowerBand
upperBand := upperBand < prevUpperBand or close[1] > prevUpperBand ? upperBand : prevUpperBand
lowerBand: lowerBand, uptrend পরিবর্তন হয়েছে কিনা তা নির্ধারণ করতে ব্যবহৃত হয়। upperBand: upperBand, downtrend পরিবর্তন হয়েছে কিনা তা নির্ধারণ করতে ব্যবহৃত হয়। 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
(যেমন, কোটাকুরেন্স সম্পদ সংখ্যা) এবংstocks
(যেমন, বেস মুদ্রা সম্পদ সংখ্যা) কৌশল ভারসাম্য তথ্য. আমরা অ্যাকাউন্টে সম্পদ প্রকৃত সংখ্যা পড়তে না, আমরা কেবল উপযুক্ত ক্রয় এবং বিক্রয় গণনা করতে অনুকূলিত পরিমাণ ব্যবহার. তারপর মূল পরামিতি যে গ্রিড এই গতিশীল ভারসাম্য কৌশল দ্বারা টানা প্রভাবিত হয়maxDiffValue
, যা ভারসাম্য বজায় রাখার জন্য মূল্যায়নের মানদণ্ড। বর্তমান মূল্যে, শুধুমাত্র যখনBaseCurrency
এবংQuoteCurrency
অতিক্রমmaxDiffValue
ব্যালেন্সিং প্রক্রিয়াটি কি ঘটে, সম্পদটিকে পুনরায় ভারসাম্যপূর্ণ করার জন্য উচ্চ মূল্যে বিক্রয় করে এবং কম মূল্যে ক্রয় করে?
কৌশল ট্রেডিং সংকেত ট্রিগার রিয়েল টাইম BAR পর্যায়ে হতে হবে, তাই যদি কৌশল ট্রেডিং শর্তাবলী বিচার সঙ্গে সেট করা হয়not barstate.ishistory
. কিনতে যখনbalance
মানstocks
বর্তমান মূল্য গণনার উপর ভিত্তি করে মূল্য। বিপরীতভাবে, একটি বিক্রয় অপারেশন সঞ্চালিত হয়।balance
এবংstocks
ভেরিয়েবল আপডেট করা হয় এবং তারপর পরবর্তী ভারসাম্য ট্রিগার অপেক্ষা।
কৌশল backtest উপরের তথ্য কৌশল backtest শুরু সময় প্রজাতির দাম রয়েছে, দাম 1458 হয়, তাই আমি পরামিতি সেটbalance
থেকেঃ 4374 (1458*3) ইচ্ছাকৃতভাবে, প্যারামিটার সেট করুনstocks
৩. সম্পত্তিটি ভারসাম্যপূর্ণ অবস্থায় শুরু হোক।
পূর্ববর্তী কোর্সে, আমরা শিখেছি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
স্ট্র্যাটেজি এন্ট্রি অর্ডারে এই স্টপ-লস এবং লাভের বৈশিষ্ট্য যোগ করার জন্য exit plan অর্ডার।
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)