برو به محتوای اصلی

تریدینگ ویو

چطور توی Pine Script معامله با لوریج رو شبیه‌سازی کنیم

مبانی کار

تمام اسکریپت‌های استراتژی که با Pine Script® ورژن ۴ به بالا نوشته شدن، به‌صورت پیش‌فرض از شبیه‌سازی معامله با لوریج (Leverage Trading) پشتیبانی می‌کنن. یعنی شما می‌تونی توی بک‌تست‌هات شرایطی رو شبیه‌سازی کنی که معامله‌گر برای باز کردن پوزیشن‌های بزرگ‌تر، از بروکر قرض می‌گیره، در حالی‌که سرمایه‌ی خودش کمتره

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

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

در استراتژی‌های نوشته‌شده با Pine Script®، مقدار لوریجی که برای معاملات لانگ و شورت شبیه‌سازی می‌شه از طریق گزینه‌های
"Margin for long positions" و "Margin for short positions"
در تب Properties تنظیمات اسکریپت مشخص می‌شه.
این گزینه‌ها نشون می‌دن که چه درصدی از ارزش کل پوزیشن باید از موجودی حساب تأمین بشه تا استراتژی بتونه باز کردن و نگه‌داشتن اون پوزیشن رو شبیه‌سازی کنه.

مثال:
اگه مقدار "Margin for long positions" برابر با ۲۰٪ باشه، یعنی فقط ۲۰٪ از ارزش هر پوزیشن لانگ باید از سرمایه‌ی استراتژی تأمین بشه، و ۸۰٪ بقیه رو شبیه‌ساز بروکر پوشش می‌ده.

پس این استراتژی می‌تونه پوزیشن‌هایی تا ۵ برابر موجودی خودش باز کنه. به‌عبارت دیگه، این سطح مارجین برابر با لوریج ۵:۱ (5x) هست.
اما اگه معامله‌ای با این میزان مارجین وارد ضرر بشه و ضررش اون‌قدری زیاد بشه که پول بروکر (اون ۸۰٪ قرض گرفته‌شده) در خطر بیفته، شبیه‌ساز بروکر Margin Call اجرا می‌کنه و بخشی یا کل پوزیشن رو می‌بنده تا سرمایه‌ی خودش رو محافظت کنه.

نکته:
برنامه‌نویس می‌تونه مقدار پیش‌فرض این مارجین‌ها رو مستقیماً داخل تابع strategy() با استفاده از پارامترهای
margin_long و margin_short
تعیین کنه.


جزئیات شبیه‌سازی لوریج در استراتژی‌های Pine Script

وقتی یه معامله‌گر از بروکر پول قرض می‌گیره تا قدرت خریدش رو بالا ببره، بروکر ازش می‌خواد که یه مقدار مشخص پول به‌عنوان وثیقه (Margin) توی حسابش داشته باشه. به زبان ساده، مارجین اون بخشیه از یه پوزیشن که معامله‌گر باید از سرمایه خودش تأمین کنه تا بروکر بقیه‌ش رو پوشش بده.
محاسبه‌ی مارجین به چه صورته؟
مارجین برابر می‌شه با ارزش کل پوزیشن ضربدر نسبت مارجین (که درواقع معکوس نسبت لوریجه).

مثال ۱: معامله بدون لوریج (۱:۱)

فرض کن نرخ EURUSD الان ۱.۰۵ هست و ما می‌خوایم یه لات استاندارد (۱۰۰٬۰۰۰ واحد) بخریم، اونم بدون اینکه پولی از بروکر قرض بگیریم (یعنی با لوریج ۱:۱).
تو این حالت باید توی تنظیمات مقدار "Margin for long positions" رو بذاریم روی ۱۰۰٪، یعنی فقط از سرمایه‌ی خودمون برای باز کردن پوزیشن استفاده بشه.

بنابراین، برای اینکه این معامله شبیه‌سازی بشه، حساب باید حداقل ۱۰۵٬۰۰۰ دلار (۱.۰۵ × ۱۰۰٬۰۰۰) موجودی داشته باشه.

مثال ۲: معامله با لوریج ۱:۲۰

حالا فرض کن بخوایم همون معامله رو با لوریج ۲۰:۱ انجام بدیم. اینجا نسبت مارجین می‌شه ۱ به ۲۰ یعنی ۵٪.
پس اگه مقدار "Margin for long positions" رو بذاریم روی ۵٪، یعنی حساب باید فقط ۵٪ از ارزش پوزیشن رو پوشش بده و بروکر ۹۵٪ باقی‌مونده رو قرض می‌ده.

مارجین لازم برای این معامله می‌شه ۵٪ از ۱۰۵٬۰۰۰ دلار = ۵٬۲۵۰ دلار.

