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

উদ্ভাবকগণ পাইন ভাষার পরিমাপকৃত শিক্ষামূলক পাঠ্যক্রম

লেখক:উদ্ভাবকগণ - ক্যোটিফিকেশন - ছোট্ট স্বপ্ন, সৃষ্টিঃ ২০২২-০৫-৩০ 16:23:43, আপডেটঃ ২০২২-০৯-২৮ ১৭ঃ১০ঃ২১

উদাহরণঃ

var lineColor = na

n = if bar_index > 10 and bar_index <= 20
    lineColor := color.green
else if bar_index > 20 and bar_index <= 30
    lineColor := color.blue
else if bar_index > 30 and bar_index <= 40
    lineColor := color.orange
else if bar_index > 40
    lineColor := color.black
else 
    lineColor := color.red
    
plot(close, title="close", color=n, linewidth=5, overlay=true)
plotchar(true, title="bar_index", char=str.tostring(bar_index), location=location.abovebar, color=color.red, overlay=true)

মূল বিষয়ঃ বিচার করার জন্য ব্যবহৃত একটি অভিব্যক্তি, বুল মান ফেরত দেয়; মনোযোগ সংকুচিত করুন; সর্বাধিক একটিelse শাখা থাকতে পারে; সমস্ত শাখা অভিব্যক্তি সত্য নয়, এবং অন্য কোনও শাখা নেই, তাই na ফেরত দেয়।

x = if close > open
    close
plot(x, title="x")

যেহেতু K-রেখা BAR ক্যান্ট্রাল হয়, অর্থাৎ close < open হলে if স্ট্রিংয়ের পরের এক্সপ্রেশনটি false হয়, তাই if এর স্থানীয় কোড ব্লকটি কার্যকর হয় না। এই সময়েও অন্য কোন শাখা নেই, if স্ট্রিং ফিরে আসে na;;x এর মান দেওয়া হয় na;; গ্রাফটিতে এই বিন্দুটি অঙ্কিত করা যায় না, আমরা এটি পুনরায় পরিমাপ করেও দেখতে পারি।

স্যুইচ বাক্য

একটি সুইচ স্ট্রিং হল একটি শাখাভিত্তিক স্ট্রিং যা নির্দিষ্ট শর্তের উপর নির্ভর করে বিভিন্ন পথ সম্পাদন করার জন্য ডিজাইন করা হয়।

1, সুইচ স্ট্রিং এবং if স্ট্রিং এর মতই, একটি মান ফেরত দিতে পারে । ২। অন্যান্য ভাষার স্যুইচ স্ট্রাকচারের মতো নয়, স্যুইচ স্ট্রাকচারটি কেবলমাত্র একটি স্থানীয় ব্লককে তার কোডের মধ্যে কার্যকর করে, তাই ব্রেক ঘোষণাটি অপ্রয়োজনীয় (যেমন ব্রেক এর মতো কীওয়ার্ড লেখার প্রয়োজন নেই) । ৩. সুইচ এর প্রতিটি শাখায় একটি স্থানীয় কোড ব্লক লিখতে পারে, এই স্থানীয় কোড ব্লকের শেষ লাইনটি হল রিটার্ন ভ্যালু (এটি একটি মানের উপাদান হতে পারে) । যদি কোন শাখার সাথে স্থানীয় কোড ব্লকটি চালিত না হয় তবে na ফিরে আসে। ৪। সুইচ কাঠামোর মধ্যে এক্সপ্রেশনাল অবস্থান নির্ধারণ, যা স্ট্রিং, ভেরিয়েবল, এক্সপ্রেশন বা ফাংশন কল লিখতে পারে। ৫. সুইচ একটি রিটার্ন ভ্যালু নির্দিষ্ট করতে দেয় যা স্ট্রাকচারে অন্য কোনও পরিস্থিতিতে সম্পাদন না হলে ডিফল্টভাবে ব্যবহৃত হয়।

স্যুইচ দুটি প্রকারের হয়, আমরা তাদের ব্যবহারের জন্য উদাহরণগুলি একের পর এক দেখি।

১, এক্সপ্রেশন সহswitchউদাহরণস্বরূপঃ

// input.string: defval, title, options, tooltip
func = input.string("EMA", title="指标名称", tooltip="选择要使用的指标函数名称", options=["EMA", "SMA", "RMA", "WMA"])

// input.int: defval, title, options, tooltip
// param1 = input.int(10, title="周期参数")
fastPeriod = input.int(10, title="快线周期参数", options=[5, 10, 20])
slowPeriod = input.int(20, title="慢线周期参数", options=[20, 25, 30])

data = input(close, title="数据", tooltip="选择使用收盘价、开盘价、最高价...")
fastColor = color.red
slowColor = color.red

[fast, slow] = switch func
    "EMA" =>
        fastLine = ta.ema(data, fastPeriod)
        slowLine = ta.ema(data, slowPeriod)
        fastColor := color.red
        slowColor := color.red
        [fastLine, slowLine]
    "SMA" =>
        fastLine = ta.sma(data, fastPeriod)
        slowLine = ta.sma(data, slowPeriod)
        fastColor := color.green
        slowColor := color.green
        [fastLine, slowLine]
    "RMA" =>
        fastLine = ta.rma(data, fastPeriod)
        slowLine = ta.rma(data, slowPeriod)
        fastColor := color.blue
        slowColor := color.blue
        [fastLine, slowLine]
    =>
        runtime.error("error")
        
plot(fast, title="fast" + fastPeriod, color=fastColor, overlay=true)
plot(slow, title="slow" + slowPeriod, color=slowColor, overlay=true)

আমরা আগে ইনপুট ফাংশন শিখেছি, এখানে আমরা ইনপুট এর মত দুটি ফাংশন শিখেছিঃinput.stringinput.intফাংশন ।input.stringএটি একটি স্ট্রিং ফেরত দিতে ব্যবহৃত হয়।input.intফাংশনটি পূর্ণসংখ্যার মান ফেরত দেয়। উদাহরণস্বরূপ, একটি নতুন যোগ করা হয়।optionsএই প্যারামিটারগুলো কিভাবে ব্যবহার করা হয়?optionsএকটি প্যারামিটার একটি নির্বাচনযোগ্য মান সমন্বিত অ্যারেতে পাস করা যেতে পারে; উদাহরণস্বরূপ উদাহরণে।options=["EMA", "SMA", "RMA", "WMA"]এবংoptions=[5, 10, 20](একটি স্ট্রিং টাইপ, অন্যটি সংখ্যা টাইপ) । এই কৌশলটি ইন্টারফেসের কন্ট্রোলগুলিকে নির্দিষ্ট সংখ্যার ইনপুটের প্রয়োজন নেই, বরং কন্ট্রোলগুলি ড্রপডাউন বক্সে পরিণত হয়, বিকল্পগুলি প্যারামিটগুলিতে প্রদত্ত বিকল্পগুলি নির্বাচন করে।

ভেরিয়েবল func এর মান একটি স্ট্রিং, ভেরিয়েবল func হল সুইচ এর একটি এক্সপ্রেশন (এটি ভেরিয়েবল, ফাংশন কল, এক্সপ্রেশন হতে পারে) যা নির্ধারণ করে যে সুইচ এর কোন শাখায় কার্যকর করা হবে। যদি ভেরিয়েবল func সুইচ এর যে কোন শাখায় এক্সপ্রেশনটির সাথে মেলে না (যেমন সমান) তবে ডিফল্ট শাখার কোড ব্লকটি কার্যকর করা হবে, যা কার্যকর হবে।runtime.error("error")ফাংশনটি নীতির অস্বাভাবিক থামার কারণ হয়।

উপরে আমাদের পরীক্ষামূলক কোডে, সুইচ এর ডিফল্ট শাখা কোড ব্লকের শেষ লাইনের রানটাইম.error এর পরে, আমরা [na, na] এর মত কোড যোগ করি নি যাতে সামঞ্জস্যপূর্ণ মান ফিরে আসে, ট্রেডিং ভিউতে এই সমস্যাটি বিবেচনা করা প্রয়োজন, যদি টাইপটি অসামঞ্জস্য হয় তবে এটি ভুল হয়। তবে FMZ এ এই সামঞ্জস্যপূর্ণ কোডটি উপেক্ষা করা যেতে পারে কারণ সেখানে কঠোরভাবে টাইপ প্রয়োজন নেই। সুতরাং FMZ এ if, সুইচ শাখার মান ফেরত দেওয়ার জন্য টাইপ সামঞ্জস্যের সমস্যাটি বিবেচনা করার দরকার নেই।

