لہذا ہم دیکھتے ہیں کہ ڈرائنگ کی تین لائنوں a، b، اور c میں، لائن b لائن a سے ایک بار سست ہے، اور لائن c لائن b سے ایک بار سست ہے۔ لائن c لائن a سے 2 بار سست ہے۔
ہم چارٹ کو انتہائی بائیں طرف کھینچ سکتے ہیں اور مشاہدہ کرسکتے ہیں کہ پہلی K لائن پر ، b اور c کی دونوں اقدار null (na) ہیں۔ اس کی وجہ یہ ہے کہ جب اسکرپٹ کو پہلی K لائن BAR پر عملدرآمد کیا جاتا ہے تو ، یہ موجود نہیں ہوتا ہے جب ایک یا دو ادوار کے تاریخی قدر کا حوالہ دیتے ہیں ، جو موجود نہیں ہے۔ لہذا ، ہمیں حکمت عملی لکھتے وقت محتاط رہنے کی ضرورت ہے تاکہ یہ معلوم کیا جاسکے کہ تاریخی اعداد و شمار کا حوالہ دیتے ہوئے صفر کی قیمتوں کا نتیجہ نکلے گا۔ اگر نول ویلیو کو لاپرواہ طور پر استعمال کیا جائے تو ، اس سے حساب کتاب کے اختلافات کا ایک سلسلہ پیدا ہوگا ، اور حقیقی وقت کے BAR کو بھی متاثر کرسکتا ہے۔ عام طور پر ہم بلٹ ان افعال کا استعمال کریں گے۔na
, nz
کوڈ میں فیصلہ کرنے کے لئے (حقیقت میں، ہم نے بھی سامنا کرنا پڑا ہےnz
، ```na` ◄ ہمارے پچھلے ویڈیوز میں، آپ کو یاد ہے کہ یہ کون سا باب ہے؟) نل اقدار کے معاملے سے نمٹنے، مثال کے طور پر:
close > nz(close[1], open) // When referencing the historical value of the previous BAR of the close built-in variable, if it does not exist, the open built-in variable is used
یہ صفر اقدار (na) کے ممکنہ حوالہ جات کو ہینڈل کرنے کا ایک طریقہ ہے.
ہم نے پائن زبان میں بہت سارے آپریٹرز سیکھے ہیں۔ یہ آپریٹرز آپریڈوں کے ساتھ مختلف امتزاجوں کے ذریعے اظہار بناتے ہیں۔ لہذا اظہار میں تشخیص کرتے وقت ان کاموں کی ترجیح کیا ہے؟ بالکل اسی طرح جیسے ہم نے اسکول میں سیکھا ریاضی ، ضرب اور تقسیم پہلے حساب کی جاتی ہے ، اس کے بعد جمع اور گھٹاؤ ہوتا ہے۔ پائن زبان میں اظہار کے لئے بھی ایسا ہی ہوتا ہے۔
ترجیح | آپریٹر |
---|---|
9 | [] |
8 | + 、- اورnot یونری آپریٹر میں |
7 | * 、/ 、% |
6 | + 、- بائنری آپریٹر میں |
5 | > 、< 、>= 、<= |
4 | == 、!= |
3 | and |
2 | or |
1 | ?: |
اعلی ترجیح والے اظہار پہلے حساب لگایا جاتا ہے، اور اگر ترجیحات ایک جیسی ہیں، تو یہ بائیں سے دائیں طرف سے جائزہ لیا جاتا ہے. اگر آپ ایک خاص حصہ کو پہلے جائزہ لینے کے لئے مجبور کرنا چاہتے ہیں، تو آپ استعمال کر سکتے ہیں()
اظہار کو لپیٹنے کے لئے پہلے اندازہ کرنے کے لئے حصہ مجبور کرنے کے لئے.
ہم نے پہلے بھی
اعلان موڈ:
متغیر کا اعلان کرتے وقت سب سے پہلے لکھنا
var
.varip
.کےvar
اورvarip
مطلوبہ الفاظ اصل میں ہمارے پچھلے باب میں مطالعہ کیا گیا ہےAssignment Operators
، لہذا ہم یہاں تفصیلات میں نہیں جائیں گے۔ اگر متغیر اعلان موڈ کے لئے کچھ بھی نہیں لکھا جاتا ہے ، جیسے بیان:i = 1
، جیسا کہ ہم نے بھی پہلے ذکر کیا ہے، اس طرح کے ایک متغیر اعلان اور تفویض ہر K لائن BAR پر عملدرآمد کیا جاتا ہے.
قسم ایف ایم زیڈ پر پائن زبان اقسام کے بارے میں سخت نہیں ہے ، اور عام طور پر اسے نظرانداز کیا جاسکتا ہے۔ تاہم ، ٹریڈنگ ویو پر اسکرپٹ کی حکمت عملی کے ساتھ مطابقت پذیر ہونے کے ل variables ، متغیرات کو اقسام کے ساتھ بھی اعلان کیا جاسکتا ہے۔ مثال کے طور پر:
int i = 0
float f = 1.1
ٹریڈنگ ویو پر ٹائپ کی ضروریات کافی سخت ہیں، اور اگر ٹریڈنگ ویو پر مندرجہ ذیل کوڈ استعمال کیا جاتا ہے تو غلطی کی اطلاع دی جائے گی:
baseLine0 = na // compile time error!
مارکر مارکر متغیر نام ہیں۔ مارکر کے ناموں کا ذکر پچھلے ابواب میں کیا گیا ہے ، لہذا آپ اسے یہاں دیکھ سکتے ہیں۔https://www.fmz.com/bbs-topic/9637#markers
خلاصہ میں، ایک متغیر کا اعلان اس طرح لکھا جا سکتا ہے:
// [<declaration_mode>] [<type>] <marker> = value
declaration mode type marker = value
تفویض آپریٹر یہاں استعمال کیا جاتا ہے:=
ایک متغیر کو ایک قدر تفویض کرتا ہے جب یہ اعلان کیا جاتا ہے۔ تفویض کرتے وقت ، قدر ایک تار ، نمبر ، اظہار ، فنکشن کال ،if
, for
, while
، یاswitch
اور دیگر ڈھانچے (یہ ساختی مطلوبہ الفاظ اور بیان کا استعمال بعد کے کورسز میں تفصیل سے بیان کیا جائے گا۔ در حقیقت ، ہم نے پچھلے کورسز میں سادہ if بیان تفویض سیکھا ہے اور آپ ان کا جائزہ لے سکتے ہیں۔
یہاں ہم ان پٹ فنکشن پر توجہ مرکوز کرتے ہیں ، جو ایک فنکشن ہے جسے ہم حکمت عملیوں کے ڈیزائن اور تحریر کرتے وقت کثرت سے استعمال کریں گے۔ یہ حکمت عملیوں کے ڈیزائن کے وقت بھی ایک بہت ہی اہم فنکشن ہے۔
ان پٹ فنکشن:
input function, parameters: defval、title、tooltip、inline、group
ایف ایم زیڈ پر ان پٹ فنکشن ٹریڈنگ ویو سے کچھ مختلف ہے ، لیکن یہ فنکشن حکمت عملی کے پیرامیٹرز کے تفویض ان پٹ کے طور پر استعمال ہوتا ہے۔ آئیے ایف ایم زیڈ پر ان پٹ فنکشن کے استعمال کو تفصیل سے ظاہر کرنے کے لئے ایک مثال استعمال کرتے ہیں:
param1 = input(10, title="name of param1", tooltip="description for param1", group="group name A")
param2 = input("close", title="name of param2", tooltip="description for param2", group="group name A")
param3 = input(color.red, title="name of param3", tooltip="description for param3", group="group name B")
param4 = input(close, title="name of param4", tooltip="description for param4", group="group name B")
param5 = input(true, title="name of param5", tooltip="description for param5", group="group name C")
ma = ta.ema(param4, param1)
plot(ma, title=param2, color=param3, overlay=param5)
ان پٹ فنکشن اکثر متغیرات کو ان کا اعلان کرتے وقت اقدار تفویض کرنے کے لئے استعمال کیا جاتا ہے۔ ایف ایم زیڈ پر ان پٹ فنکشن ایف ایم زیڈ اسٹریٹجی انٹرفیس میں خود بخود حکمت عملی کے پیرامیٹرز کی ترتیب کے لئے کنٹرولز کھینچتا ہے۔ ایف ایم زیڈ پر معاون کنٹرولز میں فی الحال عددی ان پٹ خانوں ، ٹیکسٹ ان پٹ خانوں ، ڈراپ ڈاؤن خانوں اور بولین چیک باکس شامل ہیں۔ اور آپ حکمت عملی پیرامیٹر گروپنگ ، پیرامیٹر پرامپٹ ٹیکسٹ میسج اور دیگر افعال مرتب کرسکتے ہیں۔
ہم ان پٹ فنکشن کے کئی اہم پیرامیٹرز متعارف کراتے ہیں:
انفرادی متغیر اعلان اور تفویض کے علاوہ ، متغیرات کے ایک گروپ کا اعلان کرنے اور ان کو پائن زبان میں تفویض کرنے کا ایک طریقہ بھی ہے:
[Variable A, Variable B, Variable C] = function or structure, such as ```if```, ```for```, ```while``` or ```switch```
سب سے زیادہ عام ہے جب ہم استعمال کرتے ہیںta.macd
MACD اشارے کا حساب لگانے کے لئے فنکشن، کیونکہ MACD اشارے ایک کثیر لائن اشارے ہے، اعداد و شمار کے تین سیٹ کا حساب لگایا جاتا ہے. لہذا یہ لکھا جا سکتا ہے:
[dif,dea,column] = ta.macd(close, 12, 26, 9)
plot(dif, title="dif")
plot(dea, title="dea")
plot(column, title="column", style=plot.style_histogram)
ہم مندرجہ بالا کوڈ کا استعمال کرتے ہوئے آسانی سے MACD چارٹ تیار کرسکتے ہیں۔ نہ صرف بلٹ ان افعال متعدد متغیرات کو واپس کرسکتے ہیں ، بلکہ تحریری کسٹم افعال بھی متعدد ڈیٹا کو واپس کرسکتے ہیں۔
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)
اگر اور دیگر ڈھانچے کو متعدد متغیر تفویض کے طور پر استعمال کرنے کا تحریری طریقہ بھی مذکورہ بالا کسٹم فنکشن کی طرح ہے ، اور اگر آپ دلچسپی رکھتے ہیں تو آپ اسے آزما سکتے ہیں۔
[ema10, ema20] = if true
fast = ta.ema(close, 10)
slow = ta.ema(close, 20)
[fast, slow]
plot(ema10, title="ema10", color=color.fuchsia, overlay=true)
plot(ema20, title="ema20", color=color.aqua, overlay=true)
بعض افعال کو مشروط شاخ کے مقامی کوڈ بلاک میں نہیں لکھا جا سکتا، بنیادی طور پر مندرجہ ذیل افعال شامل ہیں:
بارکلر (ب) ، فل (ب) ، لائن (ب) ، اشارے (ب) ، پلاٹ (ج) ، پلاٹ کینڈل (ب) ، پلاٹ چار (ج) ، پلاٹ شیپ (ب)
ٹریڈنگ ویو غلطیوں کے ساتھ مرتب کرے گا ، ایف ایم زیڈ اتنا محدود نہیں ہے ، لیکن ٹریڈنگ ویو کی تفصیلات پر عمل کرنے کی سفارش کی جاتی ہے۔ مثال کے طور پر ، اگرچہ یہ ایف ایم زیڈ پر غلطی کی اطلاع نہیں دیتا ہے ، لیکن اس کی سفارش نہیں کی جاتی ہے۔
strategy("test", overlay=true)
if close > open
plot(close, title="close")
else
plot(open, title="open")
وضاحت کا مثال:
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)
اہم نکتہ: جملوں کے لئے استعمال ہونے والے اظہار جو بولی اقدار کو واپس کرتے ہیں۔ انڈینٹشن کو نوٹ کریں۔ زیادہ سے زیادہ ایک اور شاخ ہوسکتی ہے۔ اگر تمام شاخ کے اظہار درست نہیں ہیں اور کوئی دوسری شاخ نہیں ہے تو ، واپس آنا۔
x = if close > open
close
plot(x, title="x")
سوئچ بیان بھی ایک شاخ ساختہ بیان ہے ، جس کا استعمال کچھ شرائط کے مطابق انجام دینے کے لئے مختلف راستوں کو ڈیزائن کرنے کے لئے کیا جاتا ہے۔ عام طور پر ، سوئچ بیان میں مندرجہ ذیل اہم علمی نکات ہوتے ہیں۔
سوئچ کی دو شکلیں ہیں، آئیے ان کے استعمال کو سمجھنے کے لئے مثالوں کو ایک ایک کرکے دیکھتے ہیں۔
switch
اظہار کے ساتھ - مثال کی وضاحت:// input.string: defval, title, options, tooltip
func = input.string("EMA", title="indicator name", tooltip="select the name of the indicator function to be used", options=["EMA", "SMA", "RMA", "WMA"])
// input.int: defval, title, options, tooltip
// param1 = input.int(10, title="period parameter")
fastPeriod = input.int(10, title="fastPeriod parameter", options=[5, 10, 20])
slowPeriod = input.int(20, title="slowPeriod parameter", options=[20, 25, 30])
data = input(close, title="data", tooltip="select the closing price, opening price, highest price...")
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
functions.
input.string
ایک تار واپس کرنے کے لئے استعمال کیا جاتا ہے، اورinput.int
فنکشن ایک عدد قدر واپس کرنے کے لئے استعمال کیا جاتا ہے. مثال میں، ایک نیا استعمال ہےoptions
پیرامیٹر.options
پیرامیٹر اختیاری اقدار کی ایک صف، جیسے منتقل کیا جا سکتا ہےoptions=["EMA", "SMA", "RMA", "WMA"]
اورoptions=[5, 10, 20]
مثال میں (نوٹ کریں کہ ایک تار کی قسم ہے ، دوسرا عددی قسم ہے۔ اس طرح ، حکمت عملی کے انٹرفیس پر کنٹرولز کو مخصوص اقدار کو ان پٹ کرنے کی ضرورت نہیں ہے ، لیکن کنٹرولز کو اختیارات پیرامیٹر میں فراہم کردہ ان اختیارات کو منتخب کرنے کے لئے ڈراپ ڈاؤن باکس بن جاتے ہیں۔
متغیر func کی قدر ایک تار ہے ، اور متغیر func کو سوئچ کے لئے اظہار کے طور پر استعمال کیا جاتا ہے (جو ایک متغیر ، فنکشن کال ، یا اظہار ہوسکتا ہے) اس بات کا تعین کرنے کے لئے کہ سوئچ میں کون سی شاخ عمل میں لائی جائے گی۔ اگر متغیر func سوئچ میں کسی بھی شاخ پر اظہار سے مماثل (یعنی برابر) نہیں ہوسکتا ہے تو ، ڈیفالٹ برانچ کوڈ بلاک عمل میں لایا جائے گا ، اورruntime.error("error")
تقریب پر عملدرآمد کیا جائے گا، حکمت عملی کو ایک استثناء پھینکنے اور روکنے کا سبب بنتا ہے.
مندرجہ بالا ہمارے ٹیسٹ کوڈ میں ، سوئچ کے ڈیفالٹ برانچ کوڈ بلاک میں رن ٹائم.غلطی کی آخری لائن کے بعد ، ہم نے [na ، na] جیسے کوڈ کو شامل نہیں کیا تاکہ واپسی کی قیمت کے ساتھ ہم آہنگ ہو۔ اس مسئلے پر ٹریڈنگ ویو پر غور کرنے کی ضرورت ہے۔ اگر قسم متضاد ہے تو ، ایک غلطی کی اطلاع دی جائے گی۔ لیکن ایف ایم زیڈ پر ، چونکہ قسم سختی سے ضروری نہیں ہے ، لہذا اس مطابقت کوڈ کو چھوڑ دیا جاسکتا ہے۔ لہذا ، ایف ایم زیڈ پر اگر اور سوئچ شاخوں کی واپسی کی قیمت کی قسم کی مطابقت پر غور کرنے کی ضرورت نہیں ہے۔
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)
ایف ایم زیڈ پر کوئی غلطی رپورٹ نہیں کی جائے گی، لیکن تجارتی نقطہ نظر پر غلطی کی اطلاع دی جائے گی۔ کیونکہ اگر شاخ کی طرف سے واپس آنے والی قسم متضاد ہے.
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
کے ساتھ اظہار،" عملدرآمد شاخ تعیناتی ہے اور حکمت عملی آپریشن کے دوران تبدیل نہیں کیا جائے گا).
return value = for count = start count to final count by step length
statement // Note: There can be break and continue in the statement
statement // Note: The last statement is the return value
فور اسٹیٹمنٹ کا استعمال بہت آسان ہے ، فور لوپ آخر کار ایک قدر (یا متعدد اقدار ، [a ، b ، c] کی شکل میں) واپس کرسکتا ہے۔ جیسا کہ مندرجہ بالا جعلی کوڈ میں
کےbreak
کے لئے لوپ میں استعمال کیا کلیدی لفظ: لوپ بند ہو جاتا ہے جبbreak
بیان پر عملدرآمد کیا جاتا ہے.
کےcontinue
کے لئے لوپ میں استعمال کیا کلیدی لفظ: جبcontinue
بیان پر عملدرآمد کیا جاتا ہے، لوپ کے بعد کوڈ کو نظر انداز کرے گاcontinue
اور لوپ کا اگلا راؤنڈ براہ راست چلائیں۔ for بیان لوپ کے آخری عمل سے واپسی کی قیمت کو واپس کرتا ہے۔ اور اگر کوئی کوڈ عمل میں نہیں لایا جاتا ہے تو یہ null لوٹاتا ہے۔
پھر ہم ایک سادہ مثال کے ساتھ ظاہر:
ret = for i = 0 to 10 // We can increase the keyword by to modify the step length, FMZ does not support reverse loops such as i = 10 to 0 for now
// We can add condition settings, use continue to skip, use break to jump out
runtime.log("i:", i)
i // If this line is not written, it will return null because there is no variable to return
runtime.log("ret:", ret)
runtime.error("stop")
کےfor ... in
بیان میں دو شکلیں ہیں، ہم ان کو مندرجہ ذیل جعلی کوڈ میں دکھائیں گے۔
return value = for array element in array
statement // Note: There can be break and continue in the statement
statement // Note: The last statement is the return value
Return value = for [index variable, array element corresponding to index variable] in array
statement // Note: There can be break and continue in the statement
statement // Note: The last statement is the return value
ہم دیکھ سکتے ہیں کہ دونوں فارموں کے مابین بنیادی فرق اس مواد میں ہے جو for مطلوبہ الفاظ کے بعد آتا ہے ، ایک متغیر کو متغیر کے طور پر استعمال کرنا ہے جو صف کے عناصر کا حوالہ دیتا ہے ، دوسرا ایک ایسا ڈھانچہ استعمال کرنا ہے جس میں انڈیکس متغیرات ، صف کے عنصر متغیرات کے ٹوپلز بطور حوالہ جات ہوں۔ دوسرے واپسی کی قیمت کے قواعد ، جیسے وقفے کا استعمال ، جاری رکھنا ، وغیرہ ، کے ساتھ ہم آہنگ ہیں for loops. ہم استعمال کو ایک سادہ مثال کے ساتھ بھی ظاہر کرتے ہیں۔
testArray = array.from(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)
for ele in testArray // Modify it to the form of [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
.
لوپ کے لئے درخواست
ہم پائین زبان میں فراہم کردہ بلٹ ان فنکشنز کا استعمال لوپ منطق کے کچھ حساب کتاب کو مکمل کرنے کے لئے کرسکتے ہیں ، یا تو براہ راست لوپ ڈھانچے کا استعمال کرتے ہوئے لکھا جاتا ہے یا بلٹ ان فنکشنز کا استعمال کرتے ہوئے پروسیس کیا جاتا ہے۔ آئیے دو مثالیں لیتے ہیں:
لوپ ڈھانچے کے ساتھ ڈیزائن کرتے وقت:
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)
بلٹ ان فنکشن استعمال کریںta.sma
براہ راست چلتی اوسط اشارے کا حساب لگانے کے لئے۔ ظاہر ہے ، چلتی اوسط کا حساب لگانے کے لئے بلٹ ان فنکشن کا استعمال کرنا آسان ہے۔ چارٹ پر موازنہ کرکے ، یہ دیکھا جاسکتا ہے کہ حساب کتاب کے نتائج بالکل ایک جیسے ہیں۔
ہم اب بھی مثال کے طور پر اوپر کی مثال کا استعمال کرتے ہیں.
لوپ ڈھانچے کے ساتھ ڈیزائن کرتے وقت:
length = 5
var a = array.new(length)
array.push(a, close)
if array.size(a) >= length
array.remove(a, 0)
sum = 0
for ele in a
sum += ele
avg = sum / length
plot(avg, title="avg", overlay=true)
plot(ta.sma(close, length), title="ta.sma", overlay=true)
ایک صف میں تمام عناصر کی رقم کا حساب کرنے کے لئے، ہم اس پر عملدرآمد کرنے کے لئے ایک لوپ استعمال کر سکتے ہیں، یا بلٹ ان تقریب کا استعمالarray.sum
حساب کرنے کے لئے.
بلٹ ان فنکشن کا استعمال کرتے ہوئے براہ راست رقم کا حساب لگائیں:
length = 5
var a = array.new(length)
array.push(a, close)
if array.size(a) >= length
array.remove(a, 0)
plot(array.sum(a) / length, title="avg", overlay=true)
plot(ta.sma(close, length), title="ta.sma", overlay=true)
ہم دیکھ سکتے ہیں کہ حساب اعداد و شمار بالکل وہی ہے جو چارٹ پر دکھایا گیا ہے جس میں پلاٹ کا استعمال کیا گیا ہے.
تو پھر لوپ ڈیزائن کرنے کی کیا ضرورت ہے جب ہم یہ سب کچھ بلٹ ان افعال کے ساتھ کر سکتے ہیں؟ لوپ کا استعمال بنیادی طور پر ان 3 نکات کے اطلاق پر مبنی ہے:
کےwhile
اسٹریمنٹ لوپ سیکشن میں کوڈ کو اس وقت تک چلتا رہتا ہے جب تک کہ جبکہ ڈھانچے میں فیصلے کی شرط غلط نہ ہو۔
return value = while judgment condition
statement // Note: There can be break and continue in the statement
statement // Note: The last statement is the return value
while کے دیگر قوانین for لوپ کے قواعد سے ملتے جلتے ہیں۔ لوپ باڈی کے لوکل کوڈ بلاک کی آخری سطر ریٹرن ویلیو ہے ، جو متعدد اقدار واپس کر سکتی ہے۔ جب
ہم اب بھی مظاہرے کے لئے چلتی اوسط کا حساب کرنے کی مثال استعمال کریں گے:
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("current value a on BAR:", a, ", a on the last BAR, i.e. the value of a[1]:", a[1])
else if bar_index == 1
array.push(a, bar_index)
runtime.log("current value a on BAR:", a, ", a on the last BAR, i.e. the value of a[1]:", a[1])
else if bar_index == 2
array.push(a, bar_index)
runtime.log("current value a on BAR:", a, ", a on the last BAR, i.e. the value of a[1]:", a[1], ", a on the last second BAR, i.e. the value of a[2]:", a[2])
else if bar_index == 3
array.push(a, bar_index)
runtime.log("current value a on BAR:", a, ", a on the last BAR, i.e. the value of a[1]:", a[1], ", a on the last second BAR, i.e. the value of a[2]:", a[2], ", a on the last third BAR, i.e. the value of a[3]:", a[3])
else if bar_index == 4
// Obtain elements by index using array.get, modify elements by index using array.set
runtime.log("Before array modification:", array.get(a, 0), array.get(a, 1), array.get(a, 2), array.get(a, 3))
array.set(a, 1, 999)
runtime.log("After array modification:", 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
افعال. اس کے علاوہ بہت سے قسم سے متعلق افعال ہیںarray.newپائن زبان میں:array.new_int()
, array.new_bool()
, array.new_color()
, array.new_string()
، وغیرہ
var کلیدی لفظ صف کے اعلان کے موڈ کے ساتھ بھی کام کرتا ہے۔ var کلیدی لفظ کے ساتھ اعلان کردہ صفیں صرف پہلے BAR پر شروع کی جاتی ہیں۔ آئیے ایک مثال کے ساتھ مشاہدہ کریں:
var a = array.from(0)
b = array.from(0)
if bar_index == 1
array.push(a, bar_index)
array.push(b, bar_index)
else if bar_index == 2
array.push(a, bar_index)
array.push(b, bar_index)
else if barstate.islast
runtime.log("a:", a)
runtime.log("b:", b)
runtime.error("stop")
یہ دیکھا جاسکتا ہے کہ صف a کی تبدیلیوں کا مستقل طور پر تعین کیا گیا ہے اور اسے ری سیٹ نہیں کیا گیا ہے۔ صف b کو ہر BAR پر شروع کیا جاتا ہے۔ آخر میں ، جبbarstate.islast
سچ ہے، اب بھی 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رنگ کی سطح کا حساب موجودہ بار کے فاصلے کا حساب لگاتے ہوئے کیا جاتا ہے 100 نظرثانی کے ادوار میں اعلی کی زیادہ سے زیادہ قیمت سے۔ پچھلے 100 نظرثانی کے دوروں میں HIGH کی زیادہ سے زیادہ قیمت کے فاصلے کے قریب ، درجہ زیادہ ہوتا ہے اور اس کے مساوی رنگ کی قیمت (کم شفافیت) زیادہ ہوتی ہے۔ بہت ساری اسی طرح کی حکمت عملییں اس طریقہ کو استعمال کرتی ہیں N نظرثانی کے ادوار میں موجودہ قیمت کی سطح کی نمائندگی کرنے کے لئے۔
ایک صف کے ذریعے iterate کرنے کے لئے کس طرح، ہم استعمال کر سکتے ہیں کے لئے / کے لئے میں / جبکہ بیانات کہ ہم نے پہلے سیکھا ہے.
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)
array.unshift()
, array.insert()
, array.push()
.
array.remove()
, array.shift()
, array.pop()
, array.clear()
.
ہم مندرجہ ذیل مثال کا استعمال کرتے ہوئے ان صفوں کو شامل کرنے اور حذف کرنے کے آپریشن کے افعال کی جانچ کرتے ہیں.
a = array.from("A", "B", "C")
ret = array.unshift(a, "X")
runtime.log("array a:", a, ", ret:", ret)
ret := array.insert(a, 1, "Y")
runtime.log("array a:", a, ", ret:", ret)
ret := array.push(a, "D")
runtime.log("array a:", a, ", ret:", ret)
ret := array.remove(a, 2)
runtime.log("array a:", a, ", ret:", ret)
ret := array.shift(a)
runtime.log("array a:", a, ", ret:", ret)
ret := array.pop(a)
runtime.log("array a:", a, ", ret:", ret)
ret := array.clear(a)
runtime.log("array 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")
نوٹ کریں کہ جب اعلان صف ایک، ہم اعلان موڈ کی وضاحت اور مطلوبہ الفاظ کا استعمال کریںvariant
اس طرح، ہر قیمت کی تبدیلی صف میں ریکارڈ کیا جائے گا.
کنکشن افعال کا حساب لگائیں:
array.avg()
ایک صف میں تمام عناصر کی اوسط قدر کا حساب لگاتا ہے،array.min()
ایک صف میں سب سے چھوٹا عنصر کا حساب لگاتا ہے،array.max()
ایک صف میں سب سے چھوٹا عنصر کا حساب لگاتا ہے،array.stdev()
ایک صف میں تمام عناصر کے معیاری انحراف کا حساب لگاتا ہے،array.sum()
ایک صف میں تمام عناصر کے معیاری انحراف کا حساب لگاتا ہے.
آپریشن سے متعلق افعال:array.concat()
دو صفوں کو ضم یا مربوط کرنے کے لئے.array.copy()
صف کو کاپی کرنے کے لئے.array.join
to ایک صف کے تمام عناصر کو ایک تار میں جوڑتا ہے۔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("Arithmetic average of the array a:", array.avg(a))
runtime.log("The minimum element in the array a:", array.min(a))
runtime.log("The maximum element in the array a:", array.max(a))
runtime.log("Standard deviation in array a:", array.stdev(a))
runtime.log("Sum of all elements of the array 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("array a: ", a, ", array b: ", b)
runtime.log("array a, array b is concatenated with:", array.concat(a, b))
c = array.copy(b)
runtime.log("Copy an array b and assign it to the variable c, variable c:", c)
runtime.log("use array.join to process the array c, add the symbol + to the middle of each element, concatenating all elements results in a string:", array.join(c, "+"))
runtime.log("Sort the array b, in order from smallest to largest, using the parameter order.ascending:", array.sort(b, order.ascending)) // array.sort function modifies the original array
runtime.log("Sort the array b, in order from largest to smallest, using the parameter order.descending:", array.sort(b, order.descending)) // array.sort function modifies the original array
runtime.log("array a:", a, ", array b:", b)
array.reverse(a) // This function modifies the original array
runtime.log("reverse the order of all elements in the array a, after reversing, the array a is:", a)
runtime.log("Intercept array a, index 0~index 3, and follow the rule of left-closed and right-open interval:", array.slice(a, 0, 3))
runtime.log("Search for element 11 in array b:", array.includes(b, 11))
runtime.log("Search for element 100 in array a:", array.includes(a, 100))
runtime.log("Connect array a and array b, and search the index position of the first occurrence of element 2:", array.indexof(array.concat(a, b), 2), " , observe array.concat(a, b):", array.concat(a, b))
runtime.log("Connect array a and array b, and search the index position of the last occurrence of element 6:", array.lastindexof(array.concat(a, b), 6), " , observe array.concat(a, b):", array.concat(a, b))
runtime.error("stop")
پائن زبان کو کسٹم فنکشنز کے ساتھ ڈیزائن کیا جاسکتا ہے۔ عام طور پر پائن زبان میں کسٹم فنکشنز پر مندرجہ ذیل اصول لاگو ہوتے ہیں:
barcolor(), fill(), hline(), plot(), plotbar(), plotcandle()
) اپنی مرضی کے افعال میں بلایا نہیں جا سکتا.ہم نے اپنی مرضی کے مطابق افعال کو بھی اپنے پچھلے سبق میں کئی بار استعمال کیا ہے، جیسے کہ ایک لائن کے طور پر ڈیزائن کیا گیا ہے:
barIsUp() => close > open
اگر موجودہ BAR ایک مثبت لائن ہے جب فنکشن واپس آتا ہے.
اپنی مرضی کے مطابق افعال متعدد لائن کے لئے ڈیزائن کیا گیا:
sma(data, length) =>
i = 0
sum = 0
while i < 10
sum += data[i]
i += 1
sum / length
plot(sma(close, length), title="sma", overlay=true)
plot(ta.sma(close, length), title="ta.sma", overlay=true)
ہم ایک کسٹم فنکشن کا استعمال کرتے ہیں SMA اوسط حساب کے فنکشن کا احساس کرنے کے لئے.
اس کے علاوہ، اپنی مرضی کے مطابق افعال کی دو مثالیں جو ہم واپس کر سکتے ہیں:
twoEMA(data, fastPeriod, slowPeriod) =>
fast = ta.ema(data, fastPeriod)
slow = ta.ema(data, slowPeriod)
[fast, slow]
[ema10, ema20] = twoEMA(close, 10, 20)
plot(ema10, title="ema10", overlay=true)
plot(ema20, title="ema20", overlay=true)
ایک فنکشن تیز لائن، سست لائن اور دو EMA اوسط کا حساب لگا سکتا ہے.
بلٹ ان افعال آسانی سے میں پایا جا سکتا ہےFMZ PINE اسکرپٹ دستاویز.
پائن زبان میں بلٹ ان افعال کی درجہ بندی:
str.
series.color.
series.input.
series.ta.
series.plot.
series.array.
series.strategy.
series.math.
series.request.
سیریز افعال، قسم ہینڈلنگ افعال، وغیرہ.)کےstrategy.
افعال کی سیریز افعال ہیں جو ہم اکثر حکمت عملی کے ڈیزائن میں استعمال کرتے ہیں، اور یہ افعال تجارتی کارروائیوں کے عمل سے قریب سے متعلق ہیں جب حکمت عملی خاص طور پر چل رہی ہے.
strategy.entry
strategy.entry
فنکشن ایک زیادہ اہم فنکشن ہے جب ہم ایک آرڈر رکھنے کے لئے ایک حکمت عملی لکھنے، فنکشن کے لئے کئی اہم پیرامیٹرز ہیں:id
, direction
, qty
, when
، وغیرہ
پیرامیٹرز:
id
: یہ سمجھا جا سکتا ہے کہ حوالہ کے لئے تجارتی پوزیشن کا نام دینا۔ اس شناخت کو منسوخ کرنے ، احکامات میں ترمیم کرنے اور پوزیشنوں کو بند کرنے کے لئے حوالہ دیا جاسکتا ہے۔direction
: اگر آرڈر کی سمت لمبی ہے (خریدیں) ، بلٹ ان متغیر میں منتقل کریںstrategy.long
، اور اگر آپ مختصر جانا چاہتے ہیں (فروخت) ، متغیر میں منتقلstrategy.short
.qty
: ترتیب دینے کے لئے آرڈر کی مقدار کی وضاحت کریں، اگر یہ پیرامیٹر منظور نہیں کیا جاتا ہے، تو آرڈر کی ڈیفالٹ رقم استعمال کی جائے گی.when
: عملدرآمد کی شرط، آپ اس پیرامیٹر کو اس بات کا کنٹرول کرنے کے لئے مخصوص کر سکتے ہیں کہ آیا یہ موجودہ آرڈر آپریشن شروع ہوتا ہے یا نہیں.limit
: آرڈر کی حد کی قیمت بتائیں.stop
سٹاپ نقصان کی قیمت.کے مخصوص عملدرآمد کی تفصیلاتstrategy.entry
تقریب پیرامیٹر کی ترتیبات کی طرف سے کنٹرول کر رہے ہیں جبstrategy
فنکشن بلایا جاتا ہے، اور یہ بھی [
ہم پر توجہ مرکوز کریں گےpyramiding
, default_qty_value
میں پیرامیٹرزstrategy
ہم ٹیسٹ کے لئے مندرجہ ذیل کوڈ استعمال کرتے ہیں:
/*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
پیرامیٹر 3 کے طور پر، ہم ایک ہی سمت میں تجارت کی زیادہ سے زیادہ تعداد 3 پر مقرر. تو چار میں سے ایکstrategy.entry
مثال میں حکم کے آپریشنز پر عملدرآمد نہیں کیا جاتا ہے. ہم نے بھی وضاحت کی ہے کیونکہdefault_qty_value
پیرامیٹر 0.1، یہ ہونا چاہئےstrategy.entry
ID کے ساتھ آپریشنlong1
اس کا ڈیفالٹ آرڈر سائز 0.1 ہے۔strategy.entry
جب ہم وضاحت فنکشن کالdirection
بطورstrategy.long
، تو backtest ٹیسٹ احکامات تمام خرید احکامات ہیں.
نوٹ کریں کہ آرڈر آپریشنstrategy.entry("long3", ...
کوڈ میں دو بار بلایا جاتا ہے، ایک ہی ID کے لئے:long3
، پہلاstrategy.entry
حکم آپریشن بھرا ہوا نہیں تھا، اور دوسری کال کرنے کے لئےstrategy.entry
ایک اور صورت میں، مثال کے طور پر، اگر ID strategy.entry
strategy.close
کےstrategy.close
فنکشن کا استعمال داخلہ پوزیشن کو مخصوص شناختی ID کے ساتھ بند کرنے کے لئے کیا جاتا ہے۔ اہم پیرامیٹرز یہ ہیں:id
, when
, qty
, qty_percent
.
پیرامیٹرز:
id
: داخلہ ID جو بند کرنے کی ضرورت ہے وہ ID ہے جسے ہم داخلہ آرڈر فنکشن کا استعمال کرتے ہوئے پوزیشن کھولتے وقت بتاتے ہیں ، جیسےstrategy.entry
.when
: عملدرآمد کی شرائطqty
: بند پوزیشنوں کی تعدادqty_percent
: بند پوزیشنوں کا فیصدآئیے ایک مثال کے ذریعے اس فنکشن کے استعمال کی تفصیلات سے واقف ہوں:
کے/*backtest ... */
کوڈ میں ہے ترتیب کی معلومات کے لئےFMZ.COMبین الاقوامی ویب سائٹ backtest، آپ اسے حذف کر سکتے ہیں اور مارکیٹ، قسم، وقت کی حد اور دیگر معلومات آپ کو ٹیسٹ کرنے کی ضرورت مقرر.
/*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") // Multiple entry orders, no qty parameters specified, close all
// strategy.close() // Without specifying the id parameter, the current position will be closed
// strategy.close("long2") // If a non-existent id is specified then nothing is done
// strategy.close("long1", qty=0.15) // Specify qty parameters to close a position
// strategy.close("long1", qty_percent=50) // qty_percent is set to 50 to close 50% of the positions marked by long1
// strategy.close("long1", qty_percent=80, when=close<open) // Specify the parameter when, change it to close>open and it won't trigger
enableStop := true
ٹیسٹ کی حکمت عملی کے اندراج ID strategy.close
ایک پوزیشن کو بند کرتے وقت backtest کے مختلف نتائج مقرر کرنے کے لئے تقریب.strategy.close
فنکشن میں پوزیشن بند کرنے کے آرڈر کی قیمت کی وضاحت کرنے کے لئے کوئی پیرامیٹرز نہیں ہیں ، یہ فنکشن بنیادی طور پر موجودہ مارکیٹ کی قیمت پر فوری طور پر پوزیشن بند کرنے کے لئے استعمال ہوتا ہے۔
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
ID strategy.position_size
0 سے زیادہ ہے تو ID strategy.position_size < 0
، یعنی ایک مختصر پوزیشن رکھنے جب، موجودہ ہولڈنگ سمت میں تمام پوزیشن بند ہو جائے گا.enableStop := true
. حکمت عملی کے عملدرآمد کو روکتا ہے تاکہ لاگ ان کا مشاہدہ کیا جا سکے۔
یہ پایا جا سکتا ہے کہ تقریبstrategy.close_all
آرڈر بند کرنے کی قیمت کی وضاحت کرنے کے لئے کوئی پیرامیٹر نہیں ہے، اس فنکشن کو بنیادی طور پر موجودہ مارکیٹ کی قیمت پر فوری طور پر پوزیشن بند کرنے کے لئے استعمال کیا جاتا ہے.
strategy.exit
کےstrategy.exit
فنکشن ایک انٹری پوزیشن بند کرنے کے لئے استعمال کیا جاتا ہے.strategy.close
اورstrategy.close_all
افعال فوری طور پر موجودہ مارکیٹ کی قیمت پر ایک پوزیشن بند.strategy.exit
تقریب پیرامیٹر کی ترتیبات کے مطابق پوزیشن بند کرے گا.
پیرامیٹرز:
id
: موجودہ بندش کی شرط کے آرڈر کا آرڈر شناختی 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") // If only one id parameter is specified, the exit order is invalid, and the parameters profit, limit, loss, stop and other exit conditions also need to be set at least one, otherwise it is also invalid
strategy.exit("exit1", "long1", profit=50) // Since the long1 entry order is not filled, the exit order with ID exit1 is also on hold until the corresponding entry order is filled before exit1 is placed
strategy.exit("exit2", "long2", qty=0.1, profit=100) // Specify the parameter qty to close 0.1 positions in the position with ID long2
strategy.exit("exit3", "long3", qty_percent=50, limit=strategy.opentrades.entry_price(findOrderIdx("long3")) + 1000) // Specify the parameter qty_percent to close 50% of the positions in the position with ID long3
isExit := true
if bar_index == 0
runtime.log("The price per point:", syminfo.mintick) // The price per point is related to the "Pricing Currency Precision" parameter setting on the Pine language template parameters
ہم ریئل ٹائم پرائس ماڈل کا استعمال بیک ٹسٹ کے لئے کرتے ہیں، ٹیسٹ کی حکمت عملی 3 انٹری آپریشنز کے ساتھ شروع ہوتی ہے (strategy.entry
فنکشن) ، اورlong1
کے ساتھ جان بوجھ کر مقرر کیا جاتا ہےlimit
ایک زیر التواء آرڈر کی قیمت کے ساتھ پیرامیٹر 1، تاکہ یہ نہیں بھرا جا سکتا ہے. پھر مشروط باہر نکلیں تقریب کی جانچ کریںstrategy.exit
ہم نے strategy.exit
فنکشن بھی زیادہ پیچیدہ ٹریلنگ سٹاپ پیرامیٹرز ہے:trail_price
, trail_points
, trail_offset
ان کے استعمال کو سیکھنے کے لئے اس مثال میں بھی تجربہ کیا جا سکتا ہے.
strategy.cancel
کےstrategy.cancel
افعال تمام پہلے سے زیر التواء احکامات کو منسوخ / روکنے کے لئے استعمال کیا جاتا ہے. یہ افعال:strategy.order
, strategy.entry
, strategy.exit
لاگ ان آئی ڈی پیدا کر سکتے ہیں۔ اس فنکشن کے اہم پیرامیٹرز یہ ہیں:id
, when
.
پیرامیٹرز:
id
: داخلہ 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