ایف ایم زیڈ کوانٹ کا پائن زبان تعارفی سبق

مصنف:لیدیہ, تخلیق: 2022-09-23 15:23:34, تازہ کاری: 2024-02-27 16:47:41

لہذا ہم دیکھتے ہیں کہ ڈرائنگ کی تین لائنوں 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 ?:

اعلی ترجیح والے اظہار پہلے حساب لگایا جاتا ہے، اور اگر ترجیحات ایک جیسی ہیں، تو یہ بائیں سے دائیں طرف سے جائزہ لیا جاتا ہے. اگر آپ ایک خاص حصہ کو پہلے جائزہ لینے کے لئے مجبور کرنا چاہتے ہیں، تو آپ استعمال کر سکتے ہیں()اظہار کو لپیٹنے کے لئے پہلے اندازہ کرنے کے لئے حصہ مجبور کرنے کے لئے.

متغیرات

متغیر اعلامیہ

ہم نے پہلے بھی مارکر کے تصور کا مطالعہ کیا ہے، جو متغیر کے نام کے طور پر استعمال ہوتا ہے، یعنی متغیر ایک مارکر ہے جو ایک قدر رکھتا ہے۔ تو ہم متغیر کا اعلان کیسے کرتے ہیں؟ متغیرات کا اعلان کرنے کے قواعد کیا ہیں؟

  • اعلان موڈ: متغیر کا اعلان کرتے وقت سب سے پہلے لکھنا declaration mode ہے۔ متغیرات کے لئے تین اعلان کے طریقے ہیں:

    1. مطلوبہ لفظ استعمال کریںvar.
    2. مطلوبہ لفظ استعمال کریںvarip.
    3. کچھ بھی نہ لکھیں.

    کے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)

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

img

ہم ان پٹ فنکشن کے کئی اہم پیرامیٹرز متعارف کراتے ہیں:

  • defval: ان پٹ فنکشن کی طرف سے مقرر حکمت عملی پیرامیٹر کے اختیارات کے لئے ڈیفالٹ قدر، پائن زبان میں بلٹ ان متغیرات، عددی اقدار، اور تاروں کی حمایت.
  • عنوان: براہ راست تجارت / بیک ٹسٹنگ کے دوران حکمت عملی کے انٹرفیس پر دکھائے جانے والے حکمت عملی کے پیرامیٹر کا نام۔
  • ٹول ٹپ: حکمت عملی کے پیرامیٹرز کے لئے ٹول ٹپ کی معلومات، جب ماؤس حکمت عملی پیرامیٹر کے اوپر ہوور کرتا ہے تو، پیرامیٹر کی ترتیب کی ٹیکسٹ کی معلومات ظاہر کی جائے گی.
  • گروپ: حکمت عملی کے پیرامیٹر گروپ کا نام، جسے حکمت عملی کے پیرامیٹرز کے لیے استعمال کیا جا سکتا ہے۔

انفرادی متغیر اعلان اور تفویض کے علاوہ ، متغیرات کے ایک گروپ کا اعلان کرنے اور ان کو پائن زبان میں تفویض کرنے کا ایک طریقہ بھی ہے:

[Variable A, Variable B, Variable C] = function or structure, such as ```if```, ```for```, ```while``` or ```switch```

سب سے زیادہ عام ہے جب ہم استعمال کرتے ہیںta.macdMACD اشارے کا حساب لگانے کے لئے فنکشن، کیونکہ 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")

سوئچ بیان

سوئچ بیان بھی ایک شاخ ساختہ بیان ہے ، جس کا استعمال کچھ شرائط کے مطابق انجام دینے کے لئے مختلف راستوں کو ڈیزائن کرنے کے لئے کیا جاتا ہے۔ عام طور پر ، سوئچ بیان میں مندرجہ ذیل اہم علمی نکات ہوتے ہیں۔

  1. سوئچ بیان، اگر بیان کی طرح، بھی ایک قدر واپس کر سکتے ہیں.
  2. دیگر زبانوں میں سوئچ بیانات کے برعکس ، جب سوئچ تعمیرات پر عملدرآمد کیا جاتا ہے تو ، اس کے کوڈ کا صرف ایک مقامی بلاک پر عملدرآمد کیا جاتا ہے ، لہذا توڑ بیان غیر ضروری ہے (یعنی ، توڑ جیسے مطلوبہ الفاظ لکھنے کی ضرورت نہیں ہے) ۔
  3. سوئچ کی ہر شاخ ایک مقامی کوڈ بلاک لکھ سکتی ہے ، اس مقامی کوڈ بلاک کی آخری سطر واپسی کی قیمت ہے (یہ اقدار کا ایک ٹپل ہوسکتا ہے) ۔ اگر کوئی بھی شاخ شدہ مقامی کوڈ بلاک عمل میں نہیں آیا تو واپس کرتا ہے۔
  4. سوئچ ڈھانچے میں اظہار اس پوزیشن کا تعین کرتا ہے جس میں کوئی تار، متغیر، اظہار یا فنکشن کال لکھ سکتا ہے۔
  5. سوئچ ایک واپسی کی قیمت کی وضاحت کرنے کی اجازت دیتا ہے جو ڈھانچے میں کوئی اور صورت نہیں ہے جب استعمال کرنے کے لئے ڈیفالٹ قیمت کے طور پر کام کرتا ہے.

