[TOC]
ویڈیو سبق کے ساتھ: کوانٹم ٹریڈنگ میں داخل ہونا کتنا مشکل ہے؟ ٹریڈنگ ویو کا استعمال کرتے ہوئے پائن زبان کو چھوٹا سفید سے لے کر کوانٹ دیوتا تک - پائن زبان کا ابتدائی تجربہ
انوینٹر کی کوانٹم ٹریڈنگ پلیٹ فارم پائن زبان لکھنے کی حکمت عملی کی حمایت کرتا ہے ، اس کی واپسی کی حمایت کرتا ہے ، پائن زبان کی حکمت عملی کو عملی طور پر چلاتا ہے ، اور پائن زبان کے کم ورژن کے ساتھ مطابقت رکھتا ہے۔اسٹریٹجی اسکوائراس میں بہت ساری پائن حکمت عملی (سکرپٹ) جمع اور منتقل کی گئی ہیں۔
ایف ایم زیڈ نہ صرف پائن زبان کی حمایت کرتا ہے ، بلکہ پائن زبان کی طاقتور ڈرائنگ فنکشن کو بھی سپورٹ کرتا ہے۔ ایف ایم زیڈ پلیٹ فارم پر موجود مختلف خصوصیات ، بھرپور عملی ٹولز ، موثر اور آسان انتظام ، اور پائن حکمت عملی کی عملی کو مزید بڑھا دیتا ہے۔
یہاں کچھ نمایاں اختلافات کا خلاصہ ہے:
//@version
کوڈ کے ساتھ شروعstrategy
、indicator
جملے لکھنے کے لئے لازمی نہیں ہیں، فی الحال ایف ایم زیڈ اس کی حمایت نہیں کرتا ہے۔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)
2، حکمت عملی ((اسکرپٹ) کچھ ٹرانزیکشن سے متعلق ترتیبات ایف ایم زیڈ حکمت عملی انٹرفیس پر “پائن زبان کے ٹرانزیکشن کلاس بیس” پیرامیٹرز کے ذریعہ طے کی گئی ہیں۔
strategy
فنکشنcalc_on_every_tick
پیرامیٹرز کو ترتیب دینے کے لئے حکمت عملی اسکرپٹ ہر قیمت میں تبدیلی کے ساتھ حقیقی وقت میں حکمت عملی کی منطق پر عملدرآمد کریں، اس وقتcalc_on_every_tick
پیرامیٹرز پر سیٹ کیا جانا چاہئےtrue
پہلے سے طے شدہcalc_on_every_tick
پیرامیٹرز ہیںfalse
اس کا مطلب یہ ہے کہ اسٹریٹجک منطق کو صرف اس وقت عمل میں لایا جائے گا جب حکمت عملی کی موجودہ K لائن BAR مکمل طور پر ختم ہوجائے۔
ایف ایم زیڈ پر ، پیرامیٹرز کو “پائن لینگویج ٹرانزیکشن کلاس بیس” ٹیمپلیٹ کے ذریعے ترتیب دیا گیا ہے۔حکمت عملی پر عملدرآمد کی قیمت ، نیچے آرڈر کی مقدار وغیرہ کی عددی درستگی کو ایف ایم زیڈ پر کنٹرول کرنے کی ضرورت ہے ٹریڈنگ ویو پر صرف نقلی ٹیسٹ کی وجہ سے ، ریئل اسٹیٹ پر آرڈر کے وقت کی درستگی کا کوئی مسئلہ نہیں ہے۔ ایف ایم زیڈ پر ، پائن حکمت عملی کو ریئل اسٹیٹ پر چلانے کے قابل ہے۔ اس کے بعد حکمت عملی کی ضرورت ہے جو تجارت کی اقسام کی قیمت کی درستگی اور آرڈر کی مقدار کی درستگی کو لچکدار طریقے سے متعین کرسکے۔ یہ درستگی کی ترتیبات متعلقہ اعداد و شمار کے چھوٹے ہندسوں کو کنٹرول کرتی ہیں ، اس سے بچنے کے لئے کہ اعداد و شمار ایکسچینج کی اطلاع دہندگی کی شرائط کے مطابق نہ ہوں جس کی وجہ سے آرڈر نہیں دیا جاسکتا ہے۔
مستقبل کے معاہدے کا کوڈ
ایف ایم زیڈ پر تجارت کی قسم اگر یہ معاہدہ ہے تو ، اس کی 2 خصوصیات ہیں۔ یہ ہیں “معاملہ جوڑی” اور “معاہدہ کوڈ” ، ریل اسٹیک اور ریٹرننگ کے وقت واضح طور پر تجارت کی جوڑی کی ضرورت کے علاوہ ، “پائن زبان” کے سانچے کے پیرامیٹر “ریٹائز کوڈ” میں بھی مخصوص معاہدہ کوڈ کی ضرورت ہے۔ مثال کے طور پر ، مستقل معاہدہ صرف بھرنا ہےswap
، معاہدہ کوڈ آپریشن کے تبادلے کے لئے مخصوص ہے کہ آیا اس طرح کے معاہدے موجود ہیں یا نہیں۔ مثال کے طور پر ، تمام سہ ماہی کے معاہدوں کے لئے معاہدے ، یہاں پُر کیا جاسکتا ہےquarter
یہ معاہدہ کوڈ ایف ایم زیڈ کے جاوا اسکرپٹ / پطرون / سی ++ زبان API دستاویزات میں بیان کردہ مستقبل کے معاہدے کے کوڈ کے مطابق ہے۔
دیگر ترتیبات جیسے کہ کم سے کم انوائس، ڈیفالٹ انوائس وغیرہ کے لیے، پیئن زبان کے دستاویزات میں ملاحظہ کیجئے۔“پائن زبان کا تبادلہ”پیرامیٹرز کا تعارف
runtime.debug
、runtime.log
、runtime.error
FMZ توسیع کے لئے فنکشن، ڈیبگنگ کے لئے ایف ایم زیڈ پلیٹ فارم پر ڈیبگنگ کے لئے 3 افعال شامل کیے گئے ہیں۔
runtime.debug
: کنسول پرنٹ کرنے کے لئے عام طور پر اس فنکشن کا استعمال نہیں کیا جاتا ہے۔
runtime.log
: لاگ ان میں آؤٹ پٹ مواد │FMZ PINE زبان کے لئے مخصوص فنکشن │
runtime.log(1, 2, 3, close, high, ...),可以传多个参数。
runtime.error
: جب کال کیا جاتا ہے تو ، اس کے نتیجے میں آپریشنل غلطی ہوتی ہے ، اور اس میں پیغام کے پیرامیٹرز میں طے شدہ غلطی کا پیغام ہوتا ہے۔
runtime.error(message)
4، کچھ ڈرائنگ فنکشن میں توسیعoverlay
پیرامیٹر
FMZ پر پائن زبان، ڈرائنگ میپ فنکشنplot
、plotshape
、plotchar
مزید اضافہoverlay
پیرامیٹرز کی حمایت کرتا ہے، جس میں پینٹنگز کو مرکزی نقشہ یا ذیلی نقشہ میں مقرر کرنے کی اجازت دیتا ہے.overlay
قائم کریںtrue
مرکزی نقشے پر پینٹ کریں، اور اسےfalse
ذیلی نقشے میں پینٹ کریں۔ ایف ایم زیڈ پر پائن حکمت عملی چلانے کے لئے مرکزی نقشہ ، ذیلی نقشہ ایک ساتھ پینٹ کریں۔
syminfo.mintick
بلٹ ان متغیرات کی قدرsyminfo.mintick
بلٹ ان متغیر کی تعریف موجودہ نسل کے لئے کم از کم پیمائش کی قیمت کے طور پر کی جاتی ہے۔فرم پیشکش/بیک ٹیسٹنگانٹرفیس پر “پائن زبان کے ٹرانزیکشن کلاس روم” میں ٹیمپلیٹ پیرامیٹر قیمتوں کا تعین کرنسی کی درستگی اس قدر کو کنٹرول کرسکتا ہے۔ قیمتوں کا تعین کرنسی کی درستگی کی ترتیب 2 یہ ہے کہ جب تجارت کی جاتی ہے تو قیمت کم سے کم تعداد میں دوسرے نمبر تک درست ہوتی ہے ، اس وقت قیمت میں کم سے کم تبدیلی یونٹ 0.01 ہے۔syminfo.mintick
0.01 ہے
مثال کے طور پر: نیچے آرڈر کی قیمت 8000 ہے ، فروخت کی سمت ، تعداد 1 ہاتھ ((ایک ، چادر) ، معاہدے کے بعد اوسط قیمت 8000 نہیں ہے ، 8000 سے کم ((قیمت میں کارروائی کی فیس شامل ہے)) ۔
جب ہم پائن زبان کی بنیادی باتیں سیکھنا شروع کرتے ہیں تو ، شاید کچھ مثالوں میں ہدایات ، کوڈ کی گرامر ہم واقف نہیں ہیں۔ اس سے کوئی فرق نہیں پڑتا ہے ، ہم پہلے تصورات سے واقف ہوسکتے ہیں ، ٹیسٹ کے مقصد کو سمجھ سکتے ہیں ، یا ایف ایم زیڈ کی پائن زبان کی دستاویزات کو دیکھ سکتے ہیں۔ اس کے بعد مختلف گرامر ، ہدایات ، افعال ، بلٹ ان متغیرات سے آہستہ آہستہ واقف ہونے کے لئے سبق کے مطابق عمل کریں۔
پائن زبان سیکھنے کے لئے ابتدائی طور پر ، اس سے متعلقہ تصورات جیسے پائن زبان کی اسکرپٹ پروگرام کے عمل کو سمجھنا ضروری ہے۔ پائن زبان کی حکمت عملی ایک چارٹ پر مبنی ہے ، جسے ایک سلسلہ حساب اور کارروائی کے طور پر سمجھا جاسکتا ہے ، جو چارٹ پر پہلے سے بھری ہوئی اعداد و شمار سے شروع ہوتا ہے ، جو وقت کے تسلسل کے مطابق ہے۔ چارٹ پر ابتدائی طور پر بھری ہوئی اعداد و شمار کی مقدار محدود ہے۔ ریئل ڈسک پر عام طور پر اس اعداد و شمار کی حد کا تعین تبادلے کے انٹرفیس پر واپس آنے والے اعداد و شمار کی زیادہ سے زیادہ مقدار پر مبنی ہوتا ہے ، اور واپسی کے وقت کی پیمائش کا ڈیٹا کی حد کا تعین پیمائش کے نظام کے ذریعہ فراہم کردہ اعداد و شمار پر مبنی ہوتا ہے۔ چارٹ پر سب سے بائیں طرف کی پہلی لائن KBar ، یعنی چارٹ کے اعداد و شمار کا ایک مجموعہ ، جس کی اشاریہ 0 کی طرف سے ہوسکتی ہے پائن زبان کی داخلی متغیرbar_index
پائن اسکرپٹ کے عمل کے وقت موجودہ K لائن بار کی انڈیکس ویلیو کا حوالہ دیتا ہے۔
plot(bar_index, "bar_index")
plot
یہ فنکشن ان میں سے ایک ہے جو ہم مستقبل میں زیادہ استعمال کریں گے۔ اس کا استعمال بہت آسان ہے، یہ صرف اعداد و شمار کو منتقل کرنے کے لئے، اعداد و شمار کو منتقل کرنے کے لئے، اعداد و شمار کو منتقل کرنے کے لئے، اعداد و شمار کو منتقل کرنے کے لئےbar_index
لائن کا نامbar_index
。 پہلی بار پر bar_index نامی لائن کی قدر 0 ہے، جیسا کہ دیکھا جا سکتا ہے بار بڑھنے کے ساتھ دائیں طرف 1 بڑھتی ہے۔
پالیسی کی ترتیب کے لحاظ سے مختلف ہے، اور پالیسی کے ماڈل پر عملدرآمد کے مختلف طریقے ہیں.收盘价模型
اور实时价模型
ہم نے پہلے بھی مختصر طور پر بندش قیمت ماڈل کے تصورات کے بارے میں بات کی ہے۔
جب حکمت عملی کا کوڈ چلایا جاتا ہے تو ، موجودہ K لائن بار کا دور مکمل طور پر چلایا جاتا ہے ، اور جب K لائن بند ہوجاتی ہے تو K لائن کا دور ختم ہوجاتا ہے۔ اس وقت پائن حکمت عملی کی منطق پر عملدرآمد کیا جاتا ہے ، اور ٹریڈ سگنل کو اگلے K لائن بار کے آغاز پر عملدرآمد کیا جائے گا۔
جب حکمت عملی کا کوڈ چلایا جاتا ہے تو ، موجودہ K لائن بار ، چاہے وہ بند ہو یا نہ ہو ، ہر بار جب تجارت میں تبدیلی ہوتی ہے تو ، پائن حکمت عملی کی منطق پر عملدرآمد کیا جاتا ہے ، جس سے ٹریڈنگ سگنل کو فوری طور پر عملدرآمد کیا جاتا ہے۔
جب پائن زبان کی حکمت عملی کو گراف پر بائیں سے دائیں سے انجام دیا جاتا ہے تو ، گراف پر K لائن بار کو تقسیم کیا جاتا ہے历史Bar
اور实时Bar
کی:
جب حکمت عملی کو “ریئل اسٹیک قیمت ماڈل” کے طور پر ترتیب دیا جاتا ہے تو ، چارٹ پر تمام K لائن بار ، سوائے دائیں طرف کے ایک K لائن بار کے ، پر عملدرآمد ہوتا ہے۔历史Bar
◦ حکمت عملی منطق میں ہر ایک历史Bar
صرف ایک بار انجام دیا گیا
جب حکمت عملی کو “خریداری قیمت ماڈل” کے طور پر ترتیب دیا گیا ہے تو ، چارٹ پر موجود تمام بارز پر عملدرآمد شروع ہوتا ہے历史Bar
◦ حکمت عملی منطق میں ہر ایک历史Bar
صرف ایک بار انجام دیا گیا
تاریخ بار کے حساب سے: اسٹریٹجک کوڈ کو ہسٹری بار بند ہونے کی حالت میں ایک بار انجام دیا جاتا ہے ، پھر اسٹریٹجک کوڈ اگلے ہسٹری بار میں اس وقت تک جاری رہتا ہے جب تک کہ تمام ہسٹری بارز ایک بار انجام نہ دیں۔
جب حکمت عملی کو دائیں طرف کے آخری K لائن بار پر عملدرآمد کیا جاتا ہے تو ، یہ بار حقیقی وقت کی بار ہے۔ جب حقیقی بار بند ہوجاتا ہے تو ، یہ بار ایک گزرنے والی حقیقی بار میں تبدیل ہوجاتا ہے ((تاریخ بار میں تبدیل ہوجاتا ہے)) ۔ چارٹ کے دائیں طرف ایک نیا حقیقی بار پیدا ہوتا ہے۔
جب حکمت عملی کو “ریئل ٹائم پرائس ماڈل” کے طور پر ترتیب دیا جاتا ہے تو ، ہر بار حکمت عملی کی منطق کو ریئل ٹائم بار میں ہر بار کی حکمت عملی پر عملدرآمد کیا جاتا ہے۔ جب حکمت عملی کو “خریداری قیمت ماڈل” کے طور پر سیٹ کیا جاتا ہے تو ، چارٹ پر ریئل ٹائم بار نہیں دکھایا جاتا ہے۔
ریئل ٹائم بار کے حساب سے:
اگر حکمت عملی کو “خریداری کی قیمت ماڈل” کے طور پر ترتیب دیا گیا ہے تو چارٹ حقیقی بار نہیں دکھاتا ہے ، حکمت عملی کا کوڈ صرف ایک بار موجودہ بار کے اختتام پر عملدرآمد ہوتا ہے۔
اگر حکمت عملی کو “ریئل ٹائم بار” کے طور پر ترتیب دیا گیا ہے تو ، ریئل ٹائم بار پر حساب کتاب اور تاریخ بار بالکل مختلف ہے۔ ہر بار جب حکمت عملی کو عملی میں تبدیل کیا جاتا ہے تو ، حکمت عملی کا کوڈ نافذ کیا جاتا ہے۔ مثال کے طور پر ، بلٹ ان متغیرhigh
、low
、close
تاریخی بار پر یہ بات یقینی ہے کہ ریئل ٹائم بار پر یہ اقدار ہر بار تبدیل ہوسکتی ہیں۔ لہذا ان اقدار پر مبنی اشارے جیسے اعداد و شمار بھی ریئل ٹائم میں تبدیل ہوسکتے ہیں۔close
اس کے علاوہ، یہ بھی کہا گیا ہے کہ:high
اورlow
ہمیشہ موجودہ ریئل ٹائم بار کے آغاز کے بعد سے حاصل کی گئی سب سے زیادہ اونچائی اور کم سے کم نچلی سطح کی نمائندگی کرتا ہے۔ یہ بلٹ ان متغیرات ریئل ٹائم بار کی آخری تازہ کاری کے وقت کی حتمی قیمت کی نمائندگی کرتے ہیں۔
ریئل ٹائم بار پر حکمت عملی پر عملدرآمد کے لئے رول آؤٹ میکانزم (ریئل ٹائم قیمت ماڈل): ریئل ٹائم بار پر عملدرآمد کرتے وقت ، حکمت عملی کی ہر نئی ایڈیشن پر عملدرآمد کرنے سے پہلے صارف کی وضاحت شدہ متغیر کو ریولر کہا جاتا ہے۔ ہم ایک مثال کے ساتھ ریولر میکانزم کو سمجھنے کے لئے ، مندرجہ ذیل کوڈ کو ٹیسٹ کرتے ہیں۔
نوٹس:
/*backtest
...
..
.
*/
پیکیج میں 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"}]
*/
var n = 0
if not barstate.ishistory
runtime.log("n + 1之前, n:", n, " 当前bar_index:", bar_index)
n := n + 1
runtime.log("n + 1之后, n:", n, " 当前bar_index:", bar_index)
plot(n, title="n")
ہم نے صرف ریئل ٹائم بار میں کئے جانے والے مناظر کا جائزہ لیا ہے، لہذا ہم نے استعمال کیا ہےnot barstate.ishistory
اظہار کی پابندی صرف ریئل ٹائم بار میں متغیر n پر جمع کی جاتی ہے اور جمع کرنے کے عمل کو انجام دینے سے پہلے اور بعد میں استعمال کیا جاتا ہےruntime.log
فنکشن آؤٹ پٹ کی معلومات حکمت عملی کی لاگ میں۔ پینٹنگ فنکشن کا استعمال کرتے ہوئےplot
n کو دیکھا جاسکتا ہے جب حکمت عملی ہسٹری بار میں چل رہی تھی۔ n ہمیشہ 0 رہا ہے۔ جب عملی طور پر بار پر عملدرآمد کیا جاتا ہے تو n جمع 1 کا عمل ہوتا ہے ، اور عملی طور پر بار پر عملی طور پر ہر بار پر عملدرآمد ہوتا ہے۔ لاگ ان معلومات سے دیکھا جاسکتا ہے کہ ہر بار میں پالیسی کوڈ پر دوبارہ عملدرآمد کیا جاتا ہے n کو پچھلے بار میں پالیسی کوڈ کی آخری پیش کش کی گئی قیمت پر دوبارہ ترتیب دیا جاتا ہے۔ جب پالیسی کوڈ کو آخری بار میں عملی طور پر بار میں اپ ڈیٹ کیا جاتا ہے تو n کی قیمت پیش کی جاتی ہے۔ لہذا ، یہ دیکھا جاسکتا ہے کہ گراف میں ریئل ٹائم بار سے شروع ہوتا ہے ، ہر بار بار میں اضافے کے ساتھ n کو بڑھایا جاتا ہے۔
آخر میں: 1۔ جب حکمت عملی کو ریئل ٹائم بار میں عملدرآمد کیا جاتا ہے تو ، ہر بار جب صورتحال کی تازہ کاری ہوتی ہے تو اس میں ایک حکمت عملی کا کوڈ ہوتا ہے۔ 2۔ جب ریئل ٹائم بار پر عملدرآمد ہوتا ہے تو ، ہر بار پالیسی کوڈ پر عملدرآمد سے پہلے متغیرات کو رول آؤٹ کیا جاتا ہے۔ 3، جب ریئل ٹائم بار پر عملدرآمد کیا جاتا ہے تو ، اختتامی اپ ڈیٹ کے وقت متغیرات کو ایک بار پیش کیا جاتا ہے۔
اعداد و شمار کے پیچھے جانے کی وجہ سے ، چارٹ پر منحنی خطوط جیسے ڈرائنگ آپریشنز کو دوبارہ ڈرائنگ کا سبب بن سکتا ہے ، مثال کے طور پر ہم نے ابھی ٹیسٹ کوڈ میں ترمیم کی ہے ، ریلڈ ڈسک ٹیسٹ:
var n = 0
if not barstate.ishistory
runtime.log("n + 1之前, n:", n, " 当前bar_index:", bar_index)
n := open > close ? n + 1 : n
runtime.log("n + 1之后, n:", n, " 当前bar_index:", bar_index)
plot(n, title="n")
لمحہ اے کا اسکرین شاٹ
لمحہ بی کا اسکرین شاٹ
ہم نے صرف اس جملے میں ترمیم کی ہے:n := open > close ? n + 1 : n
، موجودہ ریئل ٹائم بار جب سونا ہے ((یعنی کھلنے کی قیمت بند ہونے کی قیمت سے زیادہ ہے) تب ہی n کو جمع کیا جاتا ہے۔ جیسا کہ آپ دیکھ سکتے ہیں کہ پہلے گراف میں ((وقت A) اس وقت کھلنے کی قیمت بند ہونے کی قیمت سے زیادہ ہے ، لہذا n کو جمع کیا گیا ہے ، گراف کا منحنی خطوط n کی قیمت 5 ہے۔ پھر رجحان کی تبدیلی ، قیمت کی تازہ کاری جیسا کہ دوسرے گراف میں دکھایا گیا ہے۔ اس وقت کھلنے کی قیمت بند ہونے کی قیمت سے کم ہے۔ (سورج کی لکیر) ، n کی قیمت واپس چلی گئی اور اس میں کوئی جمع نہیں ہوا۔ گراف کا منحنی خطوط 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)
پیچھا چل رہا ہے اسکرین شاٹ
ٹیسٹ کا کوڈ نسبتاً سادہ ہے اور بنیادی طور پر دو طریقوں سے حوالہ کردہ اعداد و شمار کا جائزہ لینے کے لیے ہے:f(a) => a[1]
اورf2() => close[1]
。
f(a) => a[1]
اس طرح کے طور پر: فنکشن کا استعمال کرتے ہوئے پیرامیٹرز، آخر میں واپسa[1]
。
f2() => close[1]
براہ راست بلٹ ان متغیرات کا استعمال کرتے ہوئے:close
فنکشن کے آخر میں واپسیclose[1]
。
[]
اعداد و شمار کی سیریز متغیر کی تاریخی اقدار کے حوالے سے استعمال ہونے والی علامت، close[1] یعنی موجودہ بندش کی قیمت سے پہلے بار پر بندش کی قیمت کا ڈیٹا۔ ہمارے ٹیسٹ کوڈ نے چار اعداد و شمار چارٹ پر ڈرائے:
plotchar(oneBarInTwo ? f(close) : na, title = "f(close)", color = color.red, location = location.absolute, style = shape.xcross, overlay = true, char = "A")
ایک حرف A سے A پر رنگا ہوا ہے، اور جب oneBarInTwo سچ ہے تو اس کی جگہ (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 نمبر پر بند ہونے کی قیمت (بائیں نمبر پر 2 نمبر پر) بار
plot(close[1], title = "close[1]", color = color.green, overlay = true)
سبز رنگ کی لکیر جس کا مقام (Y محور پر)close[1]
یعنی موجودہ بار کے پہلے نمبر پر بند ہونے کی قیمت (بائیں نمبر پر)
اسکرین شاٹ کی طرف سے حکمت عملی کی پیمائش کے ذریعے چل رہا ہے، اگرچہ ڈرائنگ A استعمال کیا جاتا ہے کے لئے نشان لگا دیا گیا ہےf(a) => a[1]
اور پینٹ B استعمال کیا جاتا ہے کہ افعال کے نشاناتf2() => close[1]
استعمال کیا جاتا ہے[1] اعداد و شمار کے سلسلے میں تاریخی اعداد و شمار کا حوالہ دیتے ہیں ، لیکن چارٹ پر “A” اور “B” کے نشانات کی پوزیشن بالکل مختلف ہے۔ “A” کے نشانات کی پوزیشن ہمیشہ سرخ لائن پر ہوتی ہے ، یعنی حکمت عملی میں کوڈplot(close[2], title = "close[2]", color = color.red, overlay = true)
اس لائن پر جو اعداد و شمار استعمال ہوئے ہیں وہ یہ ہیں:close[2]
。
اس کی وجہ یہ ہے کہ K لائن بار کی طرف سے انڈیکس، یعنی بلٹ ان متغیرbar_index
حساب لگائیں کہ آیا “A” اور “B” نشانات ڈرائے جائیں گے۔ “A” اور “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
اور اس کے نتیجے میں صرفclose > close[1]
جب آپ ta.barssince فنکشن کو کال کرتے ہیں تو آپ کو اس کی ضرورت نہیں ہے۔ta.barssince
فنکشن سے حساب کیا جاتا ہے آخری بارclose < close[1]
تشکیل کے وقت K لائنوں کی تعداد ۔ جب ta.barssince فنکشن کو کال کیا جاتا ہے تو یہ close > close ہوتا ہے[1] ، یعنی موجودہ اختتامی قیمت پچھلے بار کی اختتامی قیمت سے زیادہ ہے ، جب فنکشن ta.barssince کو کال کیا جاتا ہے تو اس کی شرط close < close[1] نہ تو قائم کیا گیا ہے اور نہ ہی آخری بار قائم کیا گیا ہے۔
ta.barssince: جب اس کو بلایا جاتا ہے تو ، اگر موجودہ K لائن سے پہلے اس شرط کو کبھی پورا نہیں کیا گیا ہے تو ، یہ فنکشن واپس آئے گا na。
جیسا کہ شکل میں دکھایا گیا ہے:
تو جب ہم نے اس کا نقشہ کھینچا تو ہم نے صرف وہ اعداد و شمار کھینچے تھے جن میں ریز متغیر کی قدر ہوتی تھی.
اس مسئلے سے بچنے کے لئے، ہم صرف استعمال کرتے ہیں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 لائن بار پر عملدرآمد کی جاتی ہے تو استعمال کیا جاتا ہےopen[1]
حوالہ جاتopen
ٹائم سیریز پر موجودہ اسکرپٹ کے ذریعہ انجام دی جانے والی اس K لائن بار کی پچھلی K لائن بار کی افتتاحی قیمت ((یعنی پچھلے 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
اس کے بعد ہم نے ایک گراف استعمال کیا تاکہ ہم سمجھ سکیں۔
اسٹریٹجک عملدرآمد bar_index array v1 array v2 array | - | - | - | - | حکمت عملی کے لئے چلتا ہے 1st K-لائن Bar حکمت عملی کے 2nd K-لائن پر چلتا ہے حکمت عملی کے لئے چلتا ہے تیسری جڑ KBar کراس 2 کراس 1 کراس 3 کراس |…|…|…|…| اس حکمت عملی کو N + 1 K کی جڑ پر چلاتا ہے.
جیسا کہ آپ دیکھ سکتے ہیں ، v1 ، v2 اور یہاں تک کہ bar_index وقت کی ترتیب کی ساخت ہیں ، اور ہر بار میں اس کے مطابق اعداد و شمار ہیں۔ اس ٹیسٹ کوڈ میں ، چاہے “ریئل ٹائم پرائس ماڈل” یا “ہولڈنگ پرائس ماڈل” کا فرق صرف یہ ہے کہ آیا چارٹ پر حقیقی بار دکھایا گیا ہے۔ رفتار کی پیمائش کے ل we ، ہم “ہولڈنگ پرائس ماڈل” کی واپسی ٹیسٹ کا استعمال کرتے ہیں۔
کیونکہ v1 ہر بار پر 1 ہےta.cum(v1)
جب فنکشن پہلی K لائن Bar پر چلایا جاتا ہے تو صرف پہلی بار کی وجہ سے ، اس کا نتیجہ 1 ہے ، جس کی وجہ سے متغیر v2 کو دیا گیا ہے۔
جبta.cum(v1)
دوسرے K لائن بار پر عمل کرتے وقت ، پہلے ہی 2 K لائن بار موجود ہیں ((پہلا مماثل بلٹ ان متغیر bar_index 0 ہے ، دوسرا مماثل بلٹ ان متغیر bar_index 1 ہے) ، لہذا حساب کتاب 2 ہے ، متغیر v2 کو دی گئی ہے ، اور اسی طرح آگے بڑھ رہا ہے۔ یہ حقیقت میں مشاہدہ کیا جاسکتا ہے کہ v2 چارٹ میں K لائن بار کی تعداد ہے ، کیونکہ K لائنوں کی انڈیکسbar_index
یہ 0 سے بڑھتا ہے، توbar_index + 1
اصل میں K لائنوں کی تعداد ہے.v2
اورbar_index
یہ ایک ہی تصویر ہے۔
میں بھی استعمال کر سکتا ہوںta.cum
بلٹ ان فنکشن موجودہ چارٹ پر تمام بار کی بندش کی قیمتوں کا مجموعہ شمار کرتا ہے، پھر یہ صرف اس طرح لکھا جا سکتا ہے:ta.cum(close)
، جب حکمت عملی کو دائیں طرف کے ریئل ٹائم بار پر چلایا جاتا ہےta.cum(close)
اس کے نتیجے میں چارٹ پر موجود تمام باروں کے اختتامی قیمتوں کا مجموعہ ہوتا ہے (بغیر دائیں طرف چلنے کے ، صرف موجودہ بار میں اضافہ ہوتا ہے) ۔
ٹائم سیریز پر متغیرات کا آپریشن آپریٹرز کے ذریعہ بھی کیا جاسکتا ہے ، جیسے کوڈ:ta.sma(high - low, 14)
، بلٹ میں متغیراتhigh
(K لائن بار زیادہ سے زیادہ قیمت) مائنس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)
یہ ٹیسٹ کوڈ ریٹرننگ کے وقت ٹیسٹ چل رہا ہے اور یہ دیکھا جا سکتا ہےv1
اورv2
کی قدر ایک جیسی ہے، اور چارٹ پر کھینچی گئی لائن بھی مکمل طور پر ملاپ کرتی ہے۔ فنکشن کالنگ کے حساب سے نکلنے والا نتیجہ ٹائم سیریز میں قدر کا نشان چھوڑتا ہے، جیسے کوڈta.highest(high, 10)[1]
ان میں سےta.highest(high, 10)
ایک فنکشن کال کی طرف سے حاصل کردہ نتائج بھی استعمال کیا جا سکتا ہے.[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 کی قیمتیں متعلقہ بار کے اوپر اور نیچے دکھائی دیتی ہیں۔ اس ڈرائنگ کوڈ کو سیکھنے کے دوران برقرار رکھا جاسکتا ہے ، کیونکہ جانچ اور تجربے کے دوران اکثر معلومات کو چارٹ پر دیکھنے کے لئے آؤٹ پٹ کرنے کی ضرورت پڑسکتی ہے۔
اس سبق کے ابتدائی حصے میں ہم نے ایف ایم زیڈ پر پائن اور ٹریڈنگ ویو پر پائن زبان کے استعمال کے بارے میں کچھ اختلافات کا خلاصہ کیا ہے۔ ایف ایم زیڈ پر پائن کوڈ لکھتے وقت ورژن نمبر کو نظرانداز کیا جاسکتا ہے ، لیکن اس کے علاوہ ، اس میں مختلف ورژن نمبر شامل ہیں۔indicator()
、strategy()
اور، عارضی طور پر معاونت نہیںlibrary()
یقیناً ، پائن اسکرپٹ کے پہلے ورژن کے ساتھ مطابقت پانے کے لئے ، حکمت عملی لکھنے کے وقت ، اس طرح لکھیں://@version=5
,indicator()
,strategy()
یہ بھی ممکن ہے۔ کچھ پالیسی کی ترتیبات بھی دستیاب ہیں۔strategy()
فنکشن میں پاس پیرامیٹر سیٹ کریں.
<version>
<declaration_statement>
<code>
<version>
ورژن کنٹرول کی معلومات کو نظر انداز کیا جا سکتا ہے۔
پائن بولیاں//
ایک سطر کے تبصرے کے طور پر ، کیونکہ پائن زبان میں کثیر سطر تبصرے نہیں ہیں۔/**/
کثیر سطر تبصرے کے لیے استعمال کیا جاتا ہے۔
اسکرپٹ میں جو لائن تبصرہ یا کمپلیٹر ہدایات نہیں ہے وہ بیانات ہیں ، جو اسکرپٹ کے الگورتھم کو نافذ کرتی ہیں۔ ایک بیان ان میں سے ایک ہوسکتا ہے۔
if
,for
,while
یاswitch
ہم آہنگی کی ساختجملوں کو کئی طرح سے ترتیب دیا جا سکتا ہے
空格
یا制表符
(ٹیب بٹن) شروع کریں۔ ان کا پہلا حرف بھی اس لائن کا پہلا حرف ہونا چاہیے۔ لائنوں میں پہلی پوزیشن پر شروع ہونے والی لائنیں ، تعریف کے مطابق اسکرپٹ کی عالمی حدود کا حصہ بن جاتی ہیں۔local block
ایک مقامی بلاک کو ایک میٹرک یا چار خالی جگہوں میں سکریپ کرنا ہوگا (بغیر اس کے ، اس کو پچھلی لائن کے سلسلہ وار کوڈ کے طور پر تجزیہ کیا جائے گا ، یعنی اس کو پچھلی لائن کے کوڈ کا تسلسل سمجھا جائے گا) ، ہر مقامی بلاک ایک مختلف مقامی دائرہ کار کی وضاحت کرتا ہے۔مثال کے طور پر، تین مقامی بلاکس پر مشتمل ہے، ایک اپنی مرضی کے مطابق فنکشن کے بیان میں، دو متغیر کے بیان میں if ڈھانچے کا استعمال کرتے ہوئے، مندرجہ ذیل کوڈ:
indicator("", "", true) // 声明语句(全局范围),可以省略不写
barIsUp() => // 函数声明(全局范围)
close > open // 本地块(本地范围)
plotColor = if barIsUp() // 变量声明 (全局范围)
color.green // 本地块 (本地范围)
else
color.red // 本地块 (本地范围)
runtime.log("color", color = plotColor) // 调用一个内置函数输出日志 (全局范围)
لمبی لائنوں کو ایک سے زیادہ لائنوں میں تقسیم کیا جاسکتا ہے ، یا ان کو “لپیٹ” کیا جاسکتا ہے۔ لپیٹ والی لائنوں کو کسی بھی تعداد میں خالی جگہوں میں سکڑنا چاہئے ، بشرطیکہ یہ 4 کا ضرب نہ ہو۔ (یہ حدود مقامی بلاک میں سکڑنے کے لئے استعمال کی جاتی ہیں) ۔
a = open + high + low + close
اس کے علاوہ ، یہ بھی ممکن ہے کہ اس کو پیکیج کیا جا سکے (نوٹ کریں کہ ہر لائن میں گھومنے والی خالی جگہوں کی تعداد 4 کے ضرب نہیں ہے):
a = open +
high +
low +
close
ایک طویل پلاٹ ((() کال کو پیکیج کیا جاسکتا ہے۔
close1 = request.security(syminfo.tickerid, "D", close) // syminfo.tickerid 当前交易对的日线级别收盘价数据系列
close2 = request.security(syminfo.tickerid, "240", close) // syminfo.tickerid 当前交易对的240分钟级别收盘价数据系列
plot(ta.correlation(close, open, 100), // 一行长的plot()调用可以被包装
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")
متغیر کو سمجھنے سے پہلے ، ہمیں سب سے پہلے بیکن آئیڈینٹر بیکن کے تصور کو سمجھنا ہوگا۔ عام طور پر بیکن آئیڈینٹر بیکن کا استعمال کیا جاتا ہےفنکشناورمتغیراتکے نام کے ((کے لئے نام متغیر، فنکشن) فنکشناس کے بعد ہم اس سبق میں سیکھیں گے، ہم نے پہلے ہی سیکھا ہے کہ کس طرح کی شناخت کی جاتی ہے.
(A-Z)
یا اس سے بھی کم(a-z)
حروف یا زیر لکیر(_)
شروع، بطور شناخت کرنے والا پہلا حرف。مثال کے طور پر:
fmzVar
_fmzVar
fmz666Var
funcName
MAX_LEN
max_len
maxLen
3barsDown // 错误的命名!使用了数字字符作为标识符的开头字符
زیادہ تر پروگرامنگ زبانوں کی طرح ، پائن زبان میں بھی لکھنے کی تجاویز ہیں۔ عام طور پر شناخت کنندہ کے نام پر تجویز کی جاتی ہے:
// 命名变量、常量
GREEN_COLOR = #4CAF50
MAX_LOOKBACK = 100
int fastLength = 7
// 命名函数
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
فنکشن کا دوسرا پیرامیٹر اس قسم کی حمایت نہیں ک