[TOC]
معاون ویڈیو سبق:https://www.youtube.com/watch?v=CA3SwJQb_1g
ایف ایم زیڈ کوانٹ ٹریڈنگ پلیٹ فارم پائن زبان کی حکمت عملی تحریر ، بیک ٹیسٹنگ ، اور پائن زبان کی حکمت عملیوں کی براہ راست تجارت کی حمایت کرتا ہے ، اور یہ پائن زبان کے نچلے ورژن کے ساتھ مطابقت رکھتا ہے۔ پائن زبان میں جمع اور پیوند شدہ بہت ساری پائن حکمت عملی (سکرپٹ) ہیں۔اسٹریٹیجی اسکوائرایف ایم زیڈ کوانٹ ٹریڈنگ پلیٹ فارم پر (FMZ.COM).
ایف ایم زیڈ نہ صرف پائن زبان کی حمایت کرتا ہے ، بلکہ پائن زبان کے طاقتور ڈرائنگ فنکشن کی بھی حمایت کرتا ہے۔ ایف ایم زیڈ پلیٹ فارم پر مختلف افعال ، بھرپور اور عملی ٹولز ، موثر اور آسان انتظام پائن حکمت عملی (سکرپٹ) کی عملی صلاحیت کو مزید بڑھاوا دیتے ہیں۔ پائن زبان کے ساتھ مطابقت کی بنیاد پر ، ایف ایم زیڈ پائن زبان کو بھی ایک خاص حد تک وسعت دیتا ہے ، بہتر بناتا ہے اور ٹرم کرتا ہے۔ سرکاری طور پر ٹیوٹوریل میں داخل ہونے سے پہلے ، آئیے ایک نظر ڈالیں کہ اصل ورژن کے مقابلے میں ایف ایم زیڈ پر پائن زبان میں کیا تبدیلیاں کی گئیں۔
کچھ واضح اختلافات کا مختصر جائزہ:
//@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)
اختتامی قیمت ماڈل اور حقیقی وقت کی قیمت ماڈل
ٹریڈنگ کے نقطہ نظر پر، ہم استعمال کر سکتے ہیںcalc_on_every_tick
پیرامیٹرstrategy
فنکشن حکمت عملی اسکرپٹ مقرر کرنے کے لئے حقیقی وقت میں حکمت عملی منطق کو چلانے کے لئے جب قیمت ہر بار بدل جاتا ہے. اس وقت،calc_on_every_tick
پیرامیٹر پر مقرر کیا جانا چاہئےtrue
.calc_on_every_tick
ڈیفالٹ پیرامیٹر ہےfalse
، یعنی حکمت عملی منطق صرف اس وقت عمل میں لائی جاتی ہے جب حکمت عملی کی موجودہ K لائن BAR مکمل طور پر مکمل ہو جاتی ہے۔
ایف ایم زیڈ پر ، یہ
عددی درستگی کنٹرول، جیسے قیمت اور آرڈر کی رقم جب حکمت عملی پر عملدرآمد کیا جاتا ہے FMZ پر مخصوص کرنے کی ضرورت ہے تجارتی نقطہ نظر سے ، حقیقی تجارتی احکامات کی جگہ لینے پر درستگی کا کوئی مسئلہ نہیں ہوتا ہے ، کیونکہ اس کی صرف نقالی میں جانچ کی جاسکتی ہے۔ ایف ایم زیڈ پر ، پائین حکمت عملی کو حقیقی تجارت میں چلانا ممکن ہے۔ پھر حکمت عملی کو تجارتی قسم کی قیمت کی درستگی اور آرڈر کی رقم کی درستگی کو لچکدار طریقے سے متعین کرنے کے قابل ہونا چاہئے۔ درستگی کی ترتیبات متعلقہ اعداد و شمار میں اعشاریہ مقامات کی تعداد کو کنٹرول کرتی ہیں تاکہ اعداد و شمار کو ایکسچینج کی آرڈر کی ضروریات کو پورا نہ کرنے اور اس طرح آرڈر دینے میں ناکام ہونے سے روکا جاسکے۔
مستقبل کے معاہدے کا کوڈ
اگر ایف ایم زیڈ پر ٹریڈنگ پروڈکٹ ایک معاہدہ ہے تو ، اس کی دو خصوصیات ہیں ، وہ بالترتیب swap
، اور معاہدے کا کوڈ اس بات پر منحصر ہے کہ آیا آپریٹنگ ایکسچینج کے پاس ایسا معاہدہ ہے۔ مثال کے طور پر ، کچھ تبادلے میں سہ ماہی معاہدے ہوتے ہیں ، آپ اس کو پُر کرسکتے ہیںquarter
یہ معاہدہ کوڈز ایف ایم زیڈ
دیگر ترتیبات کے لئے، جیسے کم سے کم آرڈر کی رقم، ڈیفالٹ آرڈر کی رقم، وغیرہ، براہ کرم پیرامیٹر کا تعارف دیکھیں
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)
overlay
پیرامیٹر کچھ ڈرائنگ افعال میں توسیع کی جاتی ہےFMZ پر پائن زبان میں، ڈرائنگ افعالplot
, plotshape
, plotchar
، وغیرہ شامل کیا ہےoverlay
پیرامیٹر سپورٹ، مرکزی چارٹ یا ذیلی چارٹ پر ڈرائنگ کی وضاحت کرنے کی اجازت دیتا ہے.overlay
پر مقرر کیا گیا ہےtrue
مرکزی چارٹ پر ڈرائنگ کرنے کے لئے، اورfalse
ذیلی چارٹ پر ڈرائنگ کرنے کے لئے مقرر کیا جاتا ہے، جس میں FMZ پر پائن کی حکمت عملی کو ایک ہی وقت میں مرکزی چارٹ اور ذیلی چارٹ ڈرائنگ کرنے کے قابل بناتا ہے.
syminfo.mintick
بلٹ ان متغیرکے بلٹ ان متغیرsyminfo.mintick
موجودہ علامت کے لئے کم سے کم ٹِک ویلیو کے طور پر بیان کیا گیا ہے۔ اس قدر کو syminfo.mintick
0.01 ہے
مثال کے طور پر: آرڈر کی قیمت 8000 ہے، فروخت کی سمت، مقدار 1 لاٹ (ٹوک، شیٹ) ہے، ٹرانزیکشن کے بعد اوسط قیمت 8000 نہیں ہے، لیکن 8000 سے کم ہے (لاگت میں ہینڈلنگ فیس شامل ہے).
جب آپ پائن زبان کی بنیادی باتیں سیکھنا شروع کرتے ہیں تو ، ہدایات اور کوڈ گرائمر کی کچھ مثالیں ہوسکتی ہیں جن سے ہم واقف نہیں ہیں۔ اس سے کوئی فرق نہیں پڑتا ہے کہ اگر آپ اسے نہیں سمجھتے ہیں تو ، ہم پہلے تصورات سے واقف ہوسکتے ہیں اور ٹیسٹ کے مقصد کو سمجھ سکتے ہیں ، یا آپ ہدایات کے لئے ایف ایم زیڈ پر پائن زبان کی دستاویزات چیک کرسکتے ہیں۔ پھر مختلف گرائمر ، ہدایات ، افعال اور بلٹ ان متغیرات سے واقف ہونے کے لئے قدم بہ قدم ٹیوٹوریل پر عمل کریں۔
جب پائن زبان سیکھنا شروع کرتے ہیں تو ، متعلقہ تصورات جیسے پائن زبان اسکرپٹ پروگرام کے عملدرآمد کے عمل کو سمجھنا بہت ضروری ہے۔ پائن زبان کی حکمت عملی چارٹ کی بنیاد پر چلتی ہے۔ یہ سمجھا جاسکتا ہے کہ پائن زبان کی حکمت عملی حساب کتاب اور کارروائیوں کا ایک سلسلہ ہے ، جو چارٹ پر لوڈ کیے گئے ابتدائی اعداد و شمار سے وقت کی سیریز کے ترتیب میں چارٹ پر انجام دیا جاتا ہے۔ اعداد و شمار کی مقدار جو چارٹ ابتدائی طور پر لوڈ کرتی ہے محدود ہے۔ حقیقی تجارت میں ، زیادہ سے زیادہ اعداد و شمار کی مقدار عام طور پر ایکسچینج انٹرفیس کے ذریعہ واپس آنے والے زیادہ سے زیادہ ڈیٹا حجم کی بنیاد پر طے کی جاتی ہے ، اور بیک ٹیسٹنگ کے دوران ڈیٹا کی زیادہ سے زیادہ مقدار بیک ٹیسٹنگ سسٹم کے ڈیٹا ماخذ کے ذریعہ فراہم کردہ ڈیٹا کی بنیاد پر طے کی جاتی ہے۔ چارٹ پر بائیں طرف کی لائن بار ، یعنی چارٹ کے پہلے ڈیٹا سیٹ کی انڈیکس ویلیو 0 ہوتی ہے۔ جب موجودہ پائن بار اسکرپٹ کو متغیر کے ذریعہ حوالہ دیا جاتا ہے تو اس کی انڈیکس ویلیو 0 ہوتی ہے۔bar_index
پائن زبان میں.
plot(bar_index, "bar_index")
کے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
:
تاریخی بار
جب حکمت عملی Historical Bars
. حکمت عملی منطق ہر پر صرف ایک بار عملدرآمد کیا جاتا ہےhistorical bar
.
جب حکمت عملی historical bars
. حکمت عملی منطق ہر پر صرف ایک بار عملدرآمد کیا جاتا ہےhistorical bar
.
تاریخی بار پر مبنی حساب کتاب: حکمت عملی کا کوڈ تاریخی بار کی بندش کی حالت میں ایک بار عمل میں لایا جاتا ہے، اور پھر حکمت عملی کا کوڈ اگلے تاریخی بار میں عمل میں لایا جاتا ہے جب تک کہ تمام تاریخی سلاخوں کو ایک بار عمل میں نہ لایا جائے۔
ریئل ٹائم بار
جب حکمت عملی کو دائیں طرف آخری K لائن بار پر انجام دیا جاتا ہے تو ، بار ایک ریئل ٹائم بار ہے۔ ریئل ٹائم بار بند ہونے کے بعد ، بار ایک منظور شدہ ریئل ٹائم بار بن جاتا ہے (تاریخی بار بن جاتا ہے۔ چارٹ کے دائیں طرف ایک نیا ریئل ٹائم بار تیار کیا جائے گا۔
جب حکمت عملی
ریئل ٹائم بار پر مبنی حساب کتاب:
اگر حکمت عملی کو 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")
ہم صرف حقیقی وقت بارز کے دوران پھانسی دی منظر کا جائزہ لیں، تو ہم استعمال کرتے ہیںnot barstate.ishistory
اظہار صرف حقیقی وقت بار میں متغیر n کے جمع کو محدود کرنے کے لئے، اور استعمالruntime.log
جمع کرنے کے آپریشن سے پہلے اور بعد میں حکمت عملی لاگ میں معلومات کو آؤٹ پٹ کرنے کے لئے تقریب.plot
، یہ دیکھا جاسکتا ہے کہ جب حکمت عملی تاریخی باروں میں چل رہی ہے تو n ہمیشہ 0 ہوتا ہے۔ جب ریئل ٹائم بار کو عمل میں لایا جاتا ہے تو ، 1 کو n میں شامل کرنے کا عمل شروع ہوجاتا ہے ، اور 1 کو n میں شامل کرنے کا عمل اس وقت عمل میں لایا جاتا ہے جب حکمت عملی کو ریئل ٹائم بار کے ہر راؤنڈ میں عمل میں لایا جاتا ہے۔ یہ لاگ پیغام سے مشاہدہ کیا جاسکتا ہے کہ جب حکمت عملی کا کوڈ ہر راؤنڈ میں دوبارہ عمل میں لایا جاتا ہے تو پچھلی بار عملدرآمد کی حکمت عملی کے ذریعہ آخر میں فراہم کردہ قدر میں n کو ری سیٹ کیا جائے گا۔ جب حکمت عملی کا کوڈ آخری بار ریئل ٹائم بار پر عمل میں لایا جاتا ہے تو این ویلیو اپ ڈیٹ پیش کیا جائے گا ، لہذا آپ دیکھ سکتے ہیں کہ چارٹ پر ریئل ٹائم بار سے شروع ہونے والے بار کے ہر اضافے کے ساتھ منحنی n کی قیمت میں 1 کا اضافہ ہوتا ہے۔
خلاصہ:
ڈیٹا رول بیک کی وجہ سے ، ڈرائنگ آپریشنز ، جیسے چارٹ پر منحنی خطوط بھی دوبارہ ڈرائنگ کا سبب بن سکتے ہیں۔ مثال کے طور پر ، براہ راست تجارت کے لئے ابھی ٹیسٹ کوڈ کو تبدیل کریں:
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 کا اسکرین شاٹ
وقت B کا اسکرین شاٹ
ہم نے صرف جملہ میں ترمیم کی: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)
بیک ٹسٹ چلانے کا اسکرین شاٹ
ٹیسٹ کوڈ نسبتا سادہ ہے، بنیادی طور پر دو طریقوں سے حوالہ کردہ اعداد و شمار کا جائزہ لینے کے لئے، یعنی: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")
ایک کردار f(close)
.
plotchar(oneBarInTwo ? f2() : na, title = "f2()", color = color.green, location = location.absolute, style = shape.circle, overlay = true, char = "B")
ایک کردار 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] ، چارٹ پر plot(close[2], title = "close[2]", color = color.red, overlay = true)
، لائن کھینچنے کے لئے استعمال کردہ اعداد و شمار ہےclose[2]
.
وجہ یہ ہے کہ K لائن بار کے اشاریہ، یعنی بلٹ میں متغیر کے ذریعے bar_index
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 لائن سے پہلے شرط کبھی پوری نہیں ہوئی ہے۔
جیسا کہ چارٹ میں دکھایا گیا ہے:
تو جب چارٹ تیار کیا جاتا ہے، صرف اعداد و شمار کے ساتھ ایک قدر کے لئے 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 اور یہاں تک کہ بار_انڈیکس سبھی ٹائم سیریز ڈھانچے ہیں ، اور ہر بار پر متعلقہ ڈیٹا موجود ہے۔ چاہے ٹیسٹ کوڈ
چونکہ متغیر v1 ہر بار پر 1 ہے، جبta.cum(v1)
فنکشن پہلی K لائن بار پر عملدرآمد کیا جاتا ہے، صرف پہلی بار ہے، لہذا حساب نتیجہ 1 ہے اور متغیر v2 کو تفویض کیا جاتا ہے.
کبta.cum(v1)
دوسری K لائن بار پر عملدرآمد کیا جاتا ہے ، پہلے ہی 2 K لائن بارز موجود ہیں (پہلے سے متعلق بلٹ ان متغیر بار_انڈیکس 0 ہے ، اور دوسرا بلٹ ان متغیر بار_انڈیکس 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
(کی لائن بار کی سب سے زیادہ قیمت) سے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 کی اقدار متعلقہ باروں کے اوپر اور نیچے دکھائی جاتی ہیں۔ ہم سیکھنے کے عمل کے دوران اس ڈرائنگ کوڈ کو رکھ سکتے ہیں ، کیونکہ ہمیں اکثر بیک ٹیسٹنگ اور تجربات کے دوران مشاہدے کے لئے چارٹ پر معلومات آؤٹ پٹ کرنے کی ضرورت پڑسکتی ہے۔
سبق کے ابتدائی حصے میں ، ہم نے ایف ایم زیڈ اور ٹریڈنگ ویو پر پائن زبان کے استعمال میں کچھ اختلافات کا خلاصہ کیا ہے۔ جب ایف ایم زیڈ پر پائن کوڈ لکھتے ہو تو ، آپ ورژن نمبر کو چھوڑ سکتے ہیں ،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)
لمبی لائنوں کو متعدد لائنوں میں تقسیم کیا جاسکتا ہے ، یا
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")
متغیرات کو پہچاننے سے پہلے ، ہمیں پہلے
(A-Z)
یا چھوٹے حروف(a-z)
خط یا ایک underscore(_)
مارکر کے پہلے کردار کے طور پر.جیسے مندرجہ ذیل نام والے مارکر:
fmzVar
_fmzVar
fmz666Var
funcName
MAX_LEN
max_len
maxLen
3barsDown // Wrong naming! It used a numeric character as the leading character of the marker
زیادہ تر پروگرامنگ زبانوں کی طرح ، پائن زبان میں بھی تحریری تجاویز ہیں۔ شناخت کرنے والوں کا نام دینے کے لئے عام طور پر یہ تجویز کی جاتی ہے کہ:
// 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")
متغیر
مختلف
ہم مطلوبہ لفظ دیکھتے ہیں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 ہر بار ترمیم کی جاتی ہے ، لیکن پچھلی قدر کو بحال کیا جائے گا جب حکمت عملی کی منطق اگلے راؤنڈ میں عملدرآمد کی جاتی ہے (یاد رکھیں کہ رول بیک میکانزم جو ہم نے پچھلے
نشان ماڈل: چونکہ ٹِک ماڈل حکمت عملی کی منطق کو صرف ایک بار K- لائن بار پر انجام دیتا ہے۔ لہذا اختتامی قیمت ماڈل میں ، وار اور وارپ کے ذریعہ اعلان کردہ متغیرات مندرجہ بالا مثال میں بالکل ایک جیسے برتاؤ کرتے ہیں جو تاریخی K لائن مرحلے اور حقیقی وقت کے K لائن مرحلے کے دوران ہر K لائن BAR کے لئے 1 سے بڑھتے ہیں۔
آپریٹر | تفصیل |
---|---|
+ | اضافہ |
- | گھٹانا |
* | ضرب |
/ | ڈویژن |
% | ماڈیول |
کے+
اور-
آپریٹرز کو بائنری آپریٹرز یا یونری آپریٹرز کے طور پر استعمال کیا جاسکتا ہے۔ دیگر ریاضیاتی آپریٹرز کو صرف بائنری آپریٹرز کے طور پر استعمال کیا جاسکتا ہے اور اگر اسے یونری آپریٹرز کے طور پر استعمال کیا گیا ہو تو یہ غلطی کی اطلاع دے گا۔
+
، حساب کتاب کا نتیجہ ایک تار ہے ، قدر کو تار کی شکل میں تبدیل کیا جائے گا ، اور پھر تاروں کو ایک ساتھ جوڑا جائے گا۔ اگر یہ دوسرا ریاضیاتی آپریٹر ہے تو ، یہ تار کو کسی قدر میں تبدیل کرنے کی کوشش کرے گا اور پھر آپریشن جاری رکھے گا۔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 value
موازنہ آپریٹرز تمام بائنری آپریٹرز ہیں.
آپریٹر | تفصیل |
---|---|
< | < |
> | > |
<= | <= |
>= | >= |
== | == |
!= | != |
ٹیسٹ کا مثال:
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