icon icon Home
icon icon Accounts
icon icon Quick start
icon icon Symbols

اسکالپر کیست؟ همه چیز درباره اسکالپ تریدینگ

نویسنده
sana
sana

سنا دانش آموخته کارشناسی ارشد فیزیک ذرات بنیادی از دانشگاه اراک است. او فعالیت حرفه‌ای خود را به عنوان مدرس فیزیک و کارشناس فروش آغاز کرد و چندین سال در این زمینه مشغول به فعالیت بوده است. سپس به حوزه تولید محتوا روی آورده و پس از مدتی به طور ویژه به تولید محتوای بازارهای مالی ادامه داده است. ترکیب تجربه تدریس مفاهیم پیچیده علمی به زبان ساده و قابل فهم و نیز تجربه فروش، یادگیری مهارتهای ارتباطی قوی، درک بازار و دیدگاه چند بعدی در تولید محتوای تخصصی او در حوزه بازارهای مالی کاملا مشهود است. با سنا از طریق زیر می‌توانید در ارتباط باشید: sana-academy@aron-groups.com

Author
بازبینی کننده
کارشناس اقتصادی
Author
کارشناس اقتصادی

کارشناس اقتصادی در آرون گروپس.

calendar آخرین بروزرسانی: 2 روز پیش
watch زمان مطالعه 1 دقیقه

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

اگر به این موضوع علاقمندید، تا پایان مقاله با ما همراه باشید.

مفهوم استراتژی اسکالپینگ در فارکس

استراتژی اسکالپینگ در فارکس یک استراتژی معاملاتی فوق سریع است. هدف استراتژی اسکالپینگ (Scalping) کسب سودهای اندک از حرکت‌های بسیار کوچک قیمت -گاه حتی در حد یک یا دو پیپ- است. هر معامله در اسکالپینگ، ممکن است از چند ثانیه تا حداکثر چند دقیقه طول بکشد و سود هر معامله نیز، بسیار ناچیز است. بدین ترتیب، اسکالپر (یعنی ‌معامله‌گری که از استراتژی اسکالپینگ استفاده می‌‌کند)، ممکن است مجبور شود تا صدها معامله را در طول یک سشن معاملاتی باز کند و ببندد تا بتواند به یک سود معمولی در پایان روز برسد. 

اما حتی انجام صدها معامله در روز نیز برای رسیدن به یک سود معمول کافی نیست و اغلب اسکالپرها، برای رسیدن به این هدف مجبور به استفاده از اهرم معاملاتی (Leverage) در معاملات خود می‌‌شوند. استفاده از لوریج  اگرچه می‌‌تواند به سود بیشتر ‌معامله‌گر منجر شود، اما به همان نسبت می‌‌تواند ضررها را نیز افزایش داده و ریسک معاملات اسکالپ را به شدت بالا ببرد.

scalp در فارکس

اصول اولیه در استراتژی اسکالپینگ

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

  • انتخاب بروکر مناسب؛
  • تسلط بر پلتفرم معاملاتی؛
  • توجه به نقدشوندگی (Liquidity) بازار؛
  • دسترسی به ابزارهای مناسب؛
  • انتخاب تایم فریم مناسب.

انتخاب بروکر مناسب

در انتخاب بروکر، به هزینه‌های معاملاتی (مانند اسپرد، کمیسیون و …)، مارجین مورد نیاز و اهرم‌های معاملاتی که در اختیارتان قرار می‌‌گیرد دقت کنید. همچنین، قوانین بروکر را در مورد نحوه برخورد بروکر با استفاده از اهرم‌های معاملاتی و کال مارجین شدن معامله کنید. 

به علاوه، از بروکر خود سوال کنید که آیا برای اجرای معاملات در سطوح درخواستی ضمانتی ارائه می‌‌دهد یا خیر.  اجرای معاملات در سطوحی غیر از سطوح درخواستی به نام لغزش قیمت (Slippage) شناخته می‌‌شود که برای معاملات اسکالپ مثل یک سم مهلک است. این موضوع از آن نظر اهمیت دارد که برخی از بروکرها، ممکن است اجرای معاملات در سطوح درخواستی را تنها در بازارهای کم نوسان تضمین کنند و نه در همه شرایط بازار.

تسلط بر پلتفرم معاملاتی

