[TOC]
ویڈیو ٹیوٹوریل کے ساتھ:کوانٹیٹائزڈ ٹریڈنگ میں داخلہ بہت مشکل ہے؟ trade view پائن زبان کا استعمال کرتے ہوئے چھوٹی سفید سے لے کر کوانٹ دیوتا تک - پائن زبان کے ابتدائی محققین
ایجاد کنندہ کوالٹی ٹرانزیکشن پلیٹ فارمز پائین زبان میں لکھنے کی پالیسیوں کی حمایت کرتے ہیں ، دوبارہ جانچ پڑتال کی حمایت کرتے ہیں ، پائین زبان کی پالیسیوں کو ڈسک پر چلاتے ہیں ، پائین زبان کے کم ورژن کے ساتھ ہم آہنگ ہیں۔FMZ.COM(بزبان انگریزی)حکمت عملی کی چوٹیاس کے علاوہ، اسکرپٹ میں بہت سے پائن کی حکمت عملیوں کو تلاش کرنے اور نقل کرنے کے لئے استعمال کیا جاتا ہے.
FMZ نہ صرف پائن زبان کی حمایت کرتا ہے بلکہ پائن زبان کی طاقتور گرافک خصوصیات کی بھی حمایت کرتا ہے۔ FMZ پلیٹ فارم پر موجود تمام خصوصیات ، بھرپور مفید ٹولز ، موثر اور آسان انتظام ، پائن کی حکمت عملی (اسکرپٹ) کی افادیت کو بھی مزید بڑھا دیتا ہے۔ FMZ پائن زبان پر مبنی مطابقت پر مبنی ہے ، اور اس کے ساتھ ہی پائن زبان میں کچھ توسیع ، اصلاح اور کٹ بھی کی گئی ہے۔ اس سے پہلے کہ ہم سرکاری طور پر سبق میں داخل ہوں ، آئیے مل کر دیکھیں کہ FMZ پر پائن زبان اور اصل پائن میں کیا تبدیلیاں ہیں۔
اس کے علاوہ ، یہ بھی واضح ہے کہ یہ ایک بہت ہی اہم مسئلہ ہے۔
1، FMZ پر پائن پالیسی، کوڈ کے آغاز میں ورژن کا نشان//@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 مکمل طور پر ختم نہ ہوجائے۔
ایف ایم زیڈ پر ، یہ "پائن زبان کی تجارت کی قسم" ٹیمپلیٹ کے پیرامیٹرز کے ذریعہ مقرر کیا جاتا ہے۔
حکمت عملی پر عملدرآمد کے وقت قیمت، کم مقدار وغیرہ کی عددی درستگی کا کنٹرول ایف ایم زیڈ پر مقرر کیا جانا چاہئے ٹریڈنگ ویو میں صرف مشابہ ٹیسٹ کی وجہ سے حقیقی وقت کی درستگی کا کوئی مسئلہ نہیں ہے۔ ایف ایم زیڈ پر حقیقی وقت میں پائن کی حکمت عملی چل سکتی ہے۔ اس کے بعد حکمت عملی کی ضرورت ہوتی ہے جس میں تجارتی اقسام کی قیمت کی درستگی ، آرڈر کی تعداد کی درستگی کو لچکدار طور پر بیان کیا جاسکتا ہے۔ یہ درستگی کی ترتیبات متعلقہ اعداد و شمار کے چھوٹے ہندسوں کو کنٹرول کرتی ہیں ، تاکہ یہ ڈیٹا کو روکنے کے لئے کہ وہ ایکسچینج کی فہرست کی ضروریات کو پورا نہیں کرتی ہے اور اس وجہ سے آرڈر نہیں دے سکتی ہے۔
مستقبل کے معاہدے کا کوڈ
ایف ایم زیڈ پر تجارت کی قسم اگر معاہدہ ہے تو اس کی دو خصوصیات ہیں۔ "ٹرانزیکشن جوڑی" اور "معاہدہ کا کوڈ"۔ اصل ڈیسک اور ریویو کے وقت تجارت کے جوڑے کو واضح طور پر ترتیب دینے کے علاوہ ، "پائن لینگویج ٹرانزیکشن لائبریری" ٹیمپلیٹ میں پیرامیٹر "متعدد کوڈ" میں مخصوص معاہدہ کا کوڈ بھی ترتیب دینے کی ضرورت ہے۔ مثال کے طور پر ، مستقل معاہدہ بھرنے کے لئے۔swap
، معاہدے کا کوڈ اس بات پر منحصر ہے کہ آیا آپریٹنگ ایکسچینج میں ایسا معاہدہ موجود ہے۔ مثال کے طور پر ، کچھ تجارت کے تمام سہ ماہی کے معاہدے ، یہاں بھریںquarter
یہ معاہدہ کوڈ ایف ایم زیڈ کے جاوا اسکرپٹ / پائیتون / سی ++ زبان API دستاویزات میں بیان کردہ مستقبل کے معاہدے کے کوڈ سے مماثل ہے۔
دیگر ترتیبات جیسے کم سے کم تعداد، ڈیفالٹ تعداد وغیرہ کے بارے میں پائن زبان کی دستاویزات میں دیکھ سکتے ہیں۔"پائن لینگویج ٹرانزیکشن لائبریری"پیرامیٹرز کا تعارف۔
3、runtime.debug
、runtime.log
、runtime.error
FMZ توسیع کی تقریب، ڈیبگنگ کے لئے استعمال کیا جاتا ہے.
ایف ایم زیڈ پلیٹ فارم پر ڈیبگنگ کے لیے تین افعال شامل کیے گئے ہیں۔
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
ذیلی گراف میں پینٹ کریں۔ FMZ پر پائن کی پالیسی کو چلانے کے دوران مرکزی خیال، موضوع، ذیلی گراف کے ساتھ ساتھ پینٹ کریں۔
5、syminfo.mintick
بلٹ ان متغیرات کی قدر
syminfo.mintick
بلٹ ان متغیر کی تعریف موجودہ قسم کی کم سے کم درج کردہ قیمت کے طور پر کی جاتی ہے۔ FMZ میںاصلی ڈسک/دوبارہ جانچ پڑتالانٹرفیس میں "پائن زبان ٹریڈنگ کلاس لائبریری" میں ٹیمپلیٹ پیرامیٹر قیمتوں کا تعین کرنسی کی درستگی اس قدر کو کنٹرول کر سکتے ہیں. قیمتوں کا تعین کرنسی کی درستگی سیٹ 2 ہے کہ قیمتوں کا تبادلہ کرنے کے لئے دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیں دائیںsyminfo.mintick
اس کی قیمت 0.01 ہے۔
6، FMZ PINE اسکرپٹ میں اوسط قیمتیں شامل ہیں
مثال کے طور پر: آرڈر کی قیمت 8000 ہے ، فروخت کی سمت ، ایک ہاتھ کی تعداد (ایک ، چار) ، اور ٹرانزیکشن کے بعد اوسط قیمت 8000 نہیں ہے ، 8000 سے کم ہے (لاگت میں دستاویزی فیس شامل ہے) ۔
جب ہم پائین زبان کی بنیادی باتیں سیکھنا شروع کرتے ہیں تو ، کچھ مثالوں میں ہدایات ، کوڈ کی نحو سے ہم واقف نہیں ہوسکتے ہیں۔ اگر آپ کو سمجھ نہیں آتی ہے تو ، اس سے کوئی فرق نہیں پڑتا ہے ، ہم پہلے تصورات سے واقف ہوسکتے ہیں ، جانچ کے مقاصد کو سمجھ سکتے ہیں ، یا آپ ایف ایم زیڈ کی پائین زبان کی دستاویزات سے مشورہ کرسکتے ہیں تاکہ ہدایات کو دیکھ سکیں۔ اس کے بعد سبق کی پیروی کریں تاکہ ہم آہستہ آہستہ مختلف نحو ، ہدایات ، افعال ، بلٹ ان متغیرات سے واقف ہوں۔
پائن زبان سیکھنے کے لئے ابتدائی طور پر پائن زبان کے اسکرپٹ کے عملدرآمد کے طریقہ کار جیسے متعلقہ تصورات کو سمجھنا ضروری ہے۔ پائن زبان کی حکمت عملی چارٹ پر مبنی ہے ، جسے ایک سلسلہ حساب کتاب اور کارروائیوں کے طور پر سمجھا جاسکتا ہے ، جو چارٹ پر ٹائم سیریز کے بعد کے سلسلے میں چارٹ پر پہلے سے لوڈ ہونے والے اعداد و شمار سے شروع ہوتا ہے۔ چارٹ کا ابتدائی لوڈ ہونے والا ڈیٹا محدود ہے۔ اصل وقت میں عام طور پر اس ڈیٹا کی مقدار کا تعین ایکسچینج انٹرفیس کے ذریعہ واپس آنے والے ڈیٹا کی مقدار پر مبنی ہوتا ہے ، اور ریٹرن ٹائم کی حد کا تعین ریٹرن سسٹم کے ڈیٹا ماخذ کے ذریعہ فراہم کردہ ڈیٹا پر مبنی ہوتا ہے۔ چارٹ کی سب سے بائیں طرف کی پہلی لائن KBar ، یعنی چارٹ ڈیٹا سیٹ کا پہلا ڈیٹا ، جس کی انڈیکس ویلیو 0 ہے۔ پائن زبان میں بلٹ ان متغیر کے ذریعہ کیا جاسکتا ہے۔bar_index
کی لائن بار کی انڈیکس ویلیو کا حوالہ دیتا ہے جو پائن اسکرپٹ کے عملدرآمد کے وقت موجودہ ہے۔
plot(bar_index, "bar_index")
plot
فنکشن مستقبل میں زیادہ استعمال ہونے والے فنکشنز میں سے ایک ہے۔ اس کا استعمال بہت آسان ہے ، اس میں داخل کردہ پیرامیٹرز کے مطابق چارٹ پر لائنیں کھینچنا ہے ، اور داخل کردہ ڈیٹا یہ ہے: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
...
..
.
*/
اس پیکیج میں ایف ایم زیڈ کے پلیٹ فارم پر کوڈ کی شکل میں محفوظ کردہ ریسیسر کی ترتیب کی معلومات ہیں۔
/*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 کے علاوہ 1 کا عمل انجام دیا جاتا تھا۔ لاگ ان کی معلومات سے یہ دیکھا جاسکتا ہے کہ جب بھی پالیسی کوڈ کو ہر بار دوبارہ عملدرآمد کیا جاتا ہے تو n کو پچھلے بار عملدرآمد کی حکمت عملی کی آخری جمع کردہ قیمت میں دوبارہ ترتیب دیا جاتا ہے۔ جب ریئل ٹائم بار پر آخری بار عملدرآمد کی حکمت عملی کوڈ کو اپ ڈیٹ کیا جاتا ہے تو n کی قیمتوں کو اپ ڈیٹ کیا جاتا ہے ، لہذا یہ دیکھا جاسکتا ہے کہ چارٹ ریئل ٹائم بار سے شروع ہوتا ہے ، اور ہر بار بار بار کے ساتھ curve 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")
لمحہ A کی تصویر
لمحہ بی کا اسکرین شاٹ
ہم نے صرف اس جملے کو تبدیل کیا ہے:n := open > close ? n + 1 : n
، موجودہ ریئل ٹائم بار کی قیمت بند ہونے والی قیمت سے زیادہ ہے جب n کے لئے 1 کا اضافہ ہوتا ہے۔ جیسا کہ پہلے گراف میں دیکھا جاسکتا ہے ، لمحہ 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]
。
f2() => close[1]
براہ راست بلٹ ان متغیر کا استعمال کرتے ہوئے:close
اور اس کے بعد آپ کو ایک بار پھر ایک بار پھر ایک بار پھر ایک بار پھر ایک بار پھر ایک بار پھر ایک بار پھر.close[1]
。
[]
علامات اعداد و شمار سیریز کے متغیرات کی تاریخی اقدار پر حوالہ کے آپریشن کے لئے استعمال کیا جاتا ہے، قریب[1] موجودہ اختتامی قیمت سے پہلے ایک بار پر اختتامی قیمت کے اعداد و شمار کا حوالہ دیتے ہیں. ہمارے ٹیسٹ کوڈ چار اعداد و شمار کو چارٹ پر پینٹ کرتا ہے:
plotchar(oneBarInTwo ? f(close) : na, title = "f(close)", color = color.red, location = location.absolute, style = shape.xcross, overlay = true, char = "A")
ایک حرف ڈرائنگ Af(close)
واپسی کی قیمت.
plotchar(oneBarInTwo ? f2() : na, title = "f2()", color = color.green, location = location.absolute, style = shape.circle, overlay = true, char = "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]
یعنی موجودہ بار کے پہلے نمبر 1 ((بائیں نمبر 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 لائن Bar پر نہیں لگاتے ہیں۔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 تقریب کو کال کرتے وقت یہ قریب > قریب ہے [1] ، یعنی موجودہ اختتامی قیمت پچھلے بار کی اختتامی قیمت سے زیادہ ہے ، جب ta.barssince تقریب کو کال کیا جاتا ہے تو اس کی شرط قریب < close [1] بھی درست نہیں ہوتی ہے ، اور نہ ہی اس کی حالیہ تشکیل کی پوزیشن ہوتی ہے۔
ta.barssince: جب کال کی جاتی ہے تو ، اگر موجودہ K لائن سے پہلے اس شرط کو کبھی پورا نہیں کیا گیا ہے تو ، یہ فنکشن na لوٹاتا ہے۔
اس تصویر میں:
لہذا جب ہم گرافنگ کرتے ہیں تو ہم صرف اس وقت کے اعداد و شمار کو گراف کرتے ہیں جب ریس متغیر کی قدر ہوتی ہے ((-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 سٹرنگ گراف 5 منٹ کا دورانیہ ہے تو ، ہم اس کا حوالہ دیتے ہیں ((یا استعمال کرتے ہیں) پائن کی حکمت عملی کوڈ میںopen
وقت کی حکمت عملی کوڈ کا استعمال کرتے ہوئے موجودہ عملدرآمد کے وقت K لائن بار کی کھلی قیمت ہے۔ اگر وقت کی ترتیب میں تاریخی اقدار کا حوالہ دیا جائے تو استعمال کرنا ضروری ہے۔[]
آپریٹر.• جب پائن پالیسی کسی K لائن بار پر عملدرآمد ہوتی ہے تو استعمال کیا جاتا ہے۔open[1]
حوالہ دیتے ہیںopen
اس وقت کی ترتیب میں موجودہ اسکرپٹ پر عملدرآمد کرنے والے اس K لائن Bar کے پچھلے K لائن Bar کی کھلی قیمت (یعنی پچھلے 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 |
---|---|---|---|
حکمت عملی 1 K لائن بار پر چلتی ہے | 0 | 1 | 1 |
حکمت عملی 2 K لائن بار پر چلتی ہے | 1 | 1 | 2 |
حکمت عملی 3rd K لائن بار پر چلتا ہے | 2 | 1 | 3 |
… | … | … | … |
حکمت عملی N + 1th K لائن Bar پر چلتی ہے | ن | 1 | N+1 |
جیسا کہ آپ دیکھ سکتے ہیں ، حقیقت میں v1 ، v2 اور یہاں تک کہ bar_index ایک وقت کی ترتیب کا ڈھانچہ ہے ، ہر بار پر اس کے مطابق اعداد و شمار موجود ہیں۔ یہ ٹیسٹ کوڈ صرف اس بات سے فرق کرتا ہے کہ آیا "ریئل ٹائم پرائس ماڈل" یا "کلوزنگ پرائس ماڈل" صرف چارٹ پر ریئل ٹائم بار دکھاتا ہے۔ رفتار کی جانچ پڑتال کے لئے ہم "کلوزنگ پرائس ماڈل" کی جانچ پڑتال کرتے ہیں۔
کیونکہ v1 ہر بار میں 1 ہے،ta.cum(v1)
جب فنکشن پہلی K لائن Bar پر عملدرآمد کیا جاتا ہے تو ، چونکہ صرف پہلی Bar ہے ، لہذا اس کا نتیجہ 1 ہوتا ہے ، جس کی وجہ سے متغیر v2 کو تفویض کیا جاتا ہے۔
جبta.cum(v1)
جب دوسری K لائن Bar پر عملدرآمد کیا جاتا ہے تو ، پہلے ہی 2 K لائن Bar موجود ہیں۔ (پہلی کے مطابق اندرونی متغیر bar_index 0 ہے ، دوسری کے مطابق اندرونی متغیر bar_index 1 ہے) ، لہذا حساب کتاب کا نتیجہ 2 ہے ، متغیر v2 کو تفویض کیا گیا ہے ، اور اسی طرح۔ یہ مشاہدہ کیا جاسکتا ہے کہ v2 واقعی چارٹ میں K لائن Bar کی تعداد ہے ، کیونکہ 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 کی قدریں دکھائی جاتی ہیں جو کہ متعلقہ بار کے اوپر اور نیچے دکھائی جاتی ہیں۔ اس گرافک کوڈ کو سیکھنے کے دوران برقرار رکھا جاسکتا ہے کیونکہ ٹیسٹ ، تجربات کے دوران اکثر گراف پر معلومات کو آؤٹ پٹ کرنے کی ضرورت پڑسکتی ہے تاکہ مشاہدہ کیا جاسکے۔
سبق کے شروع میں ہم نے کچھ اختلافات کا خلاصہ کیا ہے جن میں FMZ پر پائن اور ٹریڈنگ ویو پر پائن زبان کا استعمال ہوتا ہے۔indicator()
、strategy()
اس کے علاوہ ، اس نے اپنے صارفین کو بھی اس کے بارے میں بتانے کی اجازت دی ہے۔library()
یقینا، پائین اسکرپٹ کے پہلے ورژن کے ساتھ ہم آہنگ ہونے کے لئے، حکمت عملی لکھنے کے وقت لکھا جاتا ہے جیسے://@version=5
,indicator()
,strategy()
آپ کی ویب سائٹ پر کچھ حکمت عملی کی ترتیبات بھی ہوسکتی ہیں.strategy()
فنکشن میں پیرامیٹر کی ترتیبات منتقل کریں۔
<version>
<declaration_statement>
<code>
<version>
ورژن کنٹرول کی معلومات کو خارج کر دیا جا سکتا ہے۔
پائن زبان کا استعمال//
بطور ایک سطری تشریح کنندہ ، چونکہ پائن زبان میں متعدد سطری تشریح کنندہ نہیں ہیں۔ FMZ نے تشریح کنندہ کو بڑھا دیا ہے۔/**/
اس کے علاوہ، آپ کو اس کے بارے میں مزید جاننے کی ضرورت ہے.
اسکرپٹ میں جو لائنیں تبصرے یا کمپائلر کی ہدایات نہیں ہیں وہ جملے ہیں جو اسکرپٹ کے الگورتھم کو نافذ کرتے ہیں۔ ایک جملہ ان میں سے ایک ہوسکتا ہے۔
if
,for
,while
یاswitch
اسی طرح کی ساختجملے کو کئی طریقوں سے ترتیب دیا جا سکتا ہے
空格
یا制表符
(ٹیب بٹن) شروع ہوتا ہے۔ ان کا پہلا کردار بھی اس لائن کا پہلا کردار ہونا ضروری ہے۔ لائن جس میں لائن کی پہلی پوزیشن شروع ہوتی ہے ، تعریف کے مطابق اسکرپٹ کے عالمی دائرہ کار کا حصہ ہے۔local block
ایک مقامی بلاک کو ایک ٹیبلر یا چار خالی جگہوں میں سکیڑنا ہوگا (دوسری صورت میں ، اسے پچھلی لائن کے سلسلہ وار کوڈ میں حل کیا جائے گا ، یعنی اس کو پچھلی لائن کے جاری مواد کے طور پر طے کیا جائے گا) ، اور ہر بلاک نے ایک مختلف مقامی دائرہ کار کی وضاحت کی ہے۔مثال کے طور پر ، تین لوکلز پر مشتمل ، ایک اپنی مرضی کے مطابق فنکشن کے بیان میں ، دو متغیر کے بیان میں اگر ساخت کا استعمال کرتے ہوئے ، مندرجہ ذیل کوڈ:
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 خالی جگہیں یا ایک نشان) ، لہذا جب اسے اگلی لائن میں تقسیم کیا جاتا ہے تو ، بیان کے تسلسل کا حصہ ایک سے زیادہ سکڑنے کے ساتھ شروع ہونا ضروری ہے ((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
فنکشن کا دوسرا پیرامیٹر اس قسم کی حمایت نہیں کرتا ہے۔ لیکن ایف ایم زیڈ پر اس طرح کی کوئی سخت پابندی نہیں ہے ، اور مذکورہ بالا کوڈ معمول کے مطابق چل سکتا ہے۔
ذیل میں ہم مختلف آپریٹرز کے استعمال کو دیکھتے ہیں۔
اس کے علاوہ، آپ کو اس بات کا یقین کرنے کی ضرورت ہے کہ آپ کو اس کے بارے میں کیا خیال ہے.=
、:=
ہم نے اس سبق کے شروع میں کئی مثالیں دیکھی ہیں۔
=
آپریٹرز کو متغیرات کو شروع کرنے یا بیان کرنے کے لئے استعمال کیا جاتا ہے۔=
ابتدائیہ ، اعلان کردہ تفویض کے بعد متغیر ہر بار اس کے بعد اس قدر سے شروع ہوتا ہے۔ یہ تمام درست متغیر بیانات ہیں:
a = close // 使用内置变量赋值给a
b = 10000 // 使用数值赋值
c = "test" // 使用字符串赋值
d = color.green // 使用颜色值赋值
plot(a, title="a")
plot(b, title="b")
plotchar(true, title="c", char=str.tostring(c), color=d, overlay=true)
توجہa = close
تفویض بیان، ہر بار پر متغیر a اس بار کی موجودہ اختتامی قیمت close ہے۔ دیگر متغیرb
、c
、d
اس کے علاوہ، یہ بھی کہا جاتا ہے کہ یہ ایک غیر متغیر ہے، اور یہ ایف ایم زیڈ پر ریٹرو ٹیسٹنگ سسٹم میں ٹیسٹ کیا جا سکتا ہے، جس کے نتائج گراف سے ظاہر ہوتے ہیں.
:=
ایک موجودہ متغیر کے لئے قدر دوبارہ تفویض کرنے کے لئے استعمال کیا جاتا ہے، جو سادہ طور پر سمجھا جاتا ہے:=
آپریٹرز پہلے سے اعلان شدہ، ابتدائی متغیر کی قدر کو تبدیل کرنے کے لئے استعمال کیا جاتا ہے.
استعمال کیا جاتا ہے:=
آپریٹرز غیر ابتدائی یا اعلان شدہ متغیر تفویض کے لئے غلطیاں پیدا کرتے ہیں، جیسے:
a := 0
تو پھر،:=
تفویض کرنے والے آپریٹرز عام طور پر پہلے سے موجود متغیرات کو دوبارہ تفویض کرنے کے لئے استعمال ہوتے ہیں ، جیسے:
a = close > open
b = 0
if a
b := b + 1
plot(b)
اگرclose > open
(یعنی موجودہ بار پگڈنڈی ہے) ، a متغیر سچ ہے؛ اگر جملے کے مقامی بلاک میں کوڈ پر عملدرآمد کیا جاتا ہےb := b + 1
، تفویض آپریٹرز کا استعمال کرتے ہوئے:=
b کو دوبارہ تفویض کریں، ایک 1 کا اضافہ کریں۔ پھر plot function کا استعمال کرتے ہوئے چارٹ پر متغیر b کی قیمتوں کو وقت کے سلسلے میں ہر BAR پر قطار میں لگائیں۔
کیا ہم یہ سمجھتے ہیں کہ اگر ہم ایک بار بار بار دیکھیں تو b مسلسل 1 کا اضافہ کرے گا؟ بالکل نہیں، یہاں ہم نے متغیر b کو بیان کیا ہے، اور اس کے لئے کوئی مطلوبہ الفاظ استعمال نہیں کیے ہیں جب یہ 0 پر شروع ہوتا ہے۔b=0
یہ ہر بار پر کیا جاتا ہے، لہذا آپ کو اس کوڈ کو چلانے کا نتیجہ دیکھ سکتے ہیں کہ ہر بار جب آپ b متغیر کو 0 پر ری سیٹ کرتے ہیں، اگر a متغیر سچ ہے تو یہ درست ہے.close > open
تو اس بار جب b کوڈ پر عملدرآمد کیا جائے گا تو یہ 1 کا اضافہ کرے گا، لیکن اگلے بار جب b کوڈ پر عملدرآمد کیا جائے گا تو یہ 0 کو دوبارہ تفویض کرے گا۔ یہ بھی ایک ایسی جگہ ہے جہاں پائین زبان کے ابتدائیوں کے لئے گڑھے میں قدم رکھنا آسان ہے۔
اس کے علاوہ، ہم نے ایک اور اہم لفظ کو بھی شامل کیا ہے، جس کا مطلب یہ ہے کہ آپ کو اس کے بارے میں مزید جاننے کی ضرورت ہے.var
、varip
وار
اصل میں، ہم نے اس مطلوبہ الفاظ کو پہلے سبق میں دیکھا اور استعمال کیا ہے، لیکن اس وقت اس پر تفصیلی بحث نہیں کی گئی تھی۔ آئیے اس کی وضاحت دیکھیں:
var ایک کلیدی لفظ ہے جو متغیرات کو تفویض کرنے اور ایک بار میں شروع کرنے کے لئے استعمال ہوتا ہے۔ عام طور پر ، متغیر تفویض کے نحو جس میں کلیدی لفظ var شامل نہیں ہوتا ہے اس کے نتیجے میں ہر بار جب ڈیٹا کو اپ ڈیٹ کیا جاتا ہے تو متغیر کی قیمتوں میں اضافہ ہوتا ہے۔ اس کے برعکس ، جب کلیدی لفظ var کے ساتھ متغیرات کو تفویض کیا جاتا ہے تو ، وہ ڈیٹا کو اپ ڈیٹ کرنے کے باوجود بھی حالت میں رہ سکتے ہیں۔
ہم اس مثال کو استعمال کرتے ہیں، لیکن ہم b کے لئے اس کا استعمال کرتے ہیں.var
کلیدی الفاظ:
a = close > open
var b = 0
if a
b := b + 1
plot(b)
var
کلیدی لفظ b متغیر کو صرف ابتدائی پہلی تفویض پر عمل کرنے دیتا ہے ، اس کے بعد حکمت عملی کی منطق کو ہر بار انجام دینے پر b کو 0 پر دوبارہ نہیں رکھا جاتا ہے ، لہذا اس کے بعد چلنے کے وقت سے تیار کردہ لائنوں میں دیکھا جاسکتا ہے کہ b موجودہ 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
ہم نے پہلی بار اس لفظ کو دیکھا، اور ہم اس کی وضاحت دیکھ سکتے ہیں:
varip (var intrabar persist) ایک کلیدی لفظ ہے جو متغیرات کو تفویض اور ایک بار میں شروع کرنے کے لئے استعمال ہوتا ہے۔ یہ var کی کلید کی طرح ہے ، لیکن متغیر کے لئے استعمال کیا جاتا ہے varip بیان کے ساتھ حقیقی وقت میں K لائنوں کی تازہ کاری کے درمیان اس کی قدر برقرار رکھیں۔
کیا یہ سمجھنے میں زیادہ مشکل ہے؟ ٹھیک ہے ، ہم مثال کے ساتھ وضاحت کرتے ہیں ، اور یہ سمجھنا آسان ہے۔
strategy(overlay=true)
// 测试 var varip
var i = 0
varip ii = 0
// 将策略逻辑每轮改变的i、ii打印在图上
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)
// 每轮逻辑执行都给i、ii递增1
i := i + 1
ii := ii + 1
یہ ٹیسٹ کوڈ "کلوزنگ پرائس ماڈل" یا "ریئل ٹائم پرائس ماڈل" میں مختلف طریقے سے کام کرتا ہے:
ریئل ٹائم قیمت ماڈل:
کیا آپ کو یاد ہے کہ ہم نے پہلے بیان کیا تھا کہ حکمت عملی کے عملدرآمد کو تاریخی بار مرحلے اور ریئل ٹائم بار مرحلے میں تقسیم کیا گیا ہے؟var
、varip
بیان کردہ متغیرi
、ii
حکمت عملی کا کوڈ ہر بار چلنے کے دوران بڑھتی ہوئی کارروائی کرتا ہے۔ لہذا یہ دیکھا جاسکتا ہے کہ K لائن بار پر دکھائے جانے والے اعداد میں سے ہر ایک میں 1 کا اضافہ ہوتا ہے۔ جب تاریخی K لائن کا مرحلہ ختم ہوجاتا ہے تو ، حقیقی وقت کے K لائن کے مرحلے کا آغاز ہوتا ہے۔ var ،varip بیان کردہ متغیر مختلف تبدیلیاں شروع ہوجاتا ہے۔ چونکہ یہ حقیقی وقت کی قیمت کا ماڈل ہے ، لہذا K لائن BAR میں ہر قیمت میں تبدیلی کے لئے حکمت عملی کا کوڈ ایک بار چلایا جاتا ہے ، اور یہ ایک بار پھر ہوتا ہے۔i := i + 1
اورii := ii + 1
یہ ایک بار چلتا ہے۔ فرق یہ ہے کہ ii ہر بار ترمیم کرتا ہے۔ اگرچہ i ہر بار ترمیم کرتا ہے ، لیکن اگلے دور میں پالیسی منطق کے عملدرآمد کے وقت اس کی پچھلی قیمت کو بحال کرتا ہے۔ (کیا آپ ماڈل پر عملدرآمد کے باب میں ہم نے پہلے بیان کردہ ریگولیشن میکانزم کو یاد رکھتے ہیں؟) جب تک کہ موجودہ K لائن BAR اپ ڈیٹ نہ ہوجائے تب تک i کی قیمت کا تعین نہیں ہوتا ہے۔ (یعنی اگلے دور میں پالیسی منطق کے عملدرآمد کے وقت اس کی پچھلی قیمت کو بحال نہیں کیا جاتا ہے۔) لہذا آپ دیکھ سکتے ہیں کہ متغیر i ہر بار میں 1 کا اضافہ کرتا ہے۔ لیکن متغیر ii ہر بار میں کئی بار اضافہ کرتا ہے۔
قیمتوں کا ماڈل: چونکہ اختتامی قیمت کا ماڈل ہر K لائن BAR کے ختم ہونے پر ایک بار حکمت عملی کا نفاذ کرتا ہے۔ لہذا اختتامی قیمت کے ماڈل میں ، تاریخی K لائن مرحلے اور حقیقی وقت کے K لائن مرحلے میں ، var ،varip بیان کردہ متغیرات مندرجہ بالا مثالوں میں مکمل طور پر یکساں طور پر ظاہر ہوتے ہیں ، ہر K لائن BAR میں 1 اضافہ ہوتا ہے۔
آپریٹر | وضاحت |
---|---|
+ | گافا |
- | قانون کو کم کرنا |
* | ضرب |
/ | استثناء |
% | ماڈلنگ |
+
、-
آپریٹرز کو بائنری آپریٹرز کے طور پر استعمال کیا جا سکتا ہے، یا ایک بنیادی آپریٹرز کے طور پر استعمال کیا جا سکتا ہے. دیگر حساباتی آپریٹرز صرف ایک بنیادی آپریٹرز کے طور پر استعمال کیا جا سکتا ہے، اور اگر ایک بنیادی آپریٹرز کے طور پر استعمال کیا جاتا ہے تو غلطیاں واپس آ جائیں گی.
1، حساب کے آپریٹرز کے دونوں اطراف عددی قسم کے ہیں، جس کا نتیجہ عددی قسم، انٹیج یا فلوٹ پوائنٹ نمبر کے طور پر آپریشن کے نتائج پر منحصر ہے۔
2، اگر آپریٹرز میں سے کوئی ایک سٹرنگ ہے تو آپریٹرز+
اس کے بعد ، آپ کو اسکرین شاٹ کو تبدیل کرنے کی ضرورت ہوگی۔ اس کے بعد ، آپ کو اسکرین شاٹ کو تبدیل کرنے کی ضرورت ہوگی۔
3، اگر ان میں سے کوئی آپریٹر نمبر na ہے تو ، حساب کتاب کا نتیجہ خالی قدر na ہے ، اور جب FMZ پر پرنٹ ہوتا ہے تو NaN ظاہر ہوتا ہے۔
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)
ایف ایم زیڈ پر یہ کام کر سکتا ہے لیکن ٹریڈنگ ویو میں ٹائپ کی خرابی کی اطلاع دیتا ہے۔ حساب کے آپریٹرز کے لئے جب دونوں طرف کے اعداد و شمار سٹرنگ ہوتے ہیں تو سسٹم سٹرنگ کو عددی میں تبدیل کرنے کے بعد حساب لگاتا ہے۔ اگر غیر عددی سٹرنگ کا حساب نہیں لگایا جاسکتا ہے تو سسٹم کا نتیجہ nullna ہوتا ہے۔
موازنہ کرنے والے آپریٹرز بائنری آپریٹرز ہیں۔
آپریٹر | وضاحت |
---|---|
< | سے کم |
> | سے زیادہ |
<= | سے کم برابر ہے. |
>= | سے زیادہ برابر ہے. |
== | برابر |
!= | مختلف |
ٹیسٹ کی مثال:
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 // 使用比较运算符构成的表达式,结果为布尔值
b = 1 != 1
c = not b // 逻辑非操作符
d = not a // 逻辑非操作符
runtime.log("测试逻辑操作符: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("测试逻辑操作符: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")
ہم نے اس کا استعمال کیا ہے تاکہ یہ نہ ہو کہ اس کے بعد کے نظام کی مسلسل چھپی ہوئی معلومات نے مشاہدے کو متاثر کیا ہو۔runtime.error("stop")
ایک دفعہ پرنٹ کرنے کے بعد، غیر معمولی غلطیوں کو چھوڑنے کے بعد، دوبارہ جانچ پڑتال کو روک دیا جاتا ہے، اور پھر آپ کو پیداوار کی معلومات کو دیکھ سکتے ہیں، اور یہ پتہ چلتا ہے کہ پرنٹ کردہ مواد اور سچائی کی میزیں اصل میں ایک ہی ہیں.
تین عدد آپریٹرز کا استعمال کرتے ہوئے? :
اور آپریٹرز کے مجموعے سے پیدا ہونے والے تین عددی اظہارcondition ? valueWhenConditionIsTrue : valueWhenConditionIsFalse
ہم نے پچھلے سبق میں بھی اس سے واقف کیا ہے۔ نام نہاد تھریڈینل اظہار، تھریڈینل آپریٹر کا مطلب ہے کہ اس میں آپریٹرز کی تعداد تین ہے۔
condition ? valueWhenConditionIsTrue : valueWhenConditionIsFalse
میںcondition
اگر آپ کو یہ معلوم نہیں ہے کہ آپ کو کیا کرنا ہے تو ، آپ کو یہ معلوم ہونا چاہئے کہ آپ کو کیا کرنا چاہئے۔valueWhenConditionIsTrue
◄ اگرcondition
اس کے لئے فرض کریں کہ اس کے معنی ہیں:valueWhenConditionIsFalse
。
اس کے علاوہ ، آپ کو اس کے بارے میں مزید جاننے کی ضرورت ہوگی کہ آپ کے پاس کیا ہے اور آپ کو اس کے بارے میں کیا سوچنا چاہئے۔
a = close > open
b = a ? "阳线" : "阴线"
c = not a ? "阴线" : "阳线"
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 ? "阳线" : "十字星" : math.abs(close-open) > 30 ? "阴线" : "十字星"
c = not a ? math.abs(close-open) > 30 ? "阴线" : "十字星" : math.abs(close-open) > 30 ? "阳线" : "十字星"
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)
اور اس کا مطلب یہ ہےcondition ? valueWhenConditionIsTrue : valueWhenConditionIsFalse
اندرونیvalueWhenConditionIsTrue
、valueWhenConditionIsFalse
اس کے بجائے ، ایک اور تھریڈ استعمال کیا جاتا ہے۔
تاریخ کے آپریٹرز کا استعمال کرتے ہوئے[]
، حوالہ وقت سیریز پر تاریخی اقدار. یہ تاریخی اقدار متغیر کی موجودہ K لائن BAR سے پہلے K لائن BAR پر اقدار ہیں جب اسکرپٹ چل رہا ہے۔[]
آپریٹرز متغیر، اظہار، یا فنکشن کالز کے بعد استعمال ہوتے ہیں۔[]
اس کواڈریٹ میں موجود اعداد و شمار کا مطلب ہے کہ ہم موجودہ 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] // 错误
آپ یہاں دیکھ سکتے ہیں، کچھ لوگ کہیں گے کہ آپریٹر[]
اس کا مطلب یہ ہے کہ سیریز کے لئے استعمال کیا جاتا ہے، سیریز کی ساخت (سیریز) اور صفوں کی طرح لگ رہا ہے!
ذیل میں ہم ایک مثال کے ساتھ دکھاتے ہیں کہ پائین زبان میں سیریز اور صفیں مختلف ہیں۔
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 کو تفویض کی جاتی ہیں ، b بھی ایک ٹائم سیریز کا ڈھانچہ ہے ، جس میں اس کی تاریخ کی قیمت کا حوالہ دیا جاسکتا ہے۔ لہذا ہم دیکھتے ہیں کہ تین لائنوں a ، b ، c میں ، b لائنیں ایک بار بار ، c لائنیں ایک بار بار بار ، c لائنیں دو بار بار بار ہیں۔
ہم گراف کو بائیں طرف گھسیٹ سکتے ہیں اور دیکھ سکتے ہیں کہ پہلی K لائن پر ، b اور c کی قیمتیں خالی ہیں ((na) ؛ یہ اس لئے ہے کہ جب اسکرپٹ پہلی K لائن BAR پر چلتا ہے تو ، ایک ، دو دوروں کی تاریخ کی قیمت کا حوالہ دیتے ہوئے ، یہ موجود نہیں ہے۔ لہذا جب ہم حکمت عملی لکھتے ہیں تو ہمیں اکثر اس بات کا خیال رکھنا چاہئے کہ آیا تاریخی اعداد و شمار کا حوالہ دیتے وقت خالی قدر کا حوالہ دیا جائے گا ، اگر ہم احتیاط سے خالی قدر کا استعمال نہیں کرتے ہیں تو اس سے حساب کتاب میں ایک سلسلہ فرق پڑتا ہے ، اور شاید حقیقی وقت میں بھی اثر پڑتا ہے۔ ہم عام طور پر کوڈ میں بار استعمال کرتے ہیں۔na
、nz
ہم نے پہلے بھی اس پر غور کیا ہے.nz
、na
اگر آپ کے پاس کوئی فاریکس ٹریڈنگ پلیٹ فارم ہے تو ، آپ کو اس کے بارے میں کیا پتہ ہونا چاہئے؟ آپ کے پاس اس کے بارے میں کیا خیال ہے؟
close > nz(close[1], open) // 当引用close内置变量前一个BAR的历史值时,如果不存在,则使用open内置变量
یہ ایک ایسا طریقہ ہے جس میں کسی خالی قدر ((na) کا حوالہ دیا جا سکتا ہے۔
ہم نے پائن زبان کے بہت سے آپریٹرز سیکھے ہیں جو آپریٹرز کے ساتھ آپریٹرز کی تعداد کے مختلف مجموعوں کے ذریعے اظہار کو تشکیل دیتے ہیں۔ تو جب ہم اظہار میں حساب لگاتے ہیں تو ان کی ترجیح کیا ہوتی ہے؟
ترجیحات | آپریٹر |
---|---|
9 | [] |
8 | ایک بار جب آپریٹرز+ 、- اورnot |
7 | * 、/ 、% |
6 | جب بائنری آپریٹرز+ 、- |
5 | > 、< 、>= 、<= |
4 | == 、!= |
3 | and |
2 | or |
1 | ?: |
اعلی ترجیح والے اظہاراتی حصے پہلے کام کرتے ہیں ، اگر ترجیح ایک جیسی ہے تو بائیں سے دائیں کام کرتے ہیں۔ اگر کسی حصے کو پہلے کام کرنے پر مجبور کرنا ہے تو ، یہ استعمال کیا جاسکتا ہے۔()
اس حصے کے اظہار کو پہلے کام کرنے کے لئے مجبور کرنے کے لئے احاطہ کرتا ہے۔
ہم نے پہلے بھی اس تصور کو سیکھا ہے کہ ایک متغیر کے نام کے طور پر ایک متغیر کو نام دیا جاتا ہے۔ لہذا یہ بھی کہا جاتا ہے: متغیر ایک متغیر ہے جس کی قدر محفوظ ہے۔ تو ، متغیر کا اعلان کیسے کیا جائے؟ متغیر کا اعلان کرنے کے لئے کون سے اصول ہیں؟
بیان کی شکل:
متغیرات کا اعلان کرتے وقت سب سے پہلے لکھا جاتا ہے "دستاویز کا انداز"۔ متغیرات کے تین اعلاناتی انداز ہیں:
1، مطلوبہ الفاظ کا استعمال کریںvar
◄
2، مطلوبہ الفاظ کا استعمال کریںvarip
◄
3، کچھ بھی نہیں لکھ رہا ہے۔
var
、varip
ہم نے پہلے ہی اس کے بارے میں سیکھا ہے کہ ہم اس کے بارے میں کیا سوچتے ہیں؟ ہم نے پہلے ہی اس کے بارے میں سیکھا ہے۔i = 1
ہم نے پہلے بھی کہا ہے کہ اس طرح کے بیان کردہ متغیر اور تفویض ہر K لائن BAR پر کیا جاتا ہے۔
اقسام ایف ایم زیڈ پر پائن زبان قسم کی ضروریات کے لئے سخت نہیں ہے اور عام طور پر اس کو چھوڑ دیا جاسکتا ہے۔ تاہم ، تجارتی نقطہ نظر پر اسکرپٹ کی پالیسیوں کے ساتھ مطابقت کے ل variables ، متغیرات کا اعلان بھی قسم کے ساتھ کیا جاسکتا ہے۔ مثال کے طور پر:
int i = 0
float f = 1.1
ٹریڈنگ ویو پر ٹائپ کرنا زیادہ سخت ہے، اور اگر آپ مندرجہ ذیل کوڈ کو ٹریڈنگ ویو میں استعمال کرتے ہیں تو یہ غلطی دیتا ہے:
baseLine0 = na // compile time error!
شناخت ایک شناخت کنندہ ایک متغیر کا نام ہے ، جس کا نام شناخت کنندہ نے پچھلے باب میں بتایا ہے ، اس پر نظر ڈالیں:https://www.fmz.com/bbs-topic/9390#标识符
خلاصہ یہ ہے کہ، ایک متغیر کا اعلان کرنے کے لئے لکھا جا سکتا ہے:
// [<declaration_mode>] [<type>] <identifier> = value
声明模式 类型 标识符 = 值
اس کے علاوہ، آپ کو اس کے بارے میں مزید جاننے کی ضرورت ہے.=
جب متغیر کا اعلان کیا جاتا ہے تو متغیر کو تفویض کیا جاتا ہے۔ جب تفویض کیا جاتا ہے تو ، قدر سٹرنگ ، عددی قدر ، اظہار ، فنکشن کال ، یا کسی بھی طرح کی ہوسکتی ہے۔if
、 for
、while
یاswitch
مثال کے طور پر، اگر آپ کو ایک لفظ یا جملے کا استعمال کرنے کا طریقہ سیکھنا ہے تو ، آپ کو اس کے بارے میں مزید تفصیل سے بات کرنی ہوگی۔
یہاں ہم ان پٹ فنکشن پر توجہ مرکوز کرتے ہیں، جو کہ ایک ایسا فنکشن ہے جسے ہم اکثر اپنی پالیسیوں کو ڈیزائن کرتے وقت استعمال کرتے ہیں۔ یہ ایک ایسا فنکشن ہے جو کہ ہماری پالیسیوں کو ڈیزائن کرتے وقت بہت اہم ہوتا ہے۔
ان پٹ فنکشن:
input函数,参数defval、title、tooltip、inline、group
ایف ایم زیڈ پر ان پٹ فنکشن ٹریڈنگ ویو پر ان پٹ فنکشن سے تھوڑا سا مختلف ہے ، لیکن یہ فنکشن حکمت عملی کے پیرامیٹرز کی تفویض ان پٹ کے طور پر استعمال ہوتا ہے۔ ذیل میں ہم ایک مثال کے ساتھ ایف ایم زیڈ پر ان پٹ فنکشن کے استعمال کی تفصیلات دیتے ہیں:
param1 = input(10, title="参数1名称", tooltip="参数1的描述信息", group="分组名称A")
param2 = input("close", title="参数2名称", tooltip="参数2的描述信息", group="分组名称A")
param3 = input(color.red, title="参数3名称", tooltip="参数3的描述信息", group="分组名称B")
param4 = input(close, title="参数4名称", tooltip="参数4的描述信息", group="分组名称B")
param5 = input(true, title="参数5名称", tooltip="参数5的描述信息", group="分组名称C")
ma = ta.ema(param4, param1)
plot(ma, title=param2, color=param3, overlay=param5)
جب متغیرات کا اعلان کیا جاتا ہے تو متغیرات کو تفویض کرنے کے لئے اکثر ان پٹ فنکشن استعمال کیا جاتا ہے۔ ایف ایم زیڈ پر ان پٹ فنکشن خود بخود ایف ایم زیڈ پالیسی انٹرفیس میں پالیسی پیرامیٹرز کو ترتیب دینے کے لئے استعمال ہونے والے کنٹرول کو پینٹ کرتا ہے۔ ایف ایم زیڈ پر تعاون یافتہ کنٹرولز میں فی الحال عددی ان پٹ باکس ، ٹیکسٹ ان پٹ باکس ، ڈراپ باکس ، بُل ویلیو چیک آؤٹ موجود ہیں۔ اور آپ پالیسی پیرامیٹرز کو تقسیم کرسکتے ہیں ، پیرامیٹرز کو ترتیب دینے کی اشارہ متن کی معلومات وغیرہ۔
ہم ان پٹ افعال کے چند اہم پیرامیٹرز کے بارے میں بات کرتے ہیں:
پائن زبان میں علیحدہ علیحدہ متغیرات کے اعلانات اور تفویض کے علاوہ متغیرات کا ایک مجموعہ بھی بیان کیا جاتا ہے اور اس میں تفویض کیا جاتا ہے:
[变量A,变量B,变量C] = 函数 或者 ```if```、 ```for```、```while```或```switch```等结构
سب سے زیادہ عام بات یہ ہے کہ ہم استعمال کرتے ہیںta.macd
جب فنکشن MACD اشارے کا حساب لگاتا ہے تو ، چونکہ MACD اشارے ایک کثیر سطری اشارے ہے ، اس لئے اعداد و شمار کے تین گروپوں کا حساب لگایا جاتا ہے۔ لہذا یہ لکھا جاسکتا ہے:
[dif,dea,column] = ta.macd(close, 12, 26, 9)
plot(dif, title="dif")
plot(dea, title="dea")
plot(column, title="column", style=plot.style_histogram)
ہم مندرجہ بالا کوڈ کا استعمال کرتے ہوئے ایک MACD چارٹ آسانی سے ڈرائنگ کر سکتے ہیں، نہ صرف ایک بلٹ ان فنکشن جس میں متعدد متغیرات واپس آ سکتے ہیں، بلکہ ایک اپنی مرضی کے مطابق فنکشن بھی لکھا جا سکتا ہے جو متعدد اعداد و شمار کو واپس کر سکتا ہے.
twoEMA(data, fastPeriod, slowPeriod) =>
fast = ta.ema(data, fastPeriod)
slow = ta.ema(data, slowPeriod)
[fast, slow]
[ema10, ema20] = twoEMA(close, 10, 20)
plot(ema10, title="ema10", overlay=true)
plot(ema20, title="ema20", overlay=true)
اگر آپ کے پاس ایک مختلف متغیر ہے تو ، آپ کو اس کا استعمال کرنے کی ضرورت نہیں ہے۔ اگر آپ کے پاس ایک مختلف متغیر ہے تو ، آپ کو اس کا استعمال کرنے کی ضرورت نہیں ہے۔ اگر آپ کے پاس ایک مختلف متغیر ہے تو ، آپ کو اس کا استعمال کرنے کی ضرورت نہیں ہے۔
[ema10, ema20] = if true
fast = ta.ema(close, 10)
slow = ta.ema(close, 20)
[fast, slow]
plot(ema10, title="ema10", color=color.fuchsia, overlay=true)
plot(ema20, title="ema20", color=color.aqua, overlay=true)
کچھ افعال ایسے مقامی کوڈ بلاکس میں لکھے جاتے ہیں جو مشروط شاخوں میں نہیں لکھے جا سکتے۔
بارکلر (ب) ، فل (ب) ، لائن (ب) ، اشارے (ب) ، پلاٹ (ج) ، پلاٹ کینڈل (ب) ، پلاٹ چار (ج) ، پلاٹ شیپ (ب)
ٹریڈنگ ویو پر غلطی کی اطلاع مرتب کی جاتی ہے۔ ایف ایم زیڈ پر پابندی اتنی سخت نہیں ہے ، لیکن یہ بھی مشورہ دیا جاتا ہے کہ ٹریڈنگ ویو پر تحریری ضوابط پر عمل کریں۔ مثال کے طور پر ، اگرچہ ایف ایم زیڈ میں غلطی کی اطلاع نہیں دی جاتی ہے ، لیکن اس طرح لکھنا مشورہ نہیں دیا جاتا ہے۔
strategy("test", overlay=true)
if close > open
plot(close, title="close")
else
plot(open, title="open")