ساعات کاری بازارهای مالی

کد پیاده سازی ساعات کاری جهان در پاین اسکریپت به قلم ه . م بله

  1. منطق دوگانه: کد به گونه‌ای نوشته شده که سقف و کف (High/Low) کل بازه زمانی سشن را محاسبه می‌کند (تا خطوط در زمان نهار قطع نشوند و یکپارچه باشند)، اما رنگ پس‌زمینه (Background) دقیقاً در ۳۰ دقیقه نهار قطع می‌شود. این یعنی شما در چارت می‌بینید که بازار در حال فعالیت است، اما در زمان نهار، رنگ پس‌زمینه قطع می‌شود که نشان‌دهنده استراحت بازار است.
  2. پوشش خودکار DST: از نام منطقه زمانی (Timezone) هر کشور استفاده شده تا تغییرات ساعت تابستانه و زمستانه را بدون دخالت شما مدیریت کند.
  3. زمان‌های نهار: من برای هر منطقه جغرافیایی، یک بازه ۳۰ دقیقه‌ای استاندارد (مثلاً حول ساعت ۱۲ یا ۱ ظهر به وقت محلی) را به عنوان استراحت در نظر گرفتم.

کد نهایی و تست شده (نسخه حرفه‌ای با مدیریت نهار و DST)

// @version=5
indicator("Global Sessions with 30m Lunch & DST (Ready-to-Use)", overlay=true, max_lines_count=500)

// --- تنظیمات ظاهری ---
line_style_input = input.string("Dotted", "Line Style", options=["Dotted", "Dashed", "Solid"])
get_style(s) =>
    s == "Dotted" ? line.style_dotted : s == "Dashed" ? line.style_dashed : line.style_solid

// --- تابع اصلی پردازش سشن‌ها ---
// sess_range: بازه کلی بازار
// lunch_range: بازه ۳۰ دقیقه‌ای نهار
// tz: منطقه زمانی کشور برای مدیریت خودکار DST
f_process_session(sess_range, lunch_range, tz, sess_col, style) =>
    // تشخیص حضور در کل سشن و حضور در زمان نهار
    in_sess = not na(time(timeframe.period, sess_range, tz))
    in_lunch = not na(time(timeframe.period, lunch_range, tz))
    is_active = in_sess and not in_lunch // زمان فعالیت برای رنگ‌آمیزی
    
    var float hi = na
    var float lo = na
    var line hi_line = na
    var line lo_line = na
    
    bool is_new = in_sess and not in_sess[1]
    
    if is_new
        hi := high
        lo := low
        hi_line := line.new(bar_index, hi, bar_index, hi, color=sess_col, style=get_style(style))
        lo_line := line.new(bar_index, lo, bar_index, lo, color=sess_col, style=get_style(style))
    else if in_sess
        // محاسبه High/Low در کل سشن (حتی در زمان نهار برای یکپارچگی خط)
        hi := math.max(high, hi)
        lo := math.min(low, lo)
        line.set_xy2(hi_line, bar_index, hi)
        line.set_xy1(hi_line, line.get_x1(hi_line), hi)
        line.set_xy2(lo_line, bar_index, lo)
        line.set_xy1(lo_line, line.get_x1(lo_line), lo)
    
    [is_active, in_sess]

// --- تعریف سشن‌ها و بازه‌های نهار (همه بر اساس ساعت محلی خود کشور) ---

// ساختار: f_process_session(ساعت بازار, ساعت نهار, منطقه زمانی, رنگ, استایل)

// چین (Asia/Shanghai)
[a1, s1] = f_process_session("0900-1600", "1200-1230", "Asia/Shanghai", color.new(color.red, 90), line_style_input)
// سنگاپور (Asia/Singapore)
[a2, s2] = f_process_session("0900-1700", "1200-1230", "Asia/Singapore", color.new(color.orange, 
[a3, s3] = f_process_session("0915-1530", "1300-1330", "Asia/Kolkata", color.new(color.blue, 90), line_style_input)
// امارات (Asia/Dubai)
[a4, s4] = f_process_session("0900-1800", "1300-1330", "Asia/Dubai", color.new(color.teal, 90), line_style_input)
// روسیه (Europe/Moscow)
[a5, s5] = f_process_session("1000-1900", "1300-1330", "Europe/Moscow", color.new(color.gray, 90), line_style_input)
// عربستان (Asia/Riyadh)
[a6, s6] = f_process_session("0800-1700", "1200-1230", "Asia/Riyadh", color.new(color.green, 90), line_style_input)
// آفریقای جنوبی (Africa/Johannesburg)
[a7, s7] = f_process_session("0900-1700", "1300-1330", "Africa/Johannesburg", color.new(color.purple, 90), line_style_input)
// آلمان (Europe/Berlin)
[a8, s8] = f_process_session("0900-1700", "1200-1230", "Europe/Berlin", color.new(color.yellow, 90), line_style_input)
// کانادا (America/90), line_style_input)
// هندوستان (Asia/Kolkata)