ارز‌ها: ۳۱,۶۸۱
ارزش بازار: ۳.۲۶ تریلیون دلار
قیمت تتر: ۷۰,۲۲۶ تومان
مهرداد

اموزش برنامه نویسی تریدینگ ویو: ساخت اندیکاتور شخصی قسمت دوم

۱ سال قبل bitcoin بیت کوین
  • ۱ سال قبل
    سلام...
    چند بار این مطلب رو ارسال کردم ولی موفق به ثبتش نشد. امیدوارم این بار بشه.
    بریم سر اصل مطلب اگ یادتون باشه در قسمت اول اومدم یه اندیکاتور به نام my moving average نوشتم ک از نظر عملکرد بسیار شبیه به اندیکاتور moving average ribbon بود. این اندیکاتور رو به چارت اضافه میکنیم و بعد وارد تنظیماتش میشیم که با تصویر زیر روبرو میشیم :
    اموزش برنامه نویسی تریدینگ ویو: ساخت اندیکاتور شخصی قسمت دوم
    این تنظیمات 3 تا تپ مختلف داره و میانگینها رو به ترتیب اسم گذاری کرده . حالا بیاید اندیکاتور  خودمون یعنی my moving average رو به چارت اضافه کنیم و وارد تنظیماتش شیم :
    اموزش برنامه نویسی تریدینگ ویو: ساخت اندیکاتور شخصی قسمت دوم
    در قیاس با تنظیمات  moving average ribbon ، اندیکاتور ما  اولا 2 تپ داره و دوم اینکه میانگینهای ما اسم گذاری نشده و معلوم نیس کدوم  خط یا plot میانگینی با چه طولی هست !!! پس احتمالا همونطور که حدس زدید قراره واسه اندیکاتورمون تنظیمات ایجاد کنیم. اگ اندیکاتورمون رو باز ندارید باز کنید.برای اینکار وارد pine editor بشید و از اون پایین open رو انتخاب کنید :
    اموزش برنامه نویسی تریدینگ ویو: ساخت اندیکاتور شخصی قسمت دوم
    چندتا بخش میبینید :
    اموزش برنامه نویسی تریدینگ ویو: ساخت اندیکاتور شخصی قسمت دوم
    بخش recently used چندتا اندیکاتوری که اخیرا باز کردید رو بهتون نشون میده اگه my moving average بود  کلیک کنید تا باز شه و اگه نبود از بخش my script… اونو پیدا کنید و باز کنید. متاسفانه در زمان انتشار مطلب قبلی تو سایت متوجه شدم سورس کد رو از قالبش خارج میکنه  و درهم نشون میده و این کار رو برای من یه مقدار سخت میکنه چون ناچرا باید همه رو اسکرین بگیرم. حالا بگذریم ک بعضی از عکسهای مطلب اول هم گم شدن و احتمالا اگ تعداد عکس باز زیاد باشه همون اتفاق بیفته !!!  از اینم بگذریم.... برای تغییر در بخش style ،  برای نشان دادن اسامی میانگینهای متحرک ، فقط کافیه title از ورودی های plot رو هم مقدار دهی کنیم :
    اموزش برنامه نویسی تریدینگ ویو: ساخت اندیکاتور شخصی قسمت دوم
    بعد از ذخیره کردن ، حالا دوباره میریم وارد تنظیمات میشیم و بله موفق شدیم اون کاری ک میخواستیم رو انجام بدیم :
    اموزش برنامه نویسی تریدینگ ویو: ساخت اندیکاتور شخصی قسمت دوم
    اگ برگردیم دوباره به تنظیمات  moving average ribbon  گفتم که سه تا تپ داشتیم و اندیکاتور ما یه تپ کمتر داره اون تپ کمتر چیزی نیست جز input . یه نگاه کوچیک اگ بهش بندازیم متوجه موارد زیر میشیم :
    اموزش برنامه نویسی تریدینگ ویو: ساخت اندیکاتور شخصی قسمت دومستون اول اسامی میانگینهای متحرکه، ستون دوم متد یا شیوه محاسبه میانگین متحرکه که به صورت پیش فرض sma یا میانگین متحرک ساده است، ستون بعدی داده ای که میانگین رو بر اساس اون محاسبه میکنه ک به صورت پیش فرض close است. این close به معنی قیمت بسته شده کندل هاست که شما میتونید تغییر بدید. و البته از همه مهمتر ستون چهارم هستش ک تو این ستون ما میایم طول میانگین رو وارد میکنیم یعنی نیازی نیست ما مثلا اگ میانیگن با طول 30 رو خواستیم ، بیایم  و کد پروژه رو تغییر بدیم بلکه این قابلیت رو از طریق تنظیمات به اندیکاتور اضافه میکنیم ک خود کاربر اونو شخصی سازی کنه البته مقادیر پیش فرضی هم داره.
    در ادامه میخوایم این ویژگی ها رو هم به اندیکاتور خودمون اضافه کنیم. در جلسه قبل برای محاسبه میانگین متحرک البته از نوع ساده اش از تابع زیر استفاده کردیم :
    ta.sma(close,10)
    در اینجا این تابع، با دوتا ورودی تعریف شده ورودی اول  که در اینجا close هست مبنای محاسبه میانگین ما رو مشخص میکنه . هر کندلی در چارت رو با چند مشخصه قیمتی میشناسیم :
    اموزش برنامه نویسی تریدینگ ویو: ساخت اندیکاتور شخصی قسمت دوم
    قیمتی که کندل باز میشه (open)، قیمتی که کندل بسته (close) میشه ، حداکثر قیمتی که کندل تحت هیجان تا اونجا بالا میره (high ) یا تحت هیجان پایین میاد (low) .برای محاسبه میانگین متحرک ما میتونیم از این مشخصه ها به عنوان ورودی استفاده کنیم. اندیکاتورها به صورت پیش فرض بر اساس قیمت بسته شدن یا close محاسبه میشن اما شما میتونید بر اساس استراتژی معاملاتیتون شخصی سازیشون کنید. پس ما در ورودی اول تابع sma میتونیم مقادیر close, open, low, high رو وارد کنیم. به جز این مقادیر ، مقادیر دیگه ای هم وجود داره ک میتونیم مبنای محاسبه میانگینمون قرار بدیم و به عنوان ورودی اول به تابع smaبدیم : hl2 : این مشخصه میاید high رو ب low اضافه میکنه و تقسیم بر 2 میکنه یا همون میانگین بالاترین قیمت و پایین ترین hlc3 : میانگین قیمت بسته شدن ، کمترین و بیشترین ohlc4 : میانگین قیمت بسته شدن، باز شدن ، بیشترین  و کمترین hlcc4 : میانگین بیشترین و کمترین قیمت با دو برابر قیمت بسته شدن اینکه از کدوم به عنوان محاسبه میانگین استفاده کنید به تجربه شما از بازار بستگی داره. شخصا در جلسات اینده که میخوام استراتژی برنامه نویسی کنم ، از این ها استفاده میکنم تا ببنید تغییر دادن بعضی از مشخصه های پیش فرض اندیکاتورها چقدر میتونه مفید باشه !!! تا اینجا توضیح ورودی اول بود، در تابع sma ورودی دوم طولی هست که میانگین بر اساس اون محاسبه میشه یعنی چه تعداد کندل قبلی رو مبنای محاسبه میانگین قرار بده. که ما از اعداد 10، 20، 50، 100، 200 استفاده کردیم. حالا بعد از این توضیحات میریم سراغ کد نویسی :
     ma1 = ta.sma(close,10)
    دستور بالا رو به شکل زیر تغییر بدید :
    اموزش برنامه نویسی تریدینگ ویو: ساخت اندیکاتور شخصی قسمت دوم
    در اینجا اومدیم دستور اول رو تفکیک کردیم ( توضیحات جلسه قبل رو در مورد تفکیک دستور plot مطالعه کنید) و مقدار طول میانگین رو در متفیری به نام ma1Length ذخیره کردیم. این مقدار رو با دستور input از کاربر دریافت میکنیم. بعد از دستور input از int استفاده کردیم. با دستور input ورودی های مختلفی از کاربر میتونیم دریافت کنیم مثل اعداد اعشاری یا اعداد  صحیح و غیره  ولی چون تعداد کندلها جز مجموعه اعداد صحیح (integer) است ما از int استفاده کردیم . توجه کنیم این عدد دریافتی قراره به عنوان ورودی به تابع sma داده بشه و چون محاسبه این تابع بر اساس تعداد کندلهاست و ما نصف کندل یا نمیدونم صدم کندل نداریم که بخوایم ورودی اعشاری از کاربر بگیریم پس محاسبه بر اعداد صحیح انجام میشه در نتیجه از دستور int استفاده میکنیم.  مابقی انواع داده رو در جلسات بعدی توضیح میدم. فعلا در همین حد کافیه که بدونیم برای دریافت اعداد صحیح از کاربر از دستور int استفاده میکنیم.
    در دستور input از دو ورودی استفاده کردیم یکی به نام title  که نام فیلد  ورودی رو با اون مشخص میکنیم  و دیگری ورودی defval که مخفف default value هست و مقادیر پیش فرض رو برای ما مشخص میکنه یا در واقع برای اندیکاتورمون مقادیر پیش فرض تعریف میکنیم.
     این تغییرات رو بر تمامی دستوراتمون اعمال میکنیم :
    اموزش برنامه نویسی تریدینگ ویو: ساخت اندیکاتور شخصی قسمت دوم
    خب حالا یه سر به تنظیمات بزنیم  :
    اموزش برنامه نویسی تریدینگ ویو: ساخت اندیکاتور شخصی قسمت دومبهله  موفق شدیم !!! اینم از بخش ورودی ، برنامه نویسی مابقی تنظیمات رو میزارم واسه جلسه بعد (حتما دلیل داره)و میریم سراغ نوشتن یه اندیکاتور دیگه !!! یه اندیکاتور جدید ایجاد کنید ( اگ شیوه کار رو فراموش کردید مطالعه جلسه قبل ضروری خواهد بود) و اسم اونو بزارید myVolume برای این کار کد پیش فرض رو به شکل زیر تغییر بدید :
    indicator("myVolume", overlay = false)
    تا اینجا حتما متوجه شدید ک ورودی اول تابع  indicator اسم اندیکاتوری هست که میخوایم ایجاد کنیم .دستور overlay هم به تریدینگ ویو میگه اندیکاتور ما رو در کجای چارت نمایش بده اگ این مقدار true باشه، بر روی چارت قیمت نشون داده میشه (مانند میانگین متحرک) و اگ false باشه به صورت مجزا از چارت نمایش داده میشه مثل rsi .
    همینطور که از اسم اندیکاتور مشخصه قراره اندیکاتوری برای حجم بنویسیم. پس دستور plot رو هم به صورت زیر تغییر بدید :
    plot(volume, color = color.black, linewidth = 3)
    ورودی اول چیزی هست که میخوایم ترسیم کنیم . در اینجا این ورودی ، حجم با volume هستش . اندیکاتور رو به چارت اضافه می کنیم :
    اموزش برنامه نویسی تریدینگ ویو: ساخت اندیکاتور شخصی قسمت دوم
    همینطور که میبینید در مقایسه با اندیکاتور حجم که به صورت پیش فرض در چارت هست ، اندیکاتور ما به صورت خطی کشیده شده نه اصطلاحا هیستوگرامی.  اگ هر دو رو در ذهنمون  روی هم بندازیم چیزی مشابه تصویر زیر رو میتونیم تجسم کنیم :
    اموزش برنامه نویسی تریدینگ ویو: ساخت اندیکاتور شخصی قسمت دوم
    خب ما اینو نمیخوایم !!! پس دستور plot رو مشابه زیر تغییر بدید :
    plot(volume, style = plot.style_histogram , color = color.black, linewidth = 3)
    همینطور که تو دستور میبینید ما ورودی جدیدی رو به plot دادیم اونم استایل یا فرم نمایش چیزی که ترسیم میکنه ، هستش. style ورودی های مختلفی میگیره که بعد از نوشتن style = plot. لیست اون ها نمایش داده میشه :
    اموزش برنامه نویسی تریدینگ ویو: ساخت اندیکاتور شخصی قسمت دوم
    برای یه تمرین خوب، خودتون بر اساس این لیست مقادیر Style رو تغییر بدید. من هیستوگرام گذاشتم و نتیجه شد این :
    اموزش برنامه نویسی تریدینگ ویو: ساخت اندیکاتور شخصی قسمت دوم
    خب حالا بهتر شد . اهووم ولی یه مشکلی هست همه رو به رنگ سیاه و تک رنگ نشون داده و مشخص نیس کدوم حجم کندل منفیه و کدوم حجم کندل مثبته !!! خب باید چی کار کرد ؟! باید اول بررسی کنیم تحت چه شرایطی یه کندل منفیه و تحت چه شرایط مثبت و بعد بیایم این شرایط رو برنامه نویسی کنیم. در زبانهای برنامه نویسی برای بررسی شرایط و اما و اگرها دستورات محتلفی است که یکی از اونها، دستور if هستش. فرمی از دستور if در این زبان رو میتونید در ادامه ببنید :
    اموزش برنامه نویسی تریدینگ ویو: ساخت اندیکاتور شخصی قسمت دوم
    condition شرطی هست که اون رو مورد بررسی قرار میدیم . local_block دستور یا مجموعه دستوراتی هست که در صورت درستی شرط مورد بررسی، اجرا میشن. ساختار دیگه ای از این دستور مشابه زیره:
    اموزش برنامه نویسی تریدینگ ویو: ساخت اندیکاتور شخصی قسمت دومcondition شرطی که اون رو مورد بررسی قرار میدیم . local_block_1 دستور یا مجموعه دستوراتی هست که در صورت درستی شرط مورد بررسی، اجرا میشن.    local_block_2 دستور یا مجموعه دستوراتی که در صورت عدم صحت یا درستی شرط مورد بررسی اجرا میشه.  در واقع ترجمه فارسی ساختار به این صورته اگر (if) شرایط condition درست (true)باشد دستورات local_block_1 رو اجرا کن در غیر این صورت (else) دستورات local_block_2 رو اجرا کن.در ادامه با مثال توضیح میدم. البته ساختار دستور if رو من به چند فرم مختلف تقسیم کردم که فعلا در اینجا از این فرم ساده استفاده میکنیم. در جلسات بعد جزییات بیشتری از این دستور توضیح داده خواهد شد.
    برگردیم به اندیکاتوری که داشتیم مینوشتیم. تا اینجا دستورات زیر رو نوشتیم :
    اموزش برنامه نویسی تریدینگ ویو: ساخت اندیکاتور شخصی قسمت دوم
    قرار شد بررسی کنیم که تحت چه شرایطی کندل منفیه و تحت چه شرایطی مثبت. دوباره به تصویر زیر نگاه کنید :
    اموزش برنامه نویسی تریدینگ ویو: ساخت اندیکاتور شخصی قسمت دوم
    در زمانی که قیمت پایانی یا close از قیمت اغازین یا open بیشتر باشه کندل مثبت و سبزه در غیر این صورت کندل منفی و قرمزه!!! حالا دستورات زیر رو به برنامه اضافه کنید : myVal = volumeدر اینجا volume رو  به متغیر myVal نسبت میدیم.  بعد دستور رو : myColor = color.blackدر اینجا هم متغییری رو برای تعیین رنگ تعریف کردیم. برای اینکه بررسی کنیم ایا کندل مثبت هست یا منفی از دستور زیر استفاده میکنیم :
    اموزش برنامه نویسی تریدینگ ویو: ساخت اندیکاتور شخصی قسمت دوم
    تو خط اول چک میکنیم که ایا close از openبیشتر است یا نه در واقع ایا کندل مثبت هست یا نه . اگ بیشتر باشه خط بعدی رو اجرا میکنه که در اینجا رنگ ابی به متغیر رنگمون تخصیص میده و اگ نباشه خط بعد از ان نادیده گرفته میشه و مقدار متفیر تغییر نمیکنه
    دستور plot هم مشابه زیر تغییر بدید : plot(myVal, style = plot.style_histogram , color =myColor, linewidth = 3)بعد از ذخیره ، اندیکاتور ما شبیه زیر میشه :
    اموزش برنامه نویسی تریدینگ ویو: ساخت اندیکاتور شخصی قسمت دوم
    بخش بالایی اندیکاتور حجم پیشفرضه و بخش پایینی اندیکاتور حجمی که ما نوشتیم. ما در اینجا یه رنگ پیش فرض سیاه برای همه کندلها استفاده کردیم بعد با دستور شرطی اومدیم و کندلهای مثبت رو ابی کردیم و ما بقی کندلها هم که به رنگ پیش فرض موندن. تا اینجا کد ما شد این :
    اموزش برنامه نویسی تریدینگ ویو: ساخت اندیکاتور شخصی قسمت دوم
    حتما دستور     myColor := color.blueرو به همین شکل بنویسید با =: میتونیم مقدار یه متغیر رو تغییر بدیم.تمرین اول :  به جای if از ساختار if else استفاده کنید و کندلهای منفی رو به رنگ قرمز دربیارید. تمرین دوم : مانند تصویر زیر یه میانگین متحرک به اندیکاتور حجم اضافه کنید کندلهای منفی رو به سمت پایین محور رسم کنید یعنی قرینه کنید و بخش تنظیمات اون رو هم برنامه نویسی کنید :
    اموزش برنامه نویسی تریدینگ ویو: ساخت اندیکاتور شخصی قسمت دوم
    راهنمایی : در ریاضیات هر مقداری رو در -1 ضرب کنیم قرینه میشه!!!
    از این اندیکاتور و میانگین متحرکش میتونیم تو معاملاتمون استفاده کنیم !!! هر وقت میانگین متحرک محور میانی رو از پایین به بالا قطع میکنه قیمت افزایش پیدا کرده و هر وقت میانگین متحرک از بالا به پایین نمودار رو قطع کرده قیمت کاهش پیدا کرده. میانگین متحرک رو با طولهای مختلف چک کنید.پایان جلسه دوم سوالی بود کامنت بدید . موفق باشید
هاب
مکانی برای گفتگو درباره سرمایه گذاری کریپتو. همین الان عضو شو
ورود به هاب