
محاسبه Lot Size در ربات معاملهگر
در دنیای معاملات الگوریتمی، موفقیت یک ربات معاملهگر (Trading Bot) تنها به دقت سیگنالهای خرید و فروش آن وابسته نیست. هسته مرکزی و حیاتی سودآوری بلندمدت، منطقی است که برای تعیین حجم هر معامله، یا همان لات سایز (Lot Size)، در کد ربات تعبیه شده است. لات سایز حجم قرارداد یا میزان دارایی پایهای است که شما در یک معامله خرید یا فروش میکنید. در معاملات ارز (فارکس)، لات واحد استانداردی است که مقدار ارز پایه معامله شده را نشان میدهد. با این حال، اهمیت آن فراتر از یک واحد اندازهگیری ساده است؛ لات سایز خط ارتباطی مستقیم و قدرتمند بین استراتژی معاملاتی و مدیریت سرمایه (Capital Management) است. انتخاب یک لات سایز نامناسب میتواند حتی بهترین استراتژیها را به فاجعه تبدیل کند، زیرا ریسک را خارج از کنترل میبرد یا از پتانسیل سود دهی بهینه میکاهد. در مقابل، محاسبه دقیق و پویای لات سایز، ربات را به ماشینی تبدیل میکند که نه تنها در بازار جستجوگر فرصتهاست، بلکه در لحظه تصمیم میگیرد با چه حجمی وارد شود که بقای حساب را تضمین کرده و رشد متعادل آن را ممکن سازد. این مقاله قصد دارد با نگاهی عمیق و تحلیلی، از منظر برنامهنویسی الگوریتمی و اصول معاملهگری، به دقت این موضوع را بررسی کند.
مفهوم Lot Size در ساختار معاملات الگوریتمی
در یک سیستم معاملاتی دستی، تریدر پس از دریافت سیگنال، به صورت ذهنی یا با استفاده از ماشین حساب، حجم معامله را بر اساس شرایط حساب و تحمل ریسک خود تعیین میکند. اما در یک ربات معاملهگر، این فرآیند باید کاملاً خودکار، دقیق و فاقد خطای انسانی باشد. لات سایز در اینجا یک پارامتر دینامیک است که در زمان اجرا (Runtime) و بر اساس دادههای لحظهای حساب و بازار محاسبه میشود. این پارامتر مستقیماً بر تمامی معیارهای عملکرد ربات تأثیر میگذارد: حداکثر افت سرمایه (Maximum Drawdown)، سوددهی مرکب، نسبت ریسک به ریوارد (Risk to Reward) تحقق یافته، و در نهایت فشار روانی که سیستم بر حساب وارد میآورد. از دیدگاه برنامهنویسی در ام کیو ال فایو (MQL5) یا ام کیو ال فور (MQL4)، لات سایز یک عدد اعشاری (double) است که به تابع OrderSend یا PositionOpen ارسال میشود. انتخاب این عدد، نقطه تلاقی منطق کسبوکار (Business Logic) ربات و ریاضیات مالی است. درک ساختار لات در بازارهای مختلف ضروری است: در فارکس، یک لات استاندارد برابر است با ۱۰۰,۰۰۰ واحد از ارز پایه، یک مینی لات ۱۰,۰۰۰ واحد، و یک میکرو لات ۱,۰۰۰ واحد. با این حال، امروزه بسیاری از بروکرها امکان معامله با لات سایزهای کسری (مثلاً ۰.۰۵ لات یا ۱.۲۵ لات) را فراهم میکنند که دقت کنترل ریسک را بسیار افزایش داده است.
تفاوت Lot ثابت و Lot داینامیک در ربات معاملهگر
یکی از نخستین و سرنوشتسازترین تصمیمات در طراحی یک ربات معاملهگر، انتخاب بین لات ثابت (Fixed Lot) و لات داینامیک (Dynamic Lot) یا متغیر است. در روش لات ثابت، ربات با یک حجم از پیش تعریف شده (مثلاً ۰.۱ لات) وارد تمامی معاملات میشود، بدون در نظر گرفتن وضعیت بالانس حساب (Account Balance)، اکویتی (Equity)، یا اندازه استاپ لاس (Stop Loss). این روش سادهترین پیادهسازی را دارد و برای تست اولیه ایده استراتژی ممکن است مفید باشد. اما معایب جدی آن در بلندمدت و در محیط واقعی معاملات آشکار میشود. با رشد حساب، حجم معاملات نسبت به سرمایه کوچک میشود و از پتانسیل رشد مرکب استفاده نمیشود. از طرفی، اگر حساب دچار دراودان شود، حجم ثابت ممکن است نسبت به سرمایه کاهش یافته بسیار بزرگ باشد و منجر به ضررهای سنگینتر و حتی از دست رفتن حساب شود. مهمتر از آن، این روش هیچ گونه مدیریت سرمایه انعطافپذیری ارائه نمیدهد و ریسک هر معامله (بر حسب درصد حساب) دائماً در حال تغییر است.
در مقابل، منطق لات داینامیک حجم هر معامله را بر اساس شرایط لحظهای محاسبه میکند. این روش، اساس رباتهای حرفهای و پایدار است. متغیرهای کلیدی که در این محاسبه وارد میشوند معمولاً شامل بالانس حساب یا اکویتی، درصد ریسک (Risk Percentage) مورد نظر برای هر معامله، و فاصله استاپ لاس از نقطه ورود هستند. در این مدل، ریسک هر معامله به یک درصد ثابت یا متغیر کنترلشده از سرمایه گره میخورد. برای مثال، اگر درصد ریسک ۲٪ تعیین شود و حساب ۱۰,۰۰۰ دلار بالانس داشته باشد، ربات به گونهای لات سایز را محاسبه میکند که اگر استاپ لاس فعال شود، ضرر حاصل حدود ۲۰۰ دلار باشد. این رویکرد باعث میشود ریسک سیستم در طول زمان ثابت بماند و رشد حساب به صورت تصاعدی (مرکب) اتفاق بیفتد. پیادهسازی لات داینامیک نیازمند توجه دقیق به جزئیات محاسباتی، گرد کردن صحیح مقادیر، و در نظر گرفتن محدودیتهای بروکر است، اما بدون شک، گزینه اصلی برای هر رباتی است که قصد فعالیت در بازار واقعی را دارد.
نقش مدیریت سرمایه در محاسبه Lot Size
مدیریت سرمایه ستون فقرات هر سیستم معاملاتی موفق است و لات سایز ابزار اجرایی اولیه آن. مدیریت سرمایه مجموعهای از قوانین است که هدف آن کنترل ریسک و حفاظت از سرمایه در برابر نابودی کامل، در عین بهرهگیری از فرصتهای رشد است. در سطح عملیاتی، مدیریت سرمایه دقیقاً به این سؤال پاسخ میدهد: “در این معامله خاص، با توجه به شرایط فعلی حساب و بازار، چه حجمی باید معامله کنم؟” پاسخ این سؤال چیزی جز لات سایز نیست. رباتی که فاقد منطق قدرتمند مدیریت سرمایه باشد، صرفاً یک مولد سیگنال است، نه یک ماشین سودآور. مدیریت سرمایه به ربات میآموزد که اولویت اول بقا است. این اصل از طریق کنترل لات سایز اجرا میشود تا اطمینان حاصل شود که حتی در بدترین حالت (یک رشته ضررهای متوالی)، حساب زنده میماند و توانایی بازگشت دارد. یکی از مدلهای ریاضی معروف در این زمینه، معیار کِلی (Kelly Criterion) است که سعی میکند نرخ رشد سرمایه را بهینه کند. اما در عمل، بسیاری از تریدرها و توسعهدهندگان ربات از نسخه کسری یا محافظهکارانهتری از آن استفاده میکنند تا از ریسکپذیری بیش از حد جلوگیری شود.
ارتباط مستقیم مدیریت سرمایه با لات سایز از طریق کنترل ریسک هر معامله برقرار میشود. به جای فکر کردن به سود، ابتدا باید به این فکر کرد که حاضریم چه مقدار از حساب را در یک معامله به خطر بیندازیم. اینجاست که مفهوم درصد ریسک ظهور میکند. یک قاعده کلی، ریسک کردن ۱٪ تا ۲٪ از سرمایه در هر معامله است. برای یک حساب ۲۰,۰۰۰ دلاری، ریسک ۱٪ برابر است با ۲۰۰ دلار. پس ربات باید لات سایز را چنان محاسبه کند که اگر قیمت به استاپ لاس برسد، ضرر واقعی شده حدود ۲۰۰ دلار باشد. این رویکرد، ریسک را مستقل از حرص و طمع تریدر و نوسانات احساسی بازار میکند و آن را به یک متغیر قابل کنترل و کمّی تبدیل مینماید. همچنین، مدیریت سرمایه هوشمند ممکن است بر اساس شرایط اکویتی نسبت به بالانس، لات سایز را تعدیل کند. به عنوان مثال، برخی رباتها هنگام رسیدن اکویتی به یک سقف جدید (High Water Mark)، حجم را بر اساس آن محاسبه میکنند و در هنگام دراودان، حجم را بر اساس بالانس اولیه یا اکویتی فعلی (بسته به استراتژی) محاسبه میکنند تا از افت بیشتر جلوگیری شود.
محاسبه Lot Size بر اساس درصد ریسک
پایهایترین و رایجترین روش برای محاسبه لات سایز داینامیک، استفاده از درصد ریسک است. این فرمول، ریاضیات سادهای دارد اما اجرای دقیق آن در کد نیازمند توجه به جزئیات بازار و بروکر است. اجزای اصلی این معادله به شرح زیر هستند:
- ریسک دلاری (Risk in Money): مقدار پولی که مایل به از دست دادن در یک معامله هستیم. این مقدار از حاصلضرب درصد ریسک (مثلاً ۰.۰۱ برای ۱٪) در سرمایه انتخابی (مانند بالانس یا اکویتی) به دست میآید. [ \text{Risk}_{\$} = \text{Account Balance} \times \text{Risk Percentage} ]
- ریسک پیپی (Risk in Pips): فاصله بین نقطه ورود تا استاپ لاس، بر حسب پیپ. توجه داشته باشید که در جفتارزهایی که JPY در قسمت quote است (مانند USDJPY)، پیپ معمولاً رقم دوم اعشار است (۰.۰۱)، در حالی که در دیگر جفتها رقم چهارم اعشار (۰.۰۰۰۱) است. همچنین، در پلتفرمهایی مانند متاتریدر، ممکن است از مفهوم پوینت (Point) که یک دهم پیپ است استفاده شود.
- ارزش پیپ (Pip Value): ارزش هر حرکت یک پیپی در نماد معاملاتی، به ارز حساب. این مقدار به لات سایز وابسته است و خودش جزء مجهول محاسبه است! اما میتوان آن را بر اساس نرخهای لحظهای و مشخصات نماد استخراج کرد.
مشکل حلقهای (دور) در اینجاست: برای محاسبه لات سایز به ارزش پیپ نیاز داریم و ارزش پیپ خود تابعی از لات سایز است. راهحل، استفاده از فرمول مستقیم و یکپارچه است. ریسک دلاری باید برابر باشد با حاصلضرب ریسک پیپی در ارزش هر پیپ برای یک لات استاندارد، ضرب در لات سایز مورد نظر.
[ \text{Risk}{\$} = (\text{Risk in Pips} \times \text{Pip Value per Standard Lot} \times \text{Lot Size}) ] پس لات سایز برابر خواهد بود با: [ \text{Lot Size} = \frac{\text{Risk}{\$}}{(\text{Risk in Pips} \times \text{Pip Value per Standard Lot})} ]
حال باید ارزش پیپ برای یک لات استاندارد را به دست آورد. این مقدار برای جفتارزها به این صورت محاسبه میشود: اگر ارز quote (ارز دوم در جفت) با ارز حساب یکسان باشد، ارزش پیپ یک لات استاندارد برابر است با ۱۰ واحد از ارز حساب. به عنوان مثال، در حساب USD و جفت EURUSD، هر حرکت یک پیپی (۰.۰۰۰۱) برای یک لات استاندارد، ۱۰ دلار ارزش دارد. اگر ارز quote با ارز حساب متفاوت باشد، باید این مقدار را به نرخ تبدیل کرد. فرمول کلی برای یک لات استاندارد (۱۰۰,۰۰۰ واحد) به شرح زیر است:
[ \text{Pip Value per Standard Lot} = \frac{100,000 \times 0.0001}{\text{Quote/Account Rate}} = \frac{10}{\text{Quote/Account Rate}} ] که در آن Quote/Account Rate نرخ تبدیل ارز quote به ارز حساب است. در ام کیو ال فایو، میتوان از تابع SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE) استفاده کرد که ارزش حرکت یک تیک را به ارز حساب برمیگرداند. با تقسیم این مقدار بر اندازه تیک (Tick Size) و تنظیم بر اساس حجم یک لات، میتوان به ارزش پیپ رسید. در نهایت، لات سایز محاسبه شده باید با توجه به محدودیتهای بروکر (حداقل و حداکثر لات، قدم لات) گرد و اعتبارسنجی شود.
ارتباط Stop Loss با حجم معامله
استاپ لاس و لات سایز دو روی یک سکه هستند و رابطه تنگاتنگ و معکوسی بین آنها برقرار است. این رابطه در قلب فرمول محاسبه لات سایز بر اساس درصد ریسک نهفته است. برای یک مقدار ریسک دلاری ثابت (مثلاً ۱۰۰ دلار)، هر چه فاصله استاپ لاس از نقطه ورود بیشتر باشد (یعنی ریسک پیپی بزرگتر باشد)، لات سایز محاسبه شده باید کوچکتر باشد تا حاصلضرب آنها همان ۱۰۰ دلار شود. برعکس، اگر استراتژی استاپ لاس تنگتری دارد (مثلاً ۱۰ پیپ)، برای حفظ همان ریسک دلاری، میتوان لات سایز بزرگتری انتخاب کرد. این ارتباط چندین پیامد مهم برای طراحی ربات دارد. اولاً، رباتی که لات سایز ثابت استفاده میکند، در واقع ریسک متغیری دارد: در معاملاتی با استاپ لاس بزرگ، ریسک دلاری بسیار بیشتر از معاملاتی با استاپ لاس کوچک است. این ناسازگاری میتواند پروفایل ریسک سیستم را مخدوش کند.
ثانیاً، این رابطه بر تعیین مکان استاپ لاس تأثیر میگذارد. استاپ لاس نباید صرفاً بر اساس تحلیل تکنیکال انتخاب شود، بلکه باید با منطق مدیریت سرمایه و محدودیتهای لات سایز هماهنگ باشد. ممکن است یک سطح تکنیکال عالی برای استاپ لاس در فاصله ۵۰ پیپی باشد، اما محاسبه نشان دهد برای حفظ درصد ریسک ۱٪، لات سایز مورد نیاز از حداکثر لات مجاز بروکر یا از حدی که باعث نقض نسبت مارجین میشود، بیشتر است. در این حالت، ربات باید یا از ورود به معامله صرفنظر کند، یا درصد ریسک را به صورت پویا کاهش دهد، یا (در صورت امکان منطقی) استاپ لاس را به نقطهای نزدیکتر (با تحلیل مجدد) منتقل کند. از طرف دیگر، یک استاپ لاس بسیار تنگ (مثلاً ۵ پیپ) ممکن است به لات سایز بسیار بزرگی منجر شود که در عمل به دلیل نوسان بازار (Market Volatility) و اسلیپیج (Slippage) به راحتی فعال شود. بنابراین، منطق ربات باید یک تعادل هوشمند بین محل استاپ لاس (بر اساس استراتژی)، لات سایز محاسبه شده، و محدودیتهای عملی بازار برقرار کند.
محاسبه Lot Size در حسابهای مختلف (Standard، Cent، ECN)
انواع مختلف حسابهای معاملاتی، مفاهیم و محاسبات مربوط به لات سایز را تحت تأثیر قرار میدهند. سه نوع رایج عبارتند از: حساب استاندارد (Standard)، حساب سنت (Cent)، و حساب ایسیان (ECN). در حساب استاندارد، واحد حجم همان لات استاندارد است و معمولاً حداقل حجم معامله ۰.۰۱ لات (یک میکرو لات) است. ارزش پیپ به ازای یک لات استاندارد همان ۱۰ واحد ارز حساب است. در حساب سنت، ماهیت بازی تغییر میکند. این حسابها برای معاملهگران با سرمایه کمتر طراحی شدهاند و ارز حساب آنها اغلب سنت دلار (یا سنت یورو) است. یک لات استاندارد در این حسابها معمولاً برابر با ۱۰۰۰ واحد ارز پایه در نظر گرفته میشود (برابر با یک میکرو لات در حساب استاندارد)، و ارزش پیپ برای یک لات “استاندارد” حساب سنت، برابر با ۰.۱۰ واحد ارز حساب (سنت) خواهد بود. این موضوع برای ربات حیاتی است. اگر رباتی که برای حساب استاندارد طراحی شده، بدون تغییر در منطق محاسبه ارزش پیپ در یک حساب سنت اجرا شود، لات سایزهای محاسبه شده صد برابر بزرگتر از حد مورد نیاز خواهند بود و منجر به فاجعه میشوند.
حسابهای ECN معمولاً ساختاری شبیه به حسابهای استاندارد دارند، اما با اسپردهای بسیار کم و دریافت کمیسیون (Commission) به ازای هر لات معامله شده. وجود کمیسیون مستقیماً بر محاسبه لات سایز و ریسک تأثیر میگذارد. ریسک دلاری که ما محاسبه میکنیم، معمولاً فقط شامل ضرر ناشی از حرکت قیمت تا استاپ لاس است. اما در عمل، با باز شدن معامله، بلافاصله مبلغ کمیسیون از حساب کسر میشود (هم در خرید و هم در فروش). بنابراین، کل ریسک واقعی معامله برابر است با ریسک قیمتی به اضافه کمیسیون. یک ربات دقیق باید این هزینه ثابت را در محاسبات خود لحاظ کند. دو رویکرد وجود دارد: یا ریسک دلاری اصلی را کاهش میدهیم تا پس از اضافه شدن کمیسیون، مجموع به حد مورد نظر برسد، یا در فرمول محاسبه لات سایز، ریسک دلاری موثر را برابر با ( \text{Risk}_{\$} – \text{Commission} ) در نظر میگیریم. نادیده گرفتن کمیسیون، به ویژه در معاملات با حجم بالا یا استراتژیهای اسکالپینگ، میتواند باعث شود ریسک واقعی به طور سیستماتیک از حد تعیین شده فراتر رود.
تأثیر اسپرد، کمیسیون و Slippage بر Lot Size
علاوه بر حرکت خالص قیمت، هزینههای معاملاتی و عدم قطعیتهای اجرای سفارش نیز بر سود و زیان نهایی تأثیر میگذارند و در نتیجه باید در منطق مدیریت ریسک و محاسبه لات سایز مدنظر قرار گیرند. اسپرد (Spread) تفاوت بین قیمت Ask و Bid است و هزینه اولیه ورود به معامله محسوب میشود. در لحظه باز شدن معامله، اگر بلافاصله آن را ببندید، به اندازه اسپرد ضرر خواهید کرد. برخی از مدلهای پیشرفته محاسبه لات سایز، اسپرد را نیز به عنوان بخشی از ریسک در نظر میگیرند، به خصوص برای استراتژیهایی که هدفهای بسیار کوتاهمدت دارند. در این حالت، ریسک پیپی موثر برابر میشود با فاصله استاپ لاس به علاوه نصف اسپرد (اگر استاپ لاس در سمت Bid قرار گیرد). محاسبه آن پیچیدهتر است و نیاز به دسترسی به قیمت Bid و Ask در لحظه محاسبه دارد.
کمیسیون همان طور که گفته شد، یک هزینه ثابت است که معمولاً به ازای هر لات معامله شده دریافت میشود. تأثیر آن بر لات سایز این است که عملاً بخشی از قدرت ریسکپذیری ما را میخورد. اگر برای یک معامله حداکثر ریسک را ۱۰۰ دلار در نظر گرفتهایم و کمیسیون رفت و برگشت معامله ۲۰ دلار است، پس فقط ۸۰ دلار ظرفیت برای ریسک قیمتی باقی میماند. در نتیجه، لات سایز محاسبه شده بر مبنای ۸۰ دلار خواهد بود، نه ۱۰۰ دلار. نادیده گرفتن این موضوع منجر به اورریسک سیستماتیک میشود.
اسلیپیج (Slippage) به اختلاف بین قیمت درخواستی و قیمت اجرای شده گفته میشود. در بازارهای با نقدینگی کم یا در زمانهای پرنوسان، ممکن است استاپ لاس دقیقاً در قیمت تعیین شده اجرا نشود و در قیمت بدتری فعال شود. اسلیپیج یک متغیر تصادفی است و نمیتوان آن را دقیقاً پیشبینی کرد، اما یک ربات محتاط باید حاشیه امنیتی برای آن در نظر بگیرد. یکی از روشها، استفاده از یک ریسک پیپی مؤثر بزرگتر در فرمول است. به جای استفاده از فاصله تئوریک استاپ لاس، از فاصله استاپ لاس به اضافه یک مقدار تخمینی برای اسلیپیج (مثلاً ۲ تا ۵ پیپ) استفاده میشود. این کار لات سایز محاسبه شده را کمی کاهش میدهد و فضای تنفسی برای اجرای بد استاپ لاس ایجاد میکند. جمعبندی این که، یک ربات معاملهگر حرفهای، برای محاسبه دقیق لات سایز، باید یک مدل ریسک جامع در نظر بگیرد که شامل ریسک قیمتی (تا استاپ لاس)، هزینه ثابت (کمیسیون)، و یک حاشیه برای عدم قطعیت اجرا (اسلیپیج) باشد.
محاسبه Lot Size در بازارهای پرنوسان و کمنوسان
نوسان بازار (Market Volatility) معیاری از میزان تغییرات قیمت در یک بازه زمانی است و مستقیماً بر محل قرارگیری استاپ لاس و در نتیجه بر محاسبه لات سایز تأثیر میگذارد. در یک بازار کمنوسان (مثلاً برخی جفتارزهای اصلی در ساعات غیرادغام بازار)، حرکات قیمت کوچک و قابل پیشبینیتر است. در چنین شرایطی، یک استاپ لاس نسبتاً تنگ ممکن است منطقی باشد، چرا که احتمال رسیدن تصادفی قیمت به آن کمتر است. این امر، طبق فرمول، اجازه استفاده از لات سایز بزرگتری را برای یک ریسک دلاری ثابت فراهم میکند. برعکس، در بازارهای پرنوسان (مانند زمان انتشار اخبار مهم، یا در نمادهای با نوسان ذاتی بالا مانند طلا یا بیتکوین)، نوسان لحظهای قیمت بسیار زیاد است. در این شرایط، قرار دادن یک استاپ لاس تنگ بسیار خطرناک است، زیرا به راحتی و بر اثر یک نوسان معمول بازار فعال میشود. بنابراین، برای محافظت از معامله در برابر نوسان بازار، باید استاپ لاس را در فاصله دورتری از قیمت ورود قرار داد. این فاصله بیشتر (ریسک پیپی بزرگتر)، به طور خودکار لات سایز محاسبه شده را برای یک ریسک دلاری ثابت، کاهش میدهد.
یک ربات معاملهگر هوشمند میتواند نوسان بازار را به صورت پویا اندازهگیری و در منطق خود وارد کند. یک شاخص رایج برای این کار، میانگین محدوده واقعی (Average True Range – ATR) است. ATR میانگین حرکات قیمت در یک دوره مشخص (مثلاً ۱۴ روز) را نشان میدهد. ربات میتواند فاصله استاپ لاس را به جای یک عدد ثابت پیپی، به عنوان مضربی از ATR تعیین کند (مثلاً ۱.۵ برابر ATR). در این صورت، در زمانهای پرنوسان، استاپ لاس به طور خودکار گشادتر میشود و در زمانهای کمنوسان، تنگتر. این روش، تطبیق پذیری استراتژی با شرایط متغیر بازار را افزایش میدهد. نکته کلیدی این است که با این تغییر، لات سایز محاسبه شده توسط ربات نیز به طور خودکار و متناسب با نوسان بازار تنظیم میشود: در نوسان بالا، حجم معاملات کاهش مییابد و در نوسان پایین، حجم افزایش مییابد (البته در چارچوب ریسک دلاری ثابت). این یکی از پیچیدهترین و در عین حال قدرتمندترین مباحث در طراحی رباتهای تطبیقپذیر است.
تفاوت محاسبه Lot Size در بکتست و حساب واقعی
بکتست (Backtest) یا آزمون گذشتهنگر، فرآیندی حیاتی برای ارزیابی استراتژی ربات معاملهگر بر روی دادههای تاریخی است. اما محاسبه لات سایز در محیط بکتست اغلب با واقعیت تفاوتهای ظریف اما مهمی دارد که اگر به درستی مدیریت نشوند، میتوانند نتایج آزمون را به شدت غیرواقعی و خوشبینانه کنند. اولین تفاوت، در دسترسی به دادههاست. در بکتست، ربات معمولاً تنها به تاریخچه قیمت (OHLC) دسترسی دارد. اطلاعاتی مانند اسپرد دقیق در هر لحظه از گذشته، اسلیپیج، و وضعیت دقیق اکویتی و مارجین در طول تاریخ ممکن است به صورت ناقص یا سادهشده شبیهسازی شوند. بسیاری از تستگیرها (مانند استراتژی تستر متاتریدر) گزینههایی برای اعمال اسپرد ثابت یا متغیر و اسلیپیج دارند، اما این شبیهسازی هرگز کاملاً دقیق نیست.
دومین و مهمترین تفاوت، مربوط به مدیریت سرمایه پویاست. در بکتست، ربات از ابتدا میداند که کل تاریخچه دادهها در اختیارش است. برخی از پیادهسازیهای سادهشده، لات سایز را بر اساس بالانس اولیه تست محاسبه میکنند و در طول کل تست آن را ثابت نگه میدارند (حتی اگر از فرمول درصد ریسک استفاده کنند). اما در واقعیت، لات سایز در هر معامله بر اساس اکویتی یا بالانس لحظهای محاسبه میشود. اگر ربات در تست، پس از یک سری ضرر، حجم معاملات را بر اساس سرمایه کاهشیافته محاسبه نکند، دراودان تست بسیار کمتر از واقعیت نشان داده میشود. برعکس، اگر پس از یک سری سود، حجم بر اساس بالانس افزایشیافته محاسبه نشود، سود مرکب تست کمتر از پتانسیل واقعی خواهد بود. برای واقعیتر کردن بکتست، باید اطمینان حاصل شود که تابع محاسبه لات سایز در ربات، در محیط تست هم دقیقاً مانند محیط واقعی عمل میکند و دادههای اکویتی را به صورت پویا از محیط درخواست میکند.
سوم، محدودیتهای بروکر در بکتست نادیده گرفته میشوند. حداقل و حداکثر لات سایز، قدم لات، و سیاستهای مارجین کال در تست معمولاً اعمال نمیشوند. ربات ممکن است در تست یک لات سایز ۵۰ را محاسبه و معامله کند، در حالی که در بروکر واقعی حداکثر لات مجاز ۱۰۰ باشد، اما این حجم غیرمعمول بزرگ ممکن است در عمل با مشکل مواجه شود. برای اطمینان، باید این محدودیتها را در کد ربات، هم در حالت تست و هم در حالت واقعی، اعمال کرد.
خطاهای رایج در محاسبه Lot Size در رباتها
پیادهسازی نادرست منطق محاسبه لات سایز میتواند باعث شکست یک ربات با استراتژی خوب شود. برخی از خطاهای رایج عبارتند از:
۱. عدم تطبیق با نوع حساب: همان طور که توضیح داده شد، استفاده از فرمولهای مربوط به حساب استاندارد در حساب سنت، بدون تطبیق ارزش پیپ، فاجعهبار است.
۲. گرد کردن نادرست: پس از محاسبه لات سایز (مثلاً ۰.۱۲۳۴۵۶)، باید آن را به نزدیکترین قدم لات مجاز (مثلاً ۰.۰۱) گرد کرد. استفاده از تابع گرد کردن اشتباه (مثلاً NormalizeDouble با ارقام نادرست در ام کیو ال) یا گرد کردن به سمت بالا به صورت سیستماتیک میتواند در بلندمدت باعث انحراف از مدیریت سرمایه مطلوب شود. همچنین، باید اطمینان حاصل کرد که لات سایز نهایی از حداقل لات بروکر کمتر نباشد.
۳. عدم در نظر گرفتن هزینهها: نادیده گرفتن کمیسیون و اسپرد در محاسبه ریسک واقعی، که قبلاً شرح داده شد.
۴. استفاده از بالانس ثابت در حالت داینامیک: در رباتی که قرار است لات سایز داینامیک داشته باشد، اگر در تابع محاسبه به جای AccountInfoDouble(ACCOUNT_EQUITY) از یک عدد ثابت اولیه استفاده شود، ریسک ثابت نخواهد ماند.
۵. خطای تقسیم بر صفر: اگر ریسک پیپی (فاصله استاپ لاس) صفر یا منفی باشد، فرمول با خطای تقسیم بر صفر مواجه میشود. ربات باید این حالت را بررسی کرده و یا از ورود به معاملۀ بدون استاپ لاس خودداری کند، یا از یک لات سایز پیشفرض بسیار کوچک استفاده نماید.
۶. عدم اعتبارسنجی نهایی در برابر Free Margin: پس از محاسبه لات سایز، باید بررسی شود که آیا مارجین مورد نیاز برای این حجم، از Free Margin موجود کمتر است یا خیر. اگر بیشتر باشد، ربات باید یا حجم را کاهش دهد، یا اصلاً وارد معامله نشود. عدم انجام این بررسی میتواند منجر به خطای “not enough money” و عدم اجرای سفارش شود.
۷. محاسبه بر اساس قیمت نامناسب: در فرمولهای دستی، گاهی از قیمت Ask برای خرید و Bid برای فروش استفاده میشود. در ام کیو ال، باید از SymbolInfoDouble(_Symbol, SYMBOL_ASK) یا SYMBOL_BID به طور صحیح استفاده کرد.
مثالهای مفهومی از محاسبه Lot Size در ربات معاملهگر
برای درک بهتر، چند سناریو را بدون کدنویسی سنگین بررسی میکنیم.
مثال ۱: حساب استاندارد با درصد ریسک ثابت
فرض کنید ربات بر روی حساب USD با بالانس ۵۰,۰۰۰ دلار کار میکند. درصد ریسک در تنظیمات ۱.۵٪ است. استراتژی یک سیگنال فروش روی EURUSD در قیمت ۱.۰۵۰۰ صادر میکند و استاپ لاس را در ۱.۰۵۵۰ قرار میدهد (۵۰ پیپ ریسک). ارز quote (USD) با ارز حساب یکسان است، پس ارزش پیپ برای یک لات استاندارد ۱۰ دلار است.
- ریسک دلاری: ( 50,000 \times 0.015 = 750 ) دلار.
- لات سایز: ( \frac{750}{(50 \times 10)} = \frac{750}{500} = 1.5 ) لات. ربات حجم ۱.۵ لات را برای این معامله محاسبه و ارسال میکند.
مثال ۲: تطبیق با کمیسیون (حساب ECN)
همان مثال قبل، اما بروکر برای هر لات استاندارد، ۱۰ دلار کمیسیون (مجموع رفت و برگشت) دریافت میکند. ریسک دلاری هدف ۷۵۰ دلار است. کمیسیون برای ۱.۵ لات: ( 1.5 \times 10 = 15 ) دلار. پس ظرفیت ریسک قیمتی ( 750 – 15 = 735 ) دلار است. اگر ربات این را از قبل در نظر نگیرد، لات سایز را ۱.۵ لات حساب میکند، اما ریسک واقعی ( 750 + 15 = 765 ) دلار خواهد بود. برای تصحیح، ربات باید معادله را اصلاح کند: [ \text{Lot Size} = \frac{\text{Risk}_{\$} – (\text{Lot Size} \times \text{Commission per Lot})}{(\text{Risk in Pips} \times \text{Pip Value per Standard Lot})} ] این معادله نیاز به حل جبری ساده دارد. جایگزین کردن اعداد: ( L = \frac{750 – (L \times 10)}{500} ) که حل آن ( L \approx 1.4706 ) لات میشود. ربات این عدد را گرد کرده و حدود ۱.۴۷ لات معامله میکند تا ریسک کل (قیمتی + کمیسیون) نزدیک به ۷۵۰ دلار باقی بماند.
مثال ۳: استفاده از ATR برای تنظیم پویای استاپ لاس و لات سایز
ربات از ATR دوره ۱۴ با مقدار فعلی ۱۰۰ پیپ استفاده میکند. طبق استراتژی، استاپ لاس برابر با ( 1.5 \times ATR = 150 ) پیپ تنظیم میشود. حساب ۱۰,۰۰۰ دلار بالانس و درصد ریسک ۲٪ دارد. ارزش پیپ یک لات استاندارد ۱۰ دلار است.
- ریسک دلاری: ( 200 ) دلار.
- ریسک پیپی: ۱۵۰ پیپ.
- لات سایز: ( \frac{200}{(150 \times 10)} \approx 0.1333 ) لات. اگر بازار نوسان کاهش یابد و ATR به ۵۰ پیپ برسد، استاپ لاس جدید ۷۵ پیپ خواهد شد و لات سایز محاسبه شده ( \frac{200}{(75 \times 10)} \approx 0.2666 ) لات میشود. ربات به طور خودکار در شرایط کمنوسان حجم بیشتری معامله میکند و در شرایط پرنوسان حجم را کاهش میدهد، در حالی که ریسک دلاری ثابت میماند.
ارتباط Lot Size با مارجین و Free Margin
مارجین (Margin) و فری مارجین (Free Margin) دو مفهوم کلیدی در معاملات اهرمی هستند که محاسبه لات سایز را محدود و کنترل میکنند. مارجین مقدار پولی است که بروکر به عنوان وثیقه (سپرده) برای باز نگه داشتن یک معامله با حجم مشخص، از حساب شما بلوکه میکند. فری مارجین برابر است با اکویتی منهای مارجین استفاده شده، و نشاندهنده مقداری از سرمایه است که هنوز میتوان برای معاملات جدید استفاده کرد. فرمول محاسبه مارجین مورد نیاز برای یک نماد به لات سایز، اهرم حساب (Leverage)، و نرخ تبدیل ارزها بستگی دارد. به طور ساده برای جفتهای فارکس:
[ \text{Margin Required} = \frac{\text{Lot Size} \times \text{Contract Size}}{\text{Leverage}} \times \text{Quote/Account Rate} ]
ربات قبل از ارسال سفارش با لات سایز محاسبه شده، باید دو بررسی حیاتی انجام دهد: اول، اطمینان حاصل کند که مارجین مورد نیاز برای این معامله از فری مارجین فعلی کمتر است. در غیر این صورت، بروکر اجازه باز کردن معامله را نمیدهد. دوم، برخی از رباتها یک قانون مدیریت سرمایه اضافی اعمال میکنند: حداکثر استفاده از مارجین را به یک درصدی از اکویتی محدود میکنند (مثلاً ۵۰٪). این کار برای جلوگیری از مارجین کال در صورت حرکت سریع بازار بر خلاف موقعیتهای باز انجام میشود. بنابراین، حتی اگر لات سایز بر اساس درصد ریسک، عددی بزرگ را پیشنهاد دهد، ممکن است به دلیل محدودیت فری مارجین یا قانون حداکثر استفاده از مارجین، مجبور به کاهش آن شویم. یک ربات قوی، این بررسیها را به ترتیب اولویت انجام میدهد: ابتدا لات سایز ایدهآل را بر اساس ریسک حساب کند، سپس آن را با محدودیت فری مارجین مقایسه کند و در صورت لزوم، آن را تا حد مجاز کاهش دهد. اگر حتی حداقل لات مجاز نیز از این محدودیتها فراتر رود، باید از باز کردن معامله صرفنظر کند.
محدودیتهای بروکر در Lot Size و نحوه مدیریت آن در ربات
هر بروکر محدودیتهای فنی و قانونی برای لات سایز معاملات تعریف میکند. این محدودیتها شامل موارد زیر است و ربات باید همه آنها را رعایت کند:
- حداقل لات (Min Lot): کوچکترین حجم قابل معامله (مثلاً ۰.۰۱ لات).
- حداکثر لات (Max Lot): بزرگترین حجم قابل معامله در یک سفارش (مثلاً ۱۰۰ لات).
- قدم لات (Lot Step): کوچکترین واحد افزایش حجم (مثلاً ۰.۰۱). یعنی حجمها باید به صورت ۰.۰۱، ۰.۰۲، ۰.۰۳ و… باشند، نه ۰.۰۱۵.
- حداکثر حجم باز کل (Maximum Total Volume): مجموع حجم تمام موقعیتهای باز نمیتواند از این حد فراتر رود.
مدیریت این محدودیتها در ربات، مستلزم استخراج دقیق این مقادیر از سرور بروکر و اعمال آنها پس از محاسبه لات سایز است. در ام کیو ال ۵، میتوان از توابع SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN)، SYMBOL_VOLUME_MAX، و SYMBOL_VOLUME_STEP استفاده کرد. فرآیند استاندارد به این صورت است:
۱. لات سایز ایدهآل (lotCalculated) را با فرمول مدیریت سرمایه محاسبه کن. ۲. آن را با حداقل لات مقایسه کن. اگر کوچکتر بود، lotCalculated = MinLot. ۳. آن را با حداکثر لات مقایسه کن. اگر بزرگتر بود، lotCalculated = MaxLot. ۴. لات سایز را با توجه به قدم لات گرد کن: [ \text{lotAdjusted} = \text{round}( \frac{\text{lotCalculated}}{\text{Lot Step}} ) \times \text{Lot Step} ] ۵. از صحت گرد کردن اطمینان حاصل کن و مجدداً با Min/Max مقایسه کن. ۶. بررسی کن که مجموع حجم موقعیتهای باز به اضافه lotAdjusted از حداکثر حجم باز کل فراتر نرود.
این فرآیند تضمین میکند که ربات در چارچوب قوانین بروکر عمل کند و از خطاهای اجرایی جلوگیری نماید. همچنین، در طراحی ربات باید به یاد داشت که این محدودیتها ممکن است بین نمادهای مختلف یک بروکر یا بین حسابهای مختلف متفاوت باشد، بنابراین ربات باید این مقادیر را به صورت پویا و برای هر نماد در لحظه اجرا بخواند، نه این که آنها را به صورت ثابت در کد ذخیره کند.
دیدگاهها (0)