اما تفاوت این دو حالت توی ریسکه.
تو حالت اول فقط پول خودمونه وسطه، ولی توی حالت دوم، اگه معامله ضرر بده و این ضرر از پول ما بیشتر بشه، بروکر برای محافظت از خودش یا درخواست پول بیشتر می‌کنه (Margin Call)، یا بخشی از پوزیشن رو به‌زور می‌بنده (Liquidation).

توی تستر استراتژی در تریدینگ‌ویو، این نوع اتفاق‌ها با عنوان "Margin Call" نشون داده می‌شن.

شبیه‌ساز بروکر توی تریدینگ‌ویو وقتی به Margin Call می‌رسه، یه مقدار چهار برابر مقدار لازم برای جبران ضرر رو لیکوئید می‌کنه تا مدام روی کندل‌های بعدی Margin Call تکرار نشه.

در مورد پوزیشن‌های شورت:

پوزیشن شورت یعنی از بروکر یه دارایی رو قرض بگیری و اون رو بفروشی، به امید اینکه بعداً ارزون‌تر بخری و بهش پس بدی.
ارزش پوزیشن شورت برابر با مبلغیه که باید بعداً برای خرید اون دارایی خرج بشه.
پس اگه قیمت بالا بره، ضرر می‌کنی.
و چون قیمت می‌تونه تا هر عددی بالا بره، ریسک ضرر در پوزیشن‌های شورت نامحدوده. حتی اگه مارجین ۱۰۰٪ باشه، باز هم ممکنه پوزیشن شورت به‌زور بسته بشه.

شبیه‌سازی مارجین‌های غیرمعمول

تو Pine Script می‌تونی حتی مقدار مارجین رو بیشتر از ۱۰۰٪ هم بزاری. مثلاً اگه مارجین رو ۲۰۰٪ تعریف کنی، یعنی استراتژی فقط اجازه داره پوزیشنی باز کنه که نصف ارزشش توی حساب باشه. این کار باعث می‌شه حداکثر حجم معامله محدود بشه به ۵۰٪ سرمایه.

هشدار مهم:

اگه مقدار مارجین رو روی ۰٪ بذاری، یعنی استراتژی می‌تونه هر حجمی پوزیشن باز کنه، حتی اگه سرمایه‌ای وجود نداشته باشه.
این باعث می‌شه نتایج تست کاملاً غیرواقعی و گمراه‌کننده باشن.

پس توصیه می‌شه هیچ‌وقت مقدار "Margin for long positions" یا "Margin for short positions" رو صفر نذاری.


کم آوردن سرمایه (Running out of funds)

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

توی تستر استراتژی، این نوع بستن اجباری پوزیشن‌ها با عنوان "Margin Call" نمایش داده می‌شه.

فرمولی که مشخص می‌کنه چه زمانی Margin Call اتفاق می‌افته:

CurrentEquity <= MarginRequired

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

MarginRequired هم مقدار مارجینیه که باید توی حساب باشه تا بتونه اون پوزیشن باز رو نگه‌داره.

وقتی سرمایه‌ی فعلی (CurrentEquity) کمتر از مارجین موردنیاز (MarginRequired) بشه، Margin Call رخ می‌ده و پوزیشن به‌صورت اجباری بسته می‌شه.

فرمول محاسبه‌ی CurrentEquity:

CurrentEquity = (PriceChange * Direction * PointValue * AbsPositionSize) + InitialCapital + NetProfit
  • PriceChange: اختلاف قیمت فعلی با قیمت ورود
  • Direction: عدد ۱ اگه پوزیشن لانگه، عدد -۱ اگه شورت
  • PointValue: مقدار دلاری هر یک واحد تغییر قیمت (معمولاً ۱ ــ برای فیوچرز ممکنه متفاوت باشه مثلاً ۵۰ دلار)
  • AbsPositionSize: اندازه پوزیشن باز (همیشه مثبت در این فرمول)
  • InitialCapital + NetProfit: سرمایه اولیه + سود/ضرر کلی استراتژی تا قبل از باز شدن این پوزیشن

فرمول محاسبه‌ی MarginRequired:

MarginRequired = LastPrice * PointValue * AbsPositionSize * (MarginPercent / 100)
  • LastPrice: قیمت فعلی
  • MarginPercent / 100: نسبت مارجینی که استراتژی برای این پوزیشن نیاز داره (مثلاً ۲۰٪ برای لوریج ۱:۵)

مثال عددی:

فرض کن یه استراتژی با سرمایه اولیه ۱٬۰۰۰ دلار داریم
و مقدار "Margin for long positions" برابر با ۲۰٪ هست (یعنی لوریج ۱:۵)
و با این استراتژی می‌خوایم ۴۰ سهم از GOOG رو با قیمت ۱۰۰ دلار بخریم.

وقتی قیمت به ۹۵ دلار می‌رسه:

