millionchart
English

درس 16: نتیجه‌هایی که زیادی خوب به نظر می‌رسند

چرا یک سیگنال یا نتیجهٔ یک استراتژی می‌تواند از اطلاعاتی استفاده کند که کندل نداشت، موتور به‌طور پیش‌فرض چطور از شما محافظت می‌کند و اخطارها چه می‌گویند.

درس 16 از 18. گران‌ترین اشتباه در یک اسکریپت از کار افتادنش نیست. نتیجه‌ای است که فوق‌العاده به نظر می‌رسد، چون بی‌صدا از چیزی استفاده کرده که کندل نمی‌توانست بداند. دو چیز این را می‌سازد: سیگنالی که ریپینت می‌کند (بعد از بسته شدن کندل عوض می‌شود) و سیگنالی که نشت دارد (آینده را می‌خواند). این درس نشان می‌دهد هرکدام چطور پیش می‌آید، موتور به‌طور پیش‌فرض چه می‌کند و اخطارهایش چه معنایی دارند.

پیش‌فرض کندل بسته‌شده است#

وقتی اسکریپت تایم‌فریم دیگری را می‌خواند، مثلاً روند ساعتی را وقتی نمودار 5 دقیقه‌ای است، پرسش این است که کدام کندل ساعتی خوانده شود. پیش‌فرض آخرین کندل ساعتی است که بسته شده.

Cuprel
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 کندل ساعتی را می‌خواهد که هنوز در حال شکل‌گیری است. این فقط روی جدیدترین کندل نمودار مهم است، جایی که کندل ساعتی هنوز باز است: آنجا مقدار با هر تیک حرکت می‌کند تا کندل ساعتی بسته شود، و شرطی که روی آن ساخته شده می‌تواند روشن و خاموش شود. روی کندل‌های تاریخچه کندل ساعتی مدت‌هاست بسته شده، پس این خواندن همان عددهای پیش‌فرض را می‌دهد. همین باعث می‌شود هم وسوسه‌کننده باشد و هم فریبنده: تاریخچه پایدار به نظر می‌رسد و کندل زنده نه. گاهی همین را می‌خواهید، مثلاً داشبوردی که مقدار ساعتی فعلی را نشان می‌دهد. موتور به شما می‌گوید:

Cuprel · هشدار W-LIVE-READ
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 از این هم جلوتر می‌رود. روی کندل‌های یک روز، رقم نهایی آن روز را نشان می‌دهد: بالاترین قیمت کل روز را روی اولین کندل. هیچ چیز در معامله‌گری واقعی نمی‌تواند این را صبح بداند.

Cuprel · هشدار W-FUTURE-READ
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")

اگر مقدار را یک روز به عقب ببرید، خواندن بی‌ضرر می‌شود: بالاترین قیمت دیروز در تمام امروز معلوم است.

Cuprel
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 استفاده کند. استراتژی‌ای که روی قیمت‌های فردا معامله کند چیزی را ثابت نمی‌کند، برای همین بررسی‌کننده آن را رد می‌کند:

Cuprel · خطا E3132
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. با آن فقط چیزی را رسم کنید که نهایی است:

Cuprel
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) آن را روی کندلی گزارش می‌کند که معلوم می‌شود، پنج کندل بعد از خود پیوت. اگر پیوت را عقب روی کندلی که به آن تعلق دارد رسم کنید، تصویر قانع‌کننده به نظر می‌رسد، اما در آن زمان آن علامت وجود نداشت. آن را همان‌جا رسم کنید که معلوم می‌شود، یا قبول کنید که دیر می‌رسد.

یک فهرست کوتاه#

  1. تایم‌فریم‌های دیگر را با پیش‌فرض بخوانید. live = true را فقط برای چیزی به کار ببرید که به آن نگاه می‌کنید، نه چیزی که با آن معامله می‌کنید.
  2. هرگز future = true را روی مقداری به کار نبرید که آن را به عقب نبرده‌اید. در استراتژی خطاست.
  3. شرطی را که روی آن عمل می‌کنید پشت confirmed(...) یا once = "bar_close" بگذارید.
  4. یادتان باشد که پیوت‌ها، و هر چیزی که به کندل‌های سمت راستش نیاز دارد، دیر می‌رسند.
  5. اگر نتیجهٔ یک استراتژی زیادی خوب به نظر می‌رسد، تاریخچه را کوتاه‌تر کنید، نماد را عوض کنید و دوباره اجرایش کنید. نتیجه‌ای که به یک بازهٔ خوش‌شانس وابسته باشد نتیجه نیست.

امتحان کنید#

  • در برنامهٔ «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(...) یک سیگنال را به کندل‌های بسته‌شده محدود کنید.
  • می‌دانید چرا پیوت دیر گزارش می‌شود و آن را کجا باید رسم کرد.
  • می‌توانید پیش از اعتماد به یک نتیجه، فهرست بالا را مرور کنید.

نگاه کنید به: تایم‌فریم‌ها و نمادهای دیگر، کلیدها و گزینه‌های هشدار، اولین استراتژی شما.

بعدی: درس 17: ماندن در محدودهٔ سقف‌ها