موجد مقداری PINE زبان کا تعارف ٹیوٹوریل
ویڈیو سبق کے ساتھ:
کوانٹم ٹریڈنگ میں داخل ہونا کتنا مشکل ہے؟ ٹریڈنگ ویو کا استعمال کرتے ہوئے پائن زبان کو چھوٹا سفید سے لے کر کوانٹ دیوتا تک - پائن زبان کا ابتدائی تجربہ
انوینٹر کی کوانٹم ٹریڈنگ پلیٹ فارم پائن زبان لکھنے کی حکمت عملی کی حمایت کرتا ہے ، اس کی واپسی کی حمایت کرتا ہے ، پائن زبان کی حکمت عملی کو عملی طور پر چلاتا ہے ، اور پائن زبان کے کم ورژن کے ساتھ مطابقت رکھتا ہے۔اسٹریٹجی اسکوائراس میں بہت ساری پائن حکمت عملی (سکرپٹ) جمع اور منتقل کی گئی ہیں۔
ایف ایم زیڈ نہ صرف پائن زبان کی حمایت کرتا ہے ، بلکہ پائن زبان کی طاقتور ڈرائنگ فنکشن کو بھی سپورٹ کرتا ہے۔ ایف ایم زیڈ پلیٹ فارم پر موجود مختلف خصوصیات ، بھرپور عملی ٹولز ، موثر اور آسان انتظام ، اور پائن حکمت عملی کی عملی کو مزید بڑھا دیتا ہے۔
یہاں کچھ نمایاں اختلافات کا خلاصہ ہے:
-
1، ایف ایم زیڈ پر پائن حکمت عملی، کوڈ کے آغاز میں ورژن کا نشان
//@versionکوڈ کے ساتھ شروعstrategy、indicatorجملے لکھنے کے لئے لازمی نہیں ہیں، فی الحال ایف ایم زیڈ اس کی حمایت نہیں کرتا ہے۔importدرآمد کریںlibraryفنکشناس کے علاوہ، آپ کو کچھ حکمت عملی نظر آئے گی جن میں لکھا ہے:
pine//@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)یا پھر اس طرح لکھتے ہیں:
pine//@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)ایف ایم زیڈ پر اس کا خلاصہ یہ ہے:
pinesrc = 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)یا:
pinelongCondition = 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 دستاویزات میں بیان کردہ مستقبل کے معاہدے کے کوڈ کے مطابق ہے۔
دیگر ترتیبات جیسے کہ کم سے کم انوائس، ڈیفالٹ انوائس وغیرہ کے لیے، پیئن زبان کے دستاویزات میں ملاحظہ کیجئے۔"پائن زبان کا تبادلہ"پیرامیٹرز کا تعارف
-
-
3、
runtime.debug、runtime.log、runtime.errorFMZ توسیع کے لئے فنکشن، ڈیبگنگ کے لئے <unk>ایف ایم زیڈ پلیٹ فارم پر ڈیبگنگ کے لئے 3 افعال شامل کیے گئے ہیں۔
-
runtime.debug: کنسول پرنٹ کرنے کے لئے عام طور پر اس فنکشن کا استعمال نہیں کیا جاتا ہے۔ -
runtime.log: لاگ ان میں آؤٹ پٹ مواد │FMZ PINE زبان کے لئے مخصوص فنکشن │pineruntime.log(1, 2, 3, close, high, ...),可以传多个参数。 -
runtime.error: جب کال کیا جاتا ہے تو ، اس کے نتیجے میں آپریشنل غلطی ہوتی ہے ، اور اس میں پیغام کے پیرامیٹرز میں طے شدہ غلطی کا پیغام ہوتا ہے۔pineruntime.error(message)
-
-
4، کچھ ڈرائنگ فنکشن میں توسیع
overlayپیرامیٹرFMZ پر پائن زبان، ڈرائنگ میپ فنکشن
plot、plotshape、plotcharمزید اضافہoverlayپیرامیٹرز کی حمایت کرتا ہے، جس میں پینٹنگز کو مرکزی نقشہ یا ذیلی نقشہ میں مقرر کرنے کی اجازت دیتا ہے.overlayقائم کریںtrueمرکزی نقشے پر پینٹ کریں، اور اسےfalseذیلی نقشے میں پینٹ کریں۔ ایف ایم زیڈ پر پائن حکمت عملی چلانے کے لئے مرکزی نقشہ ، ذیلی نقشہ ایک ساتھ پینٹ کریں۔ -
5、
syminfo.mintickبلٹ ان متغیرات کی قدرsyminfo.mintickبلٹ ان متغیر کی تعریف موجودہ نسل کے لئے کم از کم پیمائش کی قیمت کے طور پر کی جاتی ہے۔فرم پیشکش/بیک ٹیسٹنگانٹرفیس پر "پائن زبان کے ٹرانزیکشن کلاس روم" میں ٹیمپلیٹ پیرامیٹر قیمتوں کا تعین کرنسی کی درستگی اس قدر کو کنٹرول کرسکتا ہے۔ قیمتوں کا تعین کرنسی کی درستگی کی ترتیب 2 یہ ہے کہ جب تجارت کی جاتی ہے تو قیمت کم سے کم تعداد میں دوسرے نمبر تک درست ہوتی ہے ، اس وقت قیمت میں کم سے کم تبدیلی یونٹ 0.01 ہے۔syminfo.mintick0.01 <unk> ہے -
6، ایف ایم زیڈ پائن اسکرپٹ میں اوسط قیمتوں میں تمام قیمتیں شامل ہیں
مثال کے طور پر: نیچے آرڈر کی قیمت 8000 ہے ، فروخت کی سمت ، تعداد 1 ہاتھ ((ایک ، چادر) ، معاہدے کے بعد اوسط قیمت 8000 نہیں ہے ، 8000 سے کم ((قیمت میں کارروائی کی فیس شامل ہے)) ۔
پائن زبان کی بنیاد
جب ہم پائن زبان کی بنیادی باتیں سیکھنا شروع کرتے ہیں تو ، شاید کچھ مثالوں میں ہدایات ، کوڈ کی گرامر ہم واقف نہیں ہیں۔ اس سے کوئی فرق نہیں پڑتا ہے ، ہم پہلے تصورات سے واقف ہوسکتے ہیں ، ٹیسٹ کے مقصد کو سمجھ سکتے ہیں ، یا ایف ایم زیڈ کی پائن زبان کی دستاویزات کو دیکھ سکتے ہیں۔ اس کے بعد مختلف گرامر ، ہدایات ، افعال ، بلٹ ان متغیرات سے آہستہ آہستہ واقف ہونے کے لئے سبق کے مطابق عمل کریں۔
ماڈل پر عملدرآمد
پائن زبان سیکھنے کے لئے ابتدائی طور پر ، اس سے متعلقہ تصورات جیسے پائن زبان کی اسکرپٹ پروگرام کے عمل کو سمجھنا ضروری ہے۔ پائن زبان کی حکمت عملی ایک چارٹ پر مبنی ہے ، جسے ایک سلسلہ حساب اور کارروائی کے طور پر سمجھا جاسکتا ہے ، جو چارٹ پر پہلے سے بھری ہوئی اعداد و شمار سے شروع ہوتا ہے ، جو وقت کے تسلسل کے مطابق ہے۔ چارٹ پر ابتدائی طور پر بھری ہوئی اعداد و شمار کی مقدار محدود ہے۔ ریئل ڈسک پر عام طور پر اس اعداد و شمار کی حد کا تعین تبادلے کے انٹرفیس پر واپس آنے والے اعداد و شمار کی زیادہ سے زیادہ مقدار پر مبنی ہوتا ہے ، اور واپسی کے وقت کی پیمائش کا ڈیٹا کی حد کا تعین پیمائش کے نظام کے ذریعہ فراہم کردہ اعداد و شمار پر مبنی ہوتا ہے۔ چارٹ پر سب سے بائیں طرف کی پہلی لائن KBar ، یعنی چارٹ کے اعداد و شمار کا ایک مجموعہ ، جس کی اشاریہ 0 کی طرف سے ہوسکتی ہے پائن زبان کی داخلی متغیرbar_indexپائن اسکرپٹ کے عمل کے وقت موجودہ K لائن بار کی انڈیکس ویلیو کا حوالہ دیتا ہے۔
pine
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 پلیٹ فارم پر کوڈ کی شکل میں محفوظ کردہ ریٹرننگ کنفیگریشن کی معلومات ہے۔
pine/*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فنکشن آؤٹ پٹ کی معلومات حکمت عملی کی لاگ میں۔ پینٹنگ فنکشن کا استعمال کرتے ہوئےplotn کو دیکھا جاسکتا ہے جب حکمت عملی ہسٹری بار میں چل رہی تھی۔ n ہمیشہ 0 رہا ہے۔ جب عملی طور پر بار پر عملدرآمد کیا جاتا ہے تو n جمع 1 کا عمل ہوتا ہے ، اور عملی طور پر بار پر عملی طور پر ہر بار پر عملدرآمد ہوتا ہے۔ لاگ ان معلومات سے دیکھا جاسکتا ہے کہ ہر بار میں پالیسی کوڈ پر دوبارہ عملدرآمد کیا جاتا ہے n کو پچھلے بار میں پالیسی کوڈ کی آخری پیش کش کی گئی قیمت پر دوبارہ ترتیب دیا جاتا ہے۔ جب پالیسی کوڈ کو آخری بار میں عملی طور پر بار میں اپ ڈیٹ کیا جاتا ہے تو n کی قیمت پیش کی جاتی ہے۔ لہذا ، یہ دیکھا جاسکتا ہے کہ گراف میں ریئل ٹائم بار سے شروع ہوتا ہے ، ہر بار بار میں اضافے کے ساتھ n کو بڑھایا جاتا ہے۔آخر میں:
1۔ جب حکمت عملی کو ریئل ٹائم بار میں عملدرآمد کیا جاتا ہے تو ، ہر بار جب صورتحال کی تازہ کاری ہوتی ہے تو اس میں ایک حکمت عملی کا کوڈ ہوتا ہے۔
2۔ جب ریئل ٹائم بار پر عملدرآمد ہوتا ہے تو ، ہر بار پالیسی کوڈ پر عملدرآمد سے پہلے متغیرات کو رول آؤٹ کیا جاتا ہے۔
3، جب ریئل ٹائم بار پر عملدرآمد کیا جاتا ہے تو ، اختتامی اپ ڈیٹ کے وقت متغیرات کو ایک بار پیش کیا جاتا ہے۔اعداد و شمار کے پیچھے جانے کی وجہ سے ، چارٹ پر منحنی خطوط جیسے ڈرائنگ آپریشنز کو دوبارہ ڈرائنگ کا سبب بن سکتا ہے ، مثال کے طور پر ہم نے ابھی ٹیسٹ کوڈ میں ترمیم کی ہے ، ریلڈ ڈسک ٹیسٹ:
pinevar 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 پر چلنے والے ایک ٹیسٹ کوڈ کے ذریعے اس مسئلے کو سمجھا:
pine/*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<unk> سے A<unk> پر رنگا ہوا ہے، اور جب oneBarInTwo سچ ہے تو اس کی جگہ (Y محور پر) یہ ہے:f(close)واپسی کی قدر <unk> -
plotchar(oneBarInTwo ? f2() : na, title = "f2()", color = color.green, location = location.absolute, style = shape.circle, overlay = true, char = "B")
ایک حرف B<unk> کو سبز رنگ میں ڈرائنگ کریں، جب oneBarInTwo سچ ہو تو ڈرائنگ کریں، اور ڈرائنگ کی پوزیشن (Y محور پر) یہ ہے:f2()واپسی کی قدر <unk> -
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] اس طرح ایک ہی انڈیکس) <unk> -
-
کچھ بلٹ ان افعال کو ہر بار پر حساب لگانے کی ضرورت ہوتی ہے تاکہ ان کے نتائج کو صحیح طریقے سے شمار کیا جاسکے
ایک سادہ مثال کے طور پر اس کی وضاحت کریں:
pineres = 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 لائنوں کی تعداد <unk> ۔ جب 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 لائن بار کی کھلنے کی قیمت ہوتی ہے۔ اگر آپ ٹائم سیریز میں تاریخی اقدار کا حوالہ دیتے ہیں تو استعمال کرنے کی ضرورت ہے۔[]آپریٹر <unk> جب پائن حکمت عملی کسی 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ٹیسٹ کوڈ:
pinev1 = 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 <unk> <unk> <unk> <unk> <unk>
حکمت عملی کے 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 ڈھانچے کا استعمال کرتے ہوئے، مندرجہ ذیل کوڈ:
pine
indicator("", "", true) // 声明语句(全局范围),可以省略不写
barIsUp() => // 函数声明(全局范围)
close > open // 本地块(本地范围)
plotColor = if barIsUp() // 变量声明 (全局范围)
color.green // 本地块 (本地范围)
else
color.red // 本地块 (本地范围)
runtime.log("color", color = plotColor) // 调用一个内置函数输出日志 (全局范围)
کوڈ تبدیل کریں
لمبی لائنوں کو ایک سے زیادہ لائنوں میں تقسیم کیا جاسکتا ہے ، یا ان کو "لپیٹ" کیا جاسکتا ہے۔ لپیٹ والی لائنوں کو کسی بھی تعداد میں خالی جگہوں میں سکڑنا چاہئے ، بشرطیکہ یہ 4 کا ضرب نہ ہو۔ (یہ حدود مقامی بلاک میں سکڑنے کے لئے استعمال کی جاتی ہیں) ۔
pine
a = open + high + low + close
اس کے علاوہ ، یہ بھی ممکن ہے کہ اس کو پیکیج کیا جا سکے (نوٹ کریں کہ ہر لائن میں گھومنے والی خالی جگہوں کی تعداد 4 کے ضرب نہیں ہے):
pine
a = open +
high +
low +
close
ایک طویل پلاٹ ((() کال کو پیکیج کیا جاسکتا ہے۔
pine
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 خالی جگہوں کے برابر نہیں ہے) ۔ مثال کے طور پر:
pine
test(c, o) =>
ret = c > o ?
(c > o+5000 ?
1 :
0):
(c < o-5000 ?
-1 :
0)
a = test(close, open)
plot(a, title="a")
شناخت اور آپریٹر
شناخت کنندہ
متغیر کو سمجھنے سے پہلے ، ہمیں سب سے پہلے بیکن آئیڈینٹر بیکن کے تصور کو سمجھنا ہوگا۔ عام طور پر بیکن آئیڈینٹر بیکن کا استعمال کیا جاتا ہےفنکشناورمتغیراتکے نام کے ((کے لئے نام متغیر، فنکشن) <unk>فنکشناس کے بعد ہم اس سبق میں سیکھیں گے، ہم نے پہلے ہی سیکھا ہے کہ کس طرح کی شناخت کی جاتی ہے.
- 1، آئی ڈی کو بڑے حروف میں لکھنا ضروری ہے
(A-Z)یا اس سے بھی کم(a-z)حروف یا زیر لکیر(_)شروع، بطور شناخت کرنے والا پہلا حرف。 - 2، شناخت کرنے والے کے پہلے حرف کے بعد آنے والا حرف ہو سکتا ہےحروف、نیچے کی لکیریااعداد。
- 3۔ شناخت کنندہ کا نام بڑے اور چھوٹے حروف میں ہے۔
مثال کے طور پر:
pine
fmzVar
_fmzVar
fmz666Var
funcName
MAX_LEN
max_len
maxLen
3barsDown // 错误的命名!使用了数字字符作为标识符的开头字符
زیادہ تر پروگرامنگ زبانوں کی طرح ، پائن زبان میں بھی لکھنے کی تجاویز ہیں۔ عام طور پر شناخت کنندہ کے نام پر تجویز کی جاتی ہے:
- 1، تمام حروف بڑے حروف میں مستقل ناموں کے لئے استعمال ہوتے ہیں۔
-
- استعمال کریں۔کمہار قواعددیگر شناخت کنندہ ناموں کے لئے استعمال کیا جاتا ہے۔
pine
// 命名变量、常量
GREEN_COLOR = #4CAF50
MAX_LOOKBACK = 100
int fastLength = 7
// 命名函数
zeroOne(boolValue) => boolValue ? 1 : 0
آپریٹر
آپریٹر پروگرامنگ زبان میں اظہار کی تعمیر کے لئے استعمال ہونے والے آپریٹرز کے کچھ نشانات ہیں ، جبکہ اظہار ایک حساب کتاب کا قاعدہ ہے جو ہم حکمت عملی لکھتے وقت کسی حساب کتاب کے مقصد کے لئے ڈیزائن کرتے ہیں۔ پائن زبان میں آپریٹرز کو افعال کے مطابق درجہ بندی کیا جاتا ہے:
تفویض آپریٹرز، عددی آپریٹرز، موازنہ آپریٹرز، منطقی آپریٹرز،? : ٹرپل آپریٹرز[]تاریخی حوالہ آپریٹر <unk>
عددی آپریٹر*مثال کے طور پر ، ٹریڈنگ ویو پر پائن زبان کے آپریٹر کے نتیجے کے نتیجے میں پیدا ہونے والی قسم کے مسئلے کے برعکس ، مندرجہ ذیل ٹیسٹ کوڈ ہے:
pine
//@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یہ FMZ پر ردعمل کے نظام میں ٹیسٹ کیا جا سکتا ہے، جس کے نتیجے میں ڈرائنگ سے دیکھا جا سکتا ہے.
:=ایک موجودہ متغیر کو ایک قدر دوبارہ تفویض کرنے کے لئے استعمال کیا جاتا ہے، جو آسانی سے استعمال کے طور پر سمجھا جا سکتا ہے:=آپریٹر ایک متغیر کی قدر کو تبدیل کرنے کے لئے استعمال کیا جاتا ہے جو پہلے سے ہی اعلان کیا گیا ہے.
اگر استعمال کیا جاتا ہے:=ایک آپریٹر کو غیر ابتدائی یا اعلان شدہ متغیر کو تفویض کرنے سے غلطی پیدا ہوتی ہے ، جیسے:
pine
a := 0
تو،:=تفویض آپریٹر عام طور پر پہلے سے موجود متغیرات کو دوبارہ تفویض کرنے کے لئے استعمال کیا جاتا ہے ، جیسے:
pine
a = close > open
b = 0
if a
b := b + 1
plot(b)
فیصلہ کریں اگرclose > open(یعنی موجودہ BAR سورج کی لکیر ہے) ، a متغیر حقیقی قدر ہے ((true) ◄ تو اگر بیان کے مقامی بلاک میں کوڈ پر عملدرآمدb := b + 1، تفویض آپریٹر کا استعمال کرتے ہوئے:=b کو ایک بار پھر قدر دی جائے، اور ایک 1 ◄ کا اضافہ کیا جائے۔ اس کے بعد plot فنکشن کا استعمال کرتے ہوئے ، ہر بار میں b کی قدر کو ایک وقت کی ترتیب میں ، ایک لائن میں ، ایک چارٹ پر ڈرائنگ کریں۔
کیا ہم یہ مانتے ہیں کہ اگر ہم ایک بار بار بار بار بار بار بار بار بار بار بار بار بار بار بار بار بار بار بار بار بار بار بار بار 1 جمع کرتے ہیں؟ بالکل نہیں، یہاں ہم نے متغیر b کو 0 کے طور پر شروع کرنے کے لئے کوئی کلیدی لفظ استعمال نہیں کیا ہے۔b=0یہ ہر بار بار پر کیا جاتا ہے، تو آپ دیکھ سکتے ہیں کہ اس کوڈ کو چلانے کا نتیجہ یہ ہے کہ ہر بار b کو 0 پر ری سیٹ کیا جاتا ہے، اگر a سچ ہے، تو اس کا مطلب یہ ہے کہclose > openتو اس کوڈ کو چلانے کے وقت b کو 1 جمع کیا جائے گا، جب پلاٹ فنکشن ڈرائنگ میں b 1 ہو جائے گا، لیکن اگلے کوڈ کو چلانے کے وقت b کو دوبارہ 0 دیا جائے گا۔ یہ بھی پائن زبان کے ابتدائی افراد کے لئے ایک آسان جگہ ہے۔
اس کے علاوہ، ہم نے اس کے بارے میں بات کی ہے کہ اس کی وضاحت کرنے کے لئے دو کلیدی الفاظ ہیں:var、varip
-
var
یہ ایک ایسا لفظ ہے جس کے بارے میں ہم پہلے بھی سبق میں بات کر چکے ہیں، لیکن ہم نے اس کے بارے میں تفصیل سے بات نہیں کی تھی۔ آئیے اس لفظ کی وضاحت کرتے ہیں:
var تقسیم کرنے اور ایک بار شروع کرنے والے متغیرات کے لئے کلیدی لفظ ہے۔ عام طور پر ، متغیرات کو تفویض کرنے کی ترکیب جس میں کلیدی لفظ var شامل نہیں ہوتا ہے اس کا نتیجہ یہ ہوتا ہے کہ ہر بار جب ڈیٹا کو اپ ڈیٹ کیا جاتا ہے تو متغیرات کی قدر کو ڈھانپ دیا جاتا ہے۔ اس کے برعکس ، جب کلیدی لفظ var استعمال کیا جاتا ہے تو ، متغیرات کو تقسیم کیا جاتا ہے ، اگرچہ ڈیٹا کو اپ ڈیٹ کیا جاتا ہے ، لیکن وہ اپنی حالت کو برقرار رکھ سکتے ہیں۔
ہم اس مثال کو استعمال کرتے ہیں، لیکن ہم اس کا استعمال کرتے ہیں جب ہم b کو ایک قدر دیتے ہیں
varکلیدی الفاظ:pinea = close > open var b = 0 if a b := b + 1 plot(b)varکلیدی لفظ b کو صرف ابتدائی پہلی تفویض پر عملدرآمد کرنے دیتا ہے ، اور اس کے بعد ہر بار حکمت عملی کی منطق پر عمل درآمد کرتے وقت b کو دوبارہ 0 پر نہیں رکھا جاتا ہے ، لہذا چلنے کے وقت کھینچی گئی لائنوں سے یہ مشاہدہ کیا جاسکتا ہے کہ b موجودہ K لائن BAR کے وقت ظاہر ہونے والی این لائن BAR کی تعداد ہے۔var بیانات کے متغیرات کو نہ صرف عالمی سطح پر لکھا جاسکتا ہے بلکہ اس کوڈ کے بلاکس میں بھی لکھا جاسکتا ہے ، جیسے اس مثال میں:
pinestrategy(overlay=true) var a = close var b = 0.0 var c = 0.0 var green_bars_count = 0 if close > open var x = close b := x green_bars_count := green_bars_count + 1 if green_bars_count >= 10 var y = close c := y plot(a, title = "a") plot(b, title = "b") plot(c, title = "c")متغیر 'a' سیریز میں پہلی ستون لائن کی اختتامی قیمت کو برقرار رکھتا ہے۔
متغیر 'b' سیریز میں پہلے نیلم سبز نیلم کی قیمت کی سلاخوں کی اختتامی قیمت کو برقرار رکھتا ہے۔
متغیر 'c' سیریز میں دسویں ٹماٹر کی گرین ٹماٹر کی اختتامی قیمت کو برقرار رکھتا ہے۔ -
varip
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 ، varp بیانات کے متغیرات میں مختلف تبدیلیاں آنا شروع ہوجاتی ہیں۔ چونکہ یہ حقیقی وقت کی قیمت کا ماڈل ہے ، لہذا حکمت عملی کا کوڈ ایک K لائن BAR کے اندر ہر قیمت میں تبدیلی کے لئے ایک بار پھر عمل میں لایا جاتا ہے۔i := i + 1اورii := ii + 1ہر بار ایک بار نافذ کیا جاتا ہے۔ فرق یہ ہے کہ ii ہر بار ترمیم کرتا ہے۔ اگرچہ i ہر بار بھی ترمیم کرتا ہے ، لیکن اگلے مرحلے میں حکمت عملی کے نفاذ کے منطق میں پچھلی قدر کو بحال کیا جائے گا۔ (کیا آپ کو ماڈل پر عملدرآمد کے باب میں ہم نے جو رول آؤٹ میکانزم بتایا تھا وہ یاد ہے؟) ، جب تک کہ موجودہ KBAR لائن ختم نہ ہوجائے اس وقت تک i کی قیمت کو اپ ڈیٹ نہیں کیا جائے گا۔ (یعنی اگلے مرحلے میں حکمت عملی کے منطق پر عملدرآمد کے لئے پچھلی قدر کو دوبارہ بحال نہیں کیا جائے گا۔) لہذا یہ دیکھا جاسکتا ہے کہ متغیر i اب بھی ہر بار میں 1 اضافہ ہوتا ہے۔ لیکن متغیر ii میں ہر بار میں کئی بار اضافہ ہوتا ہے۔قیمتوں کا تعین:
چونکہ اختتامی قیمت کا ماڈل ہر K لائن BAR ختم ہونے پر ایک حکمت عملی کا منطق انجام دیتا ہے۔ لہذا ، اختتامی قیمت کے ماڈل میں ، تاریخی K لائن مرحلے اور حقیقی وقت کے K لائن مرحلے میں ، var ، varp بیانات کے متغیرات مندرجہ بالا مثالوں میں بڑھتی ہوئی کارکردگی کا مظاہرہ کرتے ہیں ، ہر K لائن BAR میں اضافہ ہوتا ہے۔
ریاضی کے آپریٹر
| آپریٹر | مثال دینا |
|---|---|
| + | قافیہ |
| - | کم کرنا |
| * | ضرب |
| / | قانون ختم کرنا |
| % | مثالیں تلاش کریں |
+、-آپریٹرز کو بائنری آپریٹر کے طور پر بھی استعمال کیا جاسکتا ہے ، یا ایک ہی آپریٹر کے طور پر بھی استعمال کیا جاسکتا ہے۔ دیگر ریاضی کے آپریٹرز کو صرف بائنری آپریٹر کے طور پر استعمال کیا جاسکتا ہے ، اگر وہ ایک ہی آپریٹر کے طور پر استعمال کیے جائیں تو غلطی ہوگی۔
1، عددی آپریٹر دونوں طرف عددی قسم کے ہیں، نتیجہ عددی قسم، عددی یا فلوٹ پوائنٹ نمبر کے مطابق آپریشن کے نتائج کے مطابق ہے.
2، آپریٹر اگر آپریٹر ایک تار ہے+، تو حساب کے نتیجے میں سٹرنگ ، عددی قدر کو سٹرنگ کی شکل میں تبدیل کیا جائے گا ، اور پھر سٹرنگوں کو ایک ساتھ جوڑ دیا جائے گا۔ اگر یہ دوسرے ریاضی کے آپریٹرز ہیں تو ، سٹرنگ کو عددی قدر میں تبدیل کرنے کی کوشش کی جائے گی ، اور پھر کام کیا جائے گا۔
3، اگر اس میں سے کوئی آپریٹنگ نمبر na ہے تو ، اس کا نتیجہ خالی ہےna، جب ایف ایم زیڈ پر پرنٹ کیا جائے تو NaN ظاہر ہوگا۔
pine
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
ایف ایم زیڈ پر پائن زبان یہاں اور ٹریڈنگ ویو پر پائن زبان میں تھوڑا سا فرق ہے ، ایف ایم زیڈ پر پائن زبان متغیر کی قسم کی ضروریات کے لئے زیادہ سخت نہیں ہے۔ مثال کے طور پر:
pine
a = 1 * "1.1"
b = "1" / "1.1"
c = 5 % "A"
plot(a)
plot(b)
plot(c)
ایف ایم زیڈ پر کام کیا جاسکتا ہے ، لیکن تجارتی نظارے میں اس کی قسم کی غلطی کی اطلاع دی جائے گی۔ جب ریاضی کے آپریٹر کے دونوں اطراف میں آپریٹنگ نمبر سٹرنگ ہوتے ہیں تو ، سسٹم سٹرنگ کو عددی قدر میں تبدیل کرنے کے بعد حساب کرے گا۔ اگر غیر عددی سٹرنگ کا حساب نہیں لگایا جاسکتا ہے تو ، سسٹم کے آپریشن کا نتیجہ خالی ہے
آپریٹر کا موازنہ
موازنہ آپریٹرز بائنری آپریٹرز ہیں۔
| آپریٹر | مثال دینا |
|---|---|
| < | سے کم |
| > | سے زیادہ |
| <= | سے کم کے برابر |
| >= | سے بڑا برابر ہے |
| == | برابر |
| != | عدم مساوات |
ٹیسٹ کی مثال:
pine
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 ایف ایم زیڈ پر غلطی کی اطلاع نہیں دی جاتی ہے ، عملدرآمد کے وقت سٹرنگ کو پہلے عددی قدر میں تبدیل کیا جاتا ہے ، اور پھر اس کا موازنہ کیا جاتا ہے۔ تجارتی منظر پر غلطی کی اطلاع دی جاتی ہے۔
منطقی آپریٹرز
| آپریٹر | کوڈ علامت | مثال دینا |
|---|---|---|
| نہیں | not | واحد آپریٹر، غیر آپریٹنگ |
| اور | and | بائنری آپریٹر، کے ساتھ (اور) آپریشن |
| یا | or | بائنری آپریٹرز، یا آپریشنز |
جب آپ منطقی آپریٹرز کے بارے میں بات کرتے ہیں تو ، آپ کو درست اقدار کی میز کے بارے میں بھی بات کرنا ہوگی۔ جیسا کہ ہم نے ہائی اسکول میں سیکھا تھا ، صرف یہاں ہم جانچ اور سیکھنے کے لئے ریٹرننگ سسٹم میں ہیں:
pine
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。
یہاں کچھ مثالیں ہیں جن کا استعمال عملی طور پر نہیں کیا جاسکتا ہے، لیکن یہ آپ کو دکھانے کے لئے آسان ہے:
pine
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)
اگر آپ کے پاس ایک کراس اسٹار ہے تو ، اس سے کوئی فرق نہیں پڑتا ہے۔ مثلث کے اظہار کو بھی شامل کیا جاسکتا ہے ، جیسا کہ ہم نے پچھلے سبق میں کیا تھا۔
pine
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اور اس کے بجائے ایک اور مثلث کا استعمال کیا گیا ہے۔
تاریخ آپریٹر
تاریخ کے آپریٹر کا استعمال کریں[]، حوالہ دیتے وقت کی سیریز پر تاریخی اقدار <unk> یہ تاریخی اقدار اسکرپٹ کے چلنے پر موجودہ K لائن BAR سے پہلے K لائن BAR پر متغیرات کی اقدار ہیں <unk>[]آپریٹر متغیر، اظہار، فنکشن کال کے بعد استعمال ہوتا ہے۔[]اس مربع قوسین میں موجود مقدار وہ مقدار ہے جو ہم حوالہ دینے والے تاریخی اعداد و شمار کی موجودہ K لائن BAR سے دوری ہے۔ مثال کے طور پر اگر میں پچھلی K لائن BAR کی اختتامی قیمت کا حوالہ دوں تو یہ لکھا جائے گا:close[1]。
ہم نے پچھلے کورسز میں اس طرح کی تحریر دیکھی ہے:
pine
high[10]
ta.sma(close, 10)[1]
ta.highest(high, 10)[20]
close > nz(close[1], open)
[]آپریٹر صرف ایک بار ایک ہی قدر پر استعمال کیا جا سکتا ہے، لہذا یہ لکھنا غلط ہے، اور یہ غلطی کرے گا:
pine
a = close[1][2] // 错误
آپ یہاں دیکھ سکتے ہیں، کچھ طلباء کہتے ہیں، آپریٹر[]اور اس کا مطلب یہ ہے کہ یہ سیریز کے ڈھانچے کے لئے استعمال کیا جاتا ہے، اور یہ سیریز کے ڈھانچے کے لئے استعمال کیا جاتا ہے، اور یہ سیریز کے ڈھانچے کے لئے استعمال کیا جاتا ہے.
ذیل میں ہم ایک مثال کے ذریعے پائن زبان میں سیریز اور صف میں فرق کو واضح کریں گے۔
pine
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]اس طرح لکھنا غلط ہو سکتا ہے، لیکن:
pine
b = close[1]
c = b[1]
اور اگر آپ اسے الگ الگ لکھیں تو اس میں کوئی غلطی نہیں ہوگی، اور اگر آپ اسے عام طور پر آرٹیکل کے طور پر سمجھیں تو، آپ کو اس کے بارے میں کچھ بھی نہیں ملے گا.b = close[1]اس کے بعد، b ایک عددی ہونا چاہئے، تاہمc = b[1]، b پھر بھی ایک بار پھر تاریخی اقدار کا حوالہ دینے کے لئے تاریخی آپریٹر کا استعمال کیا جاسکتا ہے۔ جیسا کہ پائن زبان میں سیریز کا تصور اتنا سادہ نہیں ہے جتنا کہ صف۔ اس کو قریب کی آخری بار پر تاریخی اقدار کے طور پر سمجھا جاسکتا ہے ، b بھی ایک ٹائم سیریز ڈھانچہ ہے ، اور اس کی تاریخی اقدار کا حوالہ جاری رکھ سکتا ہے۔ لہذا ہم دیکھتے ہیں کہ ڈرائنگ کی گئی تین لائنوں میں سے ، a ، b ، c ، b لائنیں a لائن سے ایک بار سست ہیں ، اور b لائنیں b لائن سے ایک بار سست ہیں۔
ہم گراف کو سب سے بائیں طرف کھینچ سکتے ہیں اور دیکھ سکتے ہیں کہ پہلی K لائن پر ، b اور c کی قیمتیں خالی ہیں ((na) <unk>) ۔ یہ اس لئے ہے کہ جب اسکرپٹ پہلی K لائن BAR پر عملدرآمد ہوتا ہے تو ، ایک یا دو ادوار کی تاریخی قیمت کا حوالہ دیتے وقت یہ نہیں ہوتا ہے ، یہ موجود نہیں ہے۔ لہذا ہمیں حکمت عملی لکھتے وقت اکثر اس بات پر توجہ دینے کی ضرورت ہے کہ آیا تاریخی اعداد و شمار کا حوالہ دیتے وقت خالی اقدار کا حوالہ دیا جائے گا ، اگر اس میں محتاط نہ ہوں تو خالی اقدار کا استعمال کرنے سے حساب کتاب کے مختلف سلسلے پیدا ہوسکتے ہیں ، اور یہاں تک کہ حقیقی وقت پر اثر انداز ہوسکتے ہیں۔ عام طور پر ہم کوڈ میں BAR استعمال کرتے ہیں۔na、nzاس کے علاوہ، ہم نے پہلے بھی اس کے بارے میں بات کی ہےnz、naفنکشن ، کیا آپ کو یاد ہے کہ یہ کس باب میں ہے؟) خاص طور پر خالی اقدار کے معاملات کے لئے ، جیسے:
pine
close > nz(close[1], open) // 当引用close内置变量前一个BAR的历史值时,如果不存在,则使用open内置变量
یہ ایک ایسا طریقہ ہے جس میں ممکنہ طور پر صفر کی طرف اشارہ کیا گیا ہے.
آپریٹر کی ترجیح
ہم نے پائن زبان کے بہت سے آپریٹرز سیکھے ہیں، یہ آپریٹرز اور آپریٹنگ نمبر کے مختلف مجموعوں کے ذریعے اظہار بناتے ہیں۔ تو جب اظہار میں حساب کرتے ہیں تو ان آپریشنوں کی ترجیح کیا ہوتی ہے؟ جیسے ہم نے اسکول میں سیکھا تھا چار اصولوں کا آپریشن، ضرب کو ضرب دینے کے لئے ترجیح دی جاتی ہے، اور پھر جمع کو کم کرنے کے لئے.
| ترجیحات | آپریٹر |
|---|---|
| 9 | [] |
| 8 | ایک عنصر آپریٹر کے طور پر +`` 、``-`` اور not `` |
| 7 | *、/、% |
| 6 | بائنری آپریٹرز میں + - ` |
| 5 | >、<、>=、<= |
| 4 | ==、!= |
| 3 | and |
| 2 | or |
| 1 | ?: |
اعلیٰ ترجیح والے اظہار کے حصے پہلے آپریشن کرتے ہیں، اگر ترجیح ایک جیسی ہو تو بائیں سے دائیں آپریشن کریں۔ اگر کسی حصے کو پہلے آپریشن کرنے پر مجبور کرنا ہو تو ، استعمال کیا جاسکتا ہے()اس حصے کے اظہار کو پہلے کام کرنے کے لئے مجبور کریں
متغیرات
متغیر کا بیان
ہم نے پہلے ہی سیکھا ہے کہ کس طرح ایک متغیر کا اعلان کیا جاتا ہے، اور اس کے لئے کون سے قواعد ہیں؟
-
بیانات کا طریقہ:
متغیرات کے اعلان کے وقت سب سے پہلے جو لکھا جاتا ہے وہ "اعلان کا طریقہ" ہے۔ متغیرات کے اعلان کے تین طریقے ہیں:
1، مطلوبہ الفاظ کا استعمالvar。
2، مطلوبہ الفاظ کا استعمالvarip。
3، کچھ نہیں لکھنا۔var、varipکلیدی الفاظ کے بارے میں ہم نے پہلے ہی سیکھا ہے اور اس کے بارے میں مزید بات نہیں کریں گے۔ مثال کے طور پر ، اگر متغیر کے اعلان کے انداز میں کچھ نہیں لکھا گیا ہے تو:i = 1اس کے علاوہ، ہم نے پہلے بھی کہا ہے کہ اس طرح کی ایک متغیر کا اعلان اور اس کی قدر، ہر K لائن BAR پر عملدرآمد کیا جاتا ہے. -
قسم
ایف ایم زیڈ پر پائن زبان قسم کی ضروریات کے لئے سخت نہیں ہے ، عام طور پر اس کو چھوڑ دیا جاسکتا ہے۔ تاہم ، ٹریڈنگ ویو پر اسکرپٹ کی حکمت عملی کے مطابق ، متغیرات کا اعلان کرتے وقت بھی اس قسم کا استعمال کیا جاسکتا ہے۔ مثال کے طور پر: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مثال کے طور پر: ((ان ڈھانچے کے کلیدی الفاظ، جملے کے استعمال ہم بعد کے سبق میں تفصیل سے وضاحت کریں گے، دراصل ہم نے پہلے سبق میں سادہ if جملے کی تفویض سیکھا ہے، آپ کو واپس دیکھ سکتے ہیں))
یہاں ہم ان پٹ فنکشن کے بارے میں بات کریں گے، یہ فنکشن ایک ایسا فنکشن ہے جسے ہم اکثر استعمال کرتے ہیں جب ہم حکمت عملی تیار کرتے ہیں۔ یہ فنکشن ڈیزائننگ کی حکمت عملی میں بہت اہم ہے۔
ان پٹ فنکشن:
input函数,参数defval、title、tooltip、inline、group
ایف ایم زیڈ پر ان پٹ فنکشن اور ٹریڈنگ ویو پر کچھ مختلف ہے ، لیکن یہ فنکشن حکمت عملی کے پیرامیٹرز کے لئے ان پٹ کے طور پر استعمال کیا جاتا ہے۔ ذیل میں ہم ایک مثال کے ذریعہ ایف ایم زیڈ پر ان پٹ فنکشن کے استعمال کی تفصیل دیتے ہیں:
pine
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)
متغیرات کا اعلان کرتے وقت متغیرات کو قدر دینے کے لئے ، اکثر استعمال کیا جاتا ہے ان پٹ فنکشن ، ایف ایم زیڈ پر ان پٹ فنکشن ایف ایم زیڈ پالیسی انٹرفیس میں خود بخود کنٹرول ڈرائنگ کرتا ہے جو پالیسی پیرامیٹرز کو ترتیب دینے کے لئے استعمال ہوتا ہے۔ ایف ایم زیڈ پر معاون کنٹرولز میں فی الحال عددی ان پٹ باکس ، ٹیکسٹ ان پٹ باکس ، ڈراپ ڈاؤن باکس ، بُل ویلیو چیک آؤٹ ہے۔ اور پالیسی پیرامیٹرز گروپ کو ترتیب دینے ، پیرامیٹرز کی ترتیب کے لئے متن کی معلومات جیسے فنکشن کو ترتیب دینے کے لئے استعمال کیا جاسکتا ہے۔
ہم ان پٹ فنکشن کے کچھ اہم پیرامیٹرز کے بارے میں بات کرتے ہیں:
- defval: ان پٹ فنکشن سیٹ کے طور پر پالیسی پیرامیٹرز کے اختیارات کے لئے ڈیفالٹ، پائن زبان کی بلٹ ان متغیرات، اقدار، اور سٹرنگ کی حمایت کرتا ہے
- title: پالیسی کا نام جو پالیسی انٹرفیس پر دکھایا جاتا ہے
- ٹول ٹپ: پالیسی پیرامیٹرز کے بارے میں اشارے ، جب ماؤس کو پالیسی پیرامیٹرز پر لٹکا دیا جاتا ہے تو اس پیرامیٹر کی ترتیب کے بارے میں متن کی معلومات دکھائی جاتی ہیں۔
- group: پالیسی کے پیرامیٹرز کے گروپ کا نام ، جس میں پیرامیٹرز کو گروپ کیا جاسکتا ہے۔
الگ الگ متغیرات کے اعلانات اور ان کی قدر کے علاوہ ، پائن زبان میں متغیرات کا ایک مجموعہ بیان کیا جاتا ہے اور اس کی قدر دی جاتی ہے:
[变量A,变量B,变量C] = 函数 或者 ```if```、 ```for```、```while```或```switch```等结构
سب سے زیادہ عام طور پر ہم استعمال کرتے ہیںta.macdجب فنکشن MACD اشارے کا حساب لگاتا ہے تو ، چونکہ MACD اشارے ایک کثیر سطحی اشارے ہے ، لہذا اعداد و شمار کے تین سیٹوں کا حساب لگایا جاتا ہے۔ لہذا یہ لکھا جاسکتا ہے:
pine
[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 چارٹ کو ڈرائنگ کرنے کے لئے بہت آسان ہے، نہ صرف بلٹ ان افعال ایک سے زیادہ متغیرات واپس کر سکتے ہیں، بلکہ اپنی مرضی کے مطابق افعال بھی کئی اعداد و شمار واپس کر سکتے ہیں.
pine
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)
if جیسے ڈھانچے کو ایک سے زیادہ متغیرات کے طور پر تفویض کرنے کا طریقہ بھی اوپر کی طرح ہی ہے۔ اگر آپ دلچسپی رکھتے ہیں تو آپ کوشش کر سکتے ہیں۔
[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)
مشروط ساخت
کچھ افعال کو مقامی کوڈ کے بلاکس میں لکھنا ناممکن ہے جن میں مشروط شاخیں ہیں ، بنیادی طور پر مندرجہ ذیل چند افعال:
barcolor(), fill(), hline(), indicator(), plot(), plotcandle(), plotchar(), plotshape()
ٹریڈنگ ویو پر غلطی کی اطلاع مرتب کرے گا۔ ایف ایم زیڈ پر پابندیاں اتنی سخت نہیں ہیں ، لیکن ٹریڈنگ ویو پر شرائط پر عمل کرنے کی بھی سفارش کی گئی ہے۔ مثال کے طور پر ، اگرچہ ایف ایم زیڈ پر غلطی کی اطلاع نہیں دی جاتی ہے ، لیکن اس طرح کی تحریر کی سفارش نہیں کی جاتی ہے۔
pine
strategy("test", overlay=true)
if close > open
plot(close, title="close")
else
plot(open, title="open")
اگر جملہ
مثال:
pine
var lineColor = na
n = if bar_index > 10 and bar_index <= 20
lineColor := color.green
else if bar_index > 20 and bar_index <= 30
lineColor := color.blue
else if bar_index > 30 and bar_index <= 40
lineColor := color.orange
else if bar_index > 40
lineColor := color.black
else
lineColor := color.red
plot(close, title="close", color=n, linewidth=5, overlay=true)
plotchar(true, title="bar_index", char=str.tostring(bar_index), location=location.abovebar, color=color.red, overlay=true)
نوٹ: فیصلہ کرنے کے لئے استعمال ہونے والے اظہار، بول کی قدر لوٹاتا ہے۔ احتیاط سے سکریپ کریں۔ زیادہ سے زیادہ صرف ایک دوسری شاخ ہوسکتی ہے۔ تمام شاخوں کے اظہار درست نہیں ہیں ، اور اگر کوئی دوسری شاخ نہیں ہے تو ، واپس آنا۔
pine
x = if close > open
close
plot(x, title="x")
چونکہ جب K لائن BAR نائن لائن ہوتی ہے، یعنی close < open، تو if جملے کے بعد کا اظہار false ہوتا ہے۔ اس لیے if کا لوکل کوڈ بلاک پر عملدرآمد نہیں کیا جاتا ہے۔ اس وقت بھی کوئی else شاخ نہیں ہوتی۔ اس لیے if جملہ واپس کرتا ہے کہ na。 x کو na کے طور پر تفویض کیا جاتا ہے۔ یہ نقطہ ڈرائنگ گراف پر نہیں کھینچا جا سکتا۔ ہم ڈرائنگ گراف پر بھی اس کا مشاہدہ کرسکتے ہیں۔
switch جملہ
سوئچ اسٹیٹمنٹ بھی ایک شاخ ساختہ اسٹیٹمنٹ ہے جو کچھ شرائط کے مطابق مختلف راستوں کو انجام دینے کے لئے ڈیزائن کیا گیا ہے۔ سوئچ اسٹیٹمنٹ میں عام طور پر درج ذیل اہم نکات ہیں۔
1، سوئچ کے بیانات اور اگر بیانات کی طرح، اقدار واپس کر سکتے ہیں.
2۔ دوسرے زبانوں میں سوئچ کے بیانات کے برعکس ، سوئچ ڈھانچے کو انجام دیتے وقت ، اس کے کوڈ میں صرف ایک مقامی بلاک کو انجام دیا جاتا ہے ، لہذا بریک کا اعلان غیر ضروری ہے (یعنی بریک جیسے کلیدی الفاظ لکھنے کی ضرورت نہیں ہے) ۔
3۔ سوئچ کی ہر شاخ ایک مقامی کوڈ بلاک لکھ سکتی ہے ، اور اس مقامی کوڈ بلاک کی آخری سطر واپسی کی قیمت ہے (یہ قدر کا ایک ذیلی سیٹ ہوسکتا ہے) ۔ اگر کوئی شاخ نہیں ہے تو مقامی کوڈ بلاک پر عملدرآمد کیا جاتا ہے ، واپس لوٹتا ہے
4، سوئچ ڈھانچے میں اظہار کا فیصلہ کرنے کی پوزیشن ، سٹرنگ ، متغیر ، اظہار یا فنکشن کال لکھ سکتے ہیں۔
5۔ سوئچ ایک واپسی کی قیمت کی وضاحت کرنے کی اجازت دیتا ہے ، جو ڈھانچے میں کسی اور صورت میں عملدرآمد کے لئے استعمال ہونے والی ڈیفالٹ ویلیو کے طور پر استعمال ہوتا ہے۔
سوئچ کو دو اقسام میں تقسیم کیا گیا ہے۔ ہم مثال کے طور پر دیکھتے ہیں کہ اسے کس طرح استعمال کیا جاتا ہے۔
1، جس میں اظہار ہےswitchمثال کے طور پر
pine
// input.string: defval, title, options, tooltip
func = input.string("EMA", title="指标名称", tooltip="选择要使用的指标函数名称", options=["EMA", "SMA", "RMA", "WMA"])
// input.int: defval, title, options, tooltip
// param1 = input.int(10, title="周期参数")
fastPeriod = input.int(10, title="快线周期参数", options=[5, 10, 20])
slowPeriod = input.int(20, title="慢线周期参数", options=[20, 25, 30])
data = input(close, title="数据", tooltip="选择使用收盘价、开盘价、最高价...")
fastColor = color.red
slowColor = color.red
[fast, slow] = switch func
"EMA" =>
fastLine = ta.ema(data, fastPeriod)
slowLine = ta.ema(data, slowPeriod)
fastColor := color.red
slowColor := color.red
[fastLine, slowLine]
"SMA" =>
fastLine = ta.sma(data, fastPeriod)
slowLine = ta.sma(data, slowPeriod)
fastColor := color.green
slowColor := color.green
[fastLine, slowLine]
"RMA" =>
fastLine = ta.rma(data, fastPeriod)
slowLine = ta.rma(data, slowPeriod)
fastColor := color.blue
slowColor := color.blue
[fastLine, slowLine]
=>
runtime.error("error")
plot(fast, title="fast" + fastPeriod, color=fastColor, overlay=true)
plot(slow, title="slow" + slowPeriod, color=slowColor, overlay=true)
پہلے ہم نے ان پٹ فنکشن سیکھا تھا، یہاں ہم ان پٹ سے ملتے جلتے دو فنکشنز سیکھتے ہیں:input.string、input.intفنکشن
input.stringاس کے علاوہ، یہ ایک سٹرنگ کو واپس کرنے کے لئے استعمال کیا جاتا ہے.input.intیہ فنکشن عددی عددی کو واپس کرنے کے لئے استعمال کیا جاتا ہے۔ مثال کے طور پر، یہ اصل میں ایک نیا عنصر ہے.optionsپیرامیٹرز کا استعمالoptionsپیرامیٹرز کو ایک منتخب کردہ اقدار پر مشتمل ایک صف میں منتقل کیا جا سکتا ہے۔ مثال کے طور پر مثال میںoptions=["EMA", "SMA", "RMA", "WMA"]اورoptions=[5, 10, 20](نوٹ کریں کہ ایک سٹرنگ ٹائپ ہے اور ایک عددی قسم) ۔ اس طرح پالیسی انٹرفیس پر کنٹرول کو مخصوص عددی اقدار درج کرنے کی ضرورت نہیں ہے ، لیکن کنٹرول نیچے والے خانے میں تبدیل ہوجاتا ہے ، اور اختیارات کے اختیارات میں فراہم کردہ اختیارات کو منتخب کرتا ہے۔
متغیر فنک کی قدر ایک تار کے طور پر ہے ، متغیر فنک سوئچ کے اظہار کے طور پر ((یہ متغیر ، فنکشن کال ، اظہار ہوسکتا ہے) ، اس بات کا تعین کرنے کے لئے کہ سوئچ میں کون سا شاخ ہے۔ اگر متغیر فنک سوئچ میں کسی بھی شاخ پر اظہار سے مماثل نہیں ہوتا ہے (یعنی مساوی ہے) ، تو ڈیفالٹ برانچ کوڈ بلاک پر عملدرآمد کریں ، جو عملدرآمد کرے گاruntime.error("error")فنکشن کی وجہ سے حکمت عملی کو غیر معمولی طور پر روک دیا گیا ہے.
ہمارے اوپر ٹیسٹ کوڈ میں سوئچ کے ڈیفالٹ برانچ کوڈ بلاک کی آخری لائن runtime.error کے بعد ہم نے شامل نہیں کیا[na، na] جیسے کوڈ کو واپسی کی قدر کو مطابقت دینے کے لئے ، ٹریڈنگ ویو پر اس مسئلے پر غور کرنے کی ضرورت ہے ، اگر قسم متضاد نہیں ہے تو غلطی کی اطلاع دی جائے گی۔ لیکن ایف ایم زیڈ پر اس طرح کے مطابقت پذیر کوڈ کو نظرانداز کیا جاسکتا ہے کیونکہ اس کی قسم کی سختی سے ضرورت نہیں ہے۔ لہذا ایف ایم زیڈ پر اگر ، سوئچ برانچنگ واپسی کی قدر کی قسم مطابقت کے مسئلے پر غور کرنے کی ضرورت نہیں ہے۔
pine
strategy("test", overlay=true)
x = if close > open
close
else
"open"
plotchar(true, title="x", char=str.tostring(x), location=location.abovebar, color=color.red)
ایف ایم زیڈ پر کوئی غلطی نہیں ہوگی ، لیکن تجارتی نظارے میں غلطی ہوگی۔ کیونکہ if شاخوں کی قسم متضاد ہے۔
2، کوئی اظہار نہیںswitch
ہم دیکھیں گےswitchاس کا ایک اور استعمال یہ ہے کہ اس کو بغیر کسی اظہار کے لکھا جائے گا۔
pine
up = close > open // up = close < open
down = close < open
var upOfCount = 0
var downOfCount = 0
msgColor = switch
up =>
upOfCount += 1
color.green
down =>
downOfCount += 1
color.red
plotchar(up, title="up", char=str.tostring(upOfCount), location=location.abovebar, color=msgColor, overlay=true)
plotchar(down, title="down", char=str.tostring(downOfCount), location=location.belowbar, color=msgColor, overlay=true)
ٹیسٹ کوڈ کی مثال میں دیکھا جاسکتا ہے کہ سوئچ برانچنگ کی شرائط پر عملدرآمد کرنے والے مقامی کوڈ بلاکس کو حقیقی کے طور پر مماثل کرے گا۔ عام طور پر سوئچ کے بیان کے بعد برانچنگ کی شرائط کو ایک دوسرے سے متصادم ہونا ضروری ہے۔ یعنی مثال میں اوپر اور نیچے ایک ساتھ سچے نہیں ہوسکتے ہیں۔ چونکہ سوئچ صرف ایک برانچنگ کے مقامی کوڈ بلاک پر عملدرآمد کرسکتا ہے ، لہذا دلچسپی رکھنے والوں کو کوڈ میں یہ جملہ مل سکتا ہے:up = close > open // up = close < open تبصرے میں تبدیل کریں ، اور نتائج کو دیکھیں۔ آپ کو پتہ چل جائے گا کہ سوئچ شاخ صرف پہلی شاخ پر عملدرآمد کرسکتی ہے۔ اس کے علاوہ ، اس بات پر بھی توجہ دی جانی چاہئے کہ سوئچ کی شاخ میں فنکشن کال نہ کریں۔ فنکشن کو ہر بار پر کال نہیں کیا جاسکتا ہے جس سے اعداد و شمار کے حساب سے کچھ پریشانی ہوسکتی ہے۔switchمثال کے طور پر ، ایکسپلوریشن برانچ طے شدہ ہے اور حکمت عملی کے عمل میں تبدیل نہیں ہوگی۔)
سرکلر ڈھانچہ
for جملہ
返回值 = for 计数 = 起始计数 to 最终计数 by 步长
语句 // 注释:语句里可以有break,continue
语句 // 注释:最后一条语句为返回值
for کے جملے کا استعمال بہت آسان ہے، for لوپ ایک قدر واپس کر سکتا ہے ((یا ایک سے زیادہ اقدار واپس کر سکتا ہے،[a، b، c] جیسی شکلیں) ٫٫ جیسا کہ اوپر کے جھوٹے کوڈ میں "واپسی کی قیمت" کی پوزیشن کو تفویض کیا گیا ہے۔ for کے بیان کے بعد ایک "کاؤنٹ" متغیر کے بعد استعمال کیا جاتا ہے جو سائیکل کی تعداد کو کنٹرول کرتا ہے ، دوسری اقدار کا حوالہ دیتا ہے ، وغیرہ ٫٫ "کاؤنٹ" متغیر کو سائیکل کے آغاز سے پہلے "ابتدائی گنتی" کے طور پر تفویض کیا جاتا ہے ، پھر "قدم" کی ترتیب کے مطابق اضافہ ہوتا ہے ، جب "کاؤنٹ" متغیر "حتمی گنتی" سے زیادہ ہوتا ہے تو سائیکل رک جاتا ہے۔
for لوپ میں استعمال ہوتا ہےbreakکلیدی لفظ: جب عملدرآمدbreakاس جملے کے بعد، یہ سائیکل رک گیا <unk>
for لوپ میں استعمال ہوتا ہےcontinueکلیدی لفظ: جب عملدرآمدcontinueجملے کے بعد، سائیکل کو نظر انداز کریںcontinueاس کے بعد کا کوڈ ، براہ راست اگلے دورے پر عمل درآمد کرے گا۔ for بیان آخری دورے پر عملدرآمد کے وقت کی واپسی کی واپسی کرتا ہے۔ اگر کوئی کوڈ عملدرآمد نہیں ہوتا ہے تو ، خالی واپسی کی واپسی ہوتی ہے۔
ذیل میں ہم ایک سادہ مثال پیش کرتے ہیں:
pine
ret = for i = 0 to 10 // 可以增加by关键字修改步长,暂时FMZ不支持 i = 10 to 0 这样的反向循环
// 可以增加条件设置,使用continue跳过,break跳出
runtime.log("i:", i)
i // 如果这行不写,就返回空值,因为没有可返回的变量
runtime.log("ret:", ret)
runtime.error("stop")
for ... in جملہ
for ... inجملے کی دو شکلیں ہیں، جن کی وضاحت مندرجہ ذیل فرضی کوڈ سے کی جاتی ہے۔
返回值 = for 数组元素 in 数组
语句 // 注释:语句里可以有break,continue
语句 // 注释:最后一条语句为返回值
返回值 = for [索引变量, 索引变量对应的数组元素] in 数组
语句 // 注释:语句里可以有break,continue
语句 // 注释:最后一条语句为返回值
آپ دیکھ سکتے ہیں کہ دونوں شکلوں میں بنیادی فرق صرف for کی ورڈ کے بعد آنے والے مواد میں ہے، ایک یہ ہے کہ ایک متغیر کو صف کے عناصر کے حوالہ کے طور پر استعمال کیا جائے۔ ایک یہ ہے کہ ایک متغیر کا استعمال کیا جائے جس میں انڈیکس متغیر، صف کے عناصر کے متغیرات کی ایک ذیلی سیٹ کی ساخت کا حوالہ دیا جائے۔ دوسری واپسی کی قیمت کا قاعدہ ہے، اور بریک، جاری رکھنے اور اس طرح کے قواعد اور for لوپ کے مطابق ہیں۔ ہم نے بھی ایک سادہ مثال کے ساتھ استعمال کی وضاحت کی ہے۔
pine
testArray = array.from(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)
for ele in testArray // 修改成 [i, ele]的形式:for [i, ele] in testArray , runtime.log("ele:", ele, ", i:", i)
runtime.log("ele:", ele)
runtime.error("stop")
جب آپ کو انڈیکس کی ضرورت ہو تو استعمال کریںfor [i, ele] in testArrayہسپانوی
for سرکلر ایپلی کیشن
جب پائن زبان کے ذریعہ فراہم کردہ بلٹ ان افعال کو استعمال کرکے کچھ لوپ لوجیکل حساب کتاب کی جاسکتی ہے ، تو یہ براہ راست لوپ ڈھانچے کا استعمال کرکے لکھا جاسکتا ہے ، یا اس کو بلٹ ان افعال کے ذریعہ سنبھالا جاسکتا ہے۔ ہم دو مثالیں پیش کرتے ہیں۔
1، اوسط حساب
جب آپ سرکلر ڈھانچے کا استعمال کرتے ہیں:
pine
length = 5
var a = array.new(length)
array.push(a, close)
if array.size(a) >= length
array.remove(a, 0)
sum = 0
for ele in a
sum += ele
avg = sum / length
plot(avg, title="avg", overlay=true)
مثال کے طور پر ، ہم نے for کے لکیری مجموعہ کا استعمال کیا ، اور پھر اوسط درجے کا حساب لگایا۔
براہ راست بلٹ ان فنکشن کا استعمال کرتے ہوئے اوسط لائن کا حساب لگائیں:
pine
plot(ta.sma(close, length), title="ta.sma", overlay=true)
براہ راست بلٹ ان افعال کا استعمال کرتے ہوئےta.smaاوسط لائن کے اشارے کا حساب لگانا ، اوسط لائن کے حساب لگانے کے لئے بلٹ ان فنکشن کا استعمال کرنا بہت آسان ہے۔ چارٹ پر موازنہ کرتے ہوئے آپ دیکھ سکتے ہیں کہ حساب کتاب کے نتائج بالکل یکساں ہیں۔
2، جمع کرنا
یا پھر اوپر دی گئی مثالوں کا استعمال کریں:
جب آپ سرکلر ڈھانچے کا استعمال کرتے ہیں:
pine
length = 5
var a = array.new(length)
array.push(a, close)
if array.size(a) >= length
array.remove(a, 0)
sum = 0
for ele in a
sum += ele
avg = sum / length
plot(avg, title="avg", overlay=true)
plot(ta.sma(close, length), title="ta.sma", overlay=true)
تمام عناصر کے مجموعہ کے حساب لگانے کے لئے آرٹیج کو لوپ کا استعمال کیا جا سکتا ہے، یا بلٹ ان فنکشن کا استعمال کیا جا سکتا ہےarray.sumحساب لگائیں
براہ راست بلٹ میں فنکشن کا استعمال کرتے ہوئے جمع کا حساب لگائیں:
pine
length = 5
var a = array.new(length)
array.push(a, close)
if array.size(a) >= length
array.remove(a, 0)
plot(array.sum(a) / length, title="avg", overlay=true)
plot(ta.sma(close, length), title="ta.sma", overlay=true)
اعداد و شمار کے حساب سے دیکھا جا سکتا ہے، plot ڈرائنگ کا استعمال کرتے ہوئے چارٹ پر مکمل طور پر ایک ہی دکھایا گیا ہے.
اگر آپ ان تمام کاموں کو بلٹ ان فنکشنز کے ذریعے کر سکتے ہیں تو پھر آپ کو سائیکل کیوں ڈیزائن کرنا چاہئے؟ سائیکلوں کا استعمال بنیادی طور پر ان تین چیزوں پر مبنی ہے:
1، صف کے کچھ آپریشنز کے لیے، حساب۔
2۔ تاریخ کا جائزہ لیں ، مثال کے طور پر ، معلوم کریں کہ ماضی کی اونچائی موجودہ بار کی اونچائی سے کتنی اونچی ہے۔ چونکہ موجودہ بار کی اونچائی صرف اسکرپٹ کے چلنے والے بار پر معلوم ہے ، لہذا ماضی کی بار پر وقت پر واپس جانے اور تجزیہ کرنے کے لئے ایک لوپ کی ضرورت ہے۔
3، پائن زبان کا استعمال کرتے ہوئے بلٹ ان فنکشن ماضی BAR کے حساب کو مکمل نہیں کر سکتا۔
while جملہ
whileاسٹیٹمنٹ جس میں لپیٹ کے حصے کا کوڈ اس وقت تک چلتا رہتا ہے جب تک کہ while ڈھانچے میں فیصلے کی شرط جھوٹی ((false)) ہو۔
返回值 = while 判断条件
语句 // 注释:语句里可以有break,continue
语句 // 注释:最后一条语句为返回值
while کے دیگر قواعد اور for لوپ کی طرح ہیں، لوپ جسم مقامی کوڈ بلاک کی آخری سطر واپسی کی قدر ہے، جو ایک سے زیادہ اقدار واپس کر سکتی ہے۔ جب 'لوپ کی شرط' سچ ہے تو لوپ پر عملدرآمد کرو، اور جب شرط جھوٹی ہے تو لوپ کو روک دو۔ لوپ جسم میں بھی بریک، جاری رکھنے والی جملے کا استعمال کیا جا سکتا ہے۔
اس کے علاوہ، میں نے اس کی مثال کے طور پر بھی استعمال کیا ہے کہ کس طرح ایک مساوی لائن کا حساب کیا جاتا ہے:
pine
length = 10
sma(data, length) =>
i = 0
sum = 0
while i < 10
sum += data[i]
i += 1
sum / length
plot(sma(close, length), title="sma", overlay=true)
plot(ta.sma(close, length), title="ta.sma", overlay=true)
یہ دیکھا جا سکتا ہے کہ while loop کا استعمال بھی بہت آسان ہے، اور کچھ کمپیوٹنگ منطق کو ڈیزائن کیا جا سکتا ہے جو بلٹ ان فنکشن کی طرف سے متبادل نہیں کیا جا سکتا ہے، مثال کے طور پر درجے کی ضرب:
pine
counter = 5
fact = 1
ret = while counter > 0
fact := fact * counter
counter := counter - 1
fact
plot(ret, title="ret") // ret = 5 * 4 * 3 * 2 * 1
گروپس
پین زبان میں صف اور دیگر پروگرامنگ زبانوں میں صف کی تعریف اسی طرح کی ہے ، پائن کی صف ایک جہتی صف ہے۔ یہ عام طور پر اعداد و شمار کی ایک مسلسل سیریز کو ذخیرہ کرنے کے لئے استعمال کیا جاتا ہے۔ صف جس میں ذخیرہ کردہ انفرادی اعداد و شمار کو صف کے عناصر کہا جاتا ہے ، ان عناصر کی اقسام ہوسکتی ہیں: انٹیگریٹ ، فلوٹائپ ، تار ، رنگین قدر ، بل قدر۔ ایف ایم زیڈ پر پائن زبان میں اقسام کی ضرورت نہیں ہے ، یہاں تک کہ ایک صف میں تار اور عددی قدر کو ایک ساتھ ذخیرہ کیا جاسکتا ہے۔ چونکہ اعداد و شمار کی صف کی بنیادی ڈھانچہ بھی سیریل ڈھانچہ ہے ، لہذا اگر تاریخ کے آپریٹر کا استعمال کیا جاتا ہے تو پچھلے بار میں صف کی حیثیت کا حوالہ دیا جاتا ہے۔ لہذا جب کسی صف میں کسی عنصر کا حوالہ دیا جاتا ہے تو تاریخ کا آپریٹر استعمال نہیں کیا جاتا ہے۔[]اس کے بجائےarray.get()اورarray.set()فنکشن 。 صف میں عناصر کی انڈیکسنگ ترتیب یہ ہے کہ صف کے پہلے عنصر کا انڈیکس 0 ہے اور اگلے عنصر کا انڈیکس 1 بڑھتا ہے۔
ہم نے ایک سادہ کوڈ کے ساتھ اس کی وضاحت کی ہے:
pine
var a = array.from(0)
if bar_index == 0
runtime.log("当前BAR上的a值:", a, ", 上1根BAR上的a,即a[1]值:", a[1])
else if bar_index == 1
array.push(a, bar_index)
runtime.log("当前BAR上的a值:", a, ", 上1根BAR上的a,即a[1]值:", a[1])
else if bar_index == 2
array.push(a, bar_index)
runtime.log("当前BAR上的a值:", a, ", 上1根BAR上的a,即a[1]值:", a[1], ", 向前数2根BAR上的a,即a[2]值:", a[2])
else if bar_index == 3
array.push(a, bar_index)
runtime.log("当前BAR上的a值:", a, ", 上1根BAR上的a,即a[1]值:", a[1], ", 向前数2根BAR上的a,即a[2]值:", a[2], ", 向前数3根BAR上的a,即a[3]值:", a[3])
else if bar_index == 4
// 使用array.get 按索引获取元素,使用array.set按索引修改元素
runtime.log("数组修改前:", array.get(a, 0), array.get(a, 1), array.get(a, 2), array.get(a, 3))
array.set(a, 1, 999)
runtime.log("数组修改后:", array.get(a, 0), array.get(a, 1), array.get(a, 2), array.get(a, 3))
اعلان شدہ صف
استعمال کریںarray<int> a、float[] bایک صف کو ایک صف کے طور پر منسوب کیا جاسکتا ہے جس میں ایک صف کا اعلان کیا جاسکتا ہے یا صرف ایک متغیر کا اعلان کیا جاسکتا ہے ، جیسے:
pine
array<int> a = array.new(3, bar_index)
float[] b = array.new(3, close)
c = array.from("hello", "fmz", "!")
runtime.log("a:", a)
runtime.log("b:", b)
runtime.log("c:", c)
runtime.error("stop")
صف متغیرات کو ابتدائی کرنے کے لئے عام استعمالarray.newاورarray.fromفنکشن 。پائن زبان میں اور بھی بہت سے فنکشنز ہیں جو array.new سے متعلق ہیں:array.new_int()、array.new_bool()、array.new_color()、array.new_string()انتظار کرو
var کلیدی لفظ بھی صف کے اعلان کے انداز کے ساتھ کام کرسکتا ہے۔ var کلیدی لفظ کا استعمال کرتے ہوئے صف کا اعلان صرف پہلے BAR پر کیا جاتا ہے۔ ہم ایک مثال کے ذریعہ مشاہدہ کرتے ہیں:
pine
var a = array.from(0)
b = array.from(0)
if bar_index == 1
array.push(a, bar_index)
array.push(b, bar_index)
else if bar_index == 2
array.push(a, bar_index)
array.push(b, bar_index)
else if barstate.islast
runtime.log("a:", a)
runtime.log("b:", b)
runtime.error("stop")
آپ دیکھ سکتے ہیں کہ a کے صف میں ہونے والی تبدیلیوں کو مستقل طور پر طے کیا جاتا ہے اور اسے دوبارہ ترتیب نہیں دیا جاتا ہے۔ b کے صف کو ہر BAR پر شروع کیا جاتا ہے۔ آخر میںbarstate.islastاصل وقت پرنٹنگ کے لئے صرف ایک عنصر باقی ہے، اور اس کی قدر 0 <unk> ہے.
صف میں عناصر کو پڑھنا اور لکھنا
array.get کا استعمال کرتے ہوئے صف میں انڈیکسنگ پوزیشن کے عناصر کو حاصل کریں ، array.set کو استعمال کرتے ہوئے صف میں انڈیکسنگ پوزیشن کے عناصر میں ترمیم کریں۔
array.get کا پہلا پیرامیٹر اس صف کا ہے جس پر عملدرآمد کیا جانا ہے اور دوسرا پیرامیٹر اس کی مخصوص انڈیکس ہے۔
array.set کا پہلا پیرامیٹر وہ صف ہے جس پر عملدرآمد کیا جانا چاہئے ، دوسرا پیرامیٹر وہ انڈیکس ہے جس کی وضاحت کی گئی ہے ، اور تیسرا پیرامیٹر وہ عنصر ہے جس پر لکھنا ہے۔
اس کی وضاحت کرنے کے لئے ، ایک سادہ مثال استعمال کریں:
pine
lookbackInput = input.int(100)
FILL_COLOR = color.green
var fillColors = array.new(5)
if barstate.isfirst
array.set(fillColors, 0, color.new(FILL_COLOR, 70))
array.set(fillColors, 1, color.new(FILL_COLOR, 75))
array.set(fillColors, 2, color.new(FILL_COLOR, 80))
array.set(fillColors, 3, color.new(FILL_COLOR, 85))
array.set(fillColors, 4, color.new(FILL_COLOR, 90))
lastHiBar = - ta.highestbars(high, lookbackInput)
fillNo = math.min(lastHiBar / (lookbackInput / 5), 4)
bgcolor(array.get(fillColors, int(fillNo)), overlay=true)
plot(lastHiBar, title="lastHiBar")
plot(fillNo, title="fillNo")
اس مثال میں بنیادی رنگ سبز کو ابتداء کیا گیا ہے اور اس کی وضاحت اور ابتداء کی گئی ہے۔ اس کے بعد رنگ کی قیمتوں کو مختلف شفافیت دی گئی ہے (color.new فنکشن کا استعمال کرتے ہوئے) ۔ رنگ کی درجہ بندی کا حساب کتاب کرتے ہوئے ، موجودہ BAR فاصلے کو 100 ریویو سائیکلوں میں اعلی سے زیادہ سے زیادہ فاصلے کی فاصلے کا حساب لگایا گیا ہے۔
صف عناصر کے ذریعے گھومنا
ہم نے پہلے سیکھا ہے کے طور پر for/for in/while جملے کا استعمال کرتے ہوئے ایک صف کے ذریعے کس طرح سفر کر سکتے ہیں؟
pine
a = array.from(1, 2, 3, 4, 5, 6)
for i = 0 to (array.size(a) == 0 ? na : array.size(a) - 1)
array.set(a, i, i)
runtime.log(a)
runtime.error("stop")
pine
a = array.from(1, 2, 3, 4, 5, 6)
i = 0
while i < array.size(a)
array.set(a, i, i)
i += 1
runtime.log(a)
runtime.error("stop")
pine
a = array.from(1, 2, 3, 4, 5, 6)
for [i, ele] in a
array.set(a, i, i)
runtime.log(a)
runtime.error("stop")
ان تینوں طریقوں سے ایک ہی نتیجہ نکلتا ہے۔
اسکرپٹ کے عالمی سطح پر یا کسی فنکشن یا if شاخ کے مقامی سطح پر ایک صف کا اعلان کیا جاسکتا ہے
تاریخی اعداد و شمار کا حوالہ
صفوں میں عناصر کے استعمال کے لئے ، مندرجہ ذیل طریقہ مساوی ہے ، ہم مندرجہ ذیل مثال کے ذریعے دیکھ سکتے ہیں کہ چارٹ پر دو لائنوں کے دو گروپوں کو ڈرائنگ کیا گیا ہے ، ہر گروپ میں دو لائنیں ، ہر گروپ میں دو لائنوں کی تعداد بالکل ایک جیسی ہے۔
pine
a = array.new_float(1)
array.set(a, 0, close)
closeA1 = array.get(a, 0)[1]
closeB1 = close[1]
plot(closeA1, "closeA1", color.red, 6)
plot(closeB1, "closeB1", color.black, 2)
ma1 = ta.sma(array.get(a, 0), 20)
ma2 = ta.sma(close, 20)
plot(ma1, "ma1", color.aqua, 6)
plot(ma2, "ma2", color.black, 2)
ایک صف میں اضافہ اور ہٹانے کے افعال
1، صف کا اضافہ آپریشن متعلقہ فنکشن:
array.unshift()、array.insert()、array.push()。
2، صف کے حذف کرنے کے لئے متعلقہ افعال:
array.remove()、array.shift()、array.pop()、array.clear()。
ہم مندرجہ ذیل مثالوں کا استعمال کرتے ہوئے ان صفوں کے اضافے، ہٹانے کے آپریشنل افعال کو جانچنے کے لئے کرتے ہیں:
pine
a = array.from("A", "B", "C")
ret = array.unshift(a, "X")
runtime.log("数组a:", a, ", ret:", ret)
ret := array.insert(a, 1, "Y")
runtime.log("数组a:", a, ", ret:", ret)
ret := array.push(a, "D")
runtime.log("数组a:", a, ", ret:", ret)
ret := array.remove(a, 2)
runtime.log("数组a:", a, ", ret:", ret)
ret := array.shift(a)
runtime.log("数组a:", a, ", ret:", ret)
ret := array.pop(a)
runtime.log("数组a:", a, ", ret:", ret)
ret := array.clear(a)
runtime.log("数组a:", a, ", ret:", ret)
runtime.error("stop")
شامل کریں، حذف کریں: صف کے طور پر صف
صفوں کا استعمال کرتے ہوئے، اور صفوں کے کچھ اضافہ اور حذف کرنے کے افعال ہم "صف" ڈیٹا ڈھانچے کی تعمیر کر سکتے ہیں. صفوں کو ٹِک قیمتوں کی اوسط اوسط کے حساب سے استعمال کیا جا سکتا ہے، اور شاید کچھ طلباء پوچھیں گے: کیوں صف کی تعمیر؟ کیا ہم نے پہلے صفوں کا استعمال نہیں کیا تھا؟ کیا اوسط اوسط نہیں ہے؟
قطار ایک ایسا ڈھانچہ ہے جو پروگرامنگ کے شعبے میں اکثر استعمال کیا جاتا ہے۔ اس کی خصوصیات یہ ہیں:
صف میں داخل ہونے والا پہلا عنصر ، صف سے باہر جانے والا پہلا عنصر <unk
اس طرح یہ یقینی بنایا جا سکتا ہے کہ قطار میں موجود اعداد و شمار تازہ ترین اعداد و شمار ہیں اور قطار کی لمبائی لامحدود نہیں بڑھتی ہے (لا محدود توسیع والا کوڈ صرف دوپہر کے وقت لکھا جاسکتا ہے ، کیونکہ صبح ، دوپہر اور شام میں مسئلہ ہوسکتا ہے) ۔
مندرجہ ذیل مثال میں ہم نے ایک قطار کا ڈھانچہ استعمال کیا ہے جس میں ہر ٹِک کی قیمت درج کی جاتی ہے، ٹِک کی سطح پر ایک اوسط قیمت کا حساب لگایا جاتا ہے، اور پھر اس کا موازنہ 1 منٹ کی K لائن کی سطح پر ایک اوسط قیمت کے ساتھ کیا جاتا ہے۔
pine
strategy("test", overlay=true)
varip a = array.new_float(0)
var length = 10
if not barstate.ishistory
array.push(a, close)
if array.size(a) > length
array.shift(a)
sum = 0.0
for [index, ele] in a
sum += ele
avgPrice = array.size(a) == length ? sum / length : na
plot(avgPrice, title="avgPrice")
plot(ta.sma(close, length), title="ta.sma")
نوٹ کریں کہ جب ہم نے a کے صف کا اعلان کیا تو ہم نے اعلان کا طریقہ بتایا اور ہم نے کلیدی الفاظ استعمال کیےvaripاس طرح قیمت میں ہر تبدیلی کو a کے صف میں ریکارڈ کیا جاتا ہے۔
عام طور پر استعمال ہونے والے صف حساب، آپریشن فنکشن
متعلقہ افعال کا حساب لگائیں:
array.avg()اور پھر ہم اس صف میں موجود تمام عناصر کی اوسط تلاش کرتے ہیںarray.min()اس میں سے سب سے چھوٹا عنصر تلاش کریںarray.max()اس میں سے کون سا عنصر سب سے بڑا ہے؟array.stdev()اس صف میں موجود تمام عناصر کا معیاری فرق تلاش کریںarray.sum()صف میں موجود تمام عناصر کا مجموعہ معلوم کریں۔
متعلقہ افعال:
array.concat()دو صفوں کو جوڑنا یا جوڑنا۔
array.copy()صف کو نقل کریں
array.joinصف میں موجود تمام عناصر کو ایک تار میں جوڑیں۔
array.sort()درجہ بندی کے لحاظ سے ترتیب دیں۔
array.reverse()الٹ پلٹ صف
array.slice()صفوں کا ٹکڑا کرنا
array.includes()فیصلے کا عنصر
array.indexof()واپسی انڈیکس جس میں پیرامیٹر کی قیمت پہلی بار ظاہر ہوتی ہے۔ اگر یہ قیمت نہیں ملتی ہے تو ، واپسی -1.
array.lastindexof()آخری بار ظاہر ہونے والی قدر تلاش کریں۔
صف حساب سے متعلقہ فنکشن کی جانچ کی مثال:
pine
a = array.from(3, 2, 1, 4, 5, 6, 7, 8, 9)
runtime.log("数组a的算数平均:", array.avg(a))
runtime.log("数组a中的最小元素:", array.min(a))
runtime.log("数组a中的最大元素:", array.max(a))
runtime.log("数组a中的标准差:", array.stdev(a))
runtime.log("数组a的所有元素总和:", array.sum(a))
runtime.error("stop")
یہ سب سے زیادہ استعمال ہونے والے صف حساب کے افعال ہیں۔
آپریٹنگ متعلقہ افعال کی مثالیں:
pine
a = array.from(1, 2, 3, 4, 5, 6)
b = array.from(11, 2, 13, 4, 15, 6)
runtime.log("数组a:", a, ", 数组b:", b)
runtime.log("数组a,数组b连接在一起:", array.concat(a, b))
c = array.copy(b)
runtime.log("复制一个数组b,赋值给变量c,变量c:", c)
runtime.log("使用array.join处理数组c,给每个元素中间增加符号+,连接所有元素结果为字符串:", array.join(c, "+"))
runtime.log("排序数组b,按从小到大顺序,使用参数order.ascending:", array.sort(b, order.ascending)) // array.sort函数修改原数组
runtime.log("排序数组b,按从大到小顺序,使用参数order.descending:", array.sort(b, order.descending)) // array.sort函数修改原数组
runtime.log("数组a:", a, ", 数组b:", b)
array.reverse(a) // 此函数修改原数组
runtime.log("反转数组a中的所有元素顺序,反转之后数组a为:", a)
runtime.log("截取数组a,索引0 ~ 索引3,遵循左闭右开区间规则:", array.slice(a, 0, 3))
runtime.log("在数组b中搜索元素11:", array.includes(b, 11))
runtime.log("在数组a中搜索元素100:", array.includes(a, 100))
runtime.log("将数组a和数组b连接,搜索其中第一次出现元素2的索引位置:", array.indexof(array.concat(a, b), 2), " , 参考观察 array.concat(a, b):", array.concat(a, b))
runtime.log("将数组a和数组b连接,搜索其中最后一次出现元素6的索引位置:", array.lastindexof(array.concat(a, b), 6), " , 参考观察 array.concat(a, b):", array.concat(a, b))
runtime.error("stop")
فنکشن
اپنی مرضی کے مطابق فنکشن
پائن زبان اپنی مرضی کے مطابق افعال ڈیزائن کر سکتی ہے، عام طور پر پائن زبان کے اپنی مرضی کے مطابق افعال مندرجہ ذیل قواعد کے ساتھ ہیں:
1، تمام افعال اسکرپٹ کے عالمی دائرہ کار میں بیان کیے گئے ہیں۔ ایک فنکشن کو کسی دوسرے فنکشن میں اعلان نہیں کیا جاسکتا ہے۔
2، فنکشن کو اپنے کوڈ میں اپنے آپ کو کال کرنے کی اجازت نہیں ہے۔
3، بنیادی طور پر تمام پائن زبانوں میں بلٹ ان ڈرائنگ فنکشن ((barcolor()、 fill()、 hline()、plot()、 plotbar()、 plotcandle()) کو اپنی مرضی کے مطابق فنکشن میں نہیں بلایا جاسکتا۔
4، فنکشن کو سنگل لائن یا کثیر لائن میں لکھا جا سکتا ہے۔ آخری جملے کی واپسی کی قیمت موجودہ فنکشن کی واپسی کی قیمت ہے ، واپسی کی قیمت ایٹم فارم میں واپس کی جاسکتی ہے۔
پچھلے سبق میں ہم نے کئی بار اپنی مرضی کے مطابق افعال کا استعمال کیا ہے ، جیسے کہ اپنی مرضی کے مطابق افعال کو ایک لائن میں ڈیزائن کرنا:
pine
barIsUp() => close > open
یہ فنکشن لوٹاتا ہے کہ آیا موجودہ BAR سورج کی روشنی ہے یا نہیں
کثیر سطر اپنی مرضی کے مطابق فنکشن کے طور پر ڈیزائن:
pine
sma(data, length) =>
i = 0
sum = 0
while i < 10
sum += data[i]
i += 1
sum / length
plot(sma(close, length), title="sma", overlay=true)
plot(ta.sma(close, length), title="ta.sma", overlay=true)
ہم اپنی مرضی کے مطابق فنکشن کے ساتھ اپنے آپ کو لاگو ایک sma اوسط لکیری حساب کی تقریب <unk>
مثال کے طور پر، ہم دو متغیرات کے لئے ایک اپنی مرضی کے مطابق فنکشن واپس کر سکتے ہیں:
pine
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)
ایک فنکشن سے فوری لائن، سست لائن، دو ای ایم اے اوسط لائن اشارے کا حساب لگایا جاسکتا ہے۔
بلٹ ان فنکشن
بلٹ میں فنکشن آسانی سےFMZ PINE سکرپٹ دستاویزیانٹرویو
پائن زبان میں بلٹ ان فنکشن کی درجہ بندی:
1، سٹرنگ پروسیسنگ فنکشنstr.سلسلہ
2، رنگین اقدار کے ساتھ کام کرنے والے افعالcolor.سلسلہ
3، پیرامیٹرز کی ان پٹ تقریبinput.سلسلہ
4، اشارے حساب تقریبta.سلسلہ
5، ڈرائنگ فنکشنplot.سلسلہ
6، صفوں کے ساتھ کام کرنے والے افعالarray.سلسلہ
7، ٹرانزیکشن متعلقہ افعالstrategy.سلسلہ
8، ریاضی کے آپریشن سے متعلق افعالmath.سلسلہ
9، دیگر افعال ((وقت کی پروسیسنگ، غیر پلاٹ سیریز ڈرائنگ فنکشن،request.سیریز کے افعال، قسم کی پروسیسنگ کے افعال وغیرہ) <unk>
ٹرانزیکشن فنکشن
strategy.سیریز کے افعال وہ افعال ہیں جو ہم اکثر حکمت عملی کے ڈیزائن میں استعمال کرتے ہیں ، اور یہ افعال اور حکمت عملی کے مخصوص چلانے کے وقت ٹرانزیکشن آپریشنز کو انجام دینے سے متعلق ہیں۔
1、strategy.entry
strategy.entryفنکشن ایک ایسا آرڈر فنکشن ہے جو حکمت عملی لکھتے وقت بہت اہم ہوتا ہے۔ اس فنکشن کے کچھ اہم پیرامیٹرز یہ ہیں:id, direction, qty, whenانتظار کرو
پیرامیٹر:
id: کسی تجارت کی پوزیشن کو ایک نام دینے کے لئے استعمال کیا جاتا ہے۔ اس کا حوالہ دیا جاسکتا ہے۔ آرڈر منسوخ کریں ، آرڈر میں ترمیم کریں۔direction: اگر آرڈر کی سمت زیادہ کرنا ہے ((خریدنا) تو یہ پیرامیٹر منتقل ہوتا ہےstrategy.longاس میں ایک متغیر ہے، اگر آپ کو خالی کرنا ہے تو آپ اسے بیچ دیں گے.strategy.shortیہ متغیر:qty: آرڈر کی مقدار کی وضاحت کریں ، اگر یہ پیرامیٹر استعمال نہیں کیا جاتا ہے تو یہ پہلے سے طے شدہ آرڈر کی مقدار ہے۔when: عملدرآمد کی شرائط ، آپ اس پیرامیٹر کو کنٹرول کرسکتے ہیں کہ آیا موجودہ آرڈر آپریشن کو متحرک کیا جائے یا نہیں۔limit: آرڈر کی حد کی قیمت طے کریں۔stopسٹاپ نقصان کی قیمت:
strategy.entryفنکشن کی تفصیلاتstrategyفنکشن کالز پر پیرامیٹرز کی ترتیب کو کنٹرول کیا جا سکتا ہے"پائن زبان کا تبادلہ کلاس بیس ماڈیول پیرامیٹرز"سیٹ اپ کنٹرول، پائن لینگوئج ٹرانزیکشن کلاس لائبریری ماڈل ایڈیشن پیرامیٹرز کنٹرول کے بارے میں مزید تفصیلات کے لئے، آپ کو لنک کردہ دستاویزات دیکھ سکتے ہیں.
یہاں کچھ اہم باتیں ہیں:strategyفنکشن میںpyramiding、default_qty_valueپیرامیٹرز: مندرجہ ذیل کوڈ کے ساتھ ٹیسٹ کریں:
pine
/*backtest
start: 2022-07-03 00:00:00
end: 2022-07-09 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/
strategy(title = "open long example", pyramiding = 3, default_qty_value=0.1, overlay=true)
ema10 = ta.ema(close, 10)
findOrderIdx(idx) =>
if strategy.opentrades == 0
false
else
ret = false
for i = 0 to strategy.opentrades - 1
if strategy.opentrades.entry_id(i) == idx
ret := true
break
ret
if not findOrderIdx("long1")
strategy.entry("long1", strategy.long)
if not findOrderIdx("long2")
strategy.entry("long2", strategy.long, 0.2, when = close > ema10)
if not findOrderIdx("long3")
strategy.entry("long3", strategy.long, 0.2, limit = low[1])
strategy.entry("long3", strategy.long, 0.3, limit = low[1])
if not findOrderIdx("long4")
strategy.entry("long4", strategy.long, 0.2)
plot(ema10, title="ema10", color=color.red)
کوڈ کا آغاز/*backtest ... */پیکیج کا حصہ ریٹرننگ سیٹ اپ کے لئے ہے ، جو اس وقت ریٹرننگ سیٹ اپ کے وقت کی طرح کی معلومات کو ریکارڈ کرنے کے لئے ہے ، جو ڈیبگنگ کے لئے آسان ہے ، پالیسی کوڈ نہیں ہے۔
کوڈ میں:strategy(title = "open long example", pyramiding = 3, default_qty_value=0.1, overlay=true)جب ہم نامزدpyramidingاگر ہم اس کو 3 پر سیٹ کریں تو ہم ایک ہی سمت میں زیادہ سے زیادہ 3 بار تجارت کر سکتے ہیں۔ تو مثال کے طور پر 4 بار۔strategy.entryمندرجہ ذیل آپریشن میں سے ایک پر عملدرآمد نہیں کیا گیا تھا.default_qty_valueپیرامیٹر 0.1 ہے، تو ID کی شناخت کے طور پر اس وقت <unk>long1<unk>strategy.entryاس کے بعد آپریشن کے بعد کی مقدار کو 0.1 کے طور پر طے شدہ ترتیب دیا گیا ہے.strategy.entryجب ہم ایک فنکشن کو کال کرتے ہیں تو ہم اس کا تعین کرتے ہیںdirectionکے برابر ہےstrategy.longاس کے بعد، آپ کو ایک بار پھر ٹیسٹ کیا جائے گا، اور آپ کو ایک بار پھر ٹیسٹ کیا جائے گا.
کوڈ میں نوٹسstrategy.entry("long3", ...مندرجہ ذیل کمانڈ آپریشن کو دو بار بلایا گیا ہے ، اسی ID: <unk>long3<unk> کے لئے <unk>strategy.entryمندرجہ ذیل آپریشن ناکام، دوسری کالstrategy.entryفنکشن اس ID کے آرڈر میں ترمیم کے لئے ((ریٹرننگ ٹیسٹ کے وقت دکھائے جانے والے اعداد و شمار سے یہ بھی ظاہر ہوتا ہے کہ اس حد کے آرڈر کے تحت آرڈر میں ترمیم کی گئی ہے تاکہ 0.3) ۔ دوسری صورت میں ، مثال کے طور پر اگر پہلی بار آئی ڈی کے لئے فولڈنگ لانگ 3 ٹن کا آرڈر ہوا تو ، اس کے مطابق استعمال کرنا جاری رکھیں فولڈنگ لانگ 3 ٹنstrategy.entryاگر فنکشن آرڈر کرتا ہے تو آرڈر کی پوزیشنیں ID ٹب long3 ٹب پر جمع ہوجاتی ہیں۔
2、strategy.close
strategy.closeفنکشن کا استعمال فلیٹ پوزیشن میں داخل ہونے والے پوزیشن ہولڈر کی پوزیشن کے لئے کیا جاتا ہے جس کی شناخت آئی ڈی ہے۔ اہم پیرامیٹرز یہ ہیں:id,when,qty,qty_percent。
پیرامیٹر:
idاس کے علاوہ ، ہم نے ایک اور ٹویٹ بھی کیا ہے:strategy.entryداخل ہونے کے بعد پوزیشن کھولنے کے لئے مخصوص ID <unk>whenشرائط و ضوابطqty: خالی پوزیشن کی تعدادqty_percent: خالی پوزیشن فی صد
اس فنکشن کے استعمال کی تفصیلات کے بارے میں ایک مثال سے واقف ہوں:
کوڈ میں/*backtest ... */یہ FMZ.COM بین الاقوامی اسٹیشن کی جانچ پڑتال کے وقت کی ترتیب کی معلومات ہے ، جس میں آپ کو مارکیٹ ، قسم ، وقت کی حد وغیرہ کی معلومات کو حذف کرنے اور ترتیب دینے کی ضرورت ہے جسے آپ جانچنا چاہتے ہیں۔
pine
/*backtest
start: 2022-07-03 00:00:00
end: 2022-07-09 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/
strategy("close Demo", pyramiding=3)
var enableStop = false
if enableStop
runtime.error("stop")
strategy.entry("long1", strategy.long, 0.2)
if strategy.opentrades >= 3
strategy.close("long1") // 多个入场订单,不指定qty参数,全部平仓
// strategy.close() // 不指定id参数,会平掉当前的持仓
// strategy.close("long2") // 如果指定一个不存在的id则什么都不操作
// strategy.close("long1", qty=0.15) // 指定qty参数平仓
// strategy.close("long1", qty_percent=50) // qty_percent设置50即为平掉long1标识仓位的50%持仓
// strategy.close("long1", qty_percent=80, when=close<open) // 指定when参数,修改为close>open就不触发了
enableStop := true
ٹیسٹ کی حکمت عملی میں دکھایا گیا ہے کہ تین بار لگاتار متعدد اندراجات شروع کیے جائیں ، انٹری آئی ڈی میں سے ہر ایک میں <unk>long1<unk> ہوتا ہے ، اور پھر استعمال کیا جاتا ہے۔strategy.closeفنکشن کے مختلف پیرامیٹرز کی صف بندی کے بعد پیمائش کے مختلف نتائج دیکھے جا سکتے ہیں۔strategy.closeاس فنکشن میں کوئی پیرامیٹرز نہیں ہیں جو فاریکس ٹریڈنگ کے فوائد کو سمجھنے کے لئے فاریکس ٹریڈنگ کے فوائد کو سمجھنے کے لئے فاریکس ٹریڈنگ کے فوائد کو سمجھنے کے لئے فاریکس ٹریڈنگ کے فوائد کو سمجھنے کے لئے فاریکس ٹریڈنگ کے فوائد کو سمجھنے کے لئے فاریکس ٹریڈنگ کے فوائد کو سمجھنے کے لئے فاریکس ٹریڈنگ کے فوائد کو سمجھنے کے لئے فاریکس ٹریڈنگ کے فوائد کو سمجھنے کے لئے فاریکس ٹریڈنگ کے فوائد کو سمجھنے کے لئے فاریکس ٹریڈنگ کے فوائد کو سمجھنے کے لئے استعمال کیا جاتا ہے۔
3、strategy.close_all
strategy.close_allفنکشن کا استعمال تمام موجودہ ہولڈنگز کو ختم کرنے کے لئے کیا جاتا ہے ، کیونکہ پائن زبان کے اسکرپٹ میں صرف ایک ہی سمت میں ہولڈنگز ہوسکتی ہیں ، یعنی اگر موجودہ ہولڈنگ کی سمت کے برعکس سگنل ٹرگر ہوتا ہے تو موجودہ ہولڈنگز کو ختم کردیا جائے گا اور پھر سگنل کے مطابق پوزیشن کھولی جائے گی۔strategy.close_allجب کال کی جاتی ہے تو ، موجودہ سمت میں موجود تمام پوزیشنوں کو ختم کردیا جاتا ہے۔strategy.close_allفنکشن کے اہم پیرامیٹرز ہیں:when。
پیرامیٹر:
whenشرائط و ضوابط
ہم نے ایک مثال کے طور پر دیکھا:
pine
/*backtest
start: 2022-07-03 00:00:00
end: 2022-07-09 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/
strategy("closeAll Demo")
var enableStop = false
if enableStop
runtime.error("stop")
strategy.entry("long", strategy.long, 0.2, when=strategy.position_size==0 and close>open)
strategy.entry("short", strategy.short, 0.3, when=strategy.position_size>0 and close<open)
if strategy.position_size < 0
strategy.close_all()
enableStop := true
ٹیسٹ کوڈ شروع کرنے کے لئے، انعقاد 0 تھاstrategy.position_size==0سچ ہے) ، تو جب جب پیرامیٹر کی ترتیب کی شرط کو پورا کرتا ہے تو صرف آئی ڈی پر عملدرآمد ہوتا ہےstrategy.entryداخلہ فنکشن <unk>strategy.position_size0 سے بڑا ہے، اس وقت آئی ڈی کے لئے short ٹوکری میں داخلہ فنکشن صرف اس وقت عملدرآمد کیا جا سکتا ہے، کیونکہ اس وقت کثیر پوزیشن کی پوزیشن کی وجہ سے، اس وقت ہونے والی کم از کم ریورس سگنل کی وجہ سے کثیر پوزیشن کی پوزیشن کو صاف کرنے کے بعد ریورس خالی ہو جائے گا.strategy.position_size < 0جب ، یعنی خالی سر کی پوزیشن رکھنے پر موجودہ پوزیشن کی سمت کی تمام پوزیشنوں کو صاف کریں۔ اور نشانenableStop := true│ حکمت عملی کو لاگو کرنے سے روکنے کے لئے لاگ ان کو دیکھنے کے لئے │
پایا جا سکتا ہےstrategy.close_allاس فنکشن میں کوئی پیرامیٹرز نہیں ہیں جو فاریکس ٹریڈنگ کے فوائد کو سمجھنے کے لئے فاریکس ٹریڈنگ کے فوائد کو سمجھنے کے لئے فاریکس ٹریڈنگ کے فوائد کو سمجھنے کے لئے فاریکس ٹریڈنگ کے فوائد کو سمجھنے کے لئے فاریکس ٹریڈنگ کے فوائد کو سمجھنے کے لئے فاریکس ٹریڈنگ کے فوائد کو سمجھنے کے لئے فاریکس ٹریڈنگ کے فوائد کو سمجھنے کے لئے فاریکس ٹریڈنگ کے فوائد کو سمجھنے کے لئے فاریکس ٹریڈنگ کے فوائد کو سمجھنے کے لئے فاریکس ٹریڈنگ کے فوائد کو سمجھنے کے لئے استعمال کیا جاتا ہے۔
4、strategy.exit
strategy.exitاس فنکشن کا استعمال داخلہ کی پوزیشن کے لئے کیا جاتا ہے اور اس سے مختلف ہے کہstrategy.closeاورstrategy.close_allفنکشن موجودہ مارکیٹ کی قیمت پر فوری طور پر فلیٹ پوزیشن ہے۔strategy.exitفنکشن پیرامیٹرز کی ترتیب کے مطابق منصوبہ بندی کی صفائی کرتا ہے۔
پیرامیٹر:
idآرڈر آئی ڈی: موجودہ لیز کی شرائط کے لئے آرڈر آئی ڈی <unk>from_entry: صفائی کی کارروائیوں کی وضاحت کرنے کے لئے لاگ ان ID <unk>qty: خالی پوزیشن کی تعدادqty_percent: خالی پوزیشن فی صد، رینج: 0 ~ 100 ◦profit: منافع کا ہدف، پوائنٹس میں ظاہر کیا گیا ہے۔loss: سٹاپ نقصان کا ہدف، پوائنٹس میں ظاہر کیا گیا ہے۔limit: منافع کا ہدف، قیمت کے طور پر نامزد <unk>stop: سٹاپ نقصان کا ہدف، قیمت کے ساتھ طے شدہ۔whenشرائط و ضوابط
پیرامیٹرز کے استعمال کو سمجھنے کے لئے ٹیسٹنگ حکمت عملی کا استعمال کریں۔
pine
/*backtest
start: 2022-07-03 00:00:00
end: 2022-07-09 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
args: [["RunMode",1,358374],["ZPrecision",0,358374]]
*/
strategy("strategy.exit Demo", pyramiding=3)
varip isExit = false
findOrderIdx(idx) =>
ret = -1
if strategy.opentrades == 0
ret
else
for i = 0 to strategy.opentrades - 1
if strategy.opentrades.entry_id(i) == idx
ret := i
break
ret
strategy.entry("long1", strategy.long, 0.1, limit=1, when=findOrderIdx("long1") < 0)
strategy.entry("long2", strategy.long, 0.2, when=findOrderIdx("long2") < 0)
strategy.entry("long3", strategy.long, 0.3, when=findOrderIdx("long3") < 0)
if not isExit and strategy.opentrades > 0
// strategy.exit("exitAll") // 如果仅仅指定一个id参数,则该退场订单无效,参数profit, limit, loss, stop等出场条件也至少需要设置一个,否则也无效
strategy.exit("exit1", "long1", profit=50) // 由于long1入场订单没有成交,因此ID为exit1的出场订单也处于暂待状态,直到对应的入场订单成交才会放置exit1
strategy.exit("exit2", "long2", qty=0.1, profit=100) // 指定参数qty,平掉ID为long2的持仓中0.1个持仓
strategy.exit("exit3", "long3", qty_percent=50, limit=strategy.opentrades.entry_price(findOrderIdx("long3")) + 1000) // 指定参数qty_percent,平掉ID为long3的持仓中50%的持仓
isExit := true
if bar_index == 0
runtime.log("每点价格为:", syminfo.mintick) // 每点价格和Pine语言模板参数上「定价货币精度」参数设置有关
ریئل ٹائم پرائس ماڈل ریٹرننگ ٹیسٹ کا استعمال کرتے ہوئے ، اس ٹیسٹ کی حکمت عملی نے 3 انٹری آپریشنز پر عمل درآمد شروع کیا:strategy.entryفنکشن) ، <unk>long1 <unk>limitپیرامیٹرز، 1 کی قیمت کے ساتھ لٹکا دیا گیا ہے تاکہ اسے غیر فعال کیا جاسکے۔ پھر باہر نکلنے کی حالت کی جانچ کریں۔strategy.exit。 پوائنٹ گنتی سٹاپ کا استعمال کیا گیا، قیمت سٹاپ کا استعمال کیا گیا، فکسڈ تعداد پوزیشن کا استعمال کیا گیا، فی صد فلیٹ پوزیشن کا استعمال کیا گیا 。 توسیع کی مثال میں صرف سٹاپ کا مظاہرہ کیا گیا ہے۔ سٹاپ نقصان کا آپریشن بھی اسی طرح کا ہے۔。strategy.exitفنکشن میں اس سے بھی زیادہ پیچیدہ ٹریکنگ اسٹاپ نقصان پیرامیٹرز ہیں:trail_price、trail_points、trail_offsetآپ اس مثال میں اس کا استعمال سیکھنے کی بھی کوشش کر سکتے ہیں۔
5、strategy.cancel
strategy.cancelافعال تمام پیشگی لسٹنگ کے احکامات کو منسوخ / غیر فعال کرنے کے لئے استعمال کیا جاتا ہے۔strategy.order, strategy.entry , strategy.exitداخلہ ID پیدا کر سکتا ہے۔ اس فنکشن کے اہم پیرامیٹرز یہ ہیں:id、when。
پیرامیٹر:
id: داخلے کی منسوخی کے لیے شناختی کارڈ۔whenشرائط و ضوابط
یہ فنکشن بہت اچھی طرح سے سمجھا جاتا ہے کہ یہ غیر منقولہ داخلے کے احکامات کو منسوخ کرنے کے لئے استعمال کیا جاتا ہے.
pine
/*backtest
start: 2022-07-03 00:00:00
end: 2022-07-09 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/
strategy("strategy.cancel Demo", pyramiding=3)
var isStop = false
if isStop
runtime.error("stop")
strategy.entry("long1", strategy.long, 0.1, limit=1)
strategy.entry("long2", strategy.long, 0.2, limit=2)
strategy.entry("long3", strategy.long, 0.3, limit=3)
if not barstate.ishistory and close < open
strategy.cancel("long1")
strategy.cancel("long2")
strategy.cancel("long3")
isStop := true
6、strategy.cancel_all
strategy.cancel_allافعال اورstrategy.cancelفنکشن کی طرح <unk> منسوخ / تمام پیشگی لسٹنگ احکامات کو غیر فعال <unk> مخصوص کیا جا سکتا ہےwhenپیرامیٹرز
پیرامیٹر:
whenشرائط و ضوابط
pine
/*backtest
start: 2022-07-03 00:00:00
end: 2022-07-09 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/
strategy("strategy.cancel Demo", pyramiding=3)
var isStop = false
if isStop
runtime.error("stop")
strategy.entry("long1", strategy.long, 0.1, limit=1)
strategy.entry("long2", strategy.long, 0.2, limit=2)
strategy.entry("long3", strategy.long, 0.3, limit=3)
if not barstate.ishistory and close < open
strategy.cancel_all()
isStop := true
7、strategy.order
strategy.orderفنکشن، پیرامیٹرز کی ترتیب، وغیرہ تقریباstrategy.entryہم آہنگی، فرقstrategy.orderفنکشن محفوظ نہیں ہےstrategyفنکشنpyramidingپیرامیٹرز کی ترتیب کے اثرات، کوئی ترتیب کی تعداد کی حد نہیں.
پیرامیٹر:
id: کسی تجارت کی پوزیشن کو ایک نام دینے کے لئے استعمال کیا جاتا ہے۔ اس کا حوالہ دیا جاسکتا ہے۔ آرڈر منسوخ کریں ، آرڈر میں ترمیم کریں۔direction: اگر آرڈر کی سمت زیادہ کرنا ہے ((خریدنا) تو یہ پیرامیٹر منتقل ہوتا ہےstrategy.longاس میں ایک متغیر ہے، اگر آپ کو خالی کرنا ہے تو آپ اسے بیچ دیں گے.strategy.shortیہ متغیر:qty: آرڈر کی مقدار کی وضاحت کریں ، اگر یہ پیرامیٹر استعمال نہیں کیا جاتا ہے تو یہ پہلے سے طے شدہ آرڈر کی مقدار ہے۔when: عملدرآمد کی شرائط ، آپ اس پیرامیٹر کو کنٹرول کرسکتے ہیں کہ آیا موجودہ آرڈر آپریشن کو متحرک کیا جائے یا نہیں۔limit: آرڈر کی حد کی قیمت طے کریں۔stopسٹاپ نقصان کی قیمت:
ہم استعمال کرتے ہیںstrategy.orderاس خصوصیت کے لئے کوئی تعداد کی حد نہیں ہے.strategy.exitمشروط آؤٹ فیلڈ فنکشن <unk> ایک اسکرپٹ کی تعمیر جو گرڈ کی طرح تجارت کرتی ہے <unk> مثال بہت آسان ہے ، صرف سیکھنے کے لئے:
pine
/*backtest
start: 2021-03-01 00:00:00
end: 2022-08-30 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"ETH_USDT"}]
args: [["ZPrecision",0,358374]]
*/
varip beginPrice = -1
if not barstate.ishistory
if beginPrice == -1 or (math.abs(close - beginPrice) > 1000 and strategy.opentrades == 0)
beginPrice := close
for i = 0 to 20
strategy.order("buy"+i, strategy.long, 0.01, limit=beginPrice-i*200, when=(beginPrice-i*200)<close)
strategy.exit("coverBuy"+i, "buy"+i, qty=0.01, profit=200)
strategy.order("sell"+i, strategy.short, 0.01, limit=beginPrice+i*200, when=(beginPrice+i*200)>close)
strategy.exit("coverSell"+i, "sell"+i, qty=0.01, profit=200)
حکمت عملی کی مثالیں
اس سبق میں حکمت عملی کے نمونے صرف تدریسی حکمت عملی ، رہنمائی حکمت عملی ڈیزائن آئیڈیاز کے لئے استعمال کیے جاتے ہیں ، کوئی تجارتی رہنمائی یا مشورہ نہیں کرتے ہیں۔ تدریسی حکمت عملی براہ کرم عملی طور پر کام نہ کریں۔
سپر ٹرینڈ اشارے کی حکمت عملی
pine
strategy("supertrend", overlay=true)
[supertrend, direction] = ta.supertrend(input(5, "factor"), input.int(10, "atrPeriod"))
plot(direction < 0 ? supertrend : na, "Up direction", color = color.green, style=plot.style_linebr)
plot(direction > 0 ? supertrend : na, "Down direction", color = color.red, style=plot.style_linebr)
if direction < 0
if supertrend > supertrend[2]
strategy.entry("entry long", strategy.long)
else if strategy.position_size < 0
strategy.close_all()
else if direction > 0
if supertrend < supertrend[3]
strategy.entry("entry short", strategy.short)
else if strategy.position_size > 0
strategy.close_all()
پائن زبان میں رجحانات کی حکمت عملی لکھنا بہت آسان ہے ، یہاں ہم ایک سپر ٹرینڈ اشارے کے ساتھ ایک سادہ رجحانات سے باخبر رہنے کی حکمت عملی تیار کرتے ہیں۔ آئیے اس حکمت عملی کے ماخذ کوڈ کا تجزیہ کریں۔
سب سے پہلے حکمت عملی کا کوڈ استعمال کرناstrategyفنکشن نے کچھ سادہ سیٹنگیں کیں:strategy("supertrend", overlay=true)صرف ایک حکمت عملی کا عنوان مقرر کریں: سپر ٹرینڈoverlayپیرامیٹرز ہیں۔trueہم ایک پائن حکمت عملی ڈیزائن یا ایک پائن حکمت عملی سکرپٹ سیکھنے کے لئے سب سے پہلے حکمت عملی انٹرفیس پیرامیٹرز ڈیزائن ہے، ہم نے "سپر رجحانات اشارے حکمت عملی" کے ماخذ کوڈ کو دیکھنے کے، جس میں ہم نے پہلے کورس میں سیکھا ہےinputفنکشن
[supertrend, direction] = ta.supertrend(input(5, "factor"), input.int(10, "atrPeriod"))
inputفنکشن کالز براہ راست استعمال کیا جاتا ہےta.supertrendاشارے کے فنکشن کے پیرامیٹرز سپر ٹرینڈ اشارے کا حساب لگانے کے لئے استعمال ہوتے ہیں۔ ان میں:
- input(5, "factor")
- input.int(10, "atrPeriod")
یہ فنکشن بطور ڈیفالٹ پائن زبان کی پالیسی کے انٹرفیس پر دو پیرامیٹرز کنٹرول ترتیب دیتا ہے ، جیسا کہ:
آپ دیکھ سکتے ہیں کہ کنٹرول پر ڈیفالٹ ہےinputافعال اورinputسیریز کے افعال ہیں.input.int) کے پہلے پیرامیٹرز، جو پچھلے باب میں بھی بیان کیے گئے ہیں۔ ان دونوں فنکشنز کے ذریعے ہم پالیسی انٹرفیس پر سیٹ اپ کر سکتے ہیں۔ta.supertrendفنکشن کے پیرامیٹرز ہیں: . سپر ٹرینڈ اشارے فنکشن ایک قیمت کے اعداد و شمار کا حساب کرتا ہےsupertrendاور ایک سمت ڈیٹاdirection◦ پھر استعمال کریںplotفنکشنل ڈرائنگ ، نوٹ کریں کہ ڈرائنگ کے وقت سپر ٹرینڈ اشارے کی سمت کے مطابق ڈرائنگ ڈرائنگ کریں ، صرف موجودہ سمت ڈرائنگ کریں۔ جبdirectionاس کے علاوہ، اس کے علاوہ، اس کے علاوہ، اس کے علاوہ، اس کے علاوہ، اس کے علاوہ، اس کے علاوہ، اس کے علاوہ، اس کے علاوہ،direction1 گھنٹہ کے لئے، موجودہ رجحان نیچے کی طرف ہے، لہذا ہم دیکھ سکتے ہیںplotجب فنکشن ڈرائنگ کا فیصلہdirection0 سے بڑا، 0 سے چھوٹا
اگلےif ... else ifمنطق ٹریڈنگ سگنل کا فیصلہ ہے،direction < 0ایک حقیقی وقت کی وضاحت کے طور پر جو کہ اس وقت کے حالات کو اوپر کی طرف اشارہ کرتی ہے، اس وقت اگر سپر ٹرینڈ اشارے میں قیمت کے اعداد و شمارsupertrendسپر ٹرینڈ اشارے کی قیمت سے زیادہ 2 بار آگے کی طرف ((یعنیsupertrend[2],还记得历史操作符引用某个变量历史数据吧) اس کو زیادہ اندراج کے اشارے کے طور پر استعمال کریں۔ یاد ہے؟ اگر موجودہ پوزیشن ہے تو ، اس وقت ریورس آف آرڈر فنکشن کال کرنے سے پہلے کی پوزیشن ختم ہوجائے گی ، اور پھر موجودہ تجارت کی سمت کے مطابق پوزیشن کھولی جائے گی۔supertrend > supertrend[2]شرط نہیں ملتی، صرف اس وقتstrategy.position_size < 0اس کے علاوہ ، یہ بھی ایک اہم عنصر ہے جو اس کی وجہ سے پیدا ہوتا ہے:strategy.close_all()فنکشن پر عملدرآمد، مکمل طور پر صاف کرنے کے لئے.
direction > 0اسی طرح جب آپ نیچے کی طرف رجحان رکھتے ہیں تو ، اگر آپ کے پاس بہت زیادہ پوزیشن ہے تو ، آپ پوری طرح سے خالی ہوجائیں گے ، اور پھر آپ اہل ہوں گے۔supertrend < supertrend[3]اس کے علاوہ، آپ کو یہ بھی دیکھ سکتے ہیں کہ آپ کو اس کے لئے کیا کرنا چاہئے.[3]کیا یہ ممکن ہے کہ حکمت عملی کے مصنفین نے اس کا ارادہ کیا ہو ، کیوں کہ کچھ مارکیٹوں میں ، جیسے معاہدے کی تجارت کی مارکیٹ میں ، زیادہ خطرہ لینے سے کہیں زیادہ خطرہ ہے۔
کے لیےta.supertrendکیا ان میں سے کچھ طلباء اس بات سے دلچسپی رکھتے ہیں کہ یہ کس طرح معلوم ہوتا ہے کہ موجودہ رجحان اوپر جا رہا ہے یا نیچے؟
یہ اشارے پائن زبان میں اپنی مرضی کے مطابق فنکشن کی شکل میں بھی لاگو کیا جا سکتا ہے:
pine
pine_supertrend(factor, atrPeriod) =>
src = hl2
atr = ta.atr(atrPeriod)
upperBand = src + factor * atr
lowerBand = src - factor * atr
prevLowerBand = nz(lowerBand[1])
prevUpperBand = nz(upperBand[1])
lowerBand := lowerBand > prevLowerBand or close[1] < prevLowerBand ? lowerBand : prevLowerBand
upperBand := upperBand < prevUpperBand or close[1] > prevUpperBand ? upperBand : prevUpperBand
int direction = na
float superTrend = na
prevSuperTrend = superTrend[1]
if na(atr[1])
direction := 1
else if prevSuperTrend == prevUpperBand
direction := close > upperBand ? -1 : 1
else
direction := close < lowerBand ? 1 : -1
superTrend := direction == -1 ? lowerBand : upperBand
[superTrend, direction]
یہ اپنی مرضی کے مطابق تقریب اور بلٹ میں تقریب ہےta.supertrendایک ہی الگورتھم کے ساتھ، اور ظاہر ہے، ایک ہی اشارے کے اعداد و شمار.
اس اپنی مرضی کے مطابق فنکشن کے الگورتھم سے ہم دیکھ سکتے ہیں کہ پائن کی بلٹ میں سپر ٹرینڈ اشارے کا حساب استعمال کیا جاتا ہےhl2بلٹ ان متغیر ((سب سے زیادہ قیمت، سب سے کم قیمت جمع اور پھر تقسیم 2، سب سے زیادہ قیمت سب سے کم قیمت کی اوسط قیمت) ، پھر پیرامیٹرatrPeriod کے مطابق ایک خاص دورانیہ کے لئے اے ٹی آر اشارے ((موج کی چوڑائی) کا حساب لگائیں۔) ۔ پھر ہل 2 اور اے ٹی آر کا استعمال کرتے ہوئے ٹریک اپ ، ٹریک ڈاؤن بنائیں۔
کوڈ میں تین جہتی اظہار کی بنیاد پر اپ ڈیٹlowerBandاورupperBand。
pine
lowerBand := lowerBand > prevLowerBand or close[1] < prevLowerBand ? lowerBand : prevLowerBand
upperBand := upperBand < prevUpperBand or close[1] > prevUpperBand ? upperBand : prevUpperBand
lowerBand: نچلے بینڈ ، یہ معلوم کرنے کے لئے کہ آیا اوپر کی طرف رجحان میں کوئی تبدیلی آئی ہے۔ upperBand: نچلے بینڈ ، یہ معلوم کرنے کے لئے کہ آیا نیچے کی طرف رجحان میں کوئی تبدیلی آئی ہے۔ lowerBand اور upperBand دونوں کا حساب لگایا جاتا ہے ، لیکن یہ اپنی مرضی کے مطابق فنکشن ہے جو موجودہ رجحان کی سمت کا حتمی فیصلہ کرتا ہے۔
pine
else if prevSuperTrend == prevUpperBand
direction := close > upperBand ? -1 : 1
else
direction := close < lowerBand ? 1 : -1
یہاں یہ فیصلہ کریں کہ اگر پچھلے بار پر سپر ٹرینڈ کی قیمتprevUpperBand، یعنی اوپر کی لکیری ، جو کہ نیچے کی طرف رجحان کی نشاندہی کرتی ہے۔closeسے زیادہupperBandقیمتوں میں کمی کی وجہ سے ، یہ سمجھا جاتا ہے کہ اس وقت رجحان میں تبدیلی واقع ہوئی ہے ، اور یہ اوپر کی طرف رجحان میں تبدیل ہوگیا ہے۔directionسمت متغیر کو -1 کے طور پر مقرر کیا گیا ہے۔ دوسری صورت میں یہ 1 کے طور پر مقرر کیا گیا ہے۔ لہذا آپ کو سپر ٹرینڈ حکمت عملی میں یہ نظر آئے گا۔if direction < 0جب، سگنل کی شرائط کے بعد زیادہ سے زیادہ کریں.direction > 0جب، سگنل شرط ٹرگر کے بعد خالی کرو۔
pine
superTrend := direction == -1 ? lowerBand : upperBand
[superTrend, direction]
آخر میں ، قیمت کے اعداد و شمار اور سمت کے اعداد و شمار کو واپس کرنے کے لئے مخصوص سپر ٹرینڈ اشارے کو سمت کے مطابق منتخب کریں۔
متحرک توازن کی حکمت عملی
pine
/*backtest
start: 2021-03-01 00:00:00
end: 2022-09-08 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Binance","currency":"ETH_USDT"}]
args: [["v_input_1",4374],["v_input_2",3],["v_input_3",300],["ZPrecision",0,358374]]
*/
varip balance = input(50000, "balance")
varip stocks = input(0, "stocks")
maxDiffValue = input(1000, "maxDiffValue")
if balance - close * stocks > maxDiffValue and not barstate.ishistory
// more balance , open long
tradeAmount = (balance - close * stocks) / 2 / close
strategy.order("long", strategy.long, tradeAmount)
balance := balance - tradeAmount * close
stocks := stocks + tradeAmount
runtime.log("balance:", balance, ", stocks:", stocks, ", tradeAmount:", tradeAmount)
else if close * stocks - balance > maxDiffValue and not barstate.ishistory
// more stocks , open short
tradeAmount = (close * stocks - balance) / 2 / close
strategy.order("short", strategy.short, tradeAmount)
balance := balance + tradeAmount * close
stocks := stocks - tradeAmount
runtime.log("balance:", balance, ", stocks:", stocks, ", tradeAmount:", tradeAmount)
plot(balance, title="balance value(quoteCurrency)", color=color.red)
plot(stocks*close, title="stocks value(quoteCurrency)", color=color.blue)
ہم پائن زبان کی حکمت عملی کے ڈیزائن کے کچھ مثالوں کے ساتھ آگے بڑھتے ہیں، اس بار ہم ایک متحرک توازن کی حکمت عملی پر نظر ڈالیں گے۔ متحرک توازن کی حکمت عملی یہ ہے کہBaseCurrency(ٹرانزیکشن کی قسم) کی رقم اورQuoteCurrency(قیمت کی کرنسی) کی رقم ہمیشہ توازن کے ساتھ کام کرتی ہے۔ کون سا اثاثہ بڑھتا ہے ، اکاؤنٹ میں رکھے ہوئے قدر میں اضافہ ہوتا ہے ، کون سا اثاثہ فروخت کیا جاتا ہے۔ اگر کسی اثاثے کی نسبتا price قیمت کم ہوتی ہے تو ، اکاؤنٹ میں رکھے ہوئے قدر میں کمی ہوتی ہے تو ، اس اثاثے کو خریدیں۔ یہ وہی ہے جو متحرک توازن کی حکمت عملی کہا جاتا ہے۔ متحرک توازن کی حکمت عملی ایک نیٹ ورک حکمت عملی ہے ، جو اتار چڑھاؤ کی صورتحال میں اچھی کارکردگی کا مظاہرہ کرتی ہے۔ لیکن رجحان کی صورتحال میں ، مسلسل نقصان ہوتا ہے ، قیمت کی واپسی کا انتظار کرنے کی ضرورت ہوتی ہے تاکہ نقصان کو آہستہ آہستہ کم کیا جاسکے اور منافع حاصل کیا جاسکے ، لیکن متحرک توازن کی حکمت عملی میں فائدہ مند ہونے سے آخر کار مارکیٹ میں اتار چڑھاؤ کی صورتحال کو پکڑ لیا جاسکتا ہے۔
اس حکمت عملی کا نقصان جیسا کہ اس حکمت عملی کے ریٹرننگ چارٹ میں دکھایا گیا ہے ، قیمتوں کے بڑے رجحان میں اضافہ (یا گرنے) کے مرحلے میں حکمت عملی کا اتار چڑھاؤ زیادہ ہوتا ہے۔ لہذا یہ حکمت عملی نقد حکمت عملی کے لئے اچھی ہے ، لیکن مستقبل میں اس کا استعمال کرنے کے لئے خطرہ پر قابو رکھنا ضروری ہے۔
اس کے علاوہ، ہم نے اس کوڈ کو استعمال کیا ہے جو ہم نے پہلے سے ہی استعمال کیا ہے.
ہم نے ایک سادہ ڈیزائن کا استعمال کرتے ہوئے، حکمت عملی میں ایک ماڈلنگbalance(QuoteCurrency اثاثوں کی تعداد) اورstocks(یعنی BaseCurrency اثاثوں کی تعداد) توازن کی معلومات ◄ ہم اکاؤنٹ میں اصل اثاثوں کی تعداد کو پڑھنے کے لئے نہیں جا رہے ہیں، ہم صرف مناسب خریدنے اور فروخت کرنے کے لئے استعمال کرتے ہوئے تخلیقی رقم کا حساب کرنے کے لئے ◄ پھر اس متحرک توازن کی حکمت عملی پر اثر انداز گرڈ کو ھیںچو کرنے کے لئے اہم پیرامیٹرز ہیںmaxDiffValueیہ پیرامیٹرز توازن کا فیصلہ کرنے کے لئے استعمال کیا جاتا ہے. موجودہ قیمتوں میں، صرف اس صورت میں جبBaseCurrencyاورQuoteCurrencyاس سے زیادہmaxDiffValueاس کے بعد، آپ کو ایک بار پھر آپ کے اثاثوں کو متوازن کرنے کے لئے، اعلی اثاثوں کو فروخت کرنے کے لئے، کم اثاثوں کو خریدنے کے لئے، اور ان کو دوبارہ متوازن کرنے کے لئے.
حکمت عملی کے ٹریڈنگ سگنل کو ریئل ٹائم BAR مرحلے میں ٹرگر کرنا ضروری ہے تاکہ حکمت عملی کے ٹریڈنگ کی شرائط اگر فیصلے میں طے کی جائیںnot barstate.ishistory◦ موجودہ قیمتوں کے حساب سے،balanceقیمت سے زیادہ ہےstocksقیمت کے وقت خریدنا ∙ اس کے برعکس بیچنے کا آپریشن ∙ ٹرانزیکشن بیانات کے بعد اپ ڈیٹ کرناbalanceاورstocksمتغیر، اور پھر اگلے توازن کے لئے انتظار کریں.
مندرجہ بالا حکمت عملی کی پیمائش کی معلومات میں حکمت عملی کی پیمائش شروع ہونے کے وقت کی قسم کی قیمت شامل ہے، قیمت 1458 ہے، لہذا میں نے خاص طور پر پیرامیٹرز مقرر کیے ہیںbalance47741458 کے لئے*3) پیرامیٹرز سیٹ کریںstocks3 کے لئے: اثاثوں کو شروع میں متوازن حالت میں رکھیں
ایک سپر ٹرینڈ حکمت عملی جس میں اسٹاپ نقصان کا سراغ لگایا جاتا ہے
پچھلے کورس میں ہم نے سیکھا تھاstrategy.exitپوزیشن سے باہر نکلنے کا فنکشن ، جس میں ٹریکنگ اسٹاپ نقصان کی روک تھام کی خصوصیت ہے۔ ہمارے پاس مثال نہیں ہے۔ اس سیکشن میں حکمت عملی کے ڈیزائن کے نمونے ہم استعمال کرتے ہیںstrategy.exitایک سپر رجحان کی حکمت عملی کو بہتر بنانے کے لئے فنکشن کی ٹریکنگ سٹاپ نقصان کی روک تھام کی تقریب
سب سے پہلے ہم دیکھتے ہیںstrategy.exitفنکشن کی ٹریکنگ سٹاپ نقصان روک پیرامیٹرز:
1、trail_priceپیرامیٹرز: ٹریلنگ جگہ ٹریکنگ سٹاپ سٹاپ نقصان صفائی کی پوزیشن پر اس منطقی عمل کی پوزیشن ((قیمت کی طرف سے مخصوص پوزیشن) <unk>)
2、trail_offsetپیرامیٹر: ٹریکنگ اسٹاپ نقصان کی روک تھام کی کارروائی کے بعد ، کھلی پوزیشنوں کے ایکٹ کو سب سے زیادہ قیمت ((جب زیادہ) یا کم قیمت ((جب خالی) سے فاصلہ رکھا گیا ہے۔
3、trail_pointsپیرامیٹرز: اسی طرحtrail_priceپیرامیٹرز، صرف فاریکس ٹریڈنگ کے فوائد کی تعداد کے طور پر مقرر کردہ پوزیشنوں کے لئے.
اس سے کوئی فرق نہیں پڑتا ہے کہ یہ سمجھنے میں مشکل ہے یا نہیں! ہم سیکھنے کو ایک حکمت عملی کے ذریعے سمجھنے کی کوشش کر رہے ہیں جو کہ بہت آسان ہے۔
pine
/*backtest
start: 2022-09-23 00:00:00
end: 2022-09-23 08:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Binance","currency":"ETH_USDT"}]
args: [["RunMode",1,358374],["ZPrecision",0,358374]]
*/
strategy("test", overlay = true)
varip a = na
varip highPrice = na
varip isTrade = false
varip offset = 30
if not barstate.ishistory and not isTrade
strategy.entry("test 1", strategy.long, 1)
strategy.exit("exit 1", "test 1", 1, trail_price=close+offset, trail_offset=offset)
a := close + offset
runtime.log("每点价格为:", syminfo.mintick, ",当前close:", close)
isTrade := true
if close > a and not barstate.ishistory
highPrice := na(highPrice) ? close : highPrice
highPrice := close > highPrice ? close : highPrice
plot(a, "trail_price 触发线")
plot(strategy.position_size>0 ? highPrice : na, "当前最高价")
plot(strategy.position_size>0 ? highPrice-syminfo.mintick*offset : na, "移动止损触发线")
حکمت عملی کے آغاز پر فوری طور پر کثیر سر داخلہ، اور پھر فوری طور پر اگلےstrategy.exitباہر نکلنے کے احکامات ((درجہ بندی کی روک تھام کے پیرامیٹرز کی وضاحت کی گئی ہے) ، جب قیمت میں تبدیلی کی قیمت میں اضافہ trail_price ٹرگر لائن سے زیادہ ہوتا ہے تو ، ٹریکنگ اسٹاپ نقصان کی روک تھام کی منطق پر عمل درآمد شروع ہوتا ہے ، سٹاپ نقصان کی روک تھام کی لائن ((نیلے رنگ کی) قیمت کی اعلی ترین متحرک ایڈجسٹمنٹ کی پیروی کرنا شروع کردیتی ہے ، نیلی لائن کی پوزیشن اسٹاپ نقصان کی روک تھام کی قیمت ہے جس کی وجہ سے صفائی ہوتی ہے ، اور آخر میں جب قیمت میں تبدیلی کی قیمت نیلی لائن سے نیچے آجاتی ہے تو صفائی ہوتی ہے۔ اس طرح کے چارٹ پر کھینچی گئی لائن کو سمجھنا آسان ہے۔
تو ہم نے اس خصوصیت کا استعمال کرتے ہوئے ایک سپر رجحان حکمت عملی کو بہتر بنانے کے لئے، ہم صرف حکمت عملی کے لئے ایک اندراج کے حکم کی وضاحتstrategy.exitآپ کو اس طرح کے ٹریکنگ اور نقصان کی روک تھام کی خصوصیت شامل کرنے کی ضرورت ہے۔
pine
if not barstate.ishistory and findOrderIdx("open") >= 0 and state == 1
trail_price := strategy.position_size > 0 ? close + offset : close - offset
strategy.exit("exit", "open", 1, trail_price=trail_price, trail_offset=offset)
runtime.log("每点价格为:", syminfo.mintick, ",当前close:", close, ",trail_price:", trail_price)
state := 2
tradeBarIndex := bar_index
مکمل حکمت عملی کوڈ:
pine
/*backtest
start: 2022-05-01 00:00:00
end: 2022-09-27 00:00:00
period: 1d
basePeriod: 5m
exchanges: [{"eid":"Binance","currency":"ETH_USDT"}]
args: [["RunMode",1,358374],["ZPrecision",0,358374]]
*/
varip trail_price = na
varip offset = input(50, "offset")
varip tradeBarIndex = 0
// 0 : idle , 1 current_open , 2 current_close
varip state = 0
findOrderIdx(idx) =>
ret = -1
if strategy.opentrades == 0
ret
else
for i = 0 to strategy.opentrades - 1
if strategy.opentrades.entry_id(i) == idx
ret := i
break
ret
if strategy.position_size == 0
trail_price := na
state := 0
[superTrendPrice, dir] = ta.supertrend(input(2, "atr系数"), input(20, "atr周期"))
if ((dir[1] < 0 and dir[2] > 0) or (superTrendPrice[1] > superTrendPrice[2])) and state == 0 and tradeBarIndex != bar_index
strategy.entry("open", strategy.long, 1)
state := 1
else if ((dir[1] > 0 and dir[2] < 0) or (superTrendPrice[1] < superTrendPrice[2])) and state == 0 and tradeBarIndex != bar_index
strategy.entry("open", strategy.short, 1)
state := 1
// 反向信号,全平
if strategy.position_size > 0 and dir[2] < 0 and dir[1] > 0
strategy.cancel_all()
strategy.close_all()
runtime.log("趋势反转,多头全平")
else if strategy.position_size < 0 and dir[2] > 0 and dir[1] < 0
strategy.cancel_all()
strategy.close_all()
runtime.log("趋势反转,空头全平")
if not barstate.ishistory and findOrderIdx("open") >= 0 and state == 1
trail_price := strategy.position_size > 0 ? close + offset : close - offset
strategy.exit("exit", "open", 1, trail_price=trail_price, trail_offset=offset)
runtime.log("每点价格为:", syminfo.mintick, ",当前close:", close, ",trail_price:", trail_price)
state := 2
tradeBarIndex := bar_index
plot(superTrendPrice, "superTrendPrice", color=dir>0 ? color.red : color.green, overlay=true)
- 1




















