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

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

[TOC]

img

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

معاون ویڈیو سبق:https://www.youtube.com/watch?v=CA3SwJQb_1g

ایف ایم زیڈ کوانٹ ٹریڈنگ پلیٹ فارم پائن زبان کی حکمت عملی تحریر ، بیک ٹیسٹنگ ، اور پائن زبان کی حکمت عملیوں کی براہ راست تجارت کی حمایت کرتا ہے ، اور یہ پائن زبان کے نچلے ورژن کے ساتھ مطابقت رکھتا ہے۔ پائن زبان میں جمع اور پیوند شدہ بہت ساری پائن حکمت عملی (سکرپٹ) ہیں۔اسٹریٹیجی اسکوائرایف ایم زیڈ کوانٹ ٹریڈنگ پلیٹ فارم پر (FMZ.COM).

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

کچھ واضح اختلافات کا مختصر جائزہ:

    1. ایف ایم زیڈ پر پائن حکمت عملی ، کوڈ کے آغاز میں ورژن کی شناخت//@versionاورstrategy, indicatorکوڈ کے آغاز میں بیانات لکھنے کے لئے لازمی نہیں ہیں، FMZ حمایت نہیں کرتاimportدرآمد کرناlibraryفی الحال کام.

    یہ دیکھا جا سکتا ہے کہ کچھ حکمت عملی اس طرح لکھے گئے ہیں:

    //@version=5
    indicator("My Script", overlay = true)
    src = close
    a = ta.sma(src, 5)
    b = ta.sma(src, 50)
    c = ta.cross(a, b)
    plot(a, color = color.blue)
    plot(b, color = color.black)
    plotshape(c, color = color.red)
    

    یا اس طرح لکھیں:

    //@version=5
    strategy("My Strategy", overlay=true)
    
    longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
    if (longCondition)
        strategy.entry("My Long Entry Id", strategy.long)
    
    shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))
    if (shortCondition)
        strategy.entry("My Short Entry Id", strategy.short)
    

    ایف ایم زیڈ پر یہ آسان کیا جا سکتا ہے:

    src = close
    a = ta.sma(src, 5)
    b = ta.sma(src, 50)
    c = ta.cross(a, b)
    plot(a, color = color.blue, overlay=true)
    plot(b, color = color.black, overlay=true)
    plotshape(c, color = color.red, overlay=true)
    

    یا:

    longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
    if (longCondition)
        strategy.entry("My Long Entry Id", strategy.long)
    
    shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))
    if (shortCondition)
        strategy.entry("My Short Entry Id", strategy.short)
    
    1. حکمت عملی (سکرپٹ) کی کچھ تجارتی متعلقہ ترتیبات FMZ حکمت عملی انٹرفیس پر پائن زبان ٹریڈنگ کلاس لائبریری پیرامیٹرز کی طرف سے مقرر کی جاتی ہیں.
    • اختتامی قیمت ماڈل اور حقیقی وقت کی قیمت ماڈل ٹریڈنگ کے نقطہ نظر پر، ہم استعمال کر سکتے ہیںcalc_on_every_tickپیرامیٹرstrategyفنکشن حکمت عملی اسکرپٹ مقرر کرنے کے لئے حقیقی وقت میں حکمت عملی منطق کو چلانے کے لئے جب قیمت ہر بار بدل جاتا ہے. اس وقت،calc_on_every_tickپیرامیٹر پر مقرر کیا جانا چاہئےtrue.calc_on_every_tickڈیفالٹ پیرامیٹر ہےfalse، یعنی حکمت عملی منطق صرف اس وقت عمل میں لائی جاتی ہے جب حکمت عملی کی موجودہ K لائن BAR مکمل طور پر مکمل ہو جاتی ہے۔ ایف ایم زیڈ پر ، یہ پائن لینگویج ٹریڈنگ کلاس لائبریری ٹیمپلیٹ کے پیرامیٹرز کے ذریعہ مقرر کیا گیا ہے۔

      img

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

    • مستقبل کے معاہدے کا کوڈ اگر ایف ایم زیڈ پر ٹریڈنگ پروڈکٹ ایک معاہدہ ہے تو ، اس کی دو خصوصیات ہیں ، وہ بالترتیب ٹریڈنگ جوڑی اور معاہدہ کوڈ ہیں۔ تجارتی جوڑی کو واضح طور پر طے کرنے کے علاوہ ، حقیقی تجارت اور بیک ٹیسٹنگ کے دوران پائن لینگویج ٹریڈنگ کلاس لائبریری ٹیمپلیٹ کے پیرامیٹر مختلف قسم کا کوڈ میں مخصوص معاہدہ کوڈ بھی طے کرنا ضروری ہے۔ مثال کے طور پر ، دائمی معاہدے کے لئے ، میں درج کریںswap، اور معاہدے کا کوڈ اس بات پر منحصر ہے کہ آیا آپریٹنگ ایکسچینج کے پاس ایسا معاہدہ ہے۔ مثال کے طور پر ، کچھ تبادلے میں سہ ماہی معاہدے ہوتے ہیں ، آپ اس کو پُر کرسکتے ہیںquarterیہ معاہدہ کوڈز ایف ایم زیڈ کے جاوا اسکرپٹ / پطرون / سی ++ زبان API دستاویز میں بیان کردہ فیوچر معاہدے کوڈز کے مطابق ہیں۔

    دیگر ترتیبات کے لئے، جیسے کم سے کم آرڈر کی رقم، ڈیفالٹ آرڈر کی رقم، وغیرہ، براہ کرم پیرامیٹر کا تعارف دیکھیںپائن زبان ٹریڈ کلاس لائبریری کے ٹیمپلیٹ دلائلپائین زبان کی دستاویزات میں.

    1. FMZ توسیع کے لئے افعال:runtime.debug , runtime.log, runtime.errorڈیبگنگ کے لئے استعمال کیا جاتا ہے.

    ڈیبگنگ کے لئے ایف ایم زیڈ پلیٹ فارم میں 3 افعال شامل کیے گئے ہیں۔

    • runtime.debug: کنسول پر متغیر کی معلومات پرنٹ کریں، جو عام طور پر اس فنکشن کے ساتھ استعمال نہیں کیا جاتا ہے.

    • runtime.log: لاگ ان میں آؤٹ پٹ۔ ایف ایم زیڈ پر پائن زبان کے مخصوص افعال۔

      runtime.log(1, 2, 3, close, high, ...), Multiple parameters can be passed.
      
    • runtime.error: اس کے نتیجے میں ایک رن ٹائم غلطی ہو گی جب پیغام پیرامیٹر میں بیان کردہ غلطی کا پیغام بلایا جائے گا۔

      runtime.error(message)
      
    1. کےoverlayپیرامیٹر کچھ ڈرائنگ افعال میں توسیع کی جاتی ہے

    FMZ پر پائن زبان میں، ڈرائنگ افعالplot, plotshape, plotchar، وغیرہ شامل کیا ہےoverlayپیرامیٹر سپورٹ، مرکزی چارٹ یا ذیلی چارٹ پر ڈرائنگ کی وضاحت کرنے کی اجازت دیتا ہے.overlayپر مقرر کیا گیا ہےtrueمرکزی چارٹ پر ڈرائنگ کرنے کے لئے، اورfalseذیلی چارٹ پر ڈرائنگ کرنے کے لئے مقرر کیا جاتا ہے، جس میں FMZ پر پائن کی حکمت عملی کو ایک ہی وقت میں مرکزی چارٹ اور ذیلی چارٹ ڈرائنگ کرنے کے قابل بناتا ہے.

    1. کی قیمتsyminfo.mintickبلٹ ان متغیر

    کے بلٹ ان متغیرsyminfo.mintickموجودہ علامت کے لئے کم سے کم ٹِک ویلیو کے طور پر بیان کیا گیا ہے۔ اس قدر کو پائن لینگویج ٹریڈنگ کلاس لائبریری میں ٹیمپلیٹ پیرامیٹر قیمتوں کا تعین کرنسی کی درستگی کے ذریعہ کنٹرول کیا جاسکتا ہےبوٹ/بیک ٹسٹقیمتوں کا تعین کرنسی کی درستگی کی ترتیب 2 کا مطلب یہ ہے کہ قیمت تجارت کے دوران دوسری اعشاریہ مقام تک درست ہے ، اور کم سے کم قیمت کی تبدیلی کا یونٹ 0.01 ہے۔syminfo.mintick0.01 ہے

    1. FMZ پائن اسکرپٹ میں اوسط قیمت تمام کمیشن شامل ہیں

    مثال کے طور پر: آرڈر کی قیمت 8000 ہے، فروخت کی سمت، مقدار 1 لاٹ (ٹوک، شیٹ) ہے، ٹرانزیکشن کے بعد اوسط قیمت 8000 نہیں ہے، لیکن 8000 سے کم ہے (لاگت میں ہینڈلنگ فیس شامل ہے).

