وسائل لوڈ ہو رہے ہیں... لوڈنگ...

ایجاد کاروں نے پین زبان کے تعارف کے سبق کو مقداری شکل دی

مصنف:ایجاد کاروں کی مقدار - خواب, تخلیق: 2022-05-30 16:23:43, تازہ کاری: 2022-09-28 17:10:21

مثالیں:

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.stringinput.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 جملہ

返回值 = 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 کی کلید کے بعد کیا ہوتا ہے۔ ایک متغیر کو بطور متغیر استعمال کیا جاتا ہے۔ ایک متغیر کو بطور متغیر استعمال کیا جاتا ہے۔ ایک متغیر کو بطور متغیر استعمال کیا جاتا ہے۔ دوسرے متغیر کو بطور متغیر استعمال کیا جاتا ہے۔ دوسرے متغیر کو بطور متغیر استعمال کیا جاتا ہے۔

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جملہ اس وقت تک جاری رہتا ہے جب تک کہ جب تک کہ ساخت میں فیصلے کی شرط غلط نہ ہو۔

返回值 = 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> 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 کلیدی لفظ بھی صفوں کے اعلان کے انداز کے ساتھ کام کرتا ہے، صفیں جو 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اور اس کا مطلب یہ ہے کہ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اس بار، ہم نے ایک بار پھر ایک بار پھر ایک بار پھر ایک بار پھر ایک بار پھر ایک بار پھر ایک بار پھرstrategy.entryآپریشن کے لئے 0.1 پر ڈیفالٹ سیٹ کیا جاتا ہے.strategy.entryجب ہم اس فنکشن کو کال کرتے ہیں تو ہم اس کی وضاحت کرتے ہیںdirectionبرابرstrategy.longاس کے علاوہ ، یہ بھی کہا جاتا ہے کہ یہ ایک بہت بڑا مسئلہ ہے ، لیکن اس کا حل یہ ہے کہ یہ ایک بہت بڑا مسئلہ ہے۔

