রিসোর্স লোড হচ্ছে... লোডিং...

FMZ Quant এর পাইন ল্যাঙ্গুয়েজ প্রারম্ভিক টিউটোরিয়াল

লেখক:এফএমজেড-লিডিয়া, সৃষ্টিঃ ২০২২-০৯-২৩ 15:23:34, আপডেটঃ ২০২৪-০২-২৭ ১৬ঃ৪৭ঃ৪১

.3, সীমা=3)

যদি না হয় তাহলে বারস্ট্যাট.ইশস্টরি এবং বন্ধ < খোলা কৌশল. বাতিল ((long1) কৌশল.বাতিল ((long2) কৌশল.বাতিল ((long3) isStop:= true


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

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: যদি অর্ডারের দিকটি দীর্ঘ হয় (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সুপারট্রেন্ড সূচক গণনা করার জন্য সূচক ফাংশন। এর মধ্যে রয়েছেঃ

  • ইনপুট ((5, ফ্যাক্টর)
  • input.int(10, atrPeriod)

ডিফল্টরূপে, ফাংশনটি পাইন ভাষার কৌশল পর্দায় দুটি পরামিতি কন্ট্রোল সেট করে, যা নীচে দেখানো হয়েছেঃ

img

আমরা দেখতে পাচ্ছি, কন্ট্রোলের ডিফল্ট মান হলinputফাংশন এবংinputফাংশন সিরিজ (এখানেinput.int), যা পূর্ববর্তী বিভাগেও ব্যাখ্যা করা হয়েছে। এই দুটি ফাংশন দিয়ে আমরা তারপর প্যারামিটারগুলি সেট করতে পারিta.supertrendকৌশল পর্দায় ফাংশন।supertrendফাংশন একটি মূল্য তথ্য গণনা করেsupertrendএবং একটি দিক তথ্যdirectionতারপর আমরাplotএকটি চার্ট অঙ্কন করার জন্য ফাংশন, মনে রাখবেন যে যখন চার্ট অঙ্কন, এটি সুপার ট্রেন্ড সূচক দিক উপর ভিত্তি করে, শুধুমাত্র বর্তমান দিক আঁকা হয়। যখনdirection-১, বর্তমান বাজারের প্রবণতা বাড়ছে, যখনdirection1, বর্তমান বাজার প্রবণতা নিচে হয়. তাই আমরা দেখতে পারেন যে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)

img

img

চলুন কিছু পাইন ভাষা কৌশল নকশা উদাহরণ সঙ্গে অবিরত, এই সময় আমরা একটি গতিশীল ভারসাম্য কৌশল শিখতে হবে। একটি গতিশীল ভারসাম্য কৌশল সবসময় পরিমাণ ভারসাম্য এক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ফাংশনঃ

  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স্ট্র্যাটেজি এন্ট্রি অর্ডারে এই স্টপ-লস এবং লাভের বৈশিষ্ট্য যোগ করার জন্য 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)

আরো