درس 16: نتیجههایی که زیادی خوب به نظر میرسند
چرا یک سیگنال یا نتیجهٔ یک استراتژی میتواند از اطلاعاتی استفاده کند که کندل نداشت، موتور بهطور پیشفرض چطور از شما محافظت میکند و اخطارها چه میگویند.
درس 16 از 18. گرانترین اشتباه در یک اسکریپت از کار افتادنش نیست. نتیجهای است که فوقالعاده به نظر میرسد، چون بیصدا از چیزی استفاده کرده که کندل نمیتوانست بداند. دو چیز این را میسازد: سیگنالی که ریپینت میکند (بعد از بسته شدن کندل عوض میشود) و سیگنالی که نشت دارد (آینده را میخواند). این درس نشان میدهد هرکدام چطور پیش میآید، موتور بهطور پیشفرض چه میکند و اخطارهایش چه معنایی دارند.
پیشفرض کندل بستهشده است#
وقتی اسکریپت تایمفریم دیگری را میخواند، مثلاً روند ساعتی را وقتی نمودار 5 دقیقهای است، پرسش این است که کدام کندل ساعتی خوانده شود. پیشفرض آخرین کندل ساعتی است که بسته شده.
indicator "Hourly trend"
edition = 1
display = price
let trend = data.series("60", tech.ema(close, 20), symbol = symbol.id)
plot(trend, name = "Hourly EMA")روی کندل 5 دقیقهای که ساعت 10:35 باز میشود، اسکریپت کندل ساعتی 09:00 تا 10:00 را میبیند. کندل ساعتیای را که هنوز در حال شکلگیری است نمیبیند، چون قیمت بستهشدن آن کندل هنوز وجود ندارد. خط فقط ساعتی یک بار حرکت میکند، وقتی یک کندل ساعتی بسته میشود، و عددهایی که روی کندلهای گذشته نشان میدهد همان عددهایی است که در آن زمان نشان میداد.
data.series(timeframe, expression, symbol = ...) عبارت را روی کندلهای تایمفریم دیگر حساب میکند و نتیجه را به کندلهای نمودار برمیگرداند. جزئیات در تایمفریمها و نمادهای دیگر آمده است.
خواستن کندل در حال شکلگیری#
live = true کندل ساعتی را میخواهد که هنوز در حال شکلگیری است. این فقط روی جدیدترین کندل نمودار مهم است، جایی که کندل ساعتی هنوز باز است: آنجا مقدار با هر تیک حرکت میکند تا کندل ساعتی بسته شود، و شرطی که روی آن ساخته شده میتواند روشن و خاموش شود. روی کندلهای تاریخچه کندل ساعتی مدتهاست بسته شده، پس این خواندن همان عددهای پیشفرض را میدهد. همین باعث میشود هم وسوسهکننده باشد و هم فریبنده: تاریخچه پایدار به نظر میرسد و کندل زنده نه. گاهی همین را میخواهید، مثلاً داشبوردی که مقدار ساعتی فعلی را نشان میدهد. موتور به شما میگوید:
indicator "Hourly trend, forming bar"
edition = 1
display = price
let trend = data.series("60", tech.ema(close, 20), symbol = symbol.id, live = true)
plot(trend, name = "Hourly EMA, live")سیگنالی که روی آن عمل میکنید نباید به خواندن زنده وابسته باشد.
خواستن آینده#
future = true از این هم جلوتر میرود. روی کندلهای یک روز، رقم نهایی آن روز را نشان میدهد: بالاترین قیمت کل روز را روی اولین کندل. هیچ چیز در معاملهگری واقعی نمیتواند این را صبح بداند.
indicator "Day high, final"
edition = 1
display = price
let day_high = data.series("1D", high, symbol = symbol.id, future = true)
plot(day_high, name = "Day high")اگر مقدار را یک روز به عقب ببرید، خواندن بیضرر میشود: بالاترین قیمت دیروز در تمام امروز معلوم است.
indicator "Yesterday's high"
edition = 1
display = price
let yesterday_high = data.series("1D", high[1], symbol = symbol.id, future = true)
plot(yesterday_high, name = "Yesterday's high")برای روز، هفته یا ماه قبل راه کوتاهتری هست که اصلاً درخواست لازم ندارد: prior(day).high. روز معاملاتی و سشنها آن را نشان میدهد.
استراتژی اصلاً نمیتواند از future = true استفاده کند. استراتژیای که روی قیمتهای فردا معامله کند چیزی را ثابت نمیکند، برای همین بررسیکننده آن را رد میکند:
strategy "Look-ahead strategy"
edition = 1
display = price
let day_high = data.series("1D", high, symbol = symbol.id, future = true)
if close > day_high
orders.enter("Long", side.long)
plot(day_high, name = "Day high")کندلی که بسته نشده#
جدیدترین کندل نمودار همیشه در حال شکلگیری است، حتی وقتی بازار بسته است. close آن آخرین قیمت است و با هر تیک عوض میشود، پس شرطی مثل close > open ممکن است الان درست باشد و یک ثانیه بعد نادرست. سیگنالی که روی آن ساخته شده میتواند ظاهر شود و بعد ناپدید. این همان ریپینت است.
confirmed(x) روی کندل بستهشده x را میدهد و روی کندل در حال شکلگیری na. با آن فقط چیزی را رسم کنید که نهایی است:
indicator "Closed bars only"
edition = 1
display = price
let average = tech.sma(close, 20)
let strong = close > open and close > average
mark.shape(
confirmed(strong),
name = "Strong close",
shape = circle,
place = below,
color = color.green,
)برای هشدار، once = "bar_close" همین کار را میکند: فقط بعد از بسته شدن کندل به صدا درمیآید (هشدار روی اسکریپتهای خودتان در این نسخه خاموش است؛ هشدارهایی که چیزی میگویند را ببینید).
سیگنالهایی که دیر میرسند#
بعضی جوابها را فقط بعد از اتفاق میشود فهمید. پیوت بالا کندلی است که قیمت بالایش از پنج کندل هر دو طرفش بالاتر باشد؛ پنج کندل سمت راستش باید بسته شوند تا پیوت بشود. tech.pivot_high(high, 5, 5) آن را روی کندلی گزارش میکند که معلوم میشود، پنج کندل بعد از خود پیوت. اگر پیوت را عقب روی کندلی که به آن تعلق دارد رسم کنید، تصویر قانعکننده به نظر میرسد، اما در آن زمان آن علامت وجود نداشت. آن را همانجا رسم کنید که معلوم میشود، یا قبول کنید که دیر میرسد.
یک فهرست کوتاه#
- تایمفریمهای دیگر را با پیشفرض بخوانید.
live = trueرا فقط برای چیزی به کار ببرید که به آن نگاه میکنید، نه چیزی که با آن معامله میکنید. - هرگز
future = trueرا روی مقداری به کار نبرید که آن را به عقب نبردهاید. در استراتژی خطاست. - شرطی را که روی آن عمل میکنید پشت
confirmed(...)یاonce = "bar_close"بگذارید. - یادتان باشد که پیوتها، و هر چیزی که به کندلهای سمت راستش نیاز دارد، دیر میرسند.
- اگر نتیجهٔ یک استراتژی زیادی خوب به نظر میرسد، تاریخچه را کوتاهتر کنید، نماد را عوض کنید و دوباره اجرایش کنید. نتیجهای که به یک بازهٔ خوششانس وابسته باشد نتیجه نیست.
امتحان کنید#
- در برنامهٔ «Hourly trend»، روی نمودار 15 دقیقه به جای
"60"مقدار"240"را بخوانید: حالا خط هر چهار ساعت یک بار پله میخورد. - در برنامهٔ «Hourly trend, forming bar»،
live = trueرا بردارید: ویرایشگر دیگر یادداشتW-LIVE-READرا فهرست نمیکند. - در برنامهٔ «Day high, final»،
highرا بهhigh[1]تغییر دهید: یادداشتW-FUTURE-READاز بین میرود، چون سقف دیروز در تمام امروز معلوم است. - در برنامهٔ «Closed bars only»،
confirmed(...)را از دورstrongبردارید و به جدیدترین کندل نگاه کنید: علامتش ممکن است تا وقتی کندل در حال شکلگیری است ظاهر و ناپدید شود.
نقطهٔ بررسی#
- میدانید خواندن یک تایمفریم دیگر بهطور پیشفرض کدام کندل را میدهد و
live = trueوfuture = trueچه چیزی را تغییر میدهند. - میتوانید با
confirmed(...)یک سیگنال را به کندلهای بستهشده محدود کنید. - میدانید چرا پیوت دیر گزارش میشود و آن را کجا باید رسم کرد.
- میتوانید پیش از اعتماد به یک نتیجه، فهرست بالا را مرور کنید.
نگاه کنید به: تایمفریمها و نمادهای دیگر، کلیدها و گزینههای هشدار، اولین استراتژی شما.