پائن زبان کی بنیادی باتیں

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

ماڈل عملدرآمد

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

plot(bar_index, "bar_index")

img

کےplotفنکشن ہم مستقبل میں زیادہ استعمال کریں گے افعال میں سے ایک ہے. استعمال بہت آسان ہے، یہ ان پٹ پیرامیٹرز کے مطابق چارٹ پر ایک لائن کھینچنے کے لئے ہے، ان پٹ کے اعداد و شمار ہےbar_index، اور لائن کا نام ہےbar_indexیہ دیکھا جا سکتا ہے کہ پہلی بار پر بار_انڈیکس نامی لائن کی قدر 0 ہے، اور یہ بار بڑھنے کے ساتھ ہی 1 سے دائیں بڑھتی ہے.

کیونکہ حکمت عملی کی ترتیبات مختلف ہیں، حکمت عملی کے ماڈل عملدرآمد کے طریقوں مختلف ہیں، وہ میں تقسیم کیا جا سکتا ہےclosing price modelاورreal-time price modelہم نے بھی مختصر طور پر ان کے تصورات سے پہلے متعارف کرایا ہے.

  • اختتامی قیمت کا ماڈل

    جب حکمت عملی کا کوڈ عمل میں لایا جاتا ہے تو ، موجودہ K لائن بار کا دورانیہ مکمل طور پر عمل میں آجاتا ہے ، اور جب K لائن بند ہوجاتی ہے تو ، K لائن کا دورانیہ مکمل ہوجاتا ہے۔ اس وقت ، پائن حکمت عملی کا منطق ایک بار عمل میں لایا جاتا ہے ، اور ٹرگر شدہ تجارتی سگنل اگلے K لائن بار کے آغاز پر عمل میں لایا جائے گا۔

  • ریئل ٹائم قیمت ماڈل

    جب حکمت عملی کا کوڈ عمل میں لایا جاتا ہے تو ، قطع نظر اس سے کہ موجودہ K لائن بار بند ہے یا نہیں ، پائین حکمت عملی کا منطق ہر بار جب مارکیٹ بدل جاتی ہے تو عمل میں لایا جائے گا ، اور ٹرگر شدہ تجارتی سگنل فوری طور پر عمل میں لایا جائے گا۔