بعد از انتخاب بروکر، باید پلتفرم معاملاتی که بروکر در اختیارتان قرار می‌‌دهد را به طور کامل بشناسید. این شناخت از آن جنبه ضروری است که معاملات اسکالپ با سرعت فوق العاده بالا انجام می‌‌شوند و شما، نمی‌‌توانید برای دسترسی به هر ابزار زمان زیادی را صرف کنید و یا دکمه اشتباه را فشار دهید!

پیشنهاد می‌‌شود که قبل از شروع معاملات واقعی، یک حساب دمو باز کنید و تا وقتی که به طور کامل به پلتفرم معاملاتی مسلط نشده‌اید، روی سرمایه خود ریسک نکنید.

توجه به نقدشوندگی (Liquidity) بازار

در هنگام انجام معاملات اسکالپ، نمی‌‌توانید خیلی منتظر پیدا شدن طرف دوم معامله بمانید؛ همه زمانی که برای باز کردن و بستن معامله دارید، اغلب چند ثانیه است و نه بیشتر!

 به همین دلیل است که نقدینگی (نقدشوندگی) بازاری که در آن معامله می‌‌کنید، یکی از اصول اولیه در استراتژی اسکالپینگ است. از آنجا که بازار ارزهای خارجی یا فارکس نقدشونده‌ترین بازار دنیاست، استفاده از استراتژی اسکالپینگ در فارکس عمومیت بیشتری نسبت به دیگر بازارها دارد.

دسترسی به ابزارهای مناسب

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

انتخاب تایم فریم مناسب

برای انجام معاملات اسکالپ، نمودار قیمت و تایم فریم مناسب را انتخاب کنید. استفاده از تیک چارت و تایم فریم‌های 1 و 5 دقیقه می‌‌توانند انتخاب‌های مناسبی باشند.

ابزارهای تحلیل مورد استفاده در اسکالپینگ

اسکالپرها برای انجام معاملات خود به طور کامل به تحلیل تکنیکال تکیه می‌‌کنند و با تحلیل فاندامنتال سروکاری ندارند. اندیکاتورها، خطوط روند و الگوهای قیمت از ابزارهای مفید و مورد استفاده اسکالپرها هستند که همگی، در تعیین نقاط ورود و خروج به معاملات اسکالپ به ‌معامله‌گران کمک می‌‌کنند. برخی از اندیکاتورها و ابزارهای تحلیل مورد استفاده در اسکالپینگ عبارتند از:

  • اندیکاتور مووینگ اوریج برای تشخیص روند حرکت قیمت؛
  • اندیکاتور استوکاستیک برای تعیین نقاط اشباع خرید و اشباع فروش و تعیین سرعت و مومنتوم حرکت قیمت؛
  • اندیکاتور  RSI برای تعیین سرعت و بزرگی حرکت قیمت و نیز تعیین نقاط برگشت احتمالی؛
  • اندیکاتور پارابولیک سار برای شناسایی نقاط برگشت احتمالی قیمت؛
  • و اندیکاتور MACD برای شناسایی تغییرات احتمالی در روند قیمت. 
استراتژی اسکالپ

استراتژی‌های ورود و خروج در اسکالپینگ

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

  • استراتژی‌های مبتنی بر روند ( trend trading)؛
  • استراتژی‌های ضد روند (Countertrend Trading)؛
  • معامله رنج (Range Trading)؛
  • معامله شکست (Breakout trading).

استراتژی‌های مبتنی بر روند

در استراتژی‌های مبتنی بر روند، ‌معامله‌گر در جهت روند وارد معامله شده و پس از کسب سود مورد نظر، از معامله خارج می‌‌شود. برخی از  استراتژی‌ها و ابزارهای مبتنی بر روند عبارتند از:

  • مووینگ اوریج؛
  •  اندیکاتور RSI؛
  •  استراتژی خط روند؛
  • و الگوهای حرکت قیمت (مانند الگوی پرچم).

استراتژی‌های ضد روند

در استراتژی‌های ضد روند، ‌معامله‌گر در خلاف جهت روند وارد معامله می‌‌شود. به عنوان مثال، ممکن است یک ‌معامله‌گر روی یک دارایی که در روند صعودی است وارد معامله Short شود، چون فکر می‌‌کند که قیمت به زودی کاهش خواهد یافت و روند نزولی می‌‌شود.

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

  • اندیکاتورهای تایید کننده روند مانند RSI؛
  • و الگوهای برگشتی قیمت.