نوٹ کریں کہstrategy.entry("long3", ...مندرجہ ذیل عمل کو دو بار بلایا گیا ہے، ایک ہی ID کے لئے: long3.strategy.entryمندرجہ ذیل آپریشن میں کوئی معاہدہ نہیں ہوا، دوسرا کالstrategy.entryفنکشن اس ID کو تبدیل کرنے والے آرڈر کے لئے (پھر جانچ پڑتال کے دوران دکھائے جانے والے اعداد و شمار میں یہ بھی دیکھا جاسکتا ہے کہ اس حد کے آرڈر کے تحت آرڈر کی مقدار 0.3 کے لئے تبدیل کردی گئی ہے۔ دوسری صورت میں ، مثال کے طور پر ، اگر پہلی بار آئی ڈی کے لئے ایک آرڈر کیا گیا ہے تو ، اس کے مطابق جاری رکھیں.strategy.entryفنکشن آرڈر کرتا ہے تو ، آرڈر کی پوزیشنوں کو آئی ڈی ٹونگ 3 ٹونگ پر جمع کیا جاتا ہے۔


2、strategy.close

strategy.closeیہ فنکشن لین دین کی شناخت کی شناخت کے لئے لین دین کی شناخت کے لئے استعمال کیا جاتا ہے۔ اہم پیرامیٹرز ہیں:idwhenqtyqty_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فنکشن) ، long1 کو جان بوجھ کر مقرر کیا گیا ہےlimitپیرامیٹرز، قیمت کی قیمت 1 ہے جو اسے غیر فعال کرتی ہے۔ پھر ٹیسٹ کی حالت میں باہر نکلنے کی تقریبstrategy.exit◊ پوائنٹ نمبر سٹاپ ٹاپ ، قیمت سٹاپ ٹاپ ، فکسڈ تعداد میں پوزیشنوں کا استعمال ، فیصد اسٹاپ ٹاپ کا استعمال۔ ◊ صرف اسٹاپ ٹاپ کی مثال کے طور پر دکھایا گیا ہے۔ ◊ سٹاپ نقصان کا آپریشن بھی ہم آہنگ ہے۔ ◊strategy.exitاس کے علاوہ، اس فنکشن میں مزید پیچیدہ ٹریکنگ سٹاپ نقصان کے پیرامیٹرز ہیں:trail_pricetrail_pointstrail_offsetآپ اس مثال میں اس کا استعمال سیکھنے کی جانچ بھی کرسکتے ہیں۔


5、strategy.cancel

strategy.cancelافعال جو تمام پھانسی والے احکامات کو منسوخ / غیر فعال کرنے کے لئے استعمال ہوتے ہیں۔strategy.order, strategy.entry , strategy.exitلاگ ان ID پیدا کیا جا سکتا ہے۔ اس فنکشن کے اہم پیرامیٹرز یہ ہیں: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فنکشن

[supertrend, direction] = ta.supertrend(input(5, factor) ،input.int(10, atrPeriod))

inputفنکشن کالز کو براہ راست استعمال کیا جاتا ہےta.supertrendاشارے کی تقریب کے پیرامیٹرز سپر رجحان اشارے کا حساب کرنے کے لئے استعمال کیا جاتا ہے؛ ان میں سے:

  • ان پٹ ((5, factor)
  • input.int(10, atrPeriod)

فنکشنز کی ڈیفالٹ کی طرف سے، پائن زبان کی پالیسی انٹرفیس میں دو پیرامیٹر کنٹرولز مقرر کیے جاتے ہیں، جیسے:

img

اور آپ دیکھ سکتے ہیں کہ اس کنٹرولر کی ڈیفالٹ قیمت یہ ہےinputافعال اورinputسیریز فنکشن ((یہاں ہےinput.intیہ پہلے سیکشن میں بھی بیان کیا گیا ہے۔ ان دونوں افعال کے ذریعہ ہم حکمت عملی انٹرفیس پر ترتیب دے سکتے ہیں۔ta.supertrendفنکشن کے پیرامیٹرز. سپر رجحان اشارے کی تقریب ایک قیمت کے اعداد و شمار کا حساب لگاتا ہے.supertrendاور ایک سمت کے اعداد و شمارdirection◄ پھر استعمال کریںplotفنکشن گراف ، نوٹ کریں کہ جب گراف ڈرائنگ کی جاتی ہے تو یہ سپر ٹرینڈ اشارے کی سمت کے مطابق گراف ڈرائنگ کرتا ہے ، صرف موجودہ سمت ڈرائنگ کرتا ہے۔directionاگر آپ کے پاس 1 ہے تو ، آپ کو یہ معلوم ہونا چاہئے کہ آپ کے پاس 1 ہے.directionایک بجے کے لئے موجودہ مارکیٹ نیچے کی طرف بڑھ رہی ہے۔ لہذا ہم دیکھ سکتے ہیںplotجب فنکشن گرافک کرتے ہیں تو فیصلہ کریںdirection0 سے زیادہ، 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)

img

img

ہم کچھ پائین زبان کی حکمت عملی ڈیزائن مثالیں سیکھنے کے لئے جاری رہے، اس بار ہم ایک متحرک توازن کی حکمت عملی پر نظر ڈالیں گے.BaseCurrency(تجارت کی قسم) کی رقم اورQuoteCurrency(اقتصادی رقم) کی رقم ہمیشہ توازن کا انتظام کرتی ہے۔ کسی اثاثے کی نسبت کی قیمت میں اضافہ ہوتا ہے ، اکاؤنٹ میں رکھی جانے والی قیمت میں اضافہ ہوتا ہے ، جس اثاثے کو فروخت کیا جاتا ہے۔ اگر کسی اثاثے کی نسبت کی قیمت میں کمی واقع ہوتی ہے ، تو اکاؤنٹ میں رکھی جانے والی قیمت میں کمی واقع ہوتی ہے ، تو اس اثاثے کو خریدا جاتا ہے۔ یہ نام نہاد متحرک توازن کی حکمت عملی ہے۔ حقیقت میں متحرک توازن کی حکمت عملی ایک گرڈ کی حکمت عملی ہے ، جو اتار چڑھاؤ کی صورت حال میں اچھی کارکردگی کا مظاہرہ کرتی ہے۔ لیکن رجحان کی صورت حال میں مسلسل نقصانات کی ضرورت ہوتی ہے ، جس کی قیمت میں واپسی کا انتظار کرنے کی ضرورت ہوتی ہے تاکہ نقصانات کو آہستہ آہستہ کم کیا جاسکے تاکہ منافع بخش ہو سکے ، لیکن متحرک توازن کی حکمت عملی میں ہمیشہ مارکیٹ میں اتار چڑھاؤ کو پکڑنے کے قابل ہے۔

اس حکمت عملی کے نقصانات یہ ہیں کہ اس حکمت عملی کے ریٹریک چارٹ سے پتہ چلتا ہے کہ اس کی قیمتوں میں اضافے (یا گرنے) کے مرحلے کے دوران اس کی حکمت عملی میں زیادہ نقصان ہوتا ہے۔ لہذا یہ حکمت عملی اس وقت کی حکمت عملی کے لئے اچھی ہے ، جب کہ مستقبل میں اس کا استعمال خطرہ کو کنٹرول کرنے کی ضرورت ہے۔

اس کے علاوہ، ہم نے اپنے صارفین کے لئے ایک بہت اچھا پروگرام تیار کیا ہے۔

ہم نے ایک سادہ ڈیزائن استعمال کیا ہے، اور اس کی حکمت عملی میں ہم نے ایکbalance(یعنی قیمت کرنسی کے اثاثوں کی تعداد) اورstocks(یعنی بیس کرنسی اثاثوں کی تعداد) توازن کی معلومات. ہم اکاؤنٹ میں اصل اثاثوں کی تعداد کو نہیں پڑھتے ہیں، ہم صرف مناسب خرید و فروخت کا حساب لگانے کے لئے ایک مشابہ رقم کا استعمال کرتے ہیں. پھر اس متحرک توازن کی حکمت عملی پر اثر انداز ہونے والے گرڈ کے اہم پیرامیٹرز یہ ہیں:maxDiffValueاس پیرامیٹر کا تعین کرنے کے لئے ہم آہنگی کا معیار ہے. موجودہ قیمت پر، صرف موجودہ قیمت پر.BaseCurrencyاورQuoteCurrencyانحراف سے زیادہmaxDiffValueاس کے علاوہ ، اس کے بعد سے ، ہم نے اپنے اثاثوں کی قیمتوں میں بہت زیادہ اضافہ کیا ہے۔

اسٹریٹجک ٹریڈنگ سگنل کو ریئل ٹائم بی اے آر مرحلے میں ہی معنی خیز ہونا چاہئے ، لہذا اسٹریٹجک ٹریڈنگ کی شرائط کو اگر فیصلے میں بھی طے کیا گیا ہے۔not barstate.ishistoryاس کے علاوہ ، اس کے بارے میں مزید معلومات حاصل کرنے کے لئے یہاں کلک کریں۔balanceقیمت سے زیادہ ہےstocksقیمت کے وقت خریدنا؛ اس کے برعکس فروخت کرنا؛ ٹرانزیکشن کے بیان کے بعد اپ ڈیٹ کرناbalanceاورstocksاس کے بعد ، آپ کو ایک متغیر کو تبدیل کرنے کی ضرورت ہے ، اور پھر اگلے توازن کو متحرک کرنے کا انتظار کریں۔

مندرجہ بالا حکمت عملی کی جانچ پڑتال کے بارے میں معلومات میں اس قسم کی قیمت شامل ہے جس میں حکمت عملی کی جانچ پڑتال شروع ہوتی ہے، جس کی قیمت 1458 ہے، لہذا میں نے اپنی مرضی کے مطابق پیرامیٹرز مقرر کیے ہیں.balance4374 ((1458*3) کے لئے پیرامیٹر مقرر کریںstocks3؛ اثاثوں کو ابتدائی طور پر متوازن حالت میں رکھنا؛

سٹاپ نقصانات کو روکنے کے لئے سپر رجحانات کی حکمت عملی

ہم نے پچھلے کورسز میں سیکھا ہےstrategy.exitپوزیشن سے باہر نکلنے کی تقریب، جس میں ٹریکنگ سٹاپ نقصان روک تھام کی تقریب ہم نے مثال کے طور پر بیان نہیں کیا. اس حصے میں حکمت عملی ڈیزائن مثال کے طور پر ہم استعمال کرتے ہیںstrategy.exitفنکشن کا ٹریکنگ سٹاپ نقصان سٹاپ ہولڈ افعال ایک سپر رجحان کی حکمت عملی کو بہتر بنانے کے لئے.

سب سے پہلے، آئیے دیکھتے ہیںstrategy.exitفنکشن کے لئے ٹریکنگ سٹاپ نقصان سٹاپ تھام پیرامیٹر:

1、trail_priceپیرامیٹرز: ٹرگر رکھنے کے لئے ٹریکنگ سٹاپ اور سٹاپ نقصان کی صف بندی کے لئے اس منطقی رویے کی پوزیشن ((قیمت میں مخصوص)


مزید