سوئچ کی دو شکلیں ہیں، آئیے ان کے استعمال کو سمجھنے کے لئے مثالوں کو ایک ایک کرکے دیکھتے ہیں۔

  1. اے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)

ایف ایم زیڈ پر کوئی غلطی رپورٹ نہیں کی جائے گی، لیکن تجارتی نقطہ نظر پر غلطی کی اطلاع دی جائے گی۔ کیونکہ اگر شاخ کی طرف سے واپس آنے والی قسم متضاد ہے.

  1. 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] کی شکل میں) واپس کرسکتا ہے۔ جیسا کہ مندرجہ بالا جعلی کوڈ میں واپسی کی قیمت پوزیشن میں تفویض کردہ متغیر کی طرح۔ فور اسٹیٹمنٹ کے بعد count متغیر ہوتا ہے جو لوپس کی تعداد کو کنٹرول کرنے ، دیگر اقدار کا حوالہ دینے وغیرہ کے لئے استعمال ہوتا ہے۔ count متغیر کو لوپ شروع ہونے سے پہلے ابتدائی گنتی تفویض کی جاتی ہے ، پھر قدم کی لمبائی کی ترتیب کے مطابق اضافہ ہوتا ہے ، اور جب count متغیر حتمی گنتی سے بڑا ہوتا ہے تو لوپ رک جاتا ہے۔

کے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.

لوپ کے لئے درخواست

ہم پائین زبان میں فراہم کردہ بلٹ ان فنکشنز کا استعمال لوپ منطق کے کچھ حساب کتاب کو مکمل کرنے کے لئے کرسکتے ہیں ، یا تو براہ راست لوپ ڈھانچے کا استعمال کرتے ہوئے لکھا جاتا ہے یا بلٹ ان فنکشنز کا استعمال کرتے ہوئے پروسیس کیا جاتا ہے۔ آئیے دو مثالیں لیتے ہیں:

  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)

مثال میں رقم کا حساب لگانے اور پھر اوسط قدر کا حساب لگانے کے لئے ایک فار لوپ کا استعمال کیا گیا ہے۔

بلٹ ان فنکشن کا استعمال کرتے ہوئے براہ راست چلتی اوسط حساب کریں:

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

بلٹ ان فنکشن استعمال کریںta.smaبراہ راست چلتی اوسط اشارے کا حساب لگانے کے لئے۔ ظاہر ہے ، چلتی اوسط کا حساب لگانے کے لئے بلٹ ان فنکشن کا استعمال کرنا آسان ہے۔ چارٹ پر موازنہ کرکے ، یہ دیکھا جاسکتا ہے کہ حساب کتاب کے نتائج بالکل ایک جیسے ہیں۔

  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)
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 نکات کے اطلاق پر مبنی ہے:

  1. کچھ آپریشنز اور صفوں کے لئے حساب کے لئے.
  2. تاریخ کا جائزہ لینے کے ل for ، مثال کے طور پر ، یہ معلوم کرنے کے لئے کہ پچھلے کتنے اعلی نقطہ موجودہ BAR s کے اعلی نقطہ سے زیادہ ہیں۔ چونکہ موجودہ BAR کا اعلی نقطہ صرف اس BAR پر جانا جاتا ہے جہاں اسکرپٹ چل رہا ہے ، لہذا وقت میں پچھلے BARs کو واپس کرنے اور تجزیہ کرنے کے لئے لوپ کی ضرورت ہے۔
  3. جب پائن زبان کے بلٹ ان افعال ماضی کے BARs کے لئے حساب کتاب مکمل نہیں کرسکتے ہیں۔

جبکہ statemnet

کے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 لوپ کے قواعد سے ملتے جلتے ہیں۔ لوپ باڈی کے لوکل کوڈ بلاک کی آخری سطر ریٹرن ویلیو ہے ، جو متعدد اقدار واپس کر سکتی ہے۔ جب loop condition درست ہو تو لوپ کو انجام دیں ، اور جب شرط غلط ہو تو لوپ کو روکیں۔ توڑ اور جاری رکھنے کے بیانات کو بھی لوپ باڈی میں استعمال کیا جاسکتا ہے۔

ہم اب بھی مظاہرے کے لئے چلتی اوسط کا حساب کرنے کی مثال استعمال کریں گے:

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)