معامله رنج

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

معامله شکست

در استراتژی معامله شکست -که یکی از محبوبترین استراتژی‌های اسکالپینگ است- ‌معامله‌گر به دنبال معامله روی روندهای کوچک جدیدی است که از شکست کانال قیمت و به واسطه‌ی عبور قیمت از خطوط مقاومت و حمایت به وجود می‌‌آیند.

زمان مناسب برای اجرای استراتژی اسکالپینگ

از آن جهت که بازار فارکس نقدشونده‌ترین بازار دنیاست، بهترین بازار برای استراتژی اسکالپینگ نیز هست. با این وجود، توجه به این نکته ضروری است که میزان نقدینگی در تمام طول شبانه‌روز در بازار فارکس به یک اندازه نیست. 

بیشترین میزان نقدینگی در بازار فارکس، در طول سشن‌های لندن و نیویورک مشاهده می‌‌شود در نتیجه، بهترین زمان برای اجرای استراتژی اسکالپینگ در فارکس نیز، در طول سشن‌های لندن و نیویورک و  به ویژه زمان هم‌پوشانی این دو سشن است. به علاوه، در طول این سشن‌های معاملاتی، بازار نوسانات بسیار زیادی را تجربه می‌‌کند که بسیار برای اسکالپرها مطلوب است.

به جز زمان مناسب اسکالپ با توجه به شرایط بازار، بایستی به خودتان و اینکه آیا در شرایط مناسبی برای شروع معاملات اسکالپ هستید یا خیر نیز توجه کنید. برای این کار، بهتر است که در زمان‌های زیر به هیچ عنوان معامله نکنید:

  • اگر خسته هستید؛
  • اگر دور و برتان شلوغ است؛
  • اگر شرایط پر استرسی را می‌‌گذرانید؛
  • اگر شب گذشته درست یا به اندازه کافی نخوابیده‌اید؛
  • اگر بیمار هستید و یا علائم شروع بیماری را نشان می‌‌دهید؛
  • اگر معاملات ناموفقی داشته‌اید و ممکن است معاملات انتقامی ‌‌انجام دهید.

مدیریت ریسک در استراتژی اسکالپینگ

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

از طرفی، اگر ‌معامله‌گر روی دور بدشانسی باشد و در تعداد زیادی از صدها معامله‌ای که در طول روز انجام می‌‌دهد ضرر کند، حساب اسکالپر می‌‌تواند با خطر دراودان (Drawdown) مواجه شود. یک ریسک دیگر که قبلتر هم به آن اشاره کردیم، خطر لغزش قیمت (Slippage) است که می تواند ریسک معاملات اسکالپ را به شدت بالا ببرد.

با این تفاصیل، ناگفته پیداست که رعایت اصول مدیریت ریسک در استراتژی اسکالپینگ جزو واجبات است. برخی از تکنیک‌های مدیریت ریسک در اسکالپینگ عبارتند از:

  • استفاده از دستورهای استاپ (Buy/Sell Stop) و لیمیت (Buy/Sell Limit)؛
  • رعایت قانون 1%؛
  • داشتن تریدینگ پلن.

استفاده از دستورهای استاپ و لیمیت

استفاده از این دستورها، ضمن اتوماتیک کردن  بخش زیادی از معاملات و راحت‌تر کردن کار ‌معامله‌گر، به وی کمک می‌‌کند که هیچ وقت بیش از اندازه در یک معامله نماند. کاربرد دیگر این دستورها این است که اگر بازار در خلاف جهت ‌معامله‌گر حرکت کرد، معامله به صورت خودبخود بسته و جلوی گسترش ضرر گرفته شود.

رعایت قانون 1%

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

داشتن تریدینگ پلن

اسکالپینگ نیازمند نظم و پیروی از قواعد سختگیرانه است بنابراین، داشتن تریدینگ پلن که به شما بگوید روی کدام دارایی، به چه شکلی، در چه زمانی، به چه مدت و برای رسیدن به چه هدف سودی معامله کنید، می‌تواند به موفق شدن در معاملات اسکالپ کمک کند.

استراتژی اسکالپینگ در فارکس

مزایا و معایب استراتژی اسکالپینگ

در ادامه قصد داریم به مزایا و معایب استراتژی اسکالپینگ بپردازیم.

