amit-agni/candlesticks-deeplearning

ساخت وبلاگ

این commit به هیچ شعبه ای در این مخزن تعلق ندارد و ممکن است به یک فورک خارج از مخزن تعلق داشته باشد.

شاخه ها/تگ ها را تغییر دهید برچسب های شاخه ها شاخه ها بارگیری نشد چیزی برای نشان دادن نیست برچسب ها بارگیری نشد چیزی برای نشان دادن نیست

نام در حال حاضر استفاده شده است

یک برچسب از قبل با نام شعبه ارائه شده وجود دارد. بسیاری از دستورات Git هر دو نام برچسب و شاخه را می پذیرند، بنابراین ایجاد این شاخه ممکن است باعث رفتار غیرمنتظره شود. آیا مطمئن هستید که می خواهید این شعبه را ایجاد کنید؟

لغو ایجاد کد

  • محلی
  • فضاهای کد

HTTPS GitHub CLI از Git یا Checkout با SVN با استفاده از URL وب استفاده کنید. با CLI رسمی ما سریع کار کنید. بیشتر بدانید.

ورود به سیستم لازم

برای استفاده از Codespace لطفا وارد شوید.

راه اندازی دسکتاپ GitHub

اگر اتفاقی نیفتاد، GitHub Desktop را دانلود کنید و دوباره امتحان کنید.

راه اندازی دسکتاپ GitHub

اگر اتفاقی نیفتاد، GitHub Desktop را دانلود کنید و دوباره امتحان کنید.

راه اندازی Xcode

اگر اتفاقی نیفتاد، Xcode را دانلود کنید و دوباره امتحان کنید.

راه اندازی کد ویژوال استودیو

پس از آماده شدن فضای کد شما باز می شود.

مشکلی در تهیه فضای کد شما وجود داشت، لطفاً دوباره امتحان کنید.

آخرین ارتکاب

آمار Git

فایل ها

آخرین اطلاعات commit بارگیری نشد.

تایپ کنید نام آخرین پیام commit زمان تعهد کنید مشاهده کد

README. md

پیش بینی حرکت قیمت سهام - یادگیری عمیق

یک مدل طبقه بندی تصویر یادگیری عمیق برای پیش بینی حرکت قیمت سهام بسازید. این مدل با استفاده از تصاویر نمودارهای Candlestick ایجاد شده با پنجره کشویی 5 روزه آموزش داده می شود.

جریان کلی سیستم در زیر نشان داده شده است.

  • هنگامی که کاربر نماد سهام یاهو را وارد می کند
    1. این سیستم قیمت تاریخی 5 روز گذشته را بازیابی می کند
    2. یک نمودار Candlestick ایجاد کنید
    3. از مدل آموزش دیده برای پیش بینی حرکت قیمت برای روز بعد استفاده کنید
  • فرآیند استنتاج روزانه اجرا می شود و پیش بینی قیمت روز بعد را برای 100 سهام برتر ASX (بورس سهام استرالیا) نشان می دهد.
  • سیستم همچنین عملکرد مدل را روی مجموعه آزمایشی تولید شده در طول فرآیند استنتاج نشان می دهد

system-overview

پروژه را می توان به طور کلی به سه بخش تقسیم کرد:

I. ایجاد داده های آموزشی [تکمیل شده] II. ساخت مدل [در حال پیشرفت] III. تولید، استنتاج و رابط کاربری [شروع نشده]