جب پائن زبان کی حکمت عملی چارٹ پر بائیں سے دائیں کی طرف سے عملدرآمد کیا جاتا ہے، چارٹ پر K لائن سلاخوں میں تقسیم کر رہے ہیںHistorical BarsاورReal-time Bars:

  • تاریخی بار

    جب حکمت عملی ٹِک ماڈل پر مقرر کی جاتی ہے اور عملدرآمد شروع ہوتا ہے تو، چارٹ پر تمام K لائن بارز سوائے سب سے دائیں ایک کے ہیںHistorical Bars. حکمت عملی منطق ہر پر صرف ایک بار عملدرآمد کیا جاتا ہےhistorical bar. جب حکمت عملی Bar ماڈل پر مقرر کیا جاتا ہے اور عملدرآمد شروع ہوتا ہے، چارٹ پر تمام سلاخوں ہیںhistorical bars. حکمت عملی منطق ہر پر صرف ایک بار عملدرآمد کیا جاتا ہےhistorical bar.

    تاریخی بار پر مبنی حساب کتاب: حکمت عملی کا کوڈ تاریخی بار کی بندش کی حالت میں ایک بار عمل میں لایا جاتا ہے، اور پھر حکمت عملی کا کوڈ اگلے تاریخی بار میں عمل میں لایا جاتا ہے جب تک کہ تمام تاریخی سلاخوں کو ایک بار عمل میں نہ لایا جائے۔

  • ریئل ٹائم بار

    جب حکمت عملی کو دائیں طرف آخری K لائن بار پر انجام دیا جاتا ہے تو ، بار ایک ریئل ٹائم بار ہے۔ ریئل ٹائم بار بند ہونے کے بعد ، بار ایک منظور شدہ ریئل ٹائم بار بن جاتا ہے (تاریخی بار بن جاتا ہے۔ چارٹ کے دائیں طرف ایک نیا ریئل ٹائم بار تیار کیا جائے گا۔

    جب حکمت عملی ٹاک ماڈل پر مقرر کی جاتی ہے اور عملدرآمد شروع ہوتا ہے، حکمت عملی منطق ریئل ٹائم بار پر ہر مارکیٹ کی تبدیلی کے لئے ایک بار عملدرآمد کیا جائے گا. جب حکمت عملی کو Bar Model پر سیٹ کیا جاتا ہے اور عملدرآمد شروع ہوتا ہے تو ، چارٹ پر ریئل ٹائم بار نہیں دکھایا جائے گا۔

    ریئل ٹائم بار پر مبنی حساب کتاب: اگر حکمت عملی کو Bar Model پر سیٹ کیا گیا ہے اور چارٹ میں ریئل ٹائم بارز نہیں دکھائے جاتے ہیں تو ، موجودہ بار بند ہونے پر حکمت عملی کا کوڈ صرف ایک بار عمل میں لایا جائے گا۔ اگر حکمت عملی ٹاک ماڈل پر سیٹ کی جاتی ہے تو ، ریئل ٹائم بار پر حساب کتاب تاریخی بار سے بالکل مختلف ہے ، اور حکمت عملی کا کوڈ براہ راست ٹریڈنگ باروں پر ہر مارکیٹ کی تبدیلی کے لئے ایک بار عمل میں لایا جائے گا۔ مثال کے طور پر ، بلٹ ان متغیراتhigh, low, closeتاریخی باروں پر طے ہوتے ہیں ، اور یہ اقدار ہر بار تبدیل ہوسکتی ہیں جب مارکیٹ ریئل ٹائم باروں پر بدل جاتی ہے۔ لہذا ، ان اقدار کی بنیاد پر حساب کتاب کرنے والے اشارے جیسے اعداد و شمار بھی حقیقی وقت میں بدلیں گے۔ ریئل ٹائم بار پر ،closeہمیشہ موجودہ تازہ ترین قیمت کی نمائندگی کرتا ہے، اورhighاورlowہمیشہ موجودہ ریئل ٹائم بار کے آغاز کے بعد سے حاصل کردہ سب سے زیادہ نقطہ اور سب سے کم نقطہ کی نمائندگی کرتے ہیں۔ یہ بلٹ ان متغیرات ریئل ٹائم بار کی آخری تازہ کاری کے وقت کی حتمی قیمت کی نمائندگی کرتے ہیں۔

    ریئل ٹائم بار (ریئل ٹائم پرائس ماڈل) پر حکمت عملیوں پر عملدرآمد کرتے وقت رول بیک میکانزم: ریئل ٹائم بار عملدرآمد کے دوران ، حکمت عملی کی ہر نئی تکرار سے پہلے صارف کے ذریعہ بیان کردہ متغیرات کو ری سیٹ کرنا رول بیک کہا جاتا ہے۔ آئیے مندرجہ ذیل ٹیسٹ کوڈ کی ایک مثال کے ساتھ رول بیک میکانزم کو سمجھیں۔

    توجہ:

    /*backtest 
    ...
    ..
    .
    */
    

    پیکیج کا مواد بیک ٹیسٹ کی ترتیب کی معلومات ہے جو ایف ایم زیڈ پلیٹ فارم پر کوڈ کی شکل میں محفوظ ہے۔

    /*backtest
    start: 2022-06-03 09:00:00
    end: 2022-06-08 15:00:00
    period: 1m
    basePeriod: 1m
    exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
    */
    
    var n = 0
    if not barstate.ishistory
        runtime.log("before n + 1, n:", n, " current bar_index:", bar_index)
        n := n + 1
        runtime.log("after n + 1, n:", n, " current bar_index:", bar_index)
      
    plot(n, title="n")
    

    img

ہم صرف حقیقی وقت بارز کے دوران پھانسی دی منظر کا جائزہ لیں، تو ہم استعمال کرتے ہیںnot barstate.ishistoryاظہار صرف حقیقی وقت بار میں متغیر n کے جمع کو محدود کرنے کے لئے، اور استعمالruntime.logجمع کرنے کے آپریشن سے پہلے اور بعد میں حکمت عملی لاگ میں معلومات کو آؤٹ پٹ کرنے کے لئے تقریب.plot، یہ دیکھا جاسکتا ہے کہ جب حکمت عملی تاریخی باروں میں چل رہی ہے تو n ہمیشہ 0 ہوتا ہے۔ جب ریئل ٹائم بار کو عمل میں لایا جاتا ہے تو ، 1 کو n میں شامل کرنے کا عمل شروع ہوجاتا ہے ، اور 1 کو n میں شامل کرنے کا عمل اس وقت عمل میں لایا جاتا ہے جب حکمت عملی کو ریئل ٹائم بار کے ہر راؤنڈ میں عمل میں لایا جاتا ہے۔ یہ لاگ پیغام سے مشاہدہ کیا جاسکتا ہے کہ جب حکمت عملی کا کوڈ ہر راؤنڈ میں دوبارہ عمل میں لایا جاتا ہے تو پچھلی بار عملدرآمد کی حکمت عملی کے ذریعہ آخر میں فراہم کردہ قدر میں n کو ری سیٹ کیا جائے گا۔ جب حکمت عملی کا کوڈ آخری بار ریئل ٹائم بار پر عمل میں لایا جاتا ہے تو این ویلیو اپ ڈیٹ پیش کیا جائے گا ، لہذا آپ دیکھ سکتے ہیں کہ چارٹ پر ریئل ٹائم بار سے شروع ہونے والے بار کے ہر اضافے کے ساتھ منحنی n کی قیمت میں 1 کا اضافہ ہوتا ہے۔

خلاصہ:

  1. حکمت عملی کا کوڈ ہر بار ایک بار عمل میں لایا جاتا ہے جب مارکیٹ کو اپ ڈیٹ کیا جاتا ہے جب حکمت عملی ریئل ٹائم بار میں عملدرآمد شروع ہوتی ہے۔
  2. جب ریئل ٹائم بار میں عملدرآمد کیا جاتا ہے تو ، حکمت عملی کا کوڈ عملدرآمد ہونے سے پہلے متغیرات کو ہر بار پیچھے ہٹایا جاتا ہے۔
  3. جب ریئل ٹائم بار میں عملدرآمد کیا جاتا ہے تو ، متغیرات ایک بار جمع کروائے جاتے ہیں جب اختتام کو اپ ڈیٹ کیا جاتا ہے۔

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

var n = 0
if not barstate.ishistory
    runtime.log("before n + 1, n:", n, " current bar_index:", bar_index)
    n := open > close ? n + 1 : n
    runtime.log("after n + 1, n:", n, " current bar_index:", bar_index)
  
plot(n, title="n")

وقت A کا اسکرین شاٹimg

وقت B کا اسکرین شاٹimg

ہم نے صرف جملہ میں ترمیم کی:n := open > close ? n + 1 : n، صرف 1 کو n میں شامل کریں جب موجودہ ریئل ٹائم بار منفی لائن ہے (یعنی ، افتتاحی قیمت بند ہونے کی قیمت سے زیادہ ہے۔ یہ دیکھا جاسکتا ہے کہ پہلے چارٹ (وقت A) میں ، چونکہ اس وقت افتتاحی قیمت بند ہونے کی قیمت (منفی لائن) سے زیادہ تھی ، لہذا n 1 کی طرف سے جمع ہوا ، اور چارٹ منحنی خطوط پر دکھائے جانے والے n کی قیمت 5 تھی۔ پھر مارکیٹ بدل گئی اور قیمت کو اپ ڈیٹ کیا گیا جیسا کہ دوسرے چارٹ (وقت B) میں دکھایا گیا ہے۔ اس وقت ، افتتاحی قیمت بند ہونے کی قیمت (مثبت لائن) سے کم ہے ، اور n قدر 1 کی طرف بڑھنے کے بغیر پیچھے ہٹ جاتی ہے۔ چارٹ میں n کا منحنی خطوط بھی فوری طور پر دوبارہ تیار کیا جاتا ہے ، اور منحنی خطوط پر n کی قدر 4 ہے۔ لہذا ، کراس ڈاؤن اور ریئل ٹائم سلاخوں پر دکھائے جانے والے سگنل ، غیر یقینی ہیں اور تبدیل ہوسکتے ہیں۔

  • افعال میں متغیر سیاق و سباق

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

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

    یہ سمجھنا مشکل ہے؟ کوئی بات نہیں، ہم FMZ پر چل رہا ایک ٹیسٹ کوڈ کے ساتھ اس کا پتہ چل جائے گا:

    /*backtest
    start: 2022-06-03 09:00:00
    end: 2022-06-08 15:00:00
    period: 1m
    basePeriod: 1m
    exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
    */
      
    f(a) => a[1]
    f2() => close[1]  
    
    oneBarInTwo = bar_index % 2 == 0
    plotchar(oneBarInTwo ? f(close) : na, title = "f(close)", color = color.red, location = location.absolute, style = shape.xcross, overlay = true, char = "A")   
    plotchar(oneBarInTwo ? f2() : na, title = "f2()", color = color.green, location = location.absolute, style = shape.circle, overlay = true, char = "B")   
    plot(close[2], title = "close[2]", color = color.red, overlay = true)
    plot(close[1], title = "close[1]", color = color.green, overlay = true)
    

    بیک ٹسٹ چلانے کا اسکرین شاٹ

    img

    ٹیسٹ کوڈ نسبتا سادہ ہے، بنیادی طور پر دو طریقوں سے حوالہ کردہ اعداد و شمار کا جائزہ لینے کے لئے، یعنی:f(a) => a[1]اورf2() => close[1].

    • f(a) => a[1]: پیرامیٹرز کو منتقل کرنے کا طریقہ استعمال کریں، فنکشن کو واپس آتا ہےa[1] finally.

    • f2() => close[1]: بلٹ ان متغیر استعمال کریںcloseبراہ راست، اور تقریب کو واپس آتا ہےclose[1] finally.

کے[]علامت ڈیٹا سیریز متغیر کی تاریخی قیمت کی نشاندہی کرنے کے لئے استعمال کیا جاتا ہے ، اور بند [1] موجودہ اختتامی قیمت سے پہلے بار پر اختتامی قیمت کے اعداد و شمار کی نشاندہی کرتا ہے۔ ہمارا ٹیسٹ کوڈ چارٹ پر مجموعی طور پر 4 قسم کے اعداد و شمار کھینچتا ہے۔

  • plotchar(oneBarInTwo ? f(close) : na, title = "f(close)", color = color.red, location = location.absolute, style = shape.xcross, overlay = true, char = "A")ایک کردار A ڈرا، رنگ سرخ ہے، یہ ایکBarInTwo سچ ہے جب تیار کیا جاتا ہے، اور تیار پوزیشن (Y محور پر) ہے: کی طرف سے واپس کیا قدرf(close).

  • plotchar(oneBarInTwo ? f2() : na, title = "f2()", color = color.green, location = location.absolute, style = shape.circle, overlay = true, char = "B")ایک کردار B ڈرا، رنگ سبز ہے، یہ صرف اس وقت ڈرا جاتا ہے جب oneBarInTwo سچ ہے، اور ڈرا پوزیشن (Y محور پر) ہے: کی طرف سے واپس کیا قدرf2().

  • plot(close[2], title = "close[2]", color = color.red, overlay = true)ایک لکیر کھینچیں، رنگ سرخ ہے، اور کھینچی ہوئی پوزیشن (Y محور پر) ہے:close[2]، جو موجودہ بار (بائیں سے 2 بار گنتی) سے پہلے دوسری بار کی اختتامی قیمت ہے۔

  • plot(close[1], title = "close[1]", color = color.green, overlay = true)ایک لکیر کھینچیں، رنگ سبز ہے، اور کھینچی ہوئی پوزیشن (Y محور پر) ہے:close[1]، جو موجودہ بار سے پہلے پہلی بار کی اختتامی قیمت ہے (بائیں سے 1 بار گنتی) ۔

یہ حکمت عملی backtesting کے اسکرین شاٹ سے دیکھا جا سکتا ہے کہ اگرچہ دونوں تقریبf(a) => a[1]A مارکر اور تقریب ڈرائنگ کے لئے استعمال کیاf2() => close[1]اعداد و شمار کی سیریز پر تاریخی اعداد و شمار کا حوالہ دینے کے لئے بی مارکر استعمال کرنے کے لئے استعمال کیا جاتا ہے [1] ، چارٹ پر A اور B کے مارکر کی پوزیشن بالکل مختلف ہیں۔ A مارکر کی پوزیشن ہمیشہ سرخ لائن پر پڑتی ہے ، جو حکمت عملی میں کوڈ کے ذریعہ تیار کردہ لائن ہے۔plot(close[2], title = "close[2]", color = color.red, overlay = true)، لائن کھینچنے کے لئے استعمال کردہ اعداد و شمار ہےclose[2].

img

وجہ یہ ہے کہ K لائن بار کے اشاریہ، یعنی بلٹ میں متغیر کے ذریعے A اور B مارکر ڈرائنگ کی حساب کرنا ہےbar_indexA اور B مارکر ہر K لائن بار پر نہیں کھینچے جاتے ہیں (فنکشن کا حساب لگاتے وقت کھینچ لیا جاتا ہے) ۔ فنکشن کے ذریعہ حوالہ دی جانے والی قیمتf(a) => a[1]تقریب کی طرف سے حوالہ دیا قدر کے طور پر ایک ہی نہیں ہو گاf2() => close[1]اگر فنکشن کو ہر بار پر نہیں بلایا جاتا ہے (یہاں تک کہ اگر وہ دونوں ایک ہی انڈیکس جیسے [1] استعمال کرتے ہیں) ۔

  • ان کے نتائج کو درست طریقے سے حساب کرنے کے لئے کچھ بلٹ میں افعال ہر بار پر حساب کرنے کی ضرورت ہے

    اس صورت حال کو ایک سادہ مثال کے ساتھ واضح کرنے کے لئے:

    res = close > close[1] ? ta.barssince(close < close[1]) : -1
    plot(res, style = plot.style_histogram, color=res >= 0 ? color.red : color.blue)
    

    ہم فنکشن کال کوڈ لکھتے ہیںta.barssince(close < close[1])ایک ترنری آپریٹر میںcondition ? value1 : value2. اس کا سبب بنتا ہے ta.barssince تقریب صرف جب بلایا جائے گاclose > close[1]لیکنta.barssinceتقریب آخری بار کے بعد سے K لائنوں کی تعداد کا حساب کرنا ہےclose < close[1]جب ta.barssince فنکشن کو بلایا جاتا ہے تو ، یہ ہمیشہ قریب > قریب ہوتا ہے [1] ، یعنی ، موجودہ اختتامی قیمت پچھلے بار کی اختتامی قیمت سے زیادہ ہے۔ جب ta.barssince فنکشن کو بلایا جاتا ہے تو ، بند < بند [1] شرط قائم نہیں ہوتی ہے ، اور کوئی حالیہ پوزیشن نہیں ہوتی ہے جہاں یہ برقرار رہتی ہے۔

    ta.barssince: جب بلایا جاتا ہے تو ، فنکشن واپس کرتا ہے اگر موجودہ K لائن سے پہلے شرط کبھی پوری نہیں ہوئی ہے۔

جیسا کہ چارٹ میں دکھایا گیا ہے:

img

تو جب چارٹ تیار کیا جاتا ہے، صرف اعداد و شمار کے ساتھ ایک قدر کے لئے res متغیر (-1) تیار کیا جاتا ہے.

اس مسئلے سے بچنے کے لئے، ہم صرف لےta.barssince(close < close[1])فنکشن کو ٹرنری آپریٹر سے باہر کال کریں اور اسے کسی بھی ممکنہ مشروط شاخوں کے باہر لکھیں ، جس سے یہ ہر K لائن بار پر حساب کتاب انجام دے۔

a = ta.barssince(close < close[1])
res = close > close[1] ? a : -1
plot(res, style = plot.style_histogram, color=res >= 0 ? color.red : color.blue)

وقت کی سیریز

پائن زبان میں ٹائم سیریز کا تصور بہت اہم ہے ، اور یہ ایک ایسا تصور ہے جسے ہمیں پائن زبان سیکھتے وقت سمجھنا چاہئے۔ ٹائم سیریز ایک قسم نہیں ہے بلکہ وقت کے ساتھ ساتھ متغیرات کی مسلسل اقدار کو ذخیرہ کرنے کے لئے ایک بنیادی ڈھانچہ ہے۔ ہم جانتے ہیں کہ پائن اسکرپٹس چارٹ پر مبنی ہیں ، اور چارٹ میں دکھایا جانے والا سب سے بنیادی مواد K لائن چارٹ ہے۔ ٹائم سیریز جہاں ہر قدر کو K لائن بار کے ٹائم اسٹیمپ سے منسلک کیا جاتا ہے۔openپائن زبان کا ایک بلٹ ان متغیر (بلٹ ان) ہے ، اور اس کی ساخت ہر K لائن بار کی افتتاحی قیمت کی ٹائم سیریز کو اسٹور کرنا ہے۔ یہ سمجھا جاسکتا ہے کہopenموجودہ K لائن چارٹ کے آغاز میں پہلے بار سے لے کر بار تک تمام K لائن بارز کی افتتاحی قیمتوں کی نمائندگی کرتا ہے۔ اگر موجودہ K لائن چارٹ 5 منٹ کا عرصہ ہے تو ، جب ہم اقتباس (یا استعمال) کرتے ہیںopenپائن حکمت عملی کوڈ میں ، یہ K لائن بار کی افتتاحی قیمت ہے جب حکمت عملی کا کوڈ فی الحال عمل میں ہے۔ اگر آپ کسی وقت کی سیریز میں تاریخی اقدار کا حوالہ دینا چاہتے ہیں تو ، آپ کو K لائن بار کی افتتاحی قیمت کا استعمال کرنے کی ضرورت ہے۔[]آپریٹر. جب پائن حکمت عملی ایک مخصوص K لائن بار پر عملدرآمد کیا جاتا ہے، استعمالopen[1]پچھلے K- لائن بار کی افتتاحی قیمت (یعنی پچھلے K- لائن مدت کی افتتاحی قیمت) کا حوالہ دینے کے لئے جوopenوقت سیریز جس پر اس K لائن بار اسکرپٹ کی طرف سے فی الحال عملدرآمد کیا جا رہا ہے.

  • وقت سیریز پر متغیرات کمپیوٹنگ کے لئے بہت آسان ہیں چلو بلٹ ان تقریب لےta.cumمثال کے طور پر:

    ta.cum
    
    Cumulative (total) sum of `source`. In other words it's a sum of all elements of `source`.
    ta.cum(source) → series float
    RETURNS
    Total sum series.
    ARGUMENTS
    source (series int/float)
    SEE ALSO
    math.sum
    

    ٹیسٹ کوڈ:

    v1 = 1
    v2 = ta.cum(v1)
    plot(v1, title="v1")
    plot(v2, title="v2")
    plot(bar_index+1, title="bar_index")
    

    بہت سے بلٹ ان افعال ہیں جیسےta.cumکہ براہ راست وقت کی سیریز پر ڈیٹا پر عملدرآمد کر سکتے ہیں. مثال کے طور پر،ta.cumہر K لائن بار پر منتقل متغیرات کے مطابق اقدار کی جمع ہے، اور اگلے ہم اسے سمجھنے کے لئے آسان بنانے کے لئے ایک چارٹ کا استعمال کرتے ہیں.

    حکمت عملی آپریشن کا عمل بلٹ ان متغیر bar_index v1 v2
    حکمت عملی پہلی K لائن بار پر چلتا ہے 0 1 1
    حکمت عملی دوسری K لائن بار پر چلتا ہے 1 1 2
    حکمت عملی تیسری K لائن بار پر چلتا ہے 2 1 3
    حکمت عملی N + 1th K لائن بار پر چلتا ہے ن 1 N+1

    یہ دیکھا جاسکتا ہے کہ وی 1 ، وی 2 اور یہاں تک کہ بار_انڈیکس سبھی ٹائم سیریز ڈھانچے ہیں ، اور ہر بار پر متعلقہ ڈیٹا موجود ہے۔ چاہے ٹیسٹ کوڈ بار ماڈل یا ٹِک ماڈل استعمال کرے ، فرق صرف یہ ہے کہ آیا چارٹ پر ریئل ٹائم بار دکھایا گیا ہے۔ تیز بیک ٹیسٹ کے ل we ، ہم ٹیسٹ کے لئے ٹِک ماڈل استعمال کرتے ہیں۔

    img

    چونکہ متغیر v1 ہر بار پر 1 ہے، جبta.cum(v1)فنکشن پہلی K لائن بار پر عملدرآمد کیا جاتا ہے، صرف پہلی بار ہے، لہذا حساب نتیجہ 1 ہے اور متغیر v2 کو تفویض کیا جاتا ہے. کبta.cum(v1)دوسری K لائن بار پر عملدرآمد کیا جاتا ہے ، پہلے ہی 2 K لائن بارز موجود ہیں (پہلے سے متعلق بلٹ ان متغیر بار_انڈیکس 0 ہے ، اور دوسرا بلٹ ان متغیر بار_انڈیکس 1 ہے) ، لہذا حساب کتاب کا نتیجہ 2 ہے ، جو متغیر v2 کو تفویض کیا جاتا ہے ، اور اسی طرح۔ در حقیقت ، یہ مشاہدہ کیا جاسکتا ہے کہ v2 چارٹ میں K لائن بارز کی تعداد ہے ، کیونکہ K لائن کے انڈیکسbar_index0 سے اضافہ کیا جاتا ہے، پھرbar_index + 1اصل میں K لائن بار کی تعداد ہے. چارٹ پر، ہم بھی دیکھ سکتے ہیں کہ لائنوںv2اورbar_indexدراصل اوورلیپ کرتے ہیں۔

    img

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

    وقت کی سیریز پر متغیرات کا حساب بھی آپریٹرز کا استعمال کرتے ہوئے کیا جا سکتا ہے، جیسے کوڈ:ta.sma(high - low, 14)، بلٹ ان متغیر کو گھٹائیںhigh(کی لائن بار کی سب سے زیادہ قیمت) سےlow(K لائن بار کی سب سے کم قیمت) ، اور آخر میں استعمال کریںta.smaاوسط قدر کا حساب لگانے کے لئے فنکشن.

  • ایک فنکشن کال کا نتیجہ بھی وقت سیریز میں اقدار کے نشانات چھوڑ دے گا.

    v1 = ta.highest(high, 10)[1]
    v2 = ta.highest(high[1], 10)
    plot(v1, title="v1", overlay=true)
    plot(v2, title="v2", overlay=true)
    

    ٹیسٹ کوڈ backtesting کے دوران چلتا ہے، اور یہ مشاہدہ کیا جا سکتا ہے کہ اقدارv1اورv2ایک ہی ہیں، اور چارٹ پر ڈرائنگ لائنیں بھی مکمل طور پر ملتی جلتی ہیں. فنکشن کال کی طرف سے حساب نتیجہ وقت سیریز میں قدر کے نشانات چھوڑ دیں گے، جیسےta.highest(high, 10)کوڈta.highest(high, 10)[1]. فنکشن کال کی طرف سے شمار کیا نتیجہ بھی اس کی تاریخی قدر کا حوالہ دینے کے لئے [1] استعمال کر سکتے ہیں.ta.highest(high, 10)موجودہ بار کے پچھلے بار کے مساوی ہے، حساب کا نتیجہ ہےta.highest(high[1], 10)تو.ta.highest(high[1], 10)اورta.highest(high, 10)[1]بالکل برابر ہیں.

    آؤٹ پٹ معلومات کی توثیق کے لئے ایک اور ڈرائنگ فنکشن کا استعمال کریں:

    a = ta.highest(close, 10)[1]
    b = ta.highest(close[1], 10)
    plotchar(true, title="a", char=str.tostring(a), location=location.abovebar, color=color.red, overlay=true)
    plotchar(true, title="b", char=str.tostring(b), location=location.belowbar, color=color.green, overlay=true)
    

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

    img

اسکرپٹ کی ساخت

عمومی ساخت

سبق کے ابتدائی حصے میں ، ہم نے ایف ایم زیڈ اور ٹریڈنگ ویو پر پائن زبان کے استعمال میں کچھ اختلافات کا خلاصہ کیا ہے۔ جب ایف ایم زیڈ پر پائن کوڈ لکھتے ہو تو ، آپ ورژن نمبر کو چھوڑ سکتے ہیں ،indicator(), strategy()، اورlibrary()فی الحال معاونت نہیں ہے۔ یقینا ، پائن اسکرپٹس کے سابقہ ورژن کے ساتھ ہم آہنگ ہونے کے ل strategies ، حکمت عملی جیسے://@version=5, indicator(), strategy()بھی لکھا جا سکتا ہے. کچھ حکمت عملی کی ترتیبات بھی میں پیرامیٹرز گزرنے کی طرف سے مقرر کیا جا سکتا ہےstrategy() function.

<version>
<declaration_statement>
<code>

کے<version>ورژن کنٹرول کی معلومات کو خارج کر دیا جا سکتا ہے.

تبصرے

پائن زبان استعمال کرتا ہے//ایک سطر کے تبصرے کی علامت کے طور پر ، چونکہ پائن زبان میں کثیر سطر کی تبصرے کی علامت نہیں ہے۔ ایف ایم زیڈ تبصرے کی علامت کو بڑھا دیتا ہے۔/**/کثیر سطر کے تبصرے کے لیے۔

کوڈ

اسکرپٹ میں وہ لائنیں جو تبصرے یا کمپائلر ہدایات نہیں ہیں وہ بیانات ہیں ، جو اسکرپٹ کے الگورتھم کو نافذ کرتی ہیں۔ بیان ان مواد میں سے ایک ہوسکتا ہے۔

  • متغیر اعلامیہ
  • متغیرات کی دوبارہ تفویض
  • فنکشن کا اعلان
  • بلٹ ان فنکشن کالز، صارف کی وضاحت کردہ فنکشن کالز
  • if, for, whileیاswitchساخت

بیانات کو مختلف طریقوں سے ترتیب دیا جا سکتا ہے

  • کچھ بیانات کو ایک سطر میں ظاہر کیا جاسکتا ہے ، جیسے زیادہ تر متغیر اعلانات ، صرف ایک فنکشن کال پر مشتمل لائنیں ، یا سنگل لائن فنکشن اعلانات۔ دیگر ، جیسے ڈھانچے ، ہمیشہ متعدد لائنوں کی ضرورت ہوتی ہے ، کیونکہ انہیں مقامی بلاک کی ضرورت ہوتی ہے۔
  • اسکرپٹ کے عالمی دائرہ کار میں بیانات (یعنی وہ حصے جو مقامی بلاک کا حصہ نہیں ہیں) ایک کے ساتھ شروع نہیں ہو سکتےspaceیا ```tab` (ٹیب کی) ۔ ان کا پہلا حرف بھی لائن کا پہلا حرف ہونا چاہئے۔ پہلی پوزیشن سے شروع ہونے والی لائنیں ، تعریف کے مطابق ، اسکرپٹ کے عالمی دائرہ کار کا حصہ بن جاتی ہیں۔
  • ایک ساخت یا کثیر لائن تقریب کا اعلان ہمیشہ ایک کی ضرورت ہوتی ہےlocal blockایک مقامی بلاک کو ایک ٹیب یا چار خالی جگہوں کے ساتھ انڈینٹ کرنا ضروری ہے (دوسری صورت میں ، اسے پچھلی سطر کے مربوط کوڈ کے طور پر تجزیہ کیا جائے گا ، یعنی ، کوڈ کی پچھلی سطر کا مستقل مواد سمجھا جائے گا) ، اور ہر مقامی بلاک ایک مختلف مقامی دائرہ کار کی وضاحت کرتا ہے۔
  • متعدد ایک سطر کے بیانات کو ایک لائن میں ایک لائن میں منسلک کیا جاسکتا ہے جس میں کوما (,) کو علیحدہ کرنے والے کے طور پر استعمال کیا جاسکتا ہے۔
  • ایک سطر تبصرے پر مشتمل ہو سکتی ہے یا صرف تبصرے پر مشتمل ہو۔
  • لائنوں کو بھی لپیٹا جا سکتا ہے (متعدد لائنوں پر جاری).

مثال کے طور پر اس میں تین مقامی بلاکس شامل ہیں، ایک اپنی مرضی کے مطابق فنکشن کے اعلان میں، اور دو متغیر کے اعلان میں اگر ساخت کا استعمال کرتے ہوئے، مندرجہ ذیل طور پر:

indicator("", "", true)             // declaration statement (global scope), can be omitted

barIsUp() =>                        // function declaration (global scope)
    close > open                    // local block (local scope)

plotColor = if barIsUp()            // variable declaration (global scope)
    color.green                     // local block (local scope)
else
    color.red                       // local block (local scope)

runtime.log("color", color = plotColor)  // Call a built-in function to output the log (global scope)

لائن توڑنے کا کوڈ

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

a = open + high + low + close

یہ اس طرح لپیٹا جا سکتا ہے (نوٹ کریں کہ ہر سطر میں داخل ہونے والی خالی جگہوں کی تعداد 4 کا ضرب نہیں ہوسکتی ہے):

a = open +
      high +
          low +
             close

ایک طویل پلاٹ ((() کال کے طور پر لپیٹ کیا جا سکتا ہے:

close1 = request.security(syminfo.tickerid, "D", close)      // syminfo.tickerid daily level closing price data series for the current trading pair
close2 = request.security(syminfo.tickerid, "240", close)    // syminfo.tickerid 240-minute level closing price data series for the current trading pair
plot(ta.correlation(close, open, 100),                       // line-long plot() calls can be wrapped
   color = color.new(color.purple, 40),
   style = plot.style_area,
   trackprice = true)

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

test(c, o) =>
    ret = c > o ?
       (c > o+5000 ? 
          1 :
              0):
       (c < o-5000 ? 
          -1 : 
              0)
           
                   
a = test(close, open)
plot(a, title="a")

مارکرز اور آپریٹرز

مارکر

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

    1. مارکر ایک بڑے حروف کے ساتھ شروع کرنا ضروری ہے(A-Z)یا چھوٹے حروف(a-z)خط یا ایک underscore(_)مارکر کے پہلے کردار کے طور پر.
    1. ایک مارکر کے پہلے کردار کے بعد اگلے کردار ایک ہو سکتا ہےخط, نیچے کی طرف، یا ایکنمبر.
    1. مارکرز کا نام لگانا بڑے اور چھوٹے نمبر پر منحصر ہے۔

جیسے مندرجہ ذیل نام والے مارکر:

fmzVar
_fmzVar
fmz666Var
funcName
MAX_LEN
max_len
maxLen
3barsDown  // Wrong naming! It used a numeric character as the leading character of the marker

زیادہ تر پروگرامنگ زبانوں کی طرح ، پائن زبان میں بھی تحریری تجاویز ہیں۔ شناخت کرنے والوں کا نام دینے کے لئے عام طور پر یہ تجویز کی جاتی ہے کہ:

    1. تمام بڑے حروف مستقل ناموں کے لئے استعمال ہوتے ہیں.
    1. استعمال کریںاونٹ کا نچلا کیسدوسرے مارکر ناموں کے لئے.
// name variables, constants
GREEN_COLOR = #4CAF50
MAX_LOOKBACK = 100
int fastLength = 7

// name functions
zeroOne(boolValue) => boolValue ? 1 : 0

آپریٹر

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

تفویض آپریٹرز، ریاضیاتی آپریٹرز، موازنہ آپریٹرز، منطقی آپریٹرز،? :ترنری آپریٹرز،[]تاریخی ریفرنس آپریٹرز.

ریاضیاتی آپریٹر لینے*مثال کے طور پر ، یہ ٹریڈنگ ویو پر پائن زبان کے آپریٹر کے واپسی کے نتیجے سے پیدا ہونے والے قسم کے مسئلے سے مختلف ہے۔ مندرجہ ذیل ٹیسٹ کوڈ فراہم کیا گیا ہے۔

//@version=5
indicator("")
lenInput = input.int(14, "Length")
factor = year > 2020 ? 3 : 1
adjustedLength = lenInput * factor
ma = ta.ema(close, adjustedLength)  // Compilation error!
plot(ma)

ٹریڈنگ ویو پر اس اسکرپٹ کو چلانے کے دوران، ایک تالیف کی خرابی واقع ہو گی. وجہ یہ ہے کہ ضرب کے بعدadjustedLength = lenInput * factor، نتیجہ یہ ہےseries intقسم (سلسلہ) ، لیکن تقریب کے دوسرے پیرامیٹرta.emaاس قسم کی حمایت نہیں کرتا ہے۔ لیکن ایف ایم زیڈ پر ایسی کوئی سخت پابندیاں نہیں ہیں ، مذکورہ کوڈ عام طور پر چل سکتا ہے۔

آئیے مختلف آپریٹرز کے استعمال پر ایک ساتھ نظر ڈالیں۔

تفویض کارکن

تفویض آپریٹرز کی 2 اقسام ہیں:=, :=، جس میں ہم نے سبق کے آغاز کے حصے میں کئی مثالوں میں دیکھا ہے.

کے=آپریٹر استعمال کیا جاتا ہے جب یہ ابتدائی یا اعلان کیا جاتا ہے تو متغیر کو قدر تفویض کرنے کے لئے۔ متغیرات جو ابتدائی ، اعلان اور تفویض کے ساتھ ہیں=اس کے بعد ہر بار پر اس قدر کے ساتھ شروع ہو جائے گا. یہ درست متغیر اعلانات ہیں:

a = close           // Use built-in variables to assign values to a
b = 10000           // Use numerical assignment
c = "test"          // Use string assignment
d = color.green     // Use color value assignment
plot(a, title="a")
plot(b, title="b")
plotchar(true, title="c", char=str.tostring(c), color=d, overlay=true)

نوٹ کریں کہ تفویض بیانa = close، ہر بار پر متغیر a بار کی موجودہ اختتامی قیمت (بند) ہے۔ دیگر متغیراتb, c, dتبدیل نہیں ہیں اور FMZ پر backtest کے نظام میں تجربہ کیا جا سکتا ہے، اور نتائج چارٹ پر دیکھا جا سکتا ہے.

:=موجودہ متغیرات کے لئے اقدار کو دوبارہ تفویض کرنے کے لئے استعمال کیا جاتا ہے.:=آپریٹر استعمال کیا جاتا ہے متغیرات کی اقدار کو تبدیل کرنے کے لئے جو اعلان کیا گیا ہے اور شروع کیا گیا ہے. اگر ہم استعمال کریں:=آپریٹر ایک غیر ابتدائی یا اعلان متغیر کو ایک قدر تفویض کرنے کے لئے، یہ ایک غلطی کا سبب بنے گا، مثال کے طور پر:

a := 0

لہذا،:=تفویض آپریٹر عام طور پر موجودہ متغیرات کو دوبارہ تفویض کرنے کے لئے استعمال کیا جاتا ہے، مثال کے طور پر:

a = close > open 
b = 0 
if a
    b := b + 1

plot(b)

فیصلہ کیا جائے کہclose > open(یعنی موجودہ BAR ایک مثبت لائن ہے) ، متغیر a سچ ہے. اگر بیان کے مقامی بلاک میں کوڈb := b + 1پر عملدرآمد کیا جاتا ہے، اور تفویض آپریٹر:=b کو دوبارہ تفویض کرنے کے لئے استعمال کیا جاتا ہے، اور 1 شامل کیا جاتا ہے۔ پھر ہم چارٹ پر وقت کی سیریز کے ہر BAR پر متغیر b کی قدر کھینچنے کے لئے پلاٹ فنکشن کا استعمال کرتے ہیں، اور انہیں ایک لائن میں جوڑتے ہیں۔

کیا ہم سوچتے ہیں کہ جب ایک مثبت لائن BAR ظاہر ہوتی ہے، b 1 کی طرف سے جمع کرنے کے لئے جاری رہے گا؟ یقینا نہیں، یہاں ہم اعلان کرتے ہیں اور کسی بھی مطلوبہ الفاظ کی نشاندہی کے بغیر 0 کے طور پر متغیر b کو شروع کرتے ہیں.b=0ہر بار پر عملدرآمد کیا جاتا ہے، لہذا ہم دیکھ سکتے ہیں کہ اس کوڈ کا نتیجہ بی متغیر کو ہر بار 0 پر ری سیٹ کرنا ہے، اگر متغیر ایک سچ ہے، یعنی، کے ساتھ لائن میں ہےclose > open، تب b 1 سے بڑھ جائے گا جب کوڈ اس راؤنڈ میں عمل میں لایا جاتا ہے ، اور b 1 ہے جب پلاٹ فنکشن ڈرا کرتا ہے ، لیکن b کو اگلے راؤنڈ میں کوڈ عمل میں لایا جاتا ہے تو اسے 0 پر دوبارہ تفویض کیا جاتا ہے۔ یہ وہ جگہ بھی ہے جہاں پائن زبان کے ابتدائی افراد مشکلات کا شکار ہوتے ہیں۔

جب بات تفویض آپریٹرز کی آتی ہے، تو ہمیں دو کلیدی الفاظ پر توسیع کرنا ضروری ہے:var, varip

  • وار

    دراصل، ہم نے اس مطلوبہ الفاظ کو پچھلے سبق میں دیکھا اور استعمال کیا ہے، لیکن ہم نے اس وقت اس پر تفصیل سے بات نہیں کی. آئیے پہلے اس مطلوبہ الفاظ کی وضاحت دیکھیں:

    var ایک کلیدی لفظ ہے جو متغیرات کو مختص کرنے اور ایک بار شروع کرنے کے لئے استعمال ہوتا ہے۔ عام طور پر ، متغیر تفویض گرائمر جس میں کلیدی لفظ var شامل نہیں ہوتا ہے اس کی وجہ سے ہر بار جب ڈیٹا کو اپ ڈیٹ کیا جاتا ہے تو متغیرs کی قدر اوور رائٹ ہوجاتی ہے۔ اس کے برعکس ، جب متغیرات کو کلیدی لفظ var کا استعمال کرتے ہوئے تفویض کیا جاتا ہے تو ، وہ ڈیٹا اپ ڈیٹس کے باوجود حالت کو برقرار رکھ سکتے ہیں۔

    ہم اب بھی اس مثال کا استعمال کرتے ہیں، لیکن ہمvarیہاں b کو قدر تفویض کرتے وقت کلیدی لفظ.

    a = close > open 
    var b = 0 
    if a
        b := b + 1
    
    plot(b)
    

    کےvarکلیدی لفظ متغیر b کو صرف ابتدائی تفویض انجام دینے کی اجازت دیتا ہے ، اور پھر یہ ہر بار جب حکمت عملی کی منطق کو انجام دیا جاتا ہے تو b کو 0 پر ری سیٹ نہیں کرے گا ، لہذا یہ رن ٹائم پر تیار کردہ لائن سے مشاہدہ کیا جاسکتا ہے کہ b مثبت لائن BARs کی تعداد ہے جو ظاہر ہوئی ہے جب موجودہ K لائن BAR بیک ٹسٹ کیا گیا تھا۔

    var کے ذریعہ اعلان کردہ متغیرات کو نہ صرف عالمی دائرہ کار میں لکھا جاسکتا ہے ، بلکہ کوڈ بلاکس میں بھی لکھا جاسکتا ہے ، جیسے یہ مثال:

    strategy(overlay=true)
    var a = close
    var b = 0.0
    var c = 0.0
    var green_bars_count = 0
    if close > open
        var x = close
        b := x
        green_bars_count := green_bars_count + 1
        if green_bars_count >= 10
            var y = close
            c := y
    plot(a, title = "a")
    plot(b, title = "b")
    plot(c, title = "c")
    

    متغیر a سیریز کے پہلے بار کی بندش کی قیمت رکھتا ہے۔ متغیر b سیریز میں پہلی green قیمت بار کی بندش کی قیمت رکھتا ہے. متغیر c سیریز میں دسویں green بار کی بندش کی قیمت رکھتا ہے۔

  • مختلف

    ہم مطلوبہ لفظ دیکھتے ہیںvaripپہلی بار، ہم اس مطلوبہ الفاظ کی وضاحت پر نظر ڈال سکتے ہیں:

    varp (var intrabar persist) متغیرات کو تفویض کرنے اور ایک بار شروع کرنے کے لئے ایک کلیدی لفظ ہے۔ یہ var کلیدی لفظ کی طرح ہے ، لیکن varip کے ساتھ اعلان کردہ متغیرات حقیقی وقت میں K لائن اپ ڈیٹس کے وقت اپنی اقدار کو برقرار رکھتے ہیں۔

    کیا سمجھنا مشکل ہے؟ اس سے کوئی فرق نہیں پڑتا، ہم ایک مثال کے ذریعے اس کی وضاحت کرتے ہیں، یہ سمجھنے میں آسان ہے۔

    strategy(overlay=true)
    
    // test var varip
    var i = 0
    varip ii = 0  
    
    // Print the i and ii changed in each round of the strategy logic on the chart
    plotchar(true, title="ii", char=str.tostring(ii), location=location.abovebar, color=color.red)
    plotchar(true, title="i", char=str.tostring(i), location=location.belowbar, color=color.green)  
    
    // Increment i and ii by 1 for each round of logic execution
    i := i + 1
    ii := ii + 1
    

    یہ ٹیسٹ کوڈ بار ماڈل اور ٹاک ماڈل پر مختلف کارکردگی ہے:

    بار ماڈل: کیا آپ کو یاد ہے کہ حکمت عملی کی پھانسی ہم نے پہلے وضاحت کی تاریخی بار مرحلے اور حقیقی وقت BAR مرحلے میں تقسیم کیا جاتا ہے؟ بار ماڈل میں، تاریخی K لائن مرحلے، متغیراتi, iiمیں اعلان کیا گیاvar, varipحکمت عملی کوڈ کے عملدرآمد کے ہر دور میں اضافے والے آپریشن انجام دیں۔ لہذا یہ دیکھا جاسکتا ہے کہ بیک ٹیسٹ کے نتائج کے K لائن BAR پر دکھائے جانے والے نمبروں میں ایک ایک کرکے 1 اضافہ ہوتا ہے۔ جب تاریخی K لائن مرحلہ ختم ہوجاتا ہے تو ، حقیقی وقت کے K لائن مرحلے کا آغاز ہوتا ہے۔ var اور varip کے ذریعہ بیان کردہ متغیرات مختلف تبدیلیوں کا سامنا کرنا شروع ہوجاتے ہیں۔ چونکہ یہ بار ماڈل ہے ، لہذا حکمت عملی کا کوڈ K لائن BAR میں ہر قیمت کی تبدیلی کے لئے ایک بار عمل میں لایا جائے گا ،i := i + 1اورii := ii + 1ایک بار عملدرآمد کیا جائے گا۔ فرق یہ ہے کہ ii ہر بار ترمیم کی جاتی ہے۔ اگرچہ i ہر بار ترمیم کی جاتی ہے ، لیکن پچھلی قدر کو بحال کیا جائے گا جب حکمت عملی کی منطق اگلے راؤنڈ میں عملدرآمد کی جاتی ہے (یاد رکھیں کہ رول بیک میکانزم جو ہم نے پچھلے ماڈل ایگزیکشن باب میں بیان کیا تھا؟) ، اور i کی قدر کو اس وقت تک اپ ڈیٹ نہیں کیا جائے گا جب تک کہ موجودہ K- لائن BAR مکمل نہ ہو جائے (یعنی ، پچھلی قدر کو بحال نہیں کیا جائے گا جب حکمت عملی کی منطق اگلے راؤنڈ میں عملدرآمد کی جاتی ہے۔ لہذا یہ دیکھا جاسکتا ہے کہ متغیر i ہر بار کے لئے 1 سے بڑھ جاتا ہے۔ لیکن متغیر ii ہر بار کے لئے کئی بار جمع ہوتا ہے۔

    نشان ماڈل: چونکہ ٹِک ماڈل حکمت عملی کی منطق کو صرف ایک بار K- لائن بار پر انجام دیتا ہے۔ لہذا اختتامی قیمت ماڈل میں ، وار اور وارپ کے ذریعہ اعلان کردہ متغیرات مندرجہ بالا مثال میں بالکل ایک جیسے برتاؤ کرتے ہیں جو تاریخی K لائن مرحلے اور حقیقی وقت کے K لائن مرحلے کے دوران ہر K لائن BAR کے لئے 1 سے بڑھتے ہیں۔

ریاضیاتی آپریٹرز
آپریٹر تفصیل
+ اضافہ
- گھٹانا
* ضرب
/ ڈویژن
% ماڈیول

کے+اور-آپریٹرز کو بائنری آپریٹرز یا یونری آپریٹرز کے طور پر استعمال کیا جاسکتا ہے۔ دیگر ریاضیاتی آپریٹرز کو صرف بائنری آپریٹرز کے طور پر استعمال کیا جاسکتا ہے اور اگر اسے یونری آپریٹرز کے طور پر استعمال کیا گیا ہو تو یہ غلطی کی اطلاع دے گا۔

  1. ریاضیاتی آپریٹر کے دونوں اطراف عددی قسم کے ہیں، نتیجہ عددی قسم، عددی یا فلوٹنگ پوائنٹ آپریشن کے نتیجے پر منحصر ہے.
  2. اگر آپریڈوں میں سے ایک تار ہے اور آپریٹر ہے+، حساب کتاب کا نتیجہ ایک تار ہے ، قدر کو تار کی شکل میں تبدیل کیا جائے گا ، اور پھر تاروں کو ایک ساتھ جوڑا جائے گا۔ اگر یہ دوسرا ریاضیاتی آپریٹر ہے تو ، یہ تار کو کسی قدر میں تبدیل کرنے کی کوشش کرے گا اور پھر آپریشن جاری رکھے گا۔
  3. اگر آپریڈوں میں سے ایک این اے ہے تو ، حساب کتاب کا نتیجہ نل ویلیو این اے ہے ، اور جب ایف ایم زیڈ پر پرنٹ ہوتا ہے تو یہ این اے این دکھائے گا۔
a = 1 + 1 
b = 1 + 1.1
c = 1 + "1.1"
d = "1" + "1.1"
e = 1 + na 

runtime.log("a:", a, ", b:", b, ", c:", c, ", d:", d, ", e:", e)   
// a: 2 , b: 2.1 , c: 11.1 , d: 11.1 , e: NaN

ایف ایم زیڈ پر پائن زبان ٹریڈنگ ویو پر پائن زبان سے تھوڑا سا مختلف ہے ، ایف ایم زیڈ پر پائن زبان متغیر اقسام کے بارے میں بہت سخت نہیں ہے۔ مثال کے طور پر:

a = 1 * "1.1"
b = "1" / "1.1"
c = 5 % "A" 

plot(a)
plot(b)
plot(c)

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

موازنہ آپریٹرز

موازنہ آپریٹرز تمام بائنری آپریٹرز ہیں.

آپریٹر تفصیل
< <
> >
<= <=
>= >=
== ==
!= !=

ٹیسٹ کا مثال:

a = 1 > 2 
b = 1 < 2 
c = "1" <= 2 
d = "1" >= 2 
e = 1 == 1 
f = 2 != 1 
g = open > close 
h = na > 1 
i = 1 > na

runtime.log("a:", a, ", b:", b, ", c:", c, ", d:", d, ", e:", e, ", f:", f, ", g:", g, ", h:", h, ", i:", i)   
// a: false , b: true , c: true , d: false , e: true , f: true , g: false , h: false , i: false

جیسا کہ ہم دیکھ سکتے ہیں ، موازنہ آپریٹر استعمال کرنا بہت آسان ہے ، لیکن یہ آپریٹر بھی ہے جو ہم حکمت عملی لکھتے وقت سب سے زیادہ استعمال کرتے ہیں۔ عددی اقدار اور بلٹ ان متغیرات دونوں کا موازنہ کیا جاسکتا ہے ، جیسے:close, open، وغیرہ. آپریٹر کی طرح ، ایف ایم زیڈ اور ٹریڈنگ ویو کے مابین پائن زبان کے بارے میں بھی فرق ہے۔ ایف ایم زیڈ کے پاس اقسام کے لئے خاص طور پر سخت تقاضے نہیں ہیں ، لہذا ، اس طرح کے بیاناتd = "1" >= 2ایف ایم زیڈ پر غلطی کی اطلاع نہیں دے گا ، اور اسے پہلے تار کو کسی قدر میں تبدیل کرکے اور پھر آپریشن کا موازنہ کرکے انجام دیا جائے گا۔ ٹریڈنگ ویو پر ، یہ غلطی کی اطلاع دے گا۔

منطقی آپریٹر
آپریٹر کوڈ علامتیں تفصیل
نہیں نہیں یونری آپریٹر، آپریشن نہیں
اور اور بائنری آپریٹرز اور آپریشنز
یا یا بائنری آپریٹرز یا آپریشنز

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

a = 1 == 1  // An expression formed by using comparison operators, the result is a Boolean value
b = 1 != 1
c = not b   // Logical not operators
d = not a   // Logical not operators

runtime.log("test the logical operator:and", "#FF0000")
runtime.log("a:", a, ", c:", c, ", a and c:", a and c)
runtime.log("a:", a, ", b:", b, ", a and b:", a and b)
runtime.log("b:", b, ", c:", c, ", b and c:", b and c)
runtime.log("d:", d, ", b:", b, ", d and b:", d and b)

runtime.log("test the logical operator:or", "#FF0000")
runtime.log("a:", a, ", c:", c, ", a or c:", a or c)
runtime.log("a:", a, ", b:", b, ", a or b:", a or b)
runtime.log("b:", b, ", c:", c, ", b or c:", b or c)
runtime.log("d:", d, ", b:", b, ", d or b:", d or b)

runtime.error("stop")

پیغامات overprint نہیں کرنے کے لئے، ہم کے ساتھ ایک غلطی پھینکruntime.error("stop")اور اسے ایک بار پرنٹ کرنے کے بعد روک دیں۔ اس کے بعد، ہم آؤٹ پٹ کی معلومات کا مشاہدہ کر سکتے ہیں، اور ہم دیکھ سکتے ہیں کہ پرنٹ کردہ مواد اصل میں حقیقی قدر ٹیبل کے برابر ہے۔

ترنری آپریٹر

ترنری آپریٹر کا استعمال کرتے ہوئے ترنری اظہار? :آپریٹرز کے ساتھ مل کرcondition ? valueWhenConditionIsTrue : valueWhenConditionIsFalseہم نے انہیں پچھلے سبق میں بھی استعمال کیا ہے۔ نام نہاد ترنری اظہار، ترنری آپریٹر کا مطلب ہے کہ اس میں تین آپریٹرز ہیں۔

میںcondition ? valueWhenConditionIsTrue : valueWhenConditionIsFalse, conditionیہ فیصلہ کی شرط ہے۔ اگر یہ سچ ہے تو ، اظہار کی قدر یہ ہے:valueWhenConditionIsTrue. اگرconditionغلط ہے، تو اظہار کی قدر ہےvalueWhenConditionIsFalse.

ایک آسان مظاہرے کی مثال ، اگرچہ عملی استعمال کا کم:

a = close > open
b = a ? "positive line" : "negative line"
c = not a ? "negative line" : "positive line"
plotchar(a, location=location.abovebar, color=color.red, char=b, overlay=true)
plotchar(not a, location=location.belowbar, color=color.green, char=c, overlay=true)

اگر ہمیں ڈوجی کا سامنا کرنا پڑتا ہے تو کیا کرنا ہے؟ اس سے کوئی فرق نہیں پڑتا ہے! ترنری اظہار کو بھی گھسایا جاسکتا ہے ، جیسا کہ ہم نے پچھلے سبق میں کیا تھا۔

a = close > open
b = a ? math.abs(close-open) > 30 ? "positive line" : "doji" : math.abs(close-open) > 30 ? "negative line" : "doji"
c = not a ? math.abs(close-open) > 30 ? "negative line" : "doji" : math.abs(close-open) > 30 ? "positive line" : "doji"
plotchar(a, location=location.abovebar, color=color.red, char=b, overlay=true)
plotchar(not a, location=location.belowbar, color=color.green, char=c, overlay=true)

درحقیقت یہ اس کے مترادف ہےvalueWhenConditionIsTrueاورvalueWhenConditionIsFalseمیںcondition ? valueWhenConditionIsTrue : valueWhenConditionIsFalseایک اور ترنری اظہار کے ساتھ.

تاریخی آپریٹر

تاریخی آپریٹر استعمال کریں[]ایک ٹائم سیریز پر تاریخی اقدار کا حوالہ دینے کے لئے۔ یہ تاریخی اقدار اسکرپٹ چل رہا تھا جب موجودہ K لائن بار سے پہلے K لائن بار پر متغیر کے اقدار ہیں.[]آپریٹر متغیرات، اظہار، اور فنکشن کالز کے بعد استعمال کیا جاتا ہے.[]مربع قوسین میں موجودہ K- لائن BAR سے ہم حوالہ دینا چاہتے ہیں تاریخی اعداد و شمار کی آفسیٹ ہے۔ مثال کے طور پر ، اگر میں آخری K- لائن BAR کی اختتامی قیمت کا حوالہ دینا چاہتا ہوں تو ، ہم اسے لکھتے ہیں:close[1].

ہم نے پچھلے سبقوں میں کچھ اس طرح دیکھا ہے:

high[10]
ta.sma(close, 10)[1]
ta.highest(high, 10)[20]
close > nz(close[1], open)

کے[]آپریٹر صرف ایک ہی قدر پر ایک بار استعمال کیا جا سکتا ہے، تو یہ اس طرح لکھنے کے لئے غلط ہے، اور ایک غلطی کی اطلاع دی جائے گی:

a = close[1][2]   // error

یہاں، کسی کو کہہ سکتا ہے کہ آپریٹر[]سیریز کی ساخت کے لئے استعمال کیا جاتا ہے، ایسا لگتا ہے کہ سیریز کی ساخت (سیریز) صف کی طرح ہے! آئیے پائن زبان میں سیریز اور صفوں کے مابین فرق کو ظاہر کرنے کے لئے ایک مثال استعمال کریں۔

strategy("test", overlay=true)

a = close
b = close[1]
c = b[1]

plot(a, title="a")
plot(b, title="b")
plot(c, title="c")

a = close[1][2]ایک غلطی کی اطلاع دے گا، لیکن:

b = close[1]
c = b[1]

لیکن اگر علیحدہ علیحدہ لکھا جائے تو یہ غلطی کی اطلاع نہیں دے گا۔ اگر ہم اسے معمول کی صف کے مطابق سمجھیں تو ، تفویض کے بعدb = close [1]، b ایک قدر ہونا چاہئے، لیکنc = b[1]، b کو اب بھی تاریخ کے آپریٹر کا استعمال کرتے ہوئے تاریخی قدر کا حوالہ دینے کے لئے استعمال کیا جاسکتا ہے۔ یہ دیکھا جاسکتا ہے کہ پائن زبان میں سیریز کا تصور کسی صف کی طرح آسان نہیں ہے۔ اسے قریب کے آخری بار (ب کو تفویض) پر تاریخی قدر کے طور پر سمجھا جاسکتا ہے ، b بھی ایک ٹائم سیریز ڈھانچہ (ٹائم سیریز) ہے ، اور اس کی h


مزید