مزایای استراتژی اسکالپینگ عبارتند از:

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

معایب استراتژی اسکالپینگ عبارتند از:

  • هر  معامله هزینه‌های مربوط به خودش را دارد بنابراین، واضح است که هزینه معاملات در اسکالپینگ بالاست؛
  • استفاده از لوریج برای اینکه سود معاملات افزایش یابد، باعث می‌‌شود که همزمان ریسک اسکالپینگ نیز به شدت بالا برود؛
  • ممکن است انجام معاملات اسکالپ در برخی از حساب‌های خاص در برخی کشورها غیرقانونی باشد؛
  • اسکالپینگ بسیار زمان‌بر و انرژی‌گیر است و یک تمرکز لیزری و فوق العاده را طلب می‌‌کند که برای بسیاری از تریدرها سخت و یا ناممکن است.

تأثیر نوسانات بازار بر اسکالپینگ

یکی از مهمترین عوامل ایجاد نوسانات در بازار، انتشار اخبار اقتصادی مثل داده‌های کلان اقتصادی و یا اعلام نرخ بهره بانک‌های مرکزی (به ویژه فدرال رزرو) است. اگرچه یک اسکالپر به هیچ عنوان به دنبال نحوه‌ی تاثیر این اخبار بر ارزش دارایی‌ها نیست، اما به شدت از نوسانات ایجاد شده تحت تاثیر این اخبار استقبال می‌‌کند؛ زیرا هر چه نوسانات در بازار زیادتر شود، فرصت‌های معاملاتی برای اسکالپرها نیز بیشتر خواهد شد. به علاوه، در یک بازار با نوسانات شدید، مقدار سودی که از هر معامله بدست می‌‌آید می‌تواند بیشتر باشد.

نوسانات ناشی از انتشار اخبار، از یک جنبه دیگر هم برای اسکالپرها (که به دنبال تغییرات سریع قیمت در بازار هستند) مهم هستند و آن اینکه، می‌‌توانند خیلی سریع به وجود آمده و سریع نیز فروکش کنند.

پیشنهاد می‌کنیم مطالعه کنید: بهترین جفت ارز برای اسکالپ در فارکس کدامند؟

روانشناسی معامله‌گر در اسکالپینگ

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

اسکالپر باید بتواند در تمام ساعت‌های سشن معاملاتی جلوی سیستم کامپیوتر خود بنشیند و صدها معامله را باز کند و ببندد؛ در حالی که حرکت‌های بسیار کوچک قیمت – گاه حتی یک یا دو پیپ- را به دقت تحت نظر دارد و به آنها واکنش نشان می‌‌دهد.

به علاوه، معاملات اسکالپ جایی برای فکر کردن زیاد و تصمیم گرفتن در وقت مناسب ندارند بلکه، اسکالپر باید بسیار سریع بدون ذره‌ای تردید اقدام کند. به عنوان مثال، فرض کنید بازار 2 پیپ بر علیه تریدر حرکت کند و او با تردید خودش، اجازه بدهد که این حرکت به 4 پیپ برسد. در چنین شرایطی، تریدر به احتمال زیاد نه تنها سرمایه خود را از دست داده است بلکه، به خاطر اهرم معاملاتی که استفاده کرده به بروکرش نیز بدهکار خواهد شد.

همچنین، اسکالپر باید بتواند خیلی سریع و پس از سود بسیار اندک، معامله سودده خود را ببندد و طمع‌کار نباشد. در عین حال که تحمل استرس زیاد خسته و آزرده‌اش نمی‌‌کند بلکه، باعث افزایش هیجان وی نیز می‌‌شود.

اسکالپینگ در مقایسه با سایر استراتژی‌ها

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

از طرفی، اسکالپینگ به دنبال شکار حرکت‌های بسیار کوچک قیمت است در حالیکه، استراتژی‌هایی مثل سوئینگ تریدینگ به دنبال حرکت‌های بزرگ قیمت و سود گرفتن از آنها هستند.

نتیجه‌گیری

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

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

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

منبع: td, investopedia, investopedia

calendar مهر 28, 1403
به این مقاله امتیاز بدهید

Leave a Reply

Your email address will not be published. Required fields are marked *