I. ایجاد داده های آموزشی

  • داده های OHLC (Open-High-Low-Close) برای سهام فهرست شده در بورس اوراق بهادار استرالیا برای ایجاد نمودارهای کندل استیک (مجموعه آموزشی) استفاده شد.
  • این نمودارها به عنوان تصاویر همراه با برچسب هدف ذخیره می شوند که نشان می دهد قیمت سهام در روز بعد بالا یا پایین رفته است.
  • 100_data-exploration. ipynb دارای کد ایجاد مجموعه داده ها و EDA است
  • یادداشت های کدگذاری
    • برای ایجاد نمودارهای شمعدانی از داده های CSV OHLC ، از بسته mplfinance استفاده شده است.
    • سفارشی سازی با استفاده از matplotlib rcparams انجام شده است
    • تنظیمات عرض انجام شده با کمک از (https://github.com/matplotlib/mplfinance/blob/master/examples/widths. ipynb)
    • نمونه های عالی
    • Ramdisk برای خواندن سریعتر/نوشتن پرونده های نمودار ایجاد شده است
    • UINT8 برای آرایه های Numpy و همچنین برای ایجاد_داتاس در H5PY . H5 ایجاد شده است
    • از عملکرد استخر چند پردازش برای تخم ریزی mp. cpu_count () فرآیند همزمان استفاده شده است

    ii. ساخت مدل ها [در حال پیشرفت]

    برنامه کلی استفاده از TensorFlow-KAS برای امتحان کردن انواع مختلف مدل های یادگیری عمیق است. مدل های زیر تاکنون بدون موفقیت بسیار محاکمه شده اند

    1. شبکه های متراکم کاملاً متصل
    2. شبکه های عصبی حلقوی
    3. انتقال یادگیری

    iiiاستنباط و رابط کاربری [شروع نشده]

    • تاکنون هیچ یک از مدل ها نتوانسته اند عملکرد خوبی داشته باشند. علت اصلی احتمالاً به این دلیل است که آنها قادر به دریافت سیگنال ها و الگوهای کافی از مجموعه داده های آموزش نیستند
    • چیزهایی که تاکنون امتحان شده/آموخته اند:
      • CNN و یادگیری با استفاده از Mobilenet
      • یاب نرخ یادگیری
      • پوسیدگی نرخ یادگیری
      • وب سایت وزنه ها و تعصبات برای ورود به سیستم
      • tf. data برای بارگیری مجموعه داده های بزرگتر از رم
      • الگوریتم های بهینه سازی: Relu ، Leaky Relu ، Adam
      • داده های آموزش: تقویت تصویر ، تصاویر دور افتاده با استفاده از میانگین RGB ، افزایش اندازه مجموعه داده ها
      • تنظیم کروس
      • استفاده از GPU ثابت شد
      + ویژگی های عصاره با استفاده از یادگیری انتقال و سپس استفاده از لجستیک ، XGB ، RF ، SVM و غیره + الگوریتم بهینه سازی متفاوت پارامترهای اولیه + فعال سازی برای Relu و Xavier برای ADAM؟همراه با پیچش های L2 + با گام های بالاتر + پالایش تشخیص دورتر: RGB جدا شده و سپس میانگین آنها + تشخیص آنامولی را در تصاویر پیدا کنید 

      پیش نویس یادداشت ها (برای گردآوری)

      Tensorflow - تنظیم GPU

      • TensorFlow به طور پیش فرض کل حافظه GPU را به فرآیند اجرا اختصاص می دهد. اگر سعی کنید چندین اسکریپت را اجرا کنید ، این خطای منجر به خطا می شود. با استفاده از این پیکربندی ثابت شد
      gpus = tf. config. experimental. list_physical_device ('gpu') اگر gpus: سعی کنید: # در حال حاضر ، رشد حافظه باید در GPU برای GPU در GPU یکسان باشد: tf. config. experimental. set_memory_growth (gpu ، true) منطقی_GPUS =tf. config. experimental. list_logical_device ('gpu') چاپ (لن (GPU) ، "GPU های فیزیکی" ، LEN (LEGICIC_GPUS) ، "GPU های منطقی") به جز RuntimeERROR به عنوان E: # رشد حافظه باید تنظیم شودچاپ اولیه (E) 
      • https://www. tensorflow.org/guide/mixed_precision
      • از آنجا که GPU من RTX2060 با قابلیت محاسبه 7. 5 من از آن استفاده کردم
       از tensorflow. keras. mixed_precision واردات آزمایشی به عنوان خط مشی mixed_precision = mixed_precision. policy ('mixed_float16') mixed_precision. set_policy (خط مشی) 
      • هیچ تاثیری در عملکرد مشاهده نکرد
      • قبل از استفاده از هر اپراتور تصادفی (مانند Shuffle) حتماً حتماً خرد کنید.
      • به طور کلی بهتر است که از اپراتور Shard در اوایل خط لوله مجموعه داده استفاده شود. به عنوان مثال ، هنگام خواندن از مجموعه ای از پرونده های TFRECORD ، قبل از تبدیل مجموعه داده به نمونه های ورودی ، Shard. این از خواندن هر پرونده در هر کارگر جلوگیری می کند. در زیر نمونه ای از یک استراتژی کارآمد Sharding در یک خط لوله کامل است:
      • در مقابل ، آرگومان buffer_size به tf. data. dataset. shuffle () بر تصادفی تحول تأثیر می گذارد. ما دگرگونی DataSet. Shuffle () (مانند tf. train. shuffle_batch () را که جایگزین می شود) طراحی کردیم تا بتوانیم مجموعه داده هایی را که برای جاسازی در حافظه بسیار بزرگ هستند ، انجام دهیم. به جای اینکه کل مجموعه داده ها را جابجا کند ، بافر عناصر بافر_size را حفظ می کند و به طور تصادفی عنصر بعدی را از آن بافر انتخاب می کند (در صورت موجود بودن آن را با عنصر ورودی بعدی جایگزین می کند). تغییر مقدار buffer_size بر چگونگی یکنواختی تغییر شکل تأثیر می گذارد: اگر بافر_ size از تعداد عناصر موجود در مجموعه داده بیشتر باشد ، یک تغییر یکنواخت دریافت می کنید. اگر 1 باشد ، به هیچ وجه تغییر نمی دهید. برای مجموعه داده های بسیار بزرگ ، یک رویکرد معمولی "به اندازه کافی خوب" این است که به طور تصادفی داده ها را یک بار قبل از آموزش به چندین پرونده تبدیل کنید ، سپس نام های پرونده را به طور یکنواخت تغییر دهید و سپس از یک بافر کوچکتر استفاده کنید. با این حال ، انتخاب مناسب به ماهیت دقیق شغل آموزش شما بستگی دارد.

      ساخت شبکه کاملاً متصل

      • افزایش اندازه تصویر از 64x64 به 191x192 (پایین تر از پایین)
      • عادی سازی دسته ای (بیش از حد پایین)
        • ، keras. layers. batchnormalization ()
        • ، keras. layers. dropout (0. 5)
        • نرخ = نگه داشتن_پروبی ، برای بیش از حد بالاتر
        • He_normal () برای فعال سازی Tanh
        • Glorotnormal () برای فعال سازی RELU نیز به آن sticalizer normal normal Xavier گفته می شود
        • هر دو نسخه طبیعی و یکنواخت دارند
        • دقت تک نقطه ای (FP16) برای عملکرد بهتر
        • نصب شده [tensorboard] (https://www. tensorflow.org/tensorboard/get_started)
        • hparams استفاده شده

        بهبود زمان آموزش

        عوامل بسیاری دیگر وجود دارد اما به ما اجازه می دهد تا عمدتاً روی اینها تمرکز کنیم تا زمان آموزش را بهبود بخشیم.

        • تقسیم قطار/آزمون: برای مجموعه داده های بزرگ ، برای کاهش زمان آموزش ، اندازه تقسیم را به جای 0. 2 یا 0. 1 انتخاب کنید ، به این ترتیب زمان آموزش با یک عامل بزرگ با هزینه عملکرد مدل ها کاهش می یابد اما ما به آن خواهیم رسیدبعداً و ببینیم که چگونه ما واقعاً می توانیم کاری را انجام دهیم تا در حین آموزش داده های بیشتری ایجاد کنیم.
        • نرخ یادگیری: این عامل واقعاً بر زمان آموزش تأثیر نمی گذارد ، بلکه من این را انتخاب کرده ام که فقط به این نکته اشاره کنم که مجموعه داده های مختلف از نرخ یادگیری مختلف درخواست می کنند ، بنابراین با استفاده از یک مقدار ثابت مانند 0. 01 یا 0. 003 یا هر مقدار نرخ یادگیری معروف دیگر برای آموزشمدل شما واقعاً به شما کمک نمی کند که شما باید نرخ های مختلف یادگیری را برای همان زمان مجموعه داده ها امتحان کنید ، مگر اینکه بهترین همگرایی را پیدا کنید اما با در نظر گرفتن اینکه اگر مجموعه داده خیلی بزرگ باشد ، تلاش می کند نرخ یادگیری مختلف بسیار مشکل ساز باشد وزمان بر. و برای همین ما چیزی به نام کاهش LR در فلات داریم. در نکته بعدی به آن خواهیم دید.
        • کاهش LR در فلات - هنگامی که یک متریک متوقف شده است ، میزان یادگیری را کاهش دهید. مدل ها اغلب از کاهش نرخ یادگیری توسط یک عامل 2-10 پس از یادگیری راکدها بهره مند می شوند. این پاسخ به تماس یک مقدار را کنترل می کند و در صورت عدم بهبود تعداد دوره های "صبر" ، میزان یادگیری کاهش می یابد. به شما همگرایی بهتری می بخشد. شما قادر خواهید بود این عملکرد پاسخ به تماس را در Keras و Tensorflow پیدا کنید.
        • افزایش داده ها - برای به دست آوردن داده های بیشتر ، فقط باید تغییرات جزئی را در مجموعه داده های موجود ما ایجاد کنید. تغییرات جزئی مانند تلنگر یا ترجمه یا چرخش. شبکه عصبی ما فکر می کند که به هر حال اینها تصاویر متمایز هستند. یک شبکه عصبی حلقوی که می تواند با استحکام اشیاء را طبقه بندی کند ، حتی اگر گفته شود که در جهت گیری های مختلف قرار گرفته است ، این ملک را به نام تغییر نامگذاری می کند.
        • لایه های متراکم - پس از انجام همه اینها ، در پایان نیازی به استفاده از تعدادی از لایه های متراکم نخواهید داشت و به جای جمع آوری و حداکثر و به دنبال آن یک لایه متراکم و حداکثر و سپس یک لایه متراکم و به دنبال آن لایه خروجی کافی خواهد بوددقت بالای معیار خود را به دست آورید و زمان کلی آموزش را کاهش دهید.
        • ترک تحصیل - برای مدت زمان بهتر تمرین و جلوگیری از اتصالات ، ترک تحصیل را از 0. 2 به 0. 25 افزایش دهید.
        • دوره ها - برای بهبود در زمان آموزش ، تعداد دوره ها را به 30-35 کاهش می دهد. این شماره ایده آل من است. اگر این مناسب شما نباشد ، من کاملاً مطمئن هستم که شما را پیدا خواهید کرد.

        هدف بهینه سازی ما تعقیب آن نقطه شیرین است که از دست دادن مدل ما کم است ، که وقتی پارامترهای شما به روش صحیح تنظیم می شوند ، اتفاق می افتد. بنابراین به جای افزایش تعداد لایه ها سعی در تنظیم هایپرپارامترها دارد. همچنین ، تعداد پارامترهای مورد نیاز شما متناسب با پیچیدگی کاری است که مدل شما باید انجام دهد.

        عوامل دیگری مانند عادی سازی دسته ای ، نمونه گیری تصادفی ، تعصبات طبیعی ، مقیاس بندی ویژگی ها ، اصطلاحات منظم وجود دارد ، اما این موارد به جز مقیاس بندی ویژگی ها بسیار ضروری نیستند ، شما باید تقریباً در همه جا این کار را انجام دهید.

        برخی از یادداشت های تصادفی در مورد ترک تحصیل عملکرد را بدتر می کند

        • علاوه بر این ، مراقب باشید که از Dropout استفاده می کنید. معمولاً در لایه های حلقوی بی اثر است و استفاده از آن درست قبل از لایه SoftMax بسیار مضر است.
        • Dropout یک تکنیک منظم است و در جلوگیری از افزایش بیش از حد مؤثر است. با این حال ، چندین مکان وجود دارد که ترک تحصیل می تواند به عملکرد آسیب برساند.
          • درست قبل از آخرین لایه. این به طور کلی مکان بدی برای استفاده از ترک تحصیل است ، زیرا شبکه توانایی "اصلاح" خطاهای ناشی از ترک تحصیل را قبل از وقوع طبقه بندی ندارد. اگر من به درستی خواندم ، ممکن است شما را درست قبل از SoftMax در Iris MLP قرار داده باشید.
          • هنگامی که شبکه نسبت به مجموعه داده کوچک است ، تنظیم مجدد معمولاً غیر ضروری است. اگر ظرفیت مدل در حال حاضر کم باشد ، کاهش بیشتر با افزودن منظم ، به عملکرد آسیب می رساند. من متوجه شدم که بیشتر شبکه های شما نسبتاً کوچک و کم عمق بودند.
          • وقتی زمان آموزش محدود است. مشخص نیست که آیا این مورد در اینجا وجود دارد ، اما اگر تا زمان همگرایی تمرین نکنید ، ترک تحصیل ممکن است نتایج بدتری داشته باشد. معمولاً ترک تحصیل در ابتدای تمرین به عملکرد آسیب می رساند ، اما منجر به خطای نهایی "همگرا" می شود. بنابراین ، اگر قصد ندارید تا زمان همگرایی تمرین کنید ، ممکن است بخواهید از ترک تحصیل استفاده نکنید.
          • سرانجام ، می خواهم ذکر کنم که تا آنجا که می دانم ، ترک تحصیل به ندرت از نوووایز استفاده می شود ، با تکنیکی که به عنوان عادی سازی دسته ای شناخته می شود ، مورد استفاده قرار می گیرد. البته این بدان معنا نیست که ترک تحصیل ابزاری معتبر و مؤثر برای امتحان کردن نیست.
          • من همچنین متوجه می شوم که شما یک تابع فعال سازی را برای آخرین لایه تعریف نکرده اید: keras. layers. dense (10) ، اگر از دست دادن یک متقاطع را تعریف کنید ، باید به عنوان خروجی شبکه خود ، به عنوان مثال keras. layers ، احتمال بیشتری کسب کنید. متراکم (10 ، فعال سازی = 'softmax')
          • چرا دقت اولیه 0 است: از آنجا که دقت شما بسیار کم است ، بسیار محتمل است که در چند دسته اول هیچ یک از نمونه ها به درستی طبقه بندی نمی شوند. مخصوصاً وقتی یک دسته کوچک دارید. این امر باعث می شود که در ابتدای آموزش شما 0 باشد.
          • مدل ما نزدیک به 1 میلیون پارامتر رایگان دارد اما فقط 60،000 نقطه داده آموزشی است. از چه چیزی باید نگران باشیم؟جواب بیش از حد است. و برای کمک به کاهش بیش از حد ، ما همیشه ترک تحصیل اضافه می کنیم. به طور معمول ما پس از لایه هایی که پارامترهای رایگان دارند ، ترکیبی را اضافه می کنیم: در این حالت ، قبل از اولین لایه متراکم و قبل از لایه متراکم دوم. ما ترک تحصیل = 40 ٪ را تنظیم کرده ایم ، اما می تواند بین 20 ٪ تا 50 ٪ باشد. کد ما اکنون به این شکل است:
          • از دست دادن wiggly
            • این همان چیزی است که من انتظار دارم که یک ضرر اعتبار سنجی به نظر برسد اگر مجموعه اعتبارسنجی شما کوچک باشد و از نرخ یادگیری بالا استفاده می کنید
            • خوب ، من در واقع تمام مدلها (یک در هر دوره) و به طور متوسط سه مدل برتر (با میانگین هارمونیک ، که به دلیل برخی از دلایل مات بهتر از میانگین ساده یا هندسی کار می کند) ذخیره می کنم و در واقع نتایج بهتری می بخشد.
            • هنگامی که اندازه دسته ای را از 16 به 128 افزایش دادم ، مشکل نوسانات من حل می شود.
            • با تنظیم dtypye به uint حل می شود
            • file. create_dataset ('set_x' ، data = set_x ، dtype = 'uint8')
            • 5. 4 گیگابایت به 700 مگابایت کاهش یافته است
            • تاکنون هیچ کاهش در عملکرد مدل (دقت 60 ٪)
            • set_xy = (np. empty (شکل = (loop_range) ، dtype = 'uint8') ، np. empty (شکل = (loop_range ، img_size ، img_size ، 3)))
            • سقوط کرد
            • مجبور شد از 6 هسته با استفاده از استخر چند پردازش استفاده کند
            • هنگامی که این روند فراخوانی شد ، تعداد تصادفی مشابه تولید می شد. من باید بذر را منتقل کنم ، اما نمی توانم آن را به عنوان عبور 3 متغیر در استخر. map / pool. starmap در حال تبدیل شدن به یک چالش
            • با استفاده از متغیر تاریخ در نام پرونده حل شد
            • در اوایل من از 64x64 تصاویر استفاده کردم اما به نظر می رسید که این مدل با دقت 50 ٪ گیر کرده است. شاید دوره های بیشتری به شما کمک کند؟مطمئن نیستم
            • تخصیص آرایه با شکل (156816 ، 36 ، 53806) و نوع داده UINT8 امکان پذیر نیست
            • پس از افزایش اندازه صفحه ثابت شد .. مطمئن نیستم که چگونه
            • Alteate solution : echo 1>/proc/sys/vm/overcommit_memory [محاکمه نشده است]
            • منبع: https://stackoverflow.com/questions/57507832/unable-to-allocate-array-with-shape-and-data-type
            • چاپ (set_x. dtype) UINT8 را به شما می دهد زیرا من تصاویر را در آن قالب ذخیره کرده ام زیرا فضای کمتری نیز به طول می انجامد اما هر عملیاتی مانند تفریق و تقسیم ، آن را به float32 تبدیل می کند و در نتیجه فضا را نفخ می کند و از این رو خطای حافظه
            • چاپ (set_x. nbytes/1024/1024) 3. 5 گیگابایت می دهد
            • راه حل است
                1. تبدیل آرایه به float32 یا float16 (اما بسیاری از روش ها انتظار float32 را دارند)
              • از keras. layers. batchnormalization استفاده کنید ()
              • هدف این بود که از مدل یعنی دقت آموزش به 99 ٪ استفاده کنید
              • شکل تصاویر را از 64x64 به 192x192 افزایش داد. اندازه های دیگر مانند
                • 128 (بهتر از 64 بود)
                • 256 (اندازه آرایه را افزایش می داد)
                • در حال حاضر با 192x192 حل و فصل شد
                • date_window از 20 به 15 کاهش یافت
                • keel_regularizer = keras. regularizer. l2 (0. 001))
                • Keel_initializer = 'glorotnormal'
                  • پیش فرض Glorotuniform (که لباس Xavier است)
                  • طبق این دوره توسط Andrew Ng و مستندات Xavier ، اگر از RELU به عنوان عملکرد فعال سازی استفاده می کنید ، بهتر است اولیه سازنده وزن پیش فرض (که یکنواخت Xavier است) را به حالت عادی تغییر دهید
                  • مقالات جالب در اینجا مرتبط است: https://stats. stackexchange.com/questions/339054/what-values-should-initial-weights-for-a-u-network-be
                  • اگر کمی عمیق تر حفر کرده اید ، به احتمال زیاد فهمیدید که اگر عملکرد فعال سازی یک TANH باشد ، باید از اولیه سازی Xavier / Glorot استفاده کنید ، و اینکه اولیه سازی او در صورت عملکرد فعال سازی یک RELU است. منبع: https://towardsdatascience.com/hyper-parameters-in-action-part-ii-weight-initializers-35aee1a28404
                  • من از این استفاده خواهم کرد
                  • پس از برداشتن لایه های BN ، VAL ACC برای دوره اول از 25 ٪ به 49 ٪ افزایش یافت.
                  def calcarraymemorysize (آرایه): بازگشت "اندازه حافظه:" + str (array. nbytes/1024/1024) + چاپ "mb" (calcarraymmorysize (np. random. randint (0،255 ، size = (100،64،64،64،64. 3))) چاپ (calcarraymemorysize (np. random. random (size = (100،64،64،3))))) چاپ (calcarraymemorysize (np. random. random_sample (اندازه = (100،64،64،3))) چیزی اشتباه #Memory: 9. 375 مگابایت #Memory IS: 9. 375 MB #Memory IS: 9. 375 MB 
                  • خطای عادی سازی
                    • set_x = set_x. astype ("float32") / 255
                    • MemoryError: امکان اختصاص 24. 2 GIB برای یک آرایه با شکل (58842 ، 192 ، 192 ، 3) و نوع داده float32 وجود ندارد
                    • برای استفاده از معیارهای F1 از TFA (tensorflowaddons) ، y باید یک رمزگذاری شده داغ باشد
                      • معیارها = ["دقت" ، tfa. metrics. fbetascore (num_classes = 3 ، میانگین = "میکرو" ، آستانه = هیچ)]
                      • و از ضرر = tf. keras. losses. categoriccrossentropy استفاده کنید ()
تجارت گزینه های دودویی در ایران...
ما را در سایت تجارت گزینه های دودویی در ایران دنبال می کنید

برچسب : نویسنده : زین‌العابدین مراغه‌ای بازدید : <-PostHit-> تاريخ : شنبه 2 ارديبهشت 1402 ساعت: 22:23