CurrentEquity = (95 - 100) * 1 * 1 * 40 + 1000 + 0 = -200 + 1000 = 800
MarginRequired = 95 * 1 * 40 * 0.2 = 760

چون ۸۰۰ > ۷۶۰
یعنی هنوز شرایط حفظ پوزیشن فراهمه، و Margin Call اتفاق نمی‌افته.

ولی وقتی قیمت به ۹۰ دلار می‌رسه:

CurrentEquity = (90 - 100) * 1 * 1 * 40 + 1000 + 0 = -400 + 1000 = 600
MarginRequired = 90 * 1 * 40 * 0.2 = 720

اینجا دیگه ۶۰۰ < ۷۲۰
یعنی سرمایه‌ی فعلی کفاف ادامه دادن معامله رو نمی‌ده، و استراتژی توی تستر یه Margin Call ایجاد می‌کنه و بخشی از پوزیشن رو به‌زور می‌بنده تا جلوی ضرر بیشتر گرفته بشه.


نمایش قیمت لیکویید شدن (Margin Call) روی چارت

ساده‌ترین راه برای اینکه روی چارت ببینی قیمت لیکویید شدن (یعنی قیمتی که Margin Call اتفاق می‌افته)، اینه که از متغیر داخلی زیر توی کد Pine Script استراتژی‌ت استفاده کنی:

plot(strategy.margin_liquidation_price)

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

اگه بخوای این قیمت رو دستی محاسبه کنی:

می‌تونی فرمولی که تو بخش قبل گفته شد رو به این شکل تغییر بدی:

MarginLiquidationPriceRaw = ((InitialCapital + NetProfit) / (PointValue * AbsPositionSize) - Direction * EntryPrice) / (MarginPercent / 100 - Direction)

نکات مهم در مورد این فرمول:

  • اگه پوزیشن لانگ باشه و مقدار مارجین ۱۰۰٪ باشه، مخرج فرمول صفر می‌شه و چون تقسیم بر صفر نداریم، قیمت لیکویید شدن بی‌معنی می‌شه.
    این همون حالتیه که بروکر نمی‌تونه پوزیشن رو ببنده چون کل سرمایه از سمت کاربر تأمین شده.
  • بعد از محاسبه‌ی مقدار MarginLiquidationPriceRaw، اون عدد باید با نزدیک‌ترین تیک مجاز برای نماد رُند بشه:
    • برای پوزیشن‌های شورت باید به بالا گرد بشه
    • برای پوزیشن‌های لانگ باید به پایین گرد بشه
      این کار باعث می‌شه قیمت لیکویید شدن دقیقاً با ساختار قیمت واقعی بازار هماهنگ باشه.

مثال عددی با استراتژی فرضی:

با همون مثالی که قبلاً زدیم (سرمایه اولیه ۱۰۰۰ دلار، حجم پوزیشن ۴۰، قیمت ورود ۱۰۰، مارجین ۲۰٪، لوریج ۱:۵)، فرمول به این شکل در میاد:

((1000 + 0) / (1 * 40) - 100) / (20 / 100 - 1) = 93.75

یعنی اگه قیمت به ۹۳.۷۵ دلار برسه، اولین جاییه که Margin Call ممکنه فعال بشه.

چون ۹۳.۷۵ به عدد ۰.۰۱ (تیک سایز گوگل) بخش‌پذیره، نیاز به گرد کردن هم نیست.

نکته :
فقط چون این قیمت رو محاسبه کردی، دلیل نمی‌شه توی شبیه‌سازی دقیقاً در همین عدد Margin Call اجرا بشه. شرایط بازار (مثل نوسان شدید یا سرعت حرکت قیمت) ممکنه باعث بشه زودتر یا دیرتر این اتفاق بیفته.


محاسبه‌ی مقدار پوزیشنی که توی Margin Call لیکوئید می‌شه

مقداری که از یه پوزیشن در رویداد Margin Call بسته (لیکوئید) می‌شه، بستگی به قیمت فعلی‌ای داره که توش Margin Call رخ می‌ده. همون‌طور که قبلاً اشاره شد، شبیه‌ساز بروکر در تریدینگ‌ویو، چهار برابر مقداری که لازمه برای جبران ضرر رو لیکوئید می‌کنه تا از رخ دادن پشت سر هم Margin Call جلوگیری کنه.

الگوریتم محاسبه‌ی مقدار لیکوئید شدن به‌صورت زیره:

۱. محاسبه‌ی پول مصرف‌شده (Money Spent)

سرمایه‌ای که برای باز کردن پوزیشن خرج شده:

Position Size * Entry Price

۲. محاسبه‌ی ارزش فعلی دارایی (Market Value of Security - MVS)

ارزش فعلی پوزیشن با توجه به قیمت فعلی بازار:

Position Size * Current Price

۳. محاسبه‌ی سود/ضرر باز (Open Profit)

تفاوت بین ارزش فعلی و پول مصرف‌شده. اگه پوزیشن شورت باشه و سود مثبت باشه، باید علامتش منفی بشه (چون توی شورت، سود برای کاربر، ضرر برای بروکره):

ABS(MVS - Money Spent) * -1

۴. محاسبه‌ی موجودی حساب (Equity)

مقدار کل سرمایه‌ای که در لحظه در اختیار استراتژی هست:

Initial Capital + Net Profit + Open Profit

۵. تبدیل درصد مارجین به نسبت مارجین (Margin Ratio)

Margin Percent / 100

۶. محاسبه‌ی مارجین لازم برای نگه داشتن پوزیشن (Margin)

مقداری که باید از سمت حساب تأمین بشه:

MVS * Margin Ratio

۷. محاسبه‌ی موجودی قابل استفاده (Available Funds)

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

Equity - Margin

۸. محاسبه‌ی مقدار ضرری که کاربر نتونسته پوشش بده (Loss Not Covered)

Available Funds / Margin Ratio

۹. محاسبه‌ی تعداد واحدی که باید فروخته بشه تا ضرر جبران بشه (Minimum Liquidation Size)

مقدار به تعداد واحد (سهم یا قرارداد) تبدیل می‌شه. این عدد رُند پایین (TRUNCATE) می‌شه بر اساس سایز حداقل قرارداد اون نماد:

TRUNCATE(Step 8 / Current Price)

۱۰. محاسبه‌ی مقدار نهایی واحدی که شبیه‌ساز بروکر لیکوئید می‌کنه

شبیه‌ساز بروکر ۴ برابر عدد بالا رو می‌فروشه (یا می‌خره اگه پوزیشن شورت باشه):

Step 9 * 4

مثال :

روی چارت روزانه‌ی NASDAQ:TSLA
استراتژی Supertrend Strategy رو اضافه کن
و مقدار "Order Size" رو روی ۳۰۰٪ از سرمایه بذار
و مقدار "Margin for long positions" رو بذار روی ۲۵٪ (یعنی لوریج ۱:۴)

توی این مثال، استراتژی در تاریخ ۱۶ سپتامبر ۲۰۱۰ با قیمت ۴.۴۳ دلار وارد پوزیشن خرید شده و ۶۸۲٬۴۳۸ سهم از TSLA خریده.

بعد، در تاریخ ۲۳ سپتامبر ۲۰۱۰ وقتی قیمت به ۳.۹ دلار افت کرده، شبیه‌ساز بروکر به‌خاطر کاهش سرمایه، یه Margin Call زده و ۱۱۱٬۰۵۲ سهم رو اجباری لیکوئید کرده.

بیایم مرحله‌به‌مرحله محاسبات رو مرور کنیم:

1. پول مصرف‌شده برای باز کردن پوزیشن:

Money Spent = 682438 * 4.43 = 3,023,200.34 دلار

2. ارزش فعلی پوزیشن با قیمت جدید بازار:

MVS = 682438 * 3.9 = 2,661,508.20 دلار

3. سود/ضرر باز (Open Profit):

Open Profit = -(3,023,200.34 - 2,661,508.20) = -361,692.14 دلار

4. موجودی فعلی حساب (Equity):

Equity = 1,000,000 (سرمایه اولیه) + 0 (سود قبلی) - 361,692.14 = 638,307.86 دلار

5. نسبت مارجین:

Margin Ratio = 25 / 100 = 0.25

6. مارجین موردنیاز برای نگه‌داشتن پوزیشن:

Margin = 2,661,508.20 * 0.25 = 665,377.05 دلار

7. موجودی قابل استفاده (Available Funds):

Available Funds = 638,307.86 - 665,377.05 = -27,069.19 دلار

8. مقدار ضرری که کاربر نمی‌تونه پوشش بده:

Money Lost = -27,069.19 / 0.25 = -108,276.76 دلار

9. تعداد سهمی که باید فروخته بشه برای جبران ضرر:

Shares to cover the loss = TRUNCATE(-108,276.76 / 3.9) = TRUNCATE(-27,763.27) = -27,763 سهم

10. مقدار نهایی سهم‌هایی که بروکر لیکوئید می‌کنه (۴ برابر):

Margin Call Size = -27,763 * 4 = -111,052 سهم

پس توی این موقعیت، استراتژی به‌خاطر افت قیمت و نداشتن سرمایه کافی، وارد Margin Call شده و شبیه‌ساز بروکر به‌صورت خودکار ۱۱۱٬۰۵۲ سهم از پوزیشن رو بسته تا ضرر جبران بشه و جلوی تکرار Margin Call توی کندل‌های بعدی گرفته بشه.