`; // Select the inner section where the comment should be placed const contentWrapper = cardTemplate.querySelector('.gradient-card-content'); // Move the comment into the template contentWrapper.appendChild(comment); // Add the template to the wrapper wrapper.appendChild(cardTemplate); // Add the constructed wrapper to the comment list commentListWrapper.appendChild(wrapper); }); comments.forEach((comment) => { // Select the comment-body element const commentBody = comment.querySelector('.comment-body'); const meta = comment.querySelector('.comment-meta.commentmetadata'); const reply = comment.querySelector('.reply'); if (commentBody) { // Create a new
with a specific class const newDiv = document.createElement('div'); newDiv.classList.add('custom-wrapper'); // Add the desired class // Append the new
to the comment-body commentBody.appendChild(newDiv); newDiv.appendChild(meta) newDiv.appendChild(reply) } }); -->
نه ممنون
Table of contents
`; const initializeAccordion = () => { const accordionHeaders = document.querySelectorAll(".accordion__header"); accordionHeaders.forEach((item) => { item.addEventListener("mouseup", () => { item.classList.toggle("open"); }); }); }; if (newSingleBlogPost != null || newSingleBlogPost != undefined) { // add table of content after first child in base content const firstChild = baseContent.firstElementChild.firstElementChild.firstElementChild; // Convert the table of content HTML string to a DOM element const tempDiv = document.createElement("div"); tempDiv.innerHTML = tableOfContentHTML; const tableOfContentElement = tempDiv.firstElementChild; if (firstChild) { baseContent.firstElementChild.firstElementChild.insertBefore(tableOfContentElement, firstChild.nextElementSibling); } // Set accordion click after table of content add to DOM initializeAccordion(); // Select all h2 and h3 elements const headings = document.querySelectorAll(".base_content h2, .base_content h3"); // Add data-id attribute to each heading headings.forEach((heading) => { const text = heading.textContent.trim(); const id = text .replace(/\s+/g, "_") .replace(/[^\w\u0600-\u06FF_]/g, "") .toLowerCase(); heading.setAttribute("data-id", id); }); // Create dynamic table of contents const tocWrapper = document.querySelector(".tocWrapper"); tocWrapper.innerHTML = ""; // Clear any existing content let currentH2 = null; // Variable to store the current h2 being processed headings.forEach((heading,index) => { if (heading.tagName === "H2") { // Create a link for h2 headings const link = document.createElement("a"); link.href = `#${heading.getAttribute("data-id")}`; link.textContent = heading.textContent; link.classList.add("h2"); link.classList.add("scroll-tag"); // Create a list item for h2 const listItem = document.createElement("div"); listItem.classList.add("item"); listItem.appendChild(link); // Append the list item for the h2 tocWrapper.appendChild(listItem); // Set the current h2 to this heading currentH2 = listItem; } else if (heading.tagName === "H3" && currentH2) { // Create a link for h3 headings as a subitem of the current h2 const link = document.createElement("a"); link.href = `#${heading.getAttribute("data-id")}`; link.textContent = heading.textContent; link.classList.add("h3"); link.classList.add("scroll-tag"); // Create a subitem for h3 and append it to the current h2 item const subItem = document.createElement("div"); subItem.classList.add("sub-item"); subItem.appendChild(link); // Append the subitem to the current h2's list item currentH2.appendChild(subItem); } }); // Scroll to the section when a TOC item is clicked tocWrapper.addEventListener("click", (e) => { e.preventDefault() if (e.target.tagName === "A") { const targetId = e.target.getAttribute("href").substring(1); const targetElement = document.querySelector(`[data-id="${targetId}"]`); if (targetElement) { // Scroll to the element, but adjust for the header height const targetOffset = targetElement.getBoundingClientRect().top + window.scrollY - 84; window.scrollTo({ top: targetOffset, behavior: "smooth" }); e.preventDefault(); } } }); const tableOfcontent = document.querySelector('.table_of_contents'); const tagleOfContentTitle = tableOfcontent.querySelector('.title span') const translateTableOfContent = () => { const language = getLanguageKey(); if (language === "fa") { tagleOfContentTitle.textContent = "فهرست مطالب"; } else if (language === "ar") { tagleOfContentTitle.textContent = "جدول المحتويات"; } else { tagleOfContentTitle.textContent = "Table of Content"; } }; // فراخوانی تابع ترجمه translateTableOfContent(); // Copy logic // Localized messages for different languages const messages = { en: { initial: "Copy link", copied: "Copied!", }, fa: { initial: "کپی لینک", copied: "کپی شد!", }, ar: { initial: "نسخ الرابط", copied: "تم النسخ!", }, }; // Function to detect language and match messages function getLanguageKey () { const lang = document.documentElement.lang.toLowerCase(); if (lang.includes("fa")) return "fa"; if (lang.includes("ar")) return "ar"; return "en"; }; // Function to update button text based on language const updateButtonText = (button, state = "initial") => { const langKey = getLanguageKey(); button.textContent = messages[langKey]?.[state] || messages.en[state]; }; // Function to change button background color const updateButtonBackgroundColor = (button, color) => { button.style.backgroundColor = color; }; // Initialize button text and background color on page load window.addEventListener("load", () => { const copyButton = document.querySelector(".copy_btn"); updateButtonText(copyButton); updateButtonBackgroundColor(copyButton, "#f9c43e"); // Initial color }); // Add click event listener to copy URL and update button text and color document.querySelector(".copy_btn").addEventListener("click", function () { const copyButton = this; const currentUrl = window.location.href; navigator.clipboard .writeText(currentUrl) .then(() => { updateButtonText(copyButton, "copied"); updateButtonBackgroundColor(copyButton, "#cacaca"); // Change color on click setTimeout(() => { updateButtonBackgroundColor(copyButton, "#f9c43e"); // Reset color after 3 seconds updateButtonText(copyButton); // Reset text after 3 seconds }, 3000); // 3-second timeout }) .catch((err) => { console.error("Failed to copy:", err); }); }); // rate popup click function /** * Initialize popup functionality for rate popups. * @param {HTMLElement} trigger - Element that triggers the popup. * @param {HTMLElement} popup - Popup element to display. * @param {HTMLElement} overlay - The overlay element. * @param {HTMLElement} closeButton - Button to close the popup. */ function initRatePopup(trigger, popup, overlay, closeButton) { // Show the popup when the trigger is clicked if (trigger) { trigger.addEventListener("click", () => { setTimeout(()=>{ openModal(popup, overlay); },1000) }); } // Add event listener to the overlay for closing the modal overlay.addEventListener("click", () => closeModal(popup, overlay)); // Hide the popup when the close button is clicked if (closeButton) { closeButton.addEventListener("click", () => { closeModal(popup, overlay); }); } } // Initialize the rate popup const rateStarsWrapper = document.querySelectorAll(".rate_stars_wrapper"); const ratePopup = document.querySelector(".rate_popup"); const closeRatePopupBtn = document.querySelector(".no_thanks"); rateStarsWrapper.forEach((element)=>{ initRatePopup(element, ratePopup, overlay, closeRatePopupBtn); }) window.addEventListener("load", () => { // Bonus popup functions const popup = document.querySelector(".bonus_popup"); if (!popup) return; // Exit if popup doesn't exist let isPopupShown = false; let hasScrolled = false; // Listener for scroll event const handleScroll = () => { if (isPopupShown || hasScrolled) return; // Prevent multiple triggers hasScrolled = true; setTimeout(() => { popup.classList.add("show"); isPopupShown = true; // Remove the event listener after showing the popup window.removeEventListener("scroll", handleScroll); }, 0); }; window.addEventListener("scroll", handleScroll); // Close popup functionality const closeIcon = popup.querySelector(".close_icon"); if (closeIcon) { closeIcon.addEventListener("click", () => { popup.classList.remove("show"); popup.classList.add("hide"); // Remove the hide class after animation completes popup.addEventListener( "transitionend", () => { popup.classList.remove("hide"); }, { once: true } ); }); } // Suggested Article Popup Logic const suggestedPopup = document.querySelector(".suggested_article_popup"); if (suggestedPopup) { const timeout = parseInt(suggestedPopup.getAttribute("data-timeout"), 10) || 0; setTimeout(() => { suggestedPopup.classList.add("show"); const closeSuggestedIcon = suggestedPopup.querySelector(".close_btn_wrapper"); if (closeSuggestedIcon) { closeSuggestedIcon.addEventListener("click", () => { suggestedPopup.classList.remove("show"); suggestedPopup.classList.add("hide"); suggestedPopup.addEventListener( "transitionend", () => { suggestedPopup.classList.remove("hide"); }, { once: true } ); }); } }, timeout); } }); } -->