صفوں کو شامل کرنے اور حذف کرنے کے افعال

  1. صفوں کے جمع کرنے کے عمل سے متعلق افعال:

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

  1. صفوں کو حذف کرنے کے عمل سے متعلق افعال:

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.jointo ایک صف کے تمام عناصر کو ایک تار میں جوڑتا ہے۔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")

افعال

اپنی مرضی کے افعال

پائن زبان کو کسٹم فنکشنز کے ساتھ ڈیزائن کیا جاسکتا ہے۔ عام طور پر پائن زبان میں کسٹم فنکشنز پر مندرجہ ذیل اصول لاگو ہوتے ہیں:

  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)

ایک فنکشن تیز لائن، سست لائن اور دو EMA اوسط کا حساب لگا سکتا ہے.

بلٹ ان افعال

بلٹ ان افعال آسانی سے میں پایا جا سکتا ہےFMZ PINE اسکرپٹ دستاویز.

پائن زبان میں بلٹ ان افعال کی درجہ بندی:

  1. سٹرنگ پروسیسنگ فنکشنstr. series.
  2. رنگ قدر پروسیسنگ فنکشنcolor. series.
  3. پیرامیٹر ان پٹ فنکشنinput. series.
  4. اشارے کے حساب کا کامta. series.
  5. ڈرائنگ فنکشنplot. series.
  6. صف ہینڈلنگ فنکشنarray. series.
  7. تجارت سے متعلق افعالstrategy. series.
  8. ریاضیاتی کارروائیوں سے متعلق افعالmath. series.
  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فنکشن بلایا جاتا ہے، اور یہ بھی [Pine Language Trade-Class Library Template Arguments](کے ذریعے کنٹرول کیا جا سکتا ہےhttps://www.fmz.com/bbs-topic/9293#template-arguments-of-pine-language-trade-class-library) سیٹنگ کنٹرول, Pine language trade-class library template arguments کنٹرول ٹرانزیکشن کی مزید تفصیلات, آپ تفصیلات کے لئے منسلک دستاویزات چیک کر سکتے ہیں.

ہم پر توجہ مرکوز کریں گے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.entryID کے ساتھ آپریشنlong1اس کا ڈیفالٹ آرڈر سائز 0.1 ہے۔strategy.entryجب ہم وضاحت فنکشن کالdirectionبطورstrategy.long، تو backtest ٹیسٹ احکامات تمام خرید احکامات ہیں.

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


  1. 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 long1 کے ساتھ تین مسلسل طویل اندراجات دکھاتا ہے اور پھر مختلف پیرامیٹرز کا استعمالstrategy.closeایک پوزیشن کو بند کرتے وقت backtest کے مختلف نتائج مقرر کرنے کے لئے تقریب.strategy.closeفنکشن میں پوزیشن بند کرنے کے آرڈر کی قیمت کی وضاحت کرنے کے لئے کوئی پیرامیٹرز نہیں ہیں ، یہ فنکشن بنیادی طور پر موجودہ مارکیٹ کی قیمت پر فوری طور پر پوزیشن بند کرنے کے لئے استعمال ہوتا ہے۔


  1. 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.entryID long کے ساتھ اندراج تقریب پر عملدرآمد کیا جاتا ہے. ایک طویل پوزیشن کو برقرار رکھنے کے بعد،strategy.position_size0 سے زیادہ ہے تو ID short کے ساتھ انٹری فنکشن کو عمل میں لایا جاسکتا ہے ، چونکہ موجودہ لانگ پوزیشن برقرار ہے ، اس وقت اس شارٹنگ ریورس سگنل کے نتیجے میں لانگ پوزیشن بند ہوجائے گی اور پھر مخالف سمت میں شارٹ پوزیشن کھولی جائے گی۔ پھر ہم اگر شرط میں لکھتے ہیں کہ جبstrategy.position_size < 0، یعنی ایک مختصر پوزیشن رکھنے جب، موجودہ ہولڈنگ سمت میں تمام پوزیشن بند ہو جائے گا.enableStop := true. حکمت عملی کے عملدرآمد کو روکتا ہے تاکہ لاگ ان کا مشاہدہ کیا جا سکے۔

یہ پایا جا سکتا ہے کہ تقریبstrategy.close_allآرڈر بند کرنے کی قیمت کی وضاحت کرنے کے لئے کوئی پیرامیٹر نہیں ہے، اس فنکشن کو بنیادی طور پر موجودہ مارکیٹ کی قیمت پر فوری طور پر پوزیشن بند کرنے کے لئے استعمال کیا جاتا ہے.


  1. 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ان کے استعمال کو سیکھنے کے لئے اس مثال میں بھی تجربہ کیا جا سکتا ہے.


  1. 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

مزید