مثالیں:
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 شاخ ہوسکتی ہے۔ تمام شاخوں کے اظہار غلط ہیں اور کوئیelse شاخ نہیں ہے ، جو واپس آتا ہے۔
x = if close > open
close
plot(x, title="x")
چونکہ جب K لائن BAR ایک کائناتی لائن ہے ، یعنی close < open ، if بیان کے بعد کا اظہار غلط ہے ، لہذا if کے مقامی کوڈ بلاک پر عملدرآمد نہیں ہوتا ہے۔ اس وقت بھی کوئیelse شاخ نہیں ہے ، اگر بیان na لوٹاتا ہے۔ x کو na کے طور پر تفویض کیا گیا ہے۔ اس نقطہ کو گراف میں نہیں کھینچا جاسکتا ہے ، ہم اس کا مشاہدہ گراف کو واپس کرنے سے بھی کرسکتے ہیں۔
سوئچ بیانات بھی ایک شاخ ساختہ بیانات ہیں جو مخصوص حالات کے مطابق مختلف راستوں پر عمل درآمد کرنے کے لئے ڈیزائن کیے گئے ہیں۔ سوئچ بیانات عام طور پر مندرجہ ذیل اہم علمی نکات رکھتے ہیں۔
1، سوئچ بیان، اگر بیان کی طرح، ایک قدر واپس کر سکتے ہیں. 2، دوسری زبانوں میں سوئچ کے بیانات کے برعکس، سوئچ کی ساخت پر عملدرآمد صرف اس کے کوڈ میں ایک مقامی بلاک پر عملدرآمد کرتا ہے، لہذا توڑ کا اعلان غیر ضروری ہے (یعنی آپ کو توڑ جیسے مطلوبہ الفاظ لکھنے کی ضرورت نہیں ہے) ۔ 3، سوئچ کی ہر شاخ کو ایک مقامی کوڈ بلاک لکھا جا سکتا ہے، اور اس مقامی کوڈ بلاک کی آخری سطر واپسی کی قدر ہے (یہ ایک قدر کے عنصر ہوسکتا ہے) ؛ اگر کوئی بھی شاخ نہیں چلتی ہے تو مقامی کوڈ بلاک واپس آ جاتا ہے۔ 4، سوئچ ڈھانچے میں اظہار کی پوزیشن کا فیصلہ، سٹرنگ، متغیر، اظہار یا فنکشن کال لکھ سکتے ہیں۔ 5، سوئچ ایک واپسی کی قیمت کی وضاحت کرنے کی اجازت دیتا ہے، جو اس کی ساخت میں کوئی اور صورت حال نہیں ہے جب استعمال کیا جاتا ہے کے طور پر ڈیفالٹ کی قیمت ہے.
سوئچ کو دو اقسام میں تقسیم کیا گیا ہے۔ آئیے ایک ایک کرکے مثالیں دیکھیں اور ان کے استعمال کے بارے میں جانیں۔
1، ایک اظہار کے ساتھ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.string
、input.int
فنکشن۔input.string
اس کا مطلب یہ ہے کہ آپ کو اس کی ضرورت نہیں ہے.input.int
یہ فنکشن انٹیجرز کو واپس کرنے کے لئے استعمال کیا جاتا ہے۔ مثال کے طور پر، ایک نیا شامل کیا جاتا ہےoptions
آپ کو اس کے بارے میں مزید جاننے کی ضرورت ہے۔options
ایک متغیر ایک منتخب کردہ قدر پر مشتمل ایک صف میں منتقل کیا جا سکتا ہے؛ مثال کے طور پر مثال میںoptions=["EMA", "SMA", "RMA", "WMA"]
اورoptions=[5, 10, 20]
(نوٹ کریں کہ ایک سٹرنگ کی قسم ہے اور ایک عددی کی قسم ہے) ؛ اس طرح حکمت عملی کے انٹرفیس پر کنٹرولز کو مخصوص تعداد میں داخل کرنے کی ضرورت نہیں ہے، لیکن کنٹرولز کو ڈراپ باکس میں تبدیل کر دیا جاتا ہے، اختیارات کے پیرامیٹرز میں فراہم کردہ اختیارات کو منتخب کرنے کے لئے؛
متغیر func کی قدر ایک تار کے طور پر ہوتی ہے ، متغیر func بطور سوئچ کا اظہار (متغیر ، فنکشن کال ، اظہار ہوسکتا ہے) ، جس سے یہ طے ہوتا ہے کہ سوئچ میں کون سا برانچ چل رہا ہے۔ اگر متغیر func سوئچ میں کسی بھی شاخ پر اظہار سے مماثل نہیں ہوسکتا ہے (یعنی برابر ہے) ، تو اس کے بعد ، اس کے بعد ، اس کے بعد ، اس کے بعد ، اس کے بعد ، اس کے بعد ، اس کے بعد ، اس کے بعد ، اس کے بعد ، اس کے بعد ، اس کے بعد ، اس کے بعد ، اس کے بعد ، اس کے بعد ، اس کے بعد ، اس کے بعد ، اس کے بعد ، اس کے بعد ، اس کے بعد ، اس کے بعد ، اس کے بعد ، اس کے بعد ، اس کے بعد ، اس کے بعد ، اس کے بعد ، اس کے بعد ، اس کے بعد ، اس کے بعد ، اس کے بعد ، اس کے بعد ، اس کے بعد ، اس کے بعد ، اس کے بعد ، اس کے بعد ، اس کے بعد ، اس کے بعد ، اس کے بعد ، اس کے بعد ، اس کے بعد ، اس کے بعد ، اس کے بعد ، اس کے بعد ، اس کے بعد ، اس کے بعدruntime.error("error")
اس کے بعد، آپ کو اس کے بارے میں مزید جاننے کی ضرورت ہے.
مندرجہ بالا ہمارے ٹیسٹ کوڈ میں سوئچ کے ڈیفالٹ برانچ کوڈ بلاک کی آخری لائن runtime.error کے بعد ہم نے [na، na] جیسے کوڈ کو مطابقت پذیر واپسی کی قدر کے لئے شامل نہیں کیا ہے، تجارتی نقطہ نظر میں اس مسئلے پر غور کرنے کی ضرورت ہے، اگر قسم متضاد ہے تو غلطی کا جواب دیں گے. لیکن FMZ پر اس کی وجہ سے کوئی سخت قسم کی ضرورت نہیں ہے. لہذا FMZ پر اگر، سوئچ برانچ کی واپسی کی قسم کی مطابقت کا مسئلہ نہیں ہے.
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 برانچ کی واپسی کی قسم مماثل نہیں ہے۔
2، کوئی اظہار نہیں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
تبصرے میں موجود مواد کو تبدیل کرنے کے بعد ، نتائج کا جائزہ لیں۔ یہ پتہ چلتا ہے کہ سوئچ برانچ صرف پہلی شاخ کو انجام دے سکتا ہے۔ اس کے علاوہ ، اس بات کا بھی خیال رکھنا ضروری ہے کہ جب تک ممکن ہو فنکشن کالز کو سوئچ کی شاخ میں نہ لکھیں ، فنکشن کو ہر بار نہیں بلایا جاسکتا ہے جس سے اعداد و شمار کے حساب سے متعلق کچھ مسائل پیدا ہوسکتے ہیں۔switch
مثال کے طور پر، ایکشن برانچ مقررہ ہے، اور اس کی حکمت عملی کے دوران تبدیل نہیں کیا جائے گا.)
返回值 = 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 数组
语句 // 注释:语句里可以有break,continue
语句 // 注释:最后一条语句为返回值
返回值 = for [索引变量, 索引变量对应的数组元素] in 数组
语句 // 注释:语句里可以有break,continue
语句 // 注释:最后一条语句为返回值
دونوں شکلوں کے درمیان اہم فرق یہ ہے کہ 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 سرکلر ایپلی کیشنز
جب پائن زبان کے ذریعہ فراہم کردہ بلٹ ان افعال کے ذریعہ کچھ لکیری منطقی حساب کتاب انجام دیا جاسکتا ہے تو ، اسے براہ راست لکیری ڈھانچے کا استعمال کرکے لکھا جاسکتا ہے ، یا بلٹ ان افعال کا استعمال کیا جاسکتا ہے۔ ہم دو مثالیں دیتے ہیں۔
1، حساب کی اوسط
سائیکلنگ ڈیزائن کا استعمال کرتے ہوئے:
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 loop sum استعمال کیا جاتا ہے، اور اس کے بعد برابر کا حساب لگایا جاتا ہے۔
براہ راست بلٹ ان فنکشن کا استعمال کرتے ہوئے حساب لگائیں:
plot(ta.sma(close, length), title="ta.sma", overlay=true)
براہ راست بلٹ ان افعال کا استعمال کریںta.sma
یہ واضح ہے کہ ہموار اشارے کا حساب لگانا ہموار لائنوں کے حساب سے بلٹ ان افعال کا استعمال کرتے ہوئے آسان ہے۔ چارٹ میں اس کے برعکس آپ کو معلوم ہوگا کہ حساب کتاب کے نتائج بالکل یکساں ہیں۔
2، جمع
اس کا مطلب یہ ہے کہ آپ کو اس کے بارے میں مزید جاننے کی ضرورت ہے۔
سائیکلنگ ڈیزائن کا استعمال کرتے ہوئے:
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)
حساب کرنے کے لئے کہ تمام عناصر کے لئے ایک صف کے ساتھ جو کہ loop استعمال کیا جا سکتا ہے کے لئے، ایک بلٹ میں فنکشن استعمال کیا جا سکتا ہے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)
آپ کو معلوم ہوگا کہ اعداد و شمار کا حساب کتاب کیا گیا ہے اور اس کا استعمال کرتے ہوئے پلاٹ گرافس چارٹ پر بالکل یکساں دکھایا گیا ہے۔
اگر آپ کو یہ کام بلٹ ان فنکشنز کے ذریعے کرنے کی ضرورت ہے تو پھر آپ کو لوپ ڈیزائن کرنے کی ضرورت کیوں ہے؟ 1، صفوں کے لئے کچھ آپریشن، حساب کتاب. 2، تاریخ کا جائزہ لیں، مثال کے طور پر معلوم کریں کہ ماضی کے بلندیوں میں سے کتنے موجودہ بار کے بلندیوں سے زیادہ ہیں۔ چونکہ موجودہ بار کے بلندیوں کو صرف اسکرپٹ چلنے والے بار پر جانا جاتا ہے، لہذا وقت پر واپس جانے اور ماضی کے بار کا تجزیہ کرنے کے لئے ایک لوپ کی ضرورت ہے۔ 3، پائن زبان کا استعمال کرتے ہوئے بلٹ ان افعال پچھلے بار کے حساب کو مکمل نہیں کرسکتے ہیں۔
while
جملہ اس وقت تک جاری رہتا ہے جب تک کہ جب تک کہ ساخت میں فیصلے کی شرط غلط نہ ہو۔
返回值 = while 判断条件
语句 // 注释:语句里可以有break,continue
语句 // 注释:最后一条语句为返回值
while کے دیگر قوانین for loop کی طرح ہیں، جبکہ loop کے مقامی کوڈ بلاک کی آخری سطر ایک واپسی کی قدر ہے، اور یہ ایک سے زیادہ اقدار واپس کر سکتا ہے۔ جب "لائیو شرط" حقیقی وقت میں loop پر عملدرآمد کرتا ہے، جب شرط غلط ہے تو loop کو روکتا ہے۔ loop میں بھی break،continue بیانات استعمال کیے جا سکتے ہیں۔
اس کے علاوہ، میں نے ایک مثال کے طور پر ایک ہموار لائن کا استعمال کرتے ہوئے دکھایا ہے:
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
پین زبان میں صف کی تعریف دیگر پروگرامنگ زبانوں کی طرح ہے، پین کی صف ایک جہتی صف ہے۔ یہ عام طور پر ایک مسلسل سیریز کے اعداد و شمار کو ذخیرہ کرنے کے لئے استعمال ہوتی ہے۔ صفیں جن میں ذخیرہ کردہ انفرادی اعداد و شمار کو صف کے عناصر کہا جاتا ہے، ان عناصر کی اقسام یہ ہوسکتی ہیں: انٹیگریٹ، فلوٹائپ، سٹرنگ، رنگ کی قدر، بل کی قدر۔ ایف ایم زیڈ پر پائن زبان کی قسم کی سخت ضرورت نہیں ہے، یہاں تک کہ ایک صف میں سٹرنگ اور نمبر دونوں کو ایک ساتھ ذخیرہ کیا جاسکتا ہے۔ چونکہ صفوں کی تہہ بھی ایک سیریز کی ساخت ہے، اگر تاریخ کے آپریٹر کا استعمال کرتے ہوئے سابقہ بار پر صف کی حالت کا حوالہ دیا جاتا ہے تو صف میں کسی عنصر کا حوالہ دیتے وقت تاریخ کے آپریٹر کا استعمال نہیں کیا جاتا ہے۔[]
اس کا استعمال کرنے کی ضرورت ہےarray.get()
اورarray.set()
فنکشن.مجموعہ میں عناصر کی انڈیکس ترتیب اس طرح ہے کہ صف کے پہلے عنصر کی انڈیکس 0 ہے ، اگلے عنصر کی انڈیکس میں اضافہ 1 ہے۔
ہم اس کو ایک سادہ کوڈ کے ساتھ بیان کرتے ہیں:
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> a
、float[] 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 کلیدی لفظ بھی صفوں کے اعلان کے انداز کے ساتھ کام کرتا ہے، صفیں جو var کلیدی لفظ کے اعلان کا استعمال کرتے ہیں صرف پہلے بار پر ابتدائی ہیں۔ ہم ایک مثال کے ساتھ دیکھتے ہیں:
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
اصل وقت میں پرنٹ کرتے وقت صرف ایک عنصر باقی رہتا ہے ، جس کی قدر 0 ہے۔
صف میں انڈیکس کی جگہ کا تعین کرنے والے عناصر کو حاصل کرنے کے لئے 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 جائزہ لینے کے دوروں میں درجہ بندی کا اظہار کرتی ہے۔
ہم نے پہلے سیکھا ہے کے لئے / کے لئے میں / جبکہ جملے کے ساتھ کیا جا سکتا ہے کہ کس طرح ایک صف کے ذریعے سفر کرنے کے لئے.
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")
یہ تینوں طریقوں کو ایک ہی نتائج کے ساتھ انجام دیا جاتا ہے۔
صفوں کو اسکرپٹ کی عالمی حد تک بیان کیا جاسکتا ہے ، یا فنکشن یا اگر شاخ کی مقامی حد تک بیان کیا جاسکتا ہے۔
صف میں عناصر کے استعمال کے لئے ، مندرجہ ذیل طریقے برابر ہیں ، جیسا کہ ہم مندرجہ ذیل مثالوں سے دیکھ سکتے ہیں کہ چارٹ پر دو قطاریں کھینچیں ، ہر ایک میں دو قطاریں ، ہر ایک میں دو قطاریں بالکل ایک جیسی ہیں۔
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)
1، صف کے اضافے کے لئے متعلقہ افعال:
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 منٹ کے لئے K لائن کی سطح پر اوسط کی طرف سے دیکھا جاتا ہے.
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")
نوٹ کریں کہ جب ہم ایک صف کا اعلان کرتے ہیں تو ہم نے اس کے اعلان کے موڈ کو مخصوص کیا ہے، اور ہم نے اس کے لئے مطلوبہ الفاظ استعمال کیے ہیں.varip
اس طرح ہر قیمت کی تبدیلی کو ایک صف میں ریکارڈ کیا جاتا ہے۔
متعلقہ افعال کا حساب:
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")
پائن زبان میں اپنی مرضی کے مطابق افعال ڈیزائن کیے جاسکتے ہیں ، عام طور پر پائن زبان میں اپنی مرضی کے مطابق افعال کے لئے مندرجہ ذیل قواعد ہیں:
1، تمام افعال اسکرپٹ کے عالمی دائرہ کار میں بیان کیے گئے ہیں۔ ایک فنکشن کو دوسرے فنکشن میں بیان نہیں کیا جاسکتا ہے۔
2، فنکشن کو اپنے کوڈ میں اپنے آپ کو بلانے کی اجازت نہیں ہے۔
3، بنیادی طور پر تمام PINE زبانوں میں بلٹ ان تصویر کی تقریب (((barcolor()、 fill()、 hline()、plot()、 plotbar()、 plotcandle()
) کو اپنی مرضی کے مطابق افعال میں نہیں بلایا جاسکتا ہے۔
4، فنکشن ایک سطر، کثیر سطر میں لکھا جا سکتا ہے۔ آخری جملے کی واپسی کی قیمت موجودہ فنکشن کی واپسی کی قیمت ہے، واپسی کی قیمت کو ایک اجزاء کی شکل میں واپس کیا جا سکتا ہے۔
ہم نے اپنی مرضی کے مطابق افعال کو بھی کئی بار استعمال کیا ہے۔ مثال کے طور پر ، ایک سطری اپنی مرضی کے مطابق افعال کو ڈیزائن کریں:
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 اسکرپٹ دستاویزاتاس کے بارے میں مزید جانیں
پائن زبان میں بلٹ ان افعال کی درجہ بندی:
1، سٹرنگ پروسیسنگ فنکشنstr.
سیریز۔
2، رنگ کی قدر کی پروسیسنگ کی تقریبcolor.
سیریز۔
3، پیرامیٹر ان پٹ فنکشنinput.
سیریز۔
4، اشارے کا حساب لگاناta.
سیریز۔
5، گرافک فنکشنplot.
سیریز۔
6، Array پروسیسنگ فنکشنarray.
سیریز۔
7، ٹرانزیکشن سے متعلق افعالstrategy.
سیریز۔
8، ریاضی کے کاموں سے متعلق افعالmath.
سیریز۔
9، دیگر افعال ((وقت پروسیسنگ، غیر پلاٹ سیریز پینٹنگ،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
اور اس کا مطلب یہ ہے کہpyramiding
、default_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
اس بار، ہم نے ایک بار پھر ایک بار پھر ایک بار پھر ایک بار پھر ایک بار پھر ایک بار پھر ایک بار پھرstrategy.entry
آپریشن کے لئے 0.1 پر ڈیفالٹ سیٹ کیا جاتا ہے.strategy.entry
جب ہم اس فنکشن کو کال کرتے ہیں تو ہم اس کی وضاحت کرتے ہیںdirection
برابرstrategy.long
اس کے علاوہ ، یہ بھی کہا جاتا ہے کہ یہ ایک بہت بڑا مسئلہ ہے ، لیکن اس کا حل یہ ہے کہ یہ ایک بہت بڑا مسئلہ ہے۔
نوٹ کریں کہstrategy.entry("long3", ...
مندرجہ ذیل عمل کو دو بار بلایا گیا ہے، ایک ہی ID کے لئے: strategy.entry
مندرجہ ذیل آپریشن میں کوئی معاہدہ نہیں ہوا، دوسرا کالstrategy.entry
فنکشن اس ID کو تبدیل کرنے والے آرڈر کے لئے (پھر جانچ پڑتال کے دوران دکھائے جانے والے اعداد و شمار میں یہ بھی دیکھا جاسکتا ہے کہ اس حد کے آرڈر کے تحت آرڈر کی مقدار 0.3 کے لئے تبدیل کردی گئی ہے۔ دوسری صورت میں ، مثال کے طور پر ، اگر پہلی بار آئی ڈی کے لئے ایک آرڈر کیا گیا ہے تو ، اس کے مطابق جاری رکھیں.strategy.entry
فنکشن آرڈر کرتا ہے تو ، آرڈر کی پوزیشنوں کو آئی ڈی ٹونگ 3 ٹونگ پر جمع کیا جاتا ہے۔
2、strategy.close
strategy.close
یہ فنکشن لین دین کی شناخت کی شناخت کے لئے لین دین کی شناخت کے لئے استعمال کیا جاتا ہے۔ اہم پیرامیٹرز ہیں:id
,when
,qty
,qty_percent
。
پیرامیٹرز:
id
: ہم استعمال کرتے ہیں کہ ایک لین دین 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
سچ ہے) ، لہذا جب جب کی شرط پر عملدرآمد کیا جاتا ہے تو صرف جب جب جب جب جب جب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语言模板参数上「定价货币精度」参数设置有关
ریئل ٹائم قیمت ماڈل بیک ٹیسٹ کا استعمال کرتے ہوئے ، اس ٹیسٹنگ کی حکمت عملی میں تین انٹری آپریشنز انجام دینے کا آغاز کیا گیا ہے۔strategy.entry
فنکشن) ، limit
پیرامیٹرز، قیمت کی قیمت 1 ہے جو اسے غیر فعال کرتی ہے۔ پھر ٹیسٹ کی حالت میں باہر نکلنے کی تقریبstrategy.exit
◊ پوائنٹ نمبر سٹاپ ٹاپ ، قیمت سٹاپ ٹاپ ، فکسڈ تعداد میں پوزیشنوں کا استعمال ، فیصد اسٹاپ ٹاپ کا استعمال۔ ◊ صرف اسٹاپ ٹاپ کی مثال کے طور پر دکھایا گیا ہے۔ ◊ سٹاپ نقصان کا آپریشن بھی ہم آہنگ ہے۔ ◊strategy.exit
اس کے علاوہ، اس فنکشن میں مزید پیچیدہ ٹریکنگ سٹاپ نقصان کے پیرامیٹرز ہیں:trail_price
、trail_points
、trail_offset
آپ اس مثال میں اس کا استعمال سیکھنے کی جانچ بھی کرسکتے ہیں۔
5、strategy.cancel
strategy.cancel
افعال جو تمام پھانسی والے احکامات کو منسوخ / غیر فعال کرنے کے لئے استعمال ہوتے ہیں۔strategy.order
, strategy.entry
, strategy.exit
لاگ ان ID پیدا کیا جا سکتا ہے۔ اس فنکشن کے اہم پیرامیٹرز یہ ہیں:id
、when
。
پیرامیٹرز:
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)
، صرف ایک حکمت عملی کے عنوان سے سیٹ کریں overlay
پیرامیٹر:true
ہم ایک پائن حکمت عملی ڈیزائن کرتے ہیں یا پائن حکمت عملی اسکرپٹ سیکھتے ہیں۔ سب سے پہلے ہم حکمت عملی کے انٹرفیس پیرامیٹر ڈیزائن کو دیکھتے ہیں ، ہم "سپر ٹرینڈ انڈیکیٹر حکمت عملی" کے ماخذ کو دیکھتے ہیں ، جس میں ہم نے پچھلے کورسز میں سیکھا ہے۔input
فنکشن
[supertrend, direction] = ta.supertrend(input(5,
factor input.int(10,) ، atrPeriod ))
input
فنکشن کالز کو براہ راست استعمال کیا جاتا ہےta.supertrend
اشارے کی تقریب کے پیرامیٹرز سپر رجحان اشارے کا حساب کرنے کے لئے استعمال کیا جاتا ہے؛ ان میں سے:
فنکشنز کی ڈیفالٹ کی طرف سے، پائن زبان کی پالیسی انٹرفیس میں دو پیرامیٹر کنٹرولز مقرر کیے جاتے ہیں، جیسے:
اور آپ دیکھ سکتے ہیں کہ اس کنٹرولر کی ڈیفالٹ قیمت یہ ہےinput
افعال اورinput
سیریز فنکشن ((یہاں ہےinput.int
یہ پہلے سیکشن میں بھی بیان کیا گیا ہے۔ ان دونوں افعال کے ذریعہ ہم حکمت عملی انٹرفیس پر ترتیب دے سکتے ہیں۔ta.supertrend
فنکشن کے پیرامیٹرز. سپر رجحان اشارے کی تقریب ایک قیمت کے اعداد و شمار کا حساب لگاتا ہے.supertrend
اور ایک سمت کے اعداد و شمارdirection
◄ پھر استعمال کریںplot
فنکشن گراف ، نوٹ کریں کہ جب گراف ڈرائنگ کی جاتی ہے تو یہ سپر ٹرینڈ اشارے کی سمت کے مطابق گراف ڈرائنگ کرتا ہے ، صرف موجودہ سمت ڈرائنگ کرتا ہے۔direction
اگر آپ کے پاس 1 ہے تو ، آپ کو یہ معلوم ہونا چاہئے کہ آپ کے پاس 1 ہے.direction
ایک بجے کے لئے موجودہ مارکیٹ نیچے کی طرف بڑھ رہی ہے۔ لہذا ہم دیکھ سکتے ہیںplot
جب فنکشن گرافک کرتے ہیں تو فیصلہ کریںdirection
0 سے زیادہ، 0 سے کم، 0 سے زیادہ، 0 سے کم، 0 سے کم، 0 سے کم، 0 سے کم، 0 سے کم، 0 سے کم، 0 سے کم، 0 سے کم، 0 سے کم، 0 سے کم، 0 سے کم، 0 سے کم، 0 سے کم، 0 سے کم، 0 سے کم، 0 سے کم، 0 سے کم، 0 سے کم، 0 سے کم، 0 سے کم، 0 سے کم، 0 سے کم، 0 سے کم، 0 سے کم، 0
اگلاif ... else if
منطق تجارت کے اشارے کا فیصلہ کرتی ہے، جب یہ اظہارdirection < 0
حقیقی وقت میں اشارہ کرتا ہے کہ موجودہ مارکیٹ اوپر کی سطح پر ہے ، اس وقت اگر سپر ٹرینڈ اشارے میں قیمت کے اعداد و شمارsupertrend
سب سے اوپر 2 بار پر سپر رجحان اشارے کی قیمت (یعنی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 سے تقسیم کریں ، یعنی سب سے زیادہ قیمت کی کم ترین قیمت کی اوسط) ، پھر پیرامیٹر trPeriod کے مطابق کسی خاص دورانیے کے لئے ATR اشارے ((لہر کی چوڑائی) کا حساب لگائیں۔ پھر 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)
ہم کچھ پائین زبان کی حکمت عملی ڈیزائن مثالیں سیکھنے کے لئے جاری رہے، اس بار ہم ایک متحرک توازن کی حکمت عملی پر نظر ڈالیں گے.BaseCurrency
(تجارت کی قسم) کی رقم اورQuoteCurrency
(اقتصادی رقم) کی رقم ہمیشہ توازن کا انتظام کرتی ہے۔ کسی اثاثے کی نسبت کی قیمت میں اضافہ ہوتا ہے ، اکاؤنٹ میں رکھی جانے والی قیمت میں اضافہ ہوتا ہے ، جس اثاثے کو فروخت کیا جاتا ہے۔ اگر کسی اثاثے کی نسبت کی قیمت میں کمی واقع ہوتی ہے ، تو اکاؤنٹ میں رکھی جانے والی قیمت میں کمی واقع ہوتی ہے ، تو اس اثاثے کو خریدا جاتا ہے۔ یہ نام نہاد متحرک توازن کی حکمت عملی ہے۔ حقیقت میں متحرک توازن کی حکمت عملی ایک گرڈ کی حکمت عملی ہے ، جو اتار چڑھاؤ کی صورت حال میں اچھی کارکردگی کا مظاہرہ کرتی ہے۔ لیکن رجحان کی صورت حال میں مسلسل نقصانات کی ضرورت ہوتی ہے ، جس کی قیمت میں واپسی کا انتظار کرنے کی ضرورت ہوتی ہے تاکہ نقصانات کو آہستہ آہستہ کم کیا جاسکے تاکہ منافع بخش ہو سکے ، لیکن متحرک توازن کی حکمت عملی میں ہمیشہ مارکیٹ میں اتار چڑھاؤ کو پکڑنے کے قابل ہے۔
اس حکمت عملی کے نقصانات یہ ہیں کہ اس حکمت عملی کے ریٹریک چارٹ سے پتہ چلتا ہے کہ اس کی قیمتوں میں اضافے (یا گرنے) کے مرحلے کے دوران اس کی حکمت عملی میں زیادہ نقصان ہوتا ہے۔ لہذا یہ حکمت عملی اس وقت کی حکمت عملی کے لئے اچھی ہے ، جب کہ مستقبل میں اس کا استعمال خطرہ کو کنٹرول کرنے کی ضرورت ہے۔
اس کے علاوہ، ہم نے اپنے صارفین کے لئے ایک بہت اچھا پروگرام تیار کیا ہے۔
ہم نے ایک سادہ ڈیزائن استعمال کیا ہے، اور اس کی حکمت عملی میں ہم نے ایکbalance
(یعنی قیمت کرنسی کے اثاثوں کی تعداد) اورstocks
(یعنی بیس کرنسی اثاثوں کی تعداد) توازن کی معلومات. ہم اکاؤنٹ میں اصل اثاثوں کی تعداد کو نہیں پڑھتے ہیں، ہم صرف مناسب خرید و فروخت کا حساب لگانے کے لئے ایک مشابہ رقم کا استعمال کرتے ہیں. پھر اس متحرک توازن کی حکمت عملی پر اثر انداز ہونے والے گرڈ کے اہم پیرامیٹرز یہ ہیں:maxDiffValue
اس پیرامیٹر کا تعین کرنے کے لئے ہم آہنگی کا معیار ہے. موجودہ قیمت پر، صرف موجودہ قیمت پر.BaseCurrency
اورQuoteCurrency
انحراف سے زیادہmaxDiffValue
اس کے علاوہ ، اس کے بعد سے ، ہم نے اپنے اثاثوں کی قیمتوں میں بہت زیادہ اضافہ کیا ہے۔
اسٹریٹجک ٹریڈنگ سگنل کو ریئل ٹائم بی اے آر مرحلے میں ہی معنی خیز ہونا چاہئے ، لہذا اسٹریٹجک ٹریڈنگ کی شرائط کو اگر فیصلے میں بھی طے کیا گیا ہے۔not barstate.ishistory
اس کے علاوہ ، اس کے بارے میں مزید معلومات حاصل کرنے کے لئے یہاں کلک کریں۔balance
قیمت سے زیادہ ہےstocks
قیمت کے وقت خریدنا؛ اس کے برعکس فروخت کرنا؛ ٹرانزیکشن کے بیان کے بعد اپ ڈیٹ کرناbalance
اورstocks
اس کے بعد ، آپ کو ایک متغیر کو تبدیل کرنے کی ضرورت ہے ، اور پھر اگلے توازن کو متحرک کرنے کا انتظار کریں۔
مندرجہ بالا حکمت عملی کی جانچ پڑتال کے بارے میں معلومات میں اس قسم کی قیمت شامل ہے جس میں حکمت عملی کی جانچ پڑتال شروع ہوتی ہے، جس کی قیمت 1458 ہے، لہذا میں نے اپنی مرضی کے مطابق پیرامیٹرز مقرر کیے ہیں.balance
4374 ((1458*3) کے لئے پیرامیٹر مقرر کریںstocks
3؛ اثاثوں کو ابتدائی طور پر متوازن حالت میں رکھنا؛
ہم نے پچھلے کورسز میں سیکھا ہےstrategy.exit
پوزیشن سے باہر نکلنے کی تقریب، جس میں ٹریکنگ سٹاپ نقصان روک تھام کی تقریب ہم نے مثال کے طور پر بیان نہیں کیا. اس حصے میں حکمت عملی ڈیزائن مثال کے طور پر ہم استعمال کرتے ہیںstrategy.exit
فنکشن کا ٹریکنگ سٹاپ نقصان سٹاپ ہولڈ افعال ایک سپر رجحان کی حکمت عملی کو بہتر بنانے کے لئے.
سب سے پہلے، آئیے دیکھتے ہیںstrategy.exit
فنکشن کے لئے ٹریکنگ سٹاپ نقصان سٹاپ تھام پیرامیٹر:
1、trail_price
پیرامیٹرز: ٹرگر رکھنے کے لئے ٹریکنگ سٹاپ اور سٹاپ نقصان کی صف بندی کے لئے اس منطقی رویے کی پوزیشن ((قیمت میں مخصوص)