strategy("test", overlay=true)
x = if close > open
    close
else
    "open"
plotchar(true, title="x", char=str.tostring(x), location=location.abovebar, color=color.red)

এফএমজেড-এ কোন ত্রুটি রিপোর্ট করা হয় না, ট্রেডিং ভিউ-এ ত্রুটি রিপোর্ট করা হয়; কারণ if শাখাটি একই ধরনের নয়।

২, কোন অভিব্যক্তি নেইswitch

এখন আমরা দেখি।switchঅন্য একটি ব্যবহার, যা একটি অভিব্যক্তিহীন লেখা।

up = close > open     // up = close < open 
down = close < open 
var upOfCount = 0 
var downOfCount = 0 

msgColor = switch
    up  => 
        upOfCount += 1 
        color.green 
    down => 
        downOfCount += 1
        color.red

plotchar(up, title="up", char=str.tostring(upOfCount), location=location.abovebar, color=msgColor, overlay=true)
plotchar(down, title="down", char=str.tostring(downOfCount), location=location.belowbar, color=msgColor, overlay=true)

পরীক্ষার কোডের উদাহরণে দেখা যায় যে, সুইচ বাস্তবায়ন শাখার শর্তে সত্য স্থানীয় কোড ব্লকের সাথে মেলে। সাধারণভাবে সুইচ স্ট্রিংয়ের পরে শাখার শর্ত অবশ্যই পরস্পর বিপরীত হতে হবে। অর্থাৎ, উদাহরণে আপ এবং ডাউন উভয়ই সত্য হতে পারে না। যেহেতু সুইচ কেবলমাত্র একটি শাখার স্থানীয় কোড ব্লক বাস্তবায়ন করতে পারে, তাই কোডে এই লাইনটি রাখতে আগ্রহীঃup = close > open // up = close < openপরিবর্তে মন্তব্যের বিষয়বস্তু, ফলাফল পর্যবেক্ষণ করুন। আপনি দেখতে পাবেন যে স্যুইচ শাখাটি কেবল প্রথম শাখাটি সম্পাদন করতে পারে। এছাড়াও, স্যুইচের শাখায় ফাংশন কলগুলি লেখার চেষ্টা করবেন না, ফাংশনটি প্রতিটি BAR এ কল করা যায় না যা কিছু ডেটা গণনার সমস্যা সৃষ্টি করতে পারে।switch"উপমালার ক্ষেত্রে, কার্যকর শাখাটি নির্দিষ্ট এবং কৌশলটি চলাকালীন পরিবর্তিত হবে না") ।

চক্রের গঠন

for বাক্য

返回值 = for 计数 = 起始计数 to 最终计数 by 步长
    语句                                            // 注释:语句里可以有break,continue
    语句                                            // 注释:最后一条语句为返回值

ফর স্টেটমেন্ট ব্যবহার করা খুবই সহজ, ফর লুপ শেষ পর্যন্ত একটি মান ফেরত দিতে পারে (অথবা [a, b, c] এর মতো ফর্মের মাধ্যমে একাধিক মান ফেরত দিতে পারে) । উপরের ছদ্মবেশে যেমন ভেরিয়েবলকে "রিটার্ন ভেরিয়েবল" পজিশনে দেওয়া হয়। ফর স্টেটমেন্টের পরে একটি "গণনা" ভেরিয়েবল থাকে যা লুপের সংখ্যা নিয়ন্ত্রণ করতে ব্যবহৃত হয়, অন্যান্য মান উল্লেখ করে, ইত্যাদি। "গণনা" ভেরিয়েবলটি লুপ শুরু হওয়ার আগে "প্রাথমিক গণনা" হিসাবে নির্ধারিত হয়, তারপর "বৃদ্ধি" সেটিং অনুযায়ী, "গণনা" সংখ্যা "সমাপ্ত ভেরিয়েবল" এর চেয়ে বড় হলে লুপটি বন্ধ হয়ে যায়।

for ব্যবহার করা হয়breakকীওয়ার্ডঃ যখন এটি করা হয়breakএকটি বাক্যের পর, চক্রটি বন্ধ হয়ে যায়। for ব্যবহার করা হয়continueকীওয়ার্ডঃ যখন এটি করা হয়continueবাক্যের পরে, লুপটি উপেক্ষা করা হয়continueপরবর্তী কোডটি সরাসরি পরবর্তী লুপটি চালায়; for স্টেটমেন্টটি শেষ লুপটি চালানোর সময় ফিরে আসা মানটি প্রদান করে; যদি কোন কোড চালানো না হয় তবে এটি একটি শূন্য মান প্রদান করে।

এখানে আমরা একটি সহজ উদাহরণ দেখাবঃ

ret = for i = 0 to 10       // 可以增加by关键字修改步长,暂时FMZ不支持 i = 10 to 0 这样的反向循环
    // 可以增加条件设置,使用continue跳过,break跳出
    runtime.log("i:", i)
    i                       // 如果这行不写,就返回空值,因为没有可返回的变量
    
runtime.log("ret:", ret)
runtime.error("stop")

for... in বাক্য

for ... inএই বাক্যটি দুই প্রকারের হতে পারে, যা নিম্নলিখিত ভুয়া কোড দ্বারা ব্যাখ্যা করা হয়েছে।

返回值 = for 数组元素 in 数组 
    语句                        // 注释:语句里可以有break,continue
    语句                        // 注释:最后一条语句为返回值
返回值 = for [索引变量, 索引变量对应的数组元素] in 数组
    语句                        // 注释:语句里可以有break,continue
    语句                        // 注释:最后一条语句为返回值 

দুইটি ফর্মের মধ্যে প্রধান পার্থক্য দেখা যায় যে, for কীওয়ার্ডের পরে যা অনুসরণ করা হয়, তা হল একটি ভেরিয়েবলকে একটি ভেরিয়েবল হিসেবে ব্যবহার করা হয় যা অ্যারে উপাদানকে উল্লেখ করে। অন্যটি হল একটি ভেরিয়েবলের গঠন যা একটি সূচক ভেরিয়েবল, একটি অ্যারে উপাদান ভেরিয়েবলকে উল্লেখ করে। অন্যটি হল রিটার্ন ভ্যালু নিয়ম, break, continuue এবং for লুপ ব্যবহার করে। আমরা একটি সহজ উদাহরণ দিয়েও ব্যবহারের ব্যাখ্যা দিয়েছি।

testArray = array.from(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)
for ele in testArray            // 修改成 [i, ele]的形式:for [i, ele] in testArray , runtime.log("ele:", ele, ", i:", i)
    runtime.log("ele:", ele)

runtime.error("stop")

যখনই আপনি একটি সূচক ব্যবহার করতে চান, এটি ব্যবহার করুন।for [i, ele] in testArrayএই লেখাটি।

for রিসাইক্লিং অ্যাপ্লিকেশন

যখন পাইন ভাষায় প্রদত্ত অন্তর্নির্মিত ফাংশনগুলি দিয়ে কিছু লুপিং লজিক্যাল গণনা করা যায়, তখন লুপিং স্ট্রাকচারগুলি সরাসরি লিখতে পারে, বা অন্তর্নির্মিত ফাংশনগুলি ব্যবহার করে পরিচালনা করতে পারে। আমরা দুটি উদাহরণ দিচ্ছি।

১, গণনা করা গড় মান

চক্রীয় কাঠামো ডিজাইনের জন্যঃ

length = 5
var a = array.new(length)
array.push(a, close)

if array.size(a) >= length
	array.remove(a, 0)
	
sum = 0 	
for ele in a
    sum += ele 

avg = sum / length
plot(avg, title="avg", overlay=true)

উদাহরণস্বরূপ, for লুপ যোগ করা হয় এবং তারপর সমতা গণনা করা হয়।

সরাসরি অন্তর্নির্মিত ফাংশন ব্যবহার করে গড় রেখা গণনা করুনঃ

plot(ta.sma(close, length), title="ta.sma", overlay=true)

সরাসরি বিল্ট-ইন ফাংশন ব্যবহার করুনta.sma, সমতল সূচক গণনা করা, স্পষ্টতই সমতল গণনার জন্য একটি অন্তর্নির্মিত ফাংশন ব্যবহার করা সহজ। চার্টে বিপরীতে আপনি গণনা করা ফলাফলগুলি দেখতে পাবেন।

২, যোগ করা

অথবা উপরের উদাহরণটি ব্যবহার করে ব্যাখ্যা করুন।

চক্রীয় কাঠামো ডিজাইনের জন্যঃ

length = 5
var a = array.new(length)
array.push(a, close)

if array.size(a) >= length
	array.remove(a, 0)
	
sum = 0 	
for ele in a
    sum += ele 

avg = sum / length
plot(avg, title="avg", overlay=true)
plot(ta.sma(close, length), title="ta.sma", overlay=true)

অ্যারের সমস্ত উপাদানের জন্য এবং যা লুপ ব্যবহার করে গণনা করা যেতে পারে, এটি একটি অন্তর্নির্মিত ফাংশন ব্যবহার করেও করা যেতে পারেarray.sumআসুন গণনা করা যাক। সরাসরি অন্তর্নির্মিত ফাংশন ব্যবহার করে যোগফল গণনা করুনঃ

length = 5
var a = array.new(length)
array.push(a, close)

if array.size(a) >= length
	array.remove(a, 0)
	
plot(array.sum(a) / length, title="avg", overlay=true)
plot(ta.sma(close, length), title="ta.sma", overlay=true)

আপনি গণনা করা ডেটা দেখতে পারেন, প্লট অঙ্কন ব্যবহার করে চার্টে সম্পূর্ণরূপে সামঞ্জস্যপূর্ণ প্রদর্শিত হয়।

আপনি যদি এই সমস্ত কাজগুলি একটি বিল্ট-ইন ফাংশন দিয়ে করতে পারেন, তাহলে লুপগুলি কেন ডিজাইন করবেন? ১, অ্যারেগুলির জন্য কিছু অপারেশন, গণনা। ২। ইতিহাসের দিকে ফিরে তাকান, উদাহরণস্বরূপ, বর্তমান BAR এর উচ্চতা থেকে অতীতের উচ্চতা কত বেশি তা খুঁজে বের করুন। যেহেতু বর্তমান BAR এর উচ্চতা শুধুমাত্র স্ক্রিপ্ট চালিত BAR-এ জানা যায়, তাই সময়মতো ফিরে যেতে এবং অতীতের BAR-এর বিশ্লেষণ করতে একটি লুপ প্রয়োজন। ৩। পাইন ভাষা ব্যবহার করে নির্মিত ফাংশনগুলি অতীত BAR এর গণনা সম্পন্ন করতে পারে না।

while বাক্য

whileএকটি স্ট্রিং একটি লুপ অংশের কোডকে চলতে দেয় যতক্ষণ না while স্ট্রাকচারের বিচারযোগ্য শর্তটি মিথ্যা হয়।

返回值 = while 判断条件
    语句                    // 注释:语句里可以有break,continue
    语句                    // 注释:最后一条语句为返回值

while এর অন্যান্য নিয়মগুলি for লুপের অনুরূপ, লুপের স্থানীয় কোড ব্লকের শেষ লাইনটি হল রিটার্ন ভ্যালু, যা একাধিক মান ফেরত দিতে পারে। যখন "লুপের শর্তাদি" হয় তখন লুপটি কার্যকর করা হয়, যখন শর্তাদি মিথ্যা হয় তখন লুপটি বন্ধ করা হয়। লুপের মধ্যে break, continue statements ব্যবহার করা যেতে পারে।

আমি একটি সমতল রেখার উদাহরণ দিয়ে এটি দেখাবঃ

length = 10

sma(data, length) => 
    i = 0 
    sum = 0 
    while i < 10 
        sum += data[i]
        i += 1
        sum / length

plot(sma(close, length), title="sma", overlay=true)
plot(ta.sma(close, length), title="ta.sma", overlay=true)

আপনি দেখতে পাচ্ছেন যে, যখন লুপ ব্যবহার করা খুব সহজ, তখন আপনি এমন কিছু কম্পিউটিং লজিক ডিজাইন করতে পারেন যা বিল্ট-ইন ফাংশনগুলির সাথে প্রতিস্থাপন করা যায় না, যেমন গণনা স্তরঃ

counter = 5
fact = 1

ret = while counter > 0
    fact := fact * counter
    counter := counter - 1
    fact

plot(ret, title="ret")  // ret = 5 * 4 * 3 * 2 * 1

সমষ্টি

পাইনের অ্যারে অন্যান্য প্রোগ্রামিং ভাষার অ্যারে সংজ্ঞার অনুরূপ, পাইনের অ্যারেটি একটি মাত্রিক অ্যারে। এটি সাধারণত ধারাবাহিকভাবে ডেটা সঞ্চয় করতে ব্যবহৃত হয়। অ্যারেতে সংরক্ষিত একক ডেটা অ্যারে উপাদান হিসাবে পরিচিত। এই উপাদানগুলির ধরণগুলি হতে পারেঃ পূর্ণ, ফ্লোটেট, স্ট্রিং, রঙের মান, বুল মান। FMZ এর পাইনের ভাষাটি খুব কঠোরভাবে টাইপ করার প্রয়োজন নেই এবং এমনকি একটি অ্যারেতে স্ট্রিং এবং সংখ্যা উভয়ই সংরক্ষণ করতে পারে। কারণ অ্যারেটির নীচেও একটি সিরিয়াল কাঠামো রয়েছে, যদি ইতিহাস অপারেটরটি পূর্ববর্তীটির BAR এর অ্যারেটির অবস্থা উল্লেখ করে তবে অ্যারেটির কোনও উপাদানকে উল্লেখ করার জন্য ইতিহাস অপারেটরটি ব্যবহার করা হয় না।[]এটি ব্যবহার করা প্রয়োজন।array.get()এবংarray.set()ফাংশন ⇒ অ্যারেতে থাকা উপাদানগুলির সূচক ক্রমানুসারে অ্যারেটির প্রথম উপাদানের সূচক ০ হয় এবং পরবর্তী উপাদানের সূচক ১ হয়।

আমরা একটি সহজ কোড ব্যবহার করে এটি ব্যাখ্যা করতে পারিঃ

var a = array.from(0)
if bar_index == 0 
    runtime.log("当前BAR上的a值:", a, ", 上1根BAR上的a,即a[1]值:", a[1])
else if bar_index == 1 
    array.push(a, bar_index)
    runtime.log("当前BAR上的a值:", a, ", 上1根BAR上的a,即a[1]值:", a[1])
else if bar_index == 2
    array.push(a, bar_index)
    runtime.log("当前BAR上的a值:", a, ", 上1根BAR上的a,即a[1]值:", a[1], ", 向前数2根BAR上的a,即a[2]值:", a[2])
else if bar_index == 3 
    array.push(a, bar_index)
    runtime.log("当前BAR上的a值:", a, ", 上1根BAR上的a,即a[1]值:", a[1], ", 向前数2根BAR上的a,即a[2]值:", a[2], ", 向前数3根BAR上的a,即a[3]值:", a[3])
else if bar_index == 4 
    // 使用array.get 按索引获取元素,使用array.set按索引修改元素
    runtime.log("数组修改前:", array.get(a, 0), array.get(a, 1), array.get(a, 2), array.get(a, 3))
    array.set(a, 1, 999)
    runtime.log("数组修改后:", array.get(a, 0), array.get(a, 1), array.get(a, 2), array.get(a, 3))

ঘোষিত অ্যারে

ব্যবহারarray<int> afloat[] bএকটি ঘোষিত অ্যারে বা কেবলমাত্র একটি ভেরিয়েবল ঘোষিত অ্যারেকে একটি মান দেওয়া যেতে পারে, যেমনঃ

array<int> a = array.new(3, bar_index)
float[] b = array.new(3, close)
c = array.from("hello", "fmz", "!")
runtime.log("a:", a)
runtime.log("b:", b)
runtime.log("c:", c)
runtime.error("stop")

ম্যাট্রিক্স ভেরিয়েবল ইনসিওলেশন সাধারণভাবে ব্যবহৃতarray.newএবংarray.from函数。Pine语言中还有很多和类型相关的与array.new类似的函数:array.new_int()array.new_bool()array.new_color()array.new_string()আরে।

var কীওয়ার্ডটি অ্যারেগুলির ঘোষণার মোডের সাথেও কাজ করতে পারে, যা শুধুমাত্র প্রথম BAR এ প্রাথমিকীকরণ করা হয়। আমরা একটি উদাহরণ দিয়ে এটি দেখতে পাচ্ছিঃ

var a = array.from(0)
b = array.from(0)

if bar_index == 1
    array.push(a, bar_index)
    array.push(b, bar_index)
else if bar_index == 2 
    array.push(a, bar_index)
    array.push(b, bar_index)
else if barstate.islast
    runtime.log("a:", a)
    runtime.log("b:", b)
    runtime.error("stop")

আপনি দেখতে পাচ্ছেন যে a এর পরিবর্তনগুলি ধারাবাহিকভাবে স্থির করা হয়, পুনরায় স্থাপন করা হয় না; b এর পরিবর্তনগুলি প্রতিটি BAR এ ইনসিলেটেড হয়; অবশেষেbarstate.islastরিয়েল-টাইম প্রিন্টিংয়ের সময় এখনও একটি উপাদান রয়েছে, যার মান ০।

একটি অ্যারেতে উপাদানগুলি পড়তে, লিখতে

array.get দিয়ে অ্যারেতে নির্দিষ্ট সূচক অবস্থানের জন্য একটি উপাদান পান এবং array.set দিয়ে অ্যারেতে নির্দিষ্ট সূচক অবস্থানের জন্য একটি উপাদান পরিবর্তন করুন।

array.get-এর প্রথম প্যারামিটার হল যে অ্যারেটি প্রক্রিয়া করা হবে এবং দ্বিতীয় প্যারামিটার হল নির্দিষ্ট সূচক। array.set এর প্রথম প্যারামিটার হ'ল যে অ্যারেটি প্রক্রিয়া করা হবে, দ্বিতীয় প্যারামিটার হ'ল নির্দিষ্ট সূচক এবং তৃতীয় প্যারামিটার হ'ল যে উপাদানটি লিখতে হবে।

এই সহজ উদাহরণটি ব্যবহার করে এটি ব্যাখ্যা করুনঃ

lookbackInput = input.int(100)
FILL_COLOR = color.green

var fillColors = array.new(5)
if barstate.isfirst
    array.set(fillColors, 0, color.new(FILL_COLOR, 70))
    array.set(fillColors, 1, color.new(FILL_COLOR, 75))
    array.set(fillColors, 2, color.new(FILL_COLOR, 80))
    array.set(fillColors, 3, color.new(FILL_COLOR, 85))
    array.set(fillColors, 4, color.new(FILL_COLOR, 90))

lastHiBar = - ta.highestbars(high, lookbackInput)
fillNo = math.min(lastHiBar / (lookbackInput / 5), 4)

bgcolor(array.get(fillColors, int(fillNo)), overlay=true)
plot(lastHiBar, title="lastHiBar")
plot(fillNo, title="fillNo")

এই উদাহরণটি বেস রঙটি সবুজ রঙের সাথে শুরু করে, বর্ণ সংরক্ষণের জন্য একটি অ্যারে ঘোষণা করে এবং শুরু করে এবং তারপরে রঙের মানকে বিভিন্ন স্বচ্ছতা দেয় ((color.new ফাংশন ব্যবহার করে) । রঙের স্তর গণনা করা হয় বর্তমান BAR থেকে 100 টি পর্যালোচনা চক্রের মধ্যে সর্বাধিক উচ্চ মানের দূরত্ব গণনা করে। সাম্প্রতিক 100 টি পর্যালোচনা চক্রের মধ্যে সর্বাধিক উচ্চ মানের কাছাকাছি, উচ্চতর স্তর, সংশ্লিষ্ট রঙের মানটি গভীরতর ((স্বচ্ছতা কম); অনেকগুলি অনুরূপ কৌশল এইভাবে ব্যবহৃত হয় যা বর্তমান পর্যালোচনা চক্রের N টি স্তরের মধ্যে দামকে নির্দেশ করে।

অ্যারে উপাদান জুড়ে

কিভাবে একটি অ্যারে অতিক্রম করা যায়, আমরা আগে শিখেছি যে for/for in/while বাক্য ব্যবহার করেও করা যায়।

a = array.from(1, 2, 3, 4, 5, 6)

for i = 0 to (array.size(a) == 0 ? na : array.size(a) - 1)
    array.set(a, i, i)
    
runtime.log(a)
runtime.error("stop")
a = array.from(1, 2, 3, 4, 5, 6)

i = 0
while i < array.size(a)
    array.set(a, i, i)
    i += 1

runtime.log(a)
runtime.error("stop")
a = array.from(1, 2, 3, 4, 5, 6)

for [i, ele] in a 
    array.set(a, i, i)

runtime.log(a)
runtime.error("stop")

এই তিনটি পদ্ধতি একই ফলাফল দেয়।

অ্যারেগুলি স্ক্রিপ্টের গ্লোবাল পরিসরে ঘোষণা করা যেতে পারে, অথবা ফাংশন বা if শাখার স্থানীয় পরিসরে ঘোষণা করা যেতে পারে

ঐতিহাসিক তথ্যসূত্র

অ্যারেতে উপাদান ব্যবহারের জন্য, নিম্নলিখিত পদ্ধতিটি সমতুল্য, আমরা নিম্নলিখিত উদাহরণটি দিয়ে দেখতে পারি যে চার্টটিতে দুটি লাইন আঁকতে হবে, প্রতিটি গ্রুপে দুটি লাইন, প্রতিটি গ্রুপে দুটি লাইন সংখ্যা ঠিক একই।

a = array.new_float(1)
array.set(a, 0, close)
closeA1 = array.get(a, 0)[1]
closeB1 = close[1]
plot(closeA1, "closeA1", color.red, 6)
plot(closeB1, "closeB1", color.black, 2)

ma1 = ta.sma(array.get(a, 0), 20)
ma2 = ta.sma(close, 20)
plot(ma1, "ma1", color.aqua, 6)
plot(ma2, "ma2", color.black, 2)

অ্যারে যোগ করা, অপারেটিং ফাংশন মুছে ফেলা

১, অ্যারেতে যোগ অপারেশন সম্পর্কিত ফাংশনঃ

array.unshift()array.insert()array.push()

2, অ্যারে অপসারণ অপারেশন সম্পর্কিত ফাংশনঃ

array.remove()array.shift()array.pop()array.clear()

আমরা নিম্নলিখিত উদাহরণগুলি ব্যবহার করে এই অ্যারেগুলির যোগ, অপসারণ এবং অপারেশন ফাংশনগুলি পরীক্ষা করি।

a = array.from("A", "B", "C")
ret = array.unshift(a, "X")
runtime.log("数组a:", a, ", ret:", ret)

ret := array.insert(a, 1, "Y")
runtime.log("数组a:", a, ", ret:", ret)

ret := array.push(a, "D")
runtime.log("数组a:", a, ", ret:", ret)

ret := array.remove(a, 2)
runtime.log("数组a:", a, ", ret:", ret)

ret := array.shift(a)
runtime.log("数组a:", a, ", ret:", ret)

ret := array.pop(a)
runtime.log("数组a:", a, ", ret:", ret)

ret := array.clear(a)
runtime.log("数组a:", a, ", ret:", ret)

runtime.error("stop")

যোগ এবং অপসারণ অ্যাপ্লিকেশনঃ অ্যারে ক্যারেজ হিসাবে

অ্যারে ব্যবহার করে, এবং কিছু অ্যারে যোগ এবং মুছে ফেলা ফাংশন আমরা একটি "কোয়ার্টজ" ডাটা স্ট্রাকচার নির্মাণ করতে পারেন। কোয়ার্টজ টিক মূল্যের চলমান গড় গণনা করতে ব্যবহার করা যেতে পারে, এবং কিছু ছাত্র জিজ্ঞাসা করতে পারেঃ কেন কোয়ার্টজ গঠন নির্মাণ? আমরা আগে অ্যারে ব্যবহার করে গড় গণনা করতে পারে না?

ক্যোয়ারী হল একটি কাঠামো যা প্রোগ্রামিংয়ে প্রায়শই ব্যবহৃত হয়।

প্রথম ক্যোয়ারী উপাদান প্রবেশ করুন, প্রথম ক্যোয়ারী ছেড়ে।

এটি নিশ্চিত করতে পারে যে ক্যোয়ারে থাকা ডেটা সর্বশেষতম এবং ক্যোয়ারের দৈর্ঘ্য অসীমভাবে প্রসারিত হবে না (অসীমভাবে প্রসারিত কোডটি কেবল মধ্যাহ্নের সময় লেখা যেতে পারে, কারণ খুব তাড়াতাড়ি বা খুব দেরিতে সমস্যা হবে) ।

নিম্নলিখিত উদাহরণে আমরা একটি ক্যোয়ারী কাঠামো ব্যবহার করে প্রতিটি টিকের দাম রেকর্ড করি, টিক স্তরের চলমান গড় মূল্য গণনা করি এবং তারপরে 1 মিনিটের জন্য কে-লাইন স্তরের চলমান গড়ের সাথে তুলনা করি।

strategy("test", overlay=true)

varip a = array.new_float(0)
var length = 10

if not barstate.ishistory
    array.push(a, close)

    if array.size(a) > length
        array.shift(a)

sum = 0.0
for [index, ele] in a 
    sum += ele

avgPrice = array.size(a) == length ? sum / length : na

plot(avgPrice, title="avgPrice")
plot(ta.sma(close, length), title="ta.sma")

মনে রাখবেন, যখন আমরা a অ্যারে ঘোষণা করি, তখন আমরা কীওয়ার্ড ব্যবহার করে বিবৃতির ধরন উল্লেখ করি।varip⇒ এইভাবে, প্রতিটি মূল্য পরিবর্তন a অ্যারেতে রেকর্ড করা হয়।

প্রচলিত অ্যারিট্রিক্যাল গণনা, অপারেটিং ফাংশন

সংশ্লিষ্ট ফাংশন গণনাঃ

array.avg()গড় সংখ্যা, গড় সংখ্যা, গড় সংখ্যা, গড় সংখ্যা।array.min()একটি অ্যারেতে ক্ষুদ্রতম উপাদানarray.max()যদি আপনি একটি অ্যারেতে সবচেয়ে বড় উপাদান খুঁজে পান,array.stdev()একটি সূচক অ্যারেতে সমস্ত উপাদানের স্ট্যান্ডার্ড ডিফারেন্স।array.sum()একটি সূচক অ্যারেতে সমস্ত উপাদানের যোগফল।

অপারেশন সম্পর্কিত ফাংশনঃarray.concat()দুটি অ্যারে একত্রিত বা সংযুক্ত করা হয়।array.copy()কপি করা অ্যারে।array.joinঅ্যারের সমস্ত উপাদানকে একটি স্ট্রিংয়ে সংযুক্ত করা হয়।array.sort()আপনি যদি আপনার পছন্দ পছন্দ অনুযায়ী একটি ক্রমবর্ধমান বা হ্রাসপ্রাপ্ত ক্রম অনুসারে একটি ক্রম নির্ধারণ করেন।array.reverse()বিপরীত অ্যারে ।array.slice()অ্যারেটি টুকরো টুকরো করা হয়।array.includes()এলিমেন্ট বিচার করুন।array.indexof()প্যারামিটারটি যে সূচকে প্রথম দেখায় তার মান ফেরত দেয়। যদি এটি পাওয়া না যায় তবে -1 ফেরত দেয়।array.lastindexof()সর্বশেষ যে মানটি দেখা গেছে তা খুঁজে বের করুন।

গাণিতিক গণনা সম্পর্কিত ফাংশনের পরীক্ষার উদাহরণঃ

a = array.from(3, 2, 1, 4, 5, 6, 7, 8, 9)

runtime.log("数组a的算数平均:", array.avg(a))
runtime.log("数组a中的最小元素:", array.min(a))
runtime.log("数组a中的最大元素:", array.max(a))
runtime.log("数组a中的标准差:", array.stdev(a))
runtime.log("数组a的所有元素总和:", array.sum(a))
runtime.error("stop")

এগুলি তুলনামূলকভাবে সাধারণ অ্যারে গণনা ফাংশন।

সম্পর্কিত ফাংশন পরিচালনা করার উদাহরণঃ

a = array.from(1, 2, 3, 4, 5, 6)
b = array.from(11, 2, 13, 4, 15, 6)

runtime.log("数组a:", a, ", 数组b:", b)
runtime.log("数组a,数组b连接在一起:", array.concat(a, b))
c = array.copy(b)

runtime.log("复制一个数组b,赋值给变量c,变量c:", c)

runtime.log("使用array.join处理数组c,给每个元素中间增加符号+,连接所有元素结果为字符串:", array.join(c, "+"))
runtime.log("排序数组b,按从小到大顺序,使用参数order.ascending:", array.sort(b, order.ascending))     // array.sort函数修改原数组
runtime.log("排序数组b,按从大到小顺序,使用参数order.descending:", array.sort(b, order.descending))   // array.sort函数修改原数组

runtime.log("数组a:", a, ", 数组b:", b)
array.reverse(a)   // 此函数修改原数组
runtime.log("反转数组a中的所有元素顺序,反转之后数组a为:", a)    

runtime.log("截取数组a,索引0 ~ 索引3,遵循左闭右开区间规则:", array.slice(a, 0, 3))
runtime.log("在数组b中搜索元素11:", array.includes(b, 11))
runtime.log("在数组a中搜索元素100:", array.includes(a, 100))
runtime.log("将数组a和数组b连接,搜索其中第一次出现元素2的索引位置:", array.indexof(array.concat(a, b), 2), " , 参考观察 array.concat(a, b):", array.concat(a, b))
runtime.log("将数组a和数组b连接,搜索其中最后一次出现元素6的索引位置:", array.lastindexof(array.concat(a, b), 6), " , 参考观察 array.concat(a, b):", array.concat(a, b))

runtime.error("stop")

ফাংশন

কাস্টম ফাংশন

পাইন ভাষা কাস্টম ফাংশন ডিজাইন করতে পারে। সাধারণভাবে পাইন ভাষার কাস্টম ফাংশনগুলির জন্য নিম্নলিখিত নিয়ম রয়েছেঃ

১, সমস্ত ফাংশন স্ক্রিপ্টের গ্লোবাল পরিসরে সংজ্ঞায়িত করা হয়। অন্য ফাংশনে একটি ফাংশন ঘোষণা করা যাবে না। ২, ফাংশনকে তার নিজের কোডে নিজেকে কল করার অনুমতি দেয় না। ৩, নীতিগতভাবে সকল পাইন ভাষার অন্তর্নির্মিত ছবির ফাংশন (((barcolor()、 fill()、 hline()、plot()、 plotbar()、 plotcandle()) কাস্টম ফাংশনের মধ্যে কল করা যাবে না. ৪, ফাংশনটি এক-রেখা, বহু-রেখা লিখতে পারে। শেষ বাক্যের রিটার্ন মানটি বর্তমান ফাংশনের রিটার্ন মান, যা উপাদান বিন্যাসে ফিরে আসতে পারে।

পূর্ববর্তী টিউটোরিয়ালে আমরা কাস্টম ফাংশন ব্যবহার করেছি, উদাহরণস্বরূপ, একটি একক লাইন কাস্টম ফাংশন ডিজাইন করুনঃ

barIsUp() => close > open

এই ফাংশনটি বর্তমান BAR কে সূর্যের আলো বলে কি না তা প্রদান করে।

এটি বিভিন্ন লাইনের কাস্টম ফাংশন হিসাবে ডিজাইন করা হয়েছেঃ

sma(data, length) => 
    i = 0 
    sum = 0 
    while i < 10 
        sum += data[i]
        i += 1
        sum / length

plot(sma(close, length), title="sma", overlay=true)
plot(ta.sma(close, length), title="ta.sma", overlay=true)

আমরা নিজেরাই একটি কাস্টম ফাংশন ব্যবহার করে একটি SMA গড় রেখা গণনা করা ফাংশন।

এছাড়াও, আপনি দুটি ভেরিয়েবলের জন্য একটি কাস্টম ফাংশন উদাহরণ ফেরত দিতে পারেনঃ

twoEMA(data, fastPeriod, slowPeriod) =>
    fast = ta.ema(data, fastPeriod)
    slow = ta.ema(data, slowPeriod)
    [fast, slow]

[ema10, ema20] = twoEMA(close, 10, 20)
plot(ema10, title="ema10", overlay=true)
plot(ema20, title="ema20", overlay=true)

একটি ফাংশন দ্রুত লাইন, ধীর লাইন, দুটি ইএমএ সমতল সূচক গণনা করতে পারে।

অন্তর্নির্মিত ফাংশন

একটি বিল্ট-ইন ফাংশন খুব সহজেইFMZ PINE স্ক্রিপ্ট নথিপত্রপ্রশ্নোত্তরের সময়।

পাইন ভাষার অন্তর্নির্মিত ফাংশন শ্রেণীবিভাগঃ

১, স্ট্রিং হ্যান্ডলিং ফাংশনstr.সিরিজ । ২, রঙের মান প্রক্রিয়া ফাংশনcolor.সিরিজ । ৩, প্যারামিটার ইনপুট ফাংশনinput.সিরিজ । ৪, সূচক গণনা ফাংশনta.সিরিজ । ৫, অঙ্কন ফাংশনplot.সিরিজ । ৬, অ্যারিট্রিক্যাল প্রসেসিং ফাংশনarray.সিরিজ । ৭। লেনদেন সম্পর্কিত ফাংশনstrategy.সিরিজ । ৮, গণিতের সাথে সম্পর্কিত ফাংশনmath.সিরিজ । ৯, অন্যান্য ফাংশন (সময় প্রক্রিয়াকরণ, অ-প্লট সিরিজ অঙ্কন ফাংশন,request.সিরিয়াল ফাংশন, টাইপ প্রসেসিং ফাংশন ইত্যাদি) ।

লেনদেনের ফাংশন

strategy.সারি ফাংশন হল এমন ফাংশন যা আমরা নকশা কৌশলগুলিতে প্রায়শই ব্যবহার করি, যা কৌশলগুলির সাথে সম্পর্কিত হয় যখন তারা নির্দিষ্টভাবে কাজ করে।


1、strategy.entry

strategy.entryএকটি ফাংশন হল একটি নিম্নলিখিত ফাংশন যা আমরা যখন কৌশল লিখছি তখন গুরুত্বপূর্ণ।id, direction, qty, whenআরে।

প্যারামিটারঃ

  • id: একটি ট্রেডিং পজিশনের জন্য একটি নাম উল্লেখ করার জন্য ব্যবহার করা যেতে পারে। এই আইডি প্রত্যাহার, সংশোধন আদেশ, সমাপ্তি উল্লেখ করতে পারেন।
  • direction: যদি অর্ডার করার দিকটি আরও বেশি হয় ((ক্রয়) তবে এই পরামিতিটি পাস হয়strategy.longএই বিল্ট-ইন ভেরিয়েবলটি যদি ফাঁকা করা হয় (বিক্রয়) তবে এটি পাস হবে।strategy.shortএই ভেরিয়েবলটি ।
  • qty: অর্ডার করার পরিমাণ নির্দিষ্ট করুন, যদি এই পরামিতিটি পাস না করা হয় তবে ডিফল্ট অর্ডার পরিমাণটি ব্যবহার করা হয় ।
  • when: এক্সিকিউশন শর্তাদি, আপনি এই প্যারামিটারটি নির্দিষ্ট করতে পারেন যাতে বর্তমান সাবকোর্ড অপারেশনটি ট্রিগার করা যায় কিনা তা নিয়ন্ত্রণ করা যায়।
  • limit: অর্ডারের সীমা নির্ধারণ করুন.
  • stop: স্টপ লস প্রাইস ।

strategy.entryফাংশনটির নির্দিষ্ট বাস্তবায়নstrategyফাংশন কল করার সময় প্যারামিটার সেটিং নিয়ন্ত্রণ করা যায়"পাইন ভাষা এক্সচেঞ্জ লাইব্রেরির টেমপ্লেট প্যারামিটার"সেটিং কন্ট্রোল, পাইন ভাষা লেনদেনের ক্লাস লাইব্রেরি টেমপ্লেট প্যারামিটার নিয়ন্ত্রণের লেনদেনের আরও বিশদ, লিঙ্কযুক্ত ডকুমেন্টেশন দেখুন।

এখানে মূল বিষয়গুলো তুলে ধরা হলো।strategyফাংশনে,pyramidingdefault_qty_valueপ্যারামিটার...

/*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(title = "open long example", pyramiding = 3, default_qty_value=0.1, overlay=true)

ema10 = ta.ema(close, 10)

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

if not findOrderIdx("long1")
    strategy.entry("long1", strategy.long)

if not findOrderIdx("long2")
    strategy.entry("long2", strategy.long, 0.2, when = close > ema10)

if not findOrderIdx("long3")
    strategy.entry("long3", strategy.long, 0.2, limit = low[1])
    strategy.entry("long3", strategy.long, 0.3, limit = low[1])

if not findOrderIdx("long4")
    strategy.entry("long4", strategy.long, 0.2)

plot(ema10, title="ema10", color=color.red)

কোড শুরু/*backtest ... */প্যাকেজের অংশটি পুনঃনির্ধারণের জন্য সেট করা হয়, যা সেই সময়ে পুনঃনির্ধারণের সেটিংয়ের সময় এবং অন্যান্য তথ্য রেকর্ড করার জন্য, ডিবাগিংয়ের জন্য সহজ, কৌশলগত কোড নয়।

কোডঃstrategy(title = "open long example", pyramiding = 3, default_qty_value=0.1, overlay=true)এবং আমরা যখনpyramidingআমরা একই দিক থেকে সর্বোচ্চ তিনবার ট্রেডিং করতে পারি। সুতরাং এই উদাহরণে আমরা চারবার ট্রেড করব।strategy.entryনিচের অপারেশনগুলোর মধ্যে একটি একবারও করা হয়নি।default_qty_valueএই প্যারামিটারটি 0.1, তাই আইডি চিহ্নটি হল long1strategy.entryনিম্নোক্ত অপারেশনের নিম্নোক্ত পরিমাণটি ডিফল্টরূপে 0.1 সেট করা হয়।strategy.entryফাংশন কল করার সময় আমরা যে ফাংশনটি উল্লেখ করেছিdirectionসমানstrategy.longতবে, আমি মনে করি যে, এই প্রশ্নের জবাব দিতে হলে, আমি অবশ্যই আপনাকে সাহায্য করতে চাই।

কোডের দিকে মনোযোগ দিনstrategy.entry("long3", ...নিম্নলিখিত অপারেশনটি একই আইডিঃ long3 এর জন্য দুবার কল করা হয়েছে। প্রথমটি।strategy.entryনিম্নোক্ত অপারেশনটি সম্পন্ন হয়নি, দ্বিতীয় কলstrategy.entryফাংশনটি হল এই আইডি পরিবর্তন করার জন্য একটি অর্ডার ((পুনরায় পরীক্ষা করার সময় প্রদর্শিত তথ্যটিও দেখায় যে এই সীমাবদ্ধ অর্ডারের অধীনে অর্ডারের পরিমাণটি 0.3 এর জন্য পরিবর্তিত হয়েছে) । অন্য একটি ক্ষেত্রে, উদাহরণস্বরূপ, যদি প্রথম আইডি টিউনলং 3 টনের জন্য অর্ডার করা হয়, তবে এই অর্ডার করা আইডি টিউনলং 3 টনের সাথে চালিয়ে যান।strategy.entryফাংশনটি অর্ডার দেয়, তাহলে অর্ডার পজিশনগুলি আইডি টনলং 3 টনে জমা হয়।


2、strategy.close

strategy.closeএই ফাংশনটি পলিসির জন্য ব্যবহৃত হয়।idwhenqtyqty_percent

প্যারামিটারঃ

  • id: আমাদের ব্যবহার করা হচ্ছে লিংকডইন আইডি, যার জন্য আমাদের লিংকডইন আইডি প্রয়োজন।strategy.entryইনপুট ইনপুট ইনপুট ফাংশন খোলার সময় নির্ধারিত আইডি।
  • when: বাস্তবায়নের শর্তাদি ।
  • qty: স্থিরীকরণের সংখ্যা ।
  • qty_percent: স্থিতিশীলতা শতাংশ ।

এই ফাংশনটির ব্যবহারের বিবরণ একটি উদাহরণ দিয়ে পরিচিত করুনঃ কোড/*backtest ... */是FMZ.COM国际站回测时的配置信息,可以删掉,设置自己需要测试的市场、品种、时间范围等信息。

/*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("close Demo", pyramiding=3)

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

strategy.entry("long1", strategy.long, 0.2)
if strategy.opentrades >= 3 
    strategy.close("long1")                   // 多个入场订单,不指定qty参数,全部平仓
    // strategy.close()                          // 不指定id参数,会平掉当前的持仓
    // strategy.close("long2")                   // 如果指定一个不存在的id则什么都不操作
    // strategy.close("long1", qty=0.15)         // 指定qty参数平仓
    // strategy.close("long1", qty_percent=50)   // qty_percent设置50即为平掉long1标识仓位的50%持仓
    // strategy.close("long1", qty_percent=80, when=close<open)  // 指定when参数,修改为close>open就不触发了
    enableStop := true

পরীক্ষার কৌশলটি দেখায় যে তিনটি ধারাবাহিকভাবে একাধিক লগইন শুরু করা হয়, লগইন আইডিগুলি 1 টন লং হয় এবং তারপরে ব্যবহার করা হয়strategy.closeফাংশনের বিভিন্ন প্যারামিটার সমতলতা সেট করার সময় বিভিন্ন ফলাফল পুনরুদ্ধার করা হয়।strategy.closeএই ফাংশনটির কোন প্যারামিটার নেই যা একটি পলিসির নিচে অর্ডার মূল্য নির্দিষ্ট করতে পারে। এই ফাংশনটি মূলত বর্তমান বাজারের দামের সাথে তাত্ক্ষণিকভাবে পলিসির জন্য ব্যবহৃত হয়।


3、strategy.close_all

strategy.close_allফাংশনটি বর্তমান হোল্ডিংয়ের সমস্ত স্থির করার জন্য ব্যবহৃত হয়, কারণ পাইন স্ক্রিপ্টটি কেবলমাত্র এক দিকের জন্য হোল্ডিং করতে পারে, যদি বর্তমান হোল্ডিংয়ের বিপরীত দিকের সংকেত থাকে তবে এটি বর্তমান হোল্ডিংয়ের স্থিরতাকে স্থির করে এবং সংকেতের ভিত্তিতে ট্রেডিং শুরু করে।strategy.close_allএই সময়কালে, এটি বর্তমান দিকের সমস্ত হোল্ডিংয়ের সমতুল্য হবে।strategy.close_allফাংশনের প্রধান পরামিতি হলঃwhen

প্যারামিটারঃ

  • when: বাস্তবায়নের শর্তাদি ।

আমরা একটি উদাহরণ ব্যবহার করে দেখতে পারিঃ

/*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("closeAll Demo")

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

strategy.entry("long", strategy.long, 0.2, when=strategy.position_size==0 and close>open)
strategy.entry("short", strategy.short, 0.3, when=strategy.position_size>0 and close<open)

if strategy.position_size < 0 
    strategy.close_all()
    enableStop := true 

পরীক্ষার কোডের শুরুতে, হোল্ডিং পরিমাণ 0 (অর্থাৎstrategy.position_size==0সত্য), তাই যখন when প্যারামিটার সেট করার শর্ত পূরণ করা হয় তখন কেবল আইডি-র জন্য লং-লং-লং-লংstrategy.entryইনগ্রিড ফাংশন.strategy.position_sizeআইডি শর্ট ট্যাগের প্রবেশের ফাংশনটি তখনই কার্যকর হতে পারে যখন এটি 0 এর চেয়ে বড় হয়। বর্তমানে একাধিক শর্ট পজিশনের কারণে, এই সময় প্রদর্শিত এই শূন্যতা বিপরীত সংকেতটি বহু শর্ট পজিশনের পরে আবার বিপরীতভাবে খালি হওয়ার কারণ হবে। তারপর আমরা যদি শর্তে লিখব যখনstrategy.position_size < 0যখন, অর্থাৎ, খালি মাথা ধরে রাখার সময়, বর্তমান ধারণের দিকের সমস্ত ধারণাকে সমতল করে দেয়; এবং চিহ্নিত করেenableStop := true⇒ নীতিটি বন্ধ করে দিন যাতে লগগুলি সহজেই দেখা যায়।

আপনি খুঁজে পেতে পারেনstrategy.close_allএই ফাংশনটির কোন প্যারামিটার নেই যা একটি পলিসির নিচে অর্ডার মূল্য নির্দিষ্ট করতে পারে। এই ফাংশনটি মূলত বর্তমান বাজারের দামের সাথে তাত্ক্ষণিকভাবে পলিসির জন্য ব্যবহৃত হয়।


4、strategy.exit

strategy.exitএই ফাংশনটি ইনকাম হোল্ডিংয়ের জন্য ব্যবহার করা হয়।strategy.closeএবংstrategy.close_allফাংশনটি বর্তমান বাজার মূল্যে অবিলম্বে স্থির হয়।strategy.exitফাংশনটি প্যারামিটার সেটিংসের উপর ভিত্তি করে পরিকল্পনা স্থির করে।

প্যারামিটারঃ

  • id: বর্তমান স্থগিতাদেশের শর্তাদি তালিকার অর্ডার আইডি।
  • from_entry: স্থিরকরণ অপারেশন করার জন্য লগইন আইডি নির্দিষ্ট করতে ব্যবহৃত হয়।
  • qty: স্থিরীকরণের সংখ্যা ।
  • qty_percent: স্থিতিশীলতা শতাংশ, পরিসীমাঃ 0 ~ 100 ।
  • profit: মুনাফা লক্ষ্য, বিন্দুতে চিহ্নিত ।
  • loss: স্টপ লস টার্গেট, পয়েন্ট সংখ্যা দ্বারা নির্দেশিত ।
  • limit: মুনাফা অর্জনের লক্ষ্য, মূল্য নির্ধারণ করা।
  • stop: স্টপ লস টার্গেট, মূল্য নির্ধারণ করা হয়েছে ।
  • when: বাস্তবায়নের শর্তাদি ।

একটি পরীক্ষার কৌশল ব্যবহার করে প্রতিটি প্যারামিটার ব্যবহার বোঝা যায়।

/*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"}]
args: [["RunMode",1,358374],["ZPrecision",0,358374]]
*/

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

varip isExit = false 

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

strategy.entry("long1", strategy.long, 0.1, limit=1, when=findOrderIdx("long1") < 0)
strategy.entry("long2", strategy.long, 0.2, when=findOrderIdx("long2") < 0)
strategy.entry("long3", strategy.long, 0.3, when=findOrderIdx("long3") < 0)

if not isExit and strategy.opentrades > 0
    // strategy.exit("exitAll")          // 如果仅仅指定一个id参数,则该退场订单无效,参数profit, limit, loss, stop等出场条件也至少需要设置一个,否则也无效
    strategy.exit("exit1", "long1", profit=50)                    // 由于long1入场订单没有成交,因此ID为exit1的出场订单也处于暂待状态,直到对应的入场订单成交才会放置exit1
    strategy.exit("exit2", "long2", qty=0.1, profit=100)          // 指定参数qty,平掉ID为long2的持仓中0.1个持仓
    strategy.exit("exit3", "long3", qty_percent=50, limit=strategy.opentrades.entry_price(findOrderIdx("long3")) + 1000)   // 指定参数qty_percent,平掉ID为long3的持仓中50%的持仓
    isExit := true 

if bar_index == 0 
    runtime.log("每点价格为:", syminfo.mintick)    // 每点价格和Pine语言模板参数上「定价货币精度」参数设置有关

রিয়েল-টাইম মূল্য মডেল রিটার্ন টেস্ট ব্যবহার করে, এই পরীক্ষার কৌশলটি 3 টি প্রবেশের ক্রিয়াকলাপ সম্পাদন করতে শুরু করে (((strategy.entryফাংশন), long1 ইচ্ছাকৃতভাবে সেট করা হয়limitপ্যারামিটার, প্যাকেজিংয়ের দাম 1 যা এটিকে অক্ষম করে দেয়; তারপর পরীক্ষার শর্তগুলি থেকে বেরিয়ে আসেstrategy.exit⇒ পয়েন্ট সংখ্যা অনুসারে স্টপ টপ, মূল্য অনুসারে স্টপ টপ, স্থির সংখ্যক পজিশন ব্যবহার করা হয়েছে, শতাংশের ভিত্তিতে স্টপ টপ ব্যবহার করা হয়েছে। ⇒ এই নিবন্ধের উদাহরণে কেবল স্টপ টপ প্রদর্শিত হয়েছে। ⇒ স্টপ লস অপারেশনও সমার্থক।strategy.exitফাংশনটি আরও জটিল ট্র্যাকিং স্টপ লস প্যারামিটার রয়েছেঃtrail_pricetrail_pointstrail_offsetআপনি এই উদাহরণে তাদের ব্যবহার শিখতে পরীক্ষা করতে পারেন।


5、strategy.cancel

strategy.cancelফাংশনগুলি সমস্ত প্রি-পেন্ডিং কমান্ডগুলি বাতিল / বন্ধ করার জন্য ব্যবহৃত হয়; এই ফাংশনগুলিstrategy.order, strategy.entry , strategy.exitলগ-ইন আইডি তৈরি করা যায়। ফাংশনের প্রধান পরামিতি হলঃidwhen

প্যারামিটারঃ

  • id: লগইন আইডি বাতিল করতে চান।
  • when: বাস্তবায়নের শর্তাদি ।

এই ফাংশনটি বোঝা যায় যে, এটি অপ্রচলিত লগইন কমান্ডগুলি বাতিল করার জন্য ব্যবহৃত হয়।

/*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("long1")
    strategy.cancel("long2")
    strategy.cancel("long3")
    isStop := true 

6、strategy.cancel_all

strategy.cancel_allফাংশন এবংstrategy.cancelফাংশনটি অনুরূপ ⇒ বাতিল / বন্ধ করুন সমস্ত প্রিপেইড কমান্ড ⇒ নির্দিষ্ট করা যেতে পারেwhenপ্যারামিটার ।

প্যারামিটারঃ

  • when: বাস্তবায়নের শর্তাদি ।
/*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 

7、strategy.order

strategy.orderফাংশন এর ফাংশন, প্যারামিটার সেটিং ইত্যাদি প্রায়strategy.entryএকমত, পার্থক্যstrategy.orderফাংশনটিstrategyফাংশনpyramidingপ্যারামিটার সেটিং প্রভাবিত করে, নিম্নলিখিত একক সংখ্যা সীমাবদ্ধতা নেই।

প্যারামিটারঃ

  • 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), শুধু একটি কৌশল শিরোনাম supertrend ট্যাগ সেট করুন.overlayপ্যারামিটার হলtrueআমরা একটি পাইন কৌশল ডিজাইন করি বা পাইন কৌশল স্ক্রিপ্ট শিখি, প্রথমে আমরা কৌশল ইন্টারফেসের পরামিতি ডিজাইনটি দেখি, আমরা "সুপার ট্রেন্ডিং ইন্ডিকেটর কৌশল" এর উত্স কোডটি দেখি, যা আমরা আগে শিখেছি।inputফাংশন

[সুপারট্রেন্ড, দিক] = 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এবং এক দিকের তথ্যdirectionতারপর ব্যবহার করুন।plotফাংশন গ্রাফ, লক্ষ্য করুন যে যখন গ্রাফ আঁকা হয় তখন এটি সুপারট্রেন্ডের নির্দেশকগুলির দিকনির্দেশের উপর ভিত্তি করে গ্রাফ আঁকতে হয়, কেবলমাত্র বর্তমান দিকটি আঁকতে হয়; যখনdirectionএখনকার বাজারের প্রবণতা ঊর্ধ্বমুখী, যখনdirectionএখন আমরা দেখছি যে ১টার সময় বাজারের বর্তমান প্রবণতা নিচের দিকে যাচ্ছে।plotফাংশন অঙ্কন করার সময় সিদ্ধান্ত নিনdirection০ এর চেয়ে বড়, ০ এর চেয়ে ছোট।

পরবর্তীif ... else ifযুক্তি হল ট্রেডিং সিগন্যালের বিচার।direction < 0বাস্তব সময়ে এটি দেখায় যে বর্তমান বাজারে উপরের পর্যায়ে রয়েছে, যখন সুপার ট্রেন্ড ইন্ডিকেটরের দামের তথ্য যদিsupertrendপূর্ববর্তী 2 টি BAR এর উপর সুপার ট্রেন্ডিং সূচক মূল্যের ঊর্ধ্বে (যেমনsupertrend[2],还记得历史操作符引用某个变量历史数据吧আপনি কি মনে রাখবেন? যদি বর্তমানে হোল্ডিং থাকে, তাহলে এই সময়ে বিপরীতভাবে নিচের দিকে একক ফাংশন কল করা হবে যা প্রথমে আগের হোল্ডিংটি সমতল করে দেবে এবং তারপরে বর্তমান ট্রেডিং দিকের উপর ভিত্তি করে পজিশন খুলবে। অন্যথায়,supertrend > supertrend[2]এই মুহূর্তে যদি শর্ত পূরণ না হয়, তাহলেstrategy.position_size < 0এটি একটি অদ্ভুত ঘটনা, কারণ এটি একটি অদ্ভুত ঘটনা।strategy.close_all()ফাংশনটি কার্যকর করা হয়, সমস্ত সমতুল্য করা হয়।

direction > 0নিচের ধাপেও একই কথা প্রযোজ্য, যদি একাধিক হোল্ডিং থাকে এবং সবগুলোই বন্ধ থাকে, তাহলে শর্ত পূরণ হয়।supertrend < supertrend[3]আপনি যদি আপনার ডিভাইসটি ব্যবহার করে থাকেন তবে এটি আপনার ডিভাইসের জন্য উপযুক্ত হবে।[3]প্রথম তিনটি বারের সুপার ট্রেন্ড ইন্ডিকেটরের দামের তথ্যের উল্লেখ করা কি? সম্ভবত এটি কৌশলবিদদের ইচ্ছাকৃত, কারণ কিছু বাজারে, যেমন চুক্তি বাণিজ্য বাজারে, ঝুঁকিপূর্ণ ঝুঁকি বেশি ঝুঁকিপূর্ণ।

জন্য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 সূচক ((তরঙ্গদৈর্ঘ্য) প্যারামিটার trPeriod অনুযায়ী গণনা করা হয়; এবং তারপর hL2 এবং ATR ব্যবহার করে ট্র্যাক আপ, ট্র্যাক ডাউন নির্মাণ করা হয়।

কোডের তিন-পয়েন্টের এক্সপ্রেশন অনুযায়ী আপডেট করুনlowerBandএবংupperBand

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

lowerBand: নিম্নব্যান্ড, যা উপরের প্রবণতা পরিবর্তিত হয়েছে কিনা তা নির্ধারণ করতে ব্যবহৃত হয়; upperBand: উচ্চব্যান্ড, যা নিম্নবিন্যাস পরিবর্তিত হয়েছে কিনা তা নির্ধারণ করতে ব্যবহৃত হয়। lowerBand এবং upperBand উভয়ই গণনা করা হচ্ছে, শুধুমাত্র এই কাস্টম ফাংশনের শেষে বর্তমান প্রবণতার দিক নির্ধারণ করা হয়।

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

এখানে, যদি আমরা শেষ বারের সুপার ট্রেন্ডের দামের মান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এই পরিবর্তনশীলগুলিকে পরিবর্তন করুন, এবং পরবর্তী ভারসাম্য ট্রিগার করার জন্য অপেক্ষা করুন।

উপরের পলিসি পুনরুদ্ধারের বার্তায় পলিসি পুনরুদ্ধারের শুরু হওয়ার সময়ের জাতের দাম রয়েছে, যার দাম ১৪৫৮, তাই আমি ইচ্ছাকৃতভাবে প্যারামিটারটি সেট করেছিbalance৪৩৭৪ ((১৪৫৮*৩) এর জন্য প্যারামিটার সেট করুনstocks৩. সম্পদকে শুরুতে ভারসাম্যপূর্ণ অবস্থায় রাখা।

ট্র্যাকিং স্টপ লস স্টপ পেনশন সহ সুপার ট্রেন্ড কৌশল

আমরা আগের কোর্সে শিখেছিstrategy.exitপজিশন এক্সট্রা ফাংশন, যেখানে ট্র্যাকিং স্টপ লস স্টপ ফাংশন আমরা কোন উদাহরণ ব্যাখ্যা করি নি; এই বিভাগে কৌশল নকশা উদাহরণ আমরা ব্যবহার করিstrategy.exitফাংশনটির ট্র্যাকিং স্টপ লস স্টপ ব্রেক ফাংশনটি একটি সুপার ট্রেন্ডিং কৌশলকে অপ্টিমাইজ করার জন্য।

প্রথমেই দেখা যাক।strategy.exitফাংশনের ট্র্যাকিং স্টপ লস স্টপ প্যারামিটারঃ

1、trail_priceপ্যারামিটারঃ ট্রিগার স্থাপন ট্র্যাকিং স্টপ স্টপ লস স্থিতিশীল আদেশের এই লজিক্যাল আচরণের অবস্থান ((দাম দ্বারা নির্দিষ্ট)


আরো