شبیهسازی Bar Replay تریدینگویو با Pine Script
یکی از قابلیتهای کاربردی تریدینگویو برای تمرین، بررسی استراتژیها و تحلیل رفتار قیمت در گذشته، Bar Replay است. این قابلیت به معاملهگر اجازه میدهد نمودار را به یک نقطه مشخص در گذشته ببرد و سپس حرکت قیمت را از همان نقطه به بعد، کندلبهکندل مشاهده کند.
به این ترتیب میتوان شرایطی شبیه به بازار زنده ایجاد کرد؛ بدون اینکه معاملهگر از ادامه نمودار و اتفاقاتی که در آینده رخ داده است اطلاع داشته باشد.
در این آموزش میخواهیم ببینیم چگونه میتوان با استفاده از پایناسکریپت یک نسخه ساده از این قابلیت را شبیهسازی کرد؛ نسخهای که اگرچه امکانات کامل Bar Replay اصلی TradingView را ندارد، اما برای تمرین و بررسی ایدههای معاملاتی میتواند بسیار کاربردی باشد.
Bar Replay چیست و چه کاربردی دارد؟
ریپِلی ابزاری برای مشاهده و بررسی رفتار تاریخی بازار است. شما میتوانید یک نقطه مشخص از نمودار را بهعنوان نقطه شروع انتخاب کنید و کندلهای بعدی را بهصورت مرحلهای مشاهده کنید.
برای مثال فرض کنید قصد دارید یک استراتژی معاملاتی را تمرین کنید. بهجای اینکه نمودار را از ابتدا تا انتها مشاهده کنید، به یک تاریخ مشخص در گذشته میروید و ادامه بازار را مخفی میکنید.
در این حالت فقط اطلاعاتی را میبینید که در همان لحظه از بازار در دسترس بوده است. سپس میتوانید تصمیم بگیرید که آیا در آن نقطه وارد معامله میشدید یا خیر، حد ضرر و حد سود خود را مشخص کنید و بعد حرکت کندلها را ادامه دهید تا ببینید نتیجه چه میشد.
این روش برای تمرین تحلیل تکنیکال، بررسی ایدههای معاملاتی و افزایش مهارت تصمیمگیری بسیار مفید است.
تریدینگویو نیز Bar Replay را بهعنوان ابزاری برای شبیهسازی شرایط تاریخی بازار و تمرین معاملهگری معرفی میکند. در این حالت میتوان نقطه شروع را انتخاب کرد و حرکت تاریخی بازار را با سرعتهای مختلف مشاهده کرد. (TradingView)
محدودیت Bar Replay و ایده استفاده از Pine Script
Bar Replay اصلی تریدینگویو امکانات بسیار بیشتری نسبت به روشی که در این آموزش پیادهسازی میکنیم دارد. برای مثال میتوان Replay را کنترل کرد، سرعت پخش را تغییر داد و در برخی پلنها از دادههای تاریخی بیشتری استفاده کرد.
همچنین امکانات Bar Replay و مقدار داده تاریخی قابل استفاده، به نوع حساب و تایمفریم بستگی دارد. در حال حاضر تریدینگویو برای پلنهای مختلف محدودیتهای متفاوتی برای دادههای تاریخی Intraday در نظر گرفته است و پلنهای Premium و Professional به عمق بیشتری از دادههای Intraday دسترسی دارند. (TradingView)
اما سؤال جالب این است:
آیا میتوان با Pine Script یک نسخه ساده از Replay ایجاد کرد؟
پاسخ مثبت است.
البته این روش جایگزین کامل Bar Replay نیست؛ بلکه یک تکنیک ساده برای مخفی کردن بخشی از نمودار و نمایش تدریجی آن است.
ایده اصلی بسیار ساده است:
یک زمان مشخص تعریف کنیم و فقط کندلهایی را نمایش دهیم که زمان آنها قبل از زمان تعیینشده باشد.
هر زمان که این نقطه زمانی را جابهجا کنیم، تعداد کندلهای نمایش دادهشده نیز تغییر خواهد کرد.
استفاده از plotcandle برای بازسازی کندلها
برای اجرای این ایده در پایناسکریپت میتوانیم از تابع plotcandle استفاده کنیم.
این تابع به ما اجازه میدهد یک کندل را با مقادیر دلخواه Open، High، Low و Close روی نمودار رسم کنیم.
بهعنوان مثال، اگر بخواهیم دقیقاً همان کندلهای موجود روی نمودار اصلی را بازسازی کنیم، میتوانیم مقادیر OHLC را مستقیماً به plotcandle بدهیم.
در واقع ساختار کلی به این صورت خواهد بود:
plotcandle(open, high, low, close)
مزیت مهم این روش این است که مقادیر OHLC الزاماً نباید همان مقادیر کندل اصلی باشند.
برای مثال میتوانیم کندلهایی با محاسبات متفاوت ایجاد کنیم؛ درست مانند کاری که در نمایشهایی مثل Heikin Ashi انجام میشود.
در این آموزش اما هدف ما این است که کندلهای اصلی را بدون تغییر بازسازی کنیم.
بنابراین میتوانیم رنگ کندلها را نیز بر اساس وضعیت Open و Close تعیین کنیم.
اگر Close بزرگتر از Open باشد، کندل صعودی و اگر Close کوچکتر از Open باشد، کندل نزولی در نظر گرفته میشود:
COLOR = close > open ? color.green : close < open ? color.red : color.black
سپس این رنگ را به plotcandle منتقل میکنیم.
علاوه بر رنگ بدنه، میتوان رنگ Wick و Border را نیز مشخص کرد:
plotcandle(open, high, low, close, color = COLOR, wickcolor = COLOR, bordercolor = COLOR)
در نتیجه، کندلهایی خواهیم داشت که از نظر ظاهر و اطلاعات OHLC با کندلهای اصلی نمودار مطابقت دارند.
تعیین نقطه شروع Replay
حالا به بخش اصلی ایده میرسیم.
ما به یک متغیر زمانی نیاز داریم که کاربر بتواند آن را از تنظیمات اندیکاتور تغییر دهد.
در Pine Script میتوان برای دریافت یک تاریخ و زمان از کاربر، از input.time استفاده کرد:
TIME = input.time(defval = timestamp("23 Nov 2021"))
البته میتوان ساعت، دقیقه و سایر جزئیات تاریخ را نیز در Timestamp مشخص کرد.
حالا یک سؤال مهم داریم:
چگونه مشخص کنیم کدام کندلها باید نمایش داده شوند؟
کافی است زمان هر کندل را با زمان تعیینشده توسط کاربر مقایسه کنیم.
برای مثال:
RP = time < TIME
در این حالت متغیر RP یک مقدار Boolean خواهد بود.
اگر زمان کندل قبل از زمان انتخابشده باشد:
RP = true
و اگر زمان کندل بعد از آن باشد:
RP = false
اکنون میتوانیم از این شرط برای نمایش یا عدم نمایش کندل استفاده کنیم.
مخفی کردن کندلهای بعد از زمان مشخصشده
برای این کار میتوانیم مقادیر OHLC را به شکل شرطی تعریف کنیم.
برای مثال:
OPEN = RP ? open : na
HIGH = RP ? high : na
LOW = RP ? low : na
CLOSE = RP ? close : na
کلمه na در اینجا اهمیت زیادی دارد.
وقتی شرط RP برقرار باشد، مقدار واقعی Open، High، Low و Close به متغیر داده میشود.
اما وقتی شرط برقرار نباشد، مقدار na قرار میگیرد و در نتیجه کندلی برای آن بخش رسم نخواهد شد.
در نهایت میتوانیم این مقادیر را به plotcandle بدهیم:
plotcandle( OPEN, HIGH, LOW, CLOSE, color = COLOR, wickcolor = COLOR, bordercolor = COLOR)
حالا با تغییر تاریخ موجود در تنظیمات اندیکاتور، نقطهای که بعد از آن کندلها نمایش داده نمیشوند نیز تغییر خواهد کرد.
تبدیل اندیکاتور به یک Replay ساده
اگر اندیکاتور را روی چارت اصلی قرار دهیم، میتوانیم از خط زمانی ایجادشده برای حرکت در گذشته استفاده کنیم.
برای مثال تصور کنید تاریخ Replay را روی یک روز مشخص قرار دادهایم.
در این حالت فقط کندلهای قبل از آن تاریخ نمایش داده میشوند.
اگر نقطه زمانی را جلو ببریم، کندلهای بیشتری ظاهر میشوند.
اگر آن را به سمت چپ ببریم، بخش بیشتری از آینده مخفی خواهد شد.
در نتیجه میتوانیم وارد گذشته بازار شویم، تحلیل خود را انجام دهیم و سپس نقطه Replay را بهآرامی جلو ببریم تا ببینیم آیا تحلیلی که انجام دادهایم با رفتار واقعی بازار مطابقت داشته است یا خیر.
این روش از نظر مفهومی شبیه Bar Replay است، اما کنترل آن بهجای پنل Replay خود TradingView، از طریق پارامتر زمانی اندیکاتور انجام میشود.
یک نکته مهم درباره اندیکاتورها
در این روش یک محدودیت مهم وجود دارد.
فرض کنید اندیکاتور Moving Average را بهصورت جداگانه روی چارت قرار دهیم.
ممکن است انتظار داشته باشیم چون بخشی از کندلها مخفی شدهاند، Moving Average نیز فقط تا همان نقطه محاسبه شود.
اما چنین اتفاقی نمیافتد.
دلیل این است که کندلهای اصلی نمودار هنوز واقعاً وجود دارند؛ ما فقط آنها را با plotcandle نمایش نمیدهیم.
بنابراین اندیکاتور Moving Average همچنان روی دادههای واقعی و کامل نمودار محاسبه میشود و اطلاعات کندلهایی را که قرار است در Replay مخفی باشند نیز در محاسبات خود دارد.
در نتیجه ممکن است چیزی شبیه این اتفاق رخ دهد:
کندلهای قابل مشاهده
█████████████████
کندلهای مخفی
████████████████████████
Moving Average
████████████████████████
یعنی Moving Average اطلاعات آینده را نیز در اختیار دارد و این موضوع میتواند نتیجه تمرین را مخدوش کند.
راهحل: محاسبه اندیکاتور داخل همان اسکریپت
اگر روش تحلیلی شما مشخص است و از اندیکاتورهایی استفاده میکنید که کد آنها در اختیار شماست، میتوان این مشکل را تا حد زیادی برطرف کرد.
برای مثال اگر Moving Average مورد استفاده شما مشخص باشد، میتوان محاسبات آن را مستقیماً داخل همان اسکریپت Replay قرار داد.
فرض کنیم مقدار Moving Average به شکل زیر محاسبه میشود:
MA = ta.sma(close, 20)
میتوانیم آن را نیز تحت همان شرط Replay قرار دهیم:
MA_REPLAY = RP ? MA : na
و سپس:
plot(MA_REPLAY)
در این حالت Moving Average نیز فقط تا نقطهای که شرط Replay برقرار است نمایش داده خواهد شد.
در نتیجه وقتی نقطه Replay را جابهجا میکنیم، هم کندلها و هم Moving Average با یکدیگر جابهجا میشوند.
این موضوع باعث میشود تمرین به شرایط واقعیتری نزدیک شود.
این روش برای چه اندیکاتورهایی مناسب است؟
این تکنیک زمانی کاربرد بیشتری دارد که اندیکاتور مورد استفاده شما قابل بازنویسی یا محاسبه داخل همان اسکریپت باشد.
برای مثال میتوان اندیکاتورهایی مانند:
- Moving Average
- EMA
- SMA
- Bollinger Bands
- برخی اندیکاتورهای روندی
- و بسیاری از محاسبات مبتنی بر قیمت
را در همین ساختار قرار داد.
اما در مورد اندیکاتورهایی که در یک پنجره جداگانه نمایش داده میشوند، مانند RSI، MACD و سایر Oscillatorها، شرایط کمی متفاوت است و میتوان از قابلیت force_overlay استفاده کرد.
در این موارد باید علاوه بر بخش مربوط به نمودار اصلی، منطق مربوط به پنجره جداگانه نیز به شکلی مناسب مدیریت شود. در غیر این صورت ممکن است اندیکاتور همچنان اطلاعات مربوط به بخشهای بعدی نمودار را نمایش دهد.
یک نکته دیگر هنگام تغییر تایمفریم
اگر نقطه Replay را در یک تایمفریم بالا مشخص کرده باشید و سپس به تایمفریم بسیار پایینتری بروید، ممکن است نقطه انتخابشده دیگر در محدوده قابل مشاهده نمودار نباشد.
در این شرایط ممکن است تصور کنید اندیکاتور از بین رفته است، در حالی که چنین نیست.
معمولاً میتوان با انتخاب خود اندیکاتور و پیدا کردن خط یا نقطه مربوط به Replay، آن را دوباره در محدوده مناسب قرار داد.
همچنین باید توجه داشت که در خود TradingView نیز مقدار داده تاریخی قابل استفاده در تایمفریمهای مختلف یکسان نیست. برای نمونه، ممکن است داده روزانه یک نماد تا سالهای بسیار دور در دسترس باشد، اما داده یکدقیقهای همان نماد از تاریخ بسیار جدیدتری شروع شود. (TradingView)
جمعبندی
Bar Replay یکی از ابزارهای مفید TradingView برای تمرین و بررسی رفتار بازار در گذشته است. با این حال، برای برخی کاربران یا در برخی شرایط ممکن است نیاز باشد یک روش سادهتر برای مخفی کردن آینده نمودار در اختیار داشته باشند.
در Pine Script میتوان با ترکیب چند قابلیت ساده، چنین ساختاری ایجاد کرد:
- تعیین یک تاریخ و زمان با
input.time - مقایسه زمان هر کندل با زمان انتخابشده
- استفاده از یک شرط Boolean مانند
RP - مخفی کردن کندلهای بعد از نقطه Replay با مقدار
na - بازسازی کندلها با
plotcandle - اعمال همان شرط روی اندیکاتورهای مورد استفاده
البته این روش جایگزین Bar Replay اصلی TradingView نیست و امکاناتی مانند کنترل سرعت، اجرای مرحلهای استاندارد و برخی قابلیتهای پیشرفته Replay را ارائه نمیدهد. Bar Replay رسمی TradingView امکانات گستردهتری دارد و حتی امکان همگامسازی Replay بین چند نمودار را نیز فراهم میکند. (TradingView)
اما از نظر آموزشی، این تکنیک یک نکته بسیار مهم را نشان میدهد: با Pine Script میتوان نحوه نمایش دادههای بازار را کنترل کرد و ابزارهای اختصاصی متناسب با نیاز خود ساخت.
اگر هدف شما تمرین یک روش معاملاتی مشخص باشد، میتوانید حتی یک مرحله جلوتر بروید و منطق اندیکاتورهای مورد استفاده خود را نیز داخل همین اسکریپت قرار دهید تا آنها فقط بر اساس بخش قابل مشاهده بازار محاسبه و نمایش داده شوند.
به این ترتیب میتوان یک محیط تمرینی نسبتاً ساده ایجاد کرد که در آن ابتدا تنها بخشی از بازار در اختیار شماست، تحلیل خود را انجام میدهید و سپس با حرکت دادن نقطه Replay، ادامه بازار را مشاهده میکنید؛ درست مانند زمانی که در بازار واقعی هنوز از اتفاقات چند کندل آینده خبر ندارید.
این روش میتواند ابزار مناسبی برای تمرین تحلیل تکنیکال، بررسی ایدههای معاملاتی و ارزیابی کیفیت تصمیمهای معاملاتی در گذشته باشد.