در سرخطی بورس، سفارشی جلوی صف مینشیند که زودتر از بقیه، و نه زودتر از شروع پیشگشایش، به هستهی معاملات برسد. سرور مجازی فقط اولین حلقهی این مسیر را کوتاه میکند، اما همین حلقه را میشود اندازه گرفت: ۲۵ مهر ۱۴۰۵ از یک سرور در شبکهی سرورهای ابری ایرانِ مهران هاست، یک درخواست روی اتصالِ از قبل باز به سامانهی آنلاین آگاه، ایزیتریدر مفید و فارابیکسو ۲٫۵ تا ۱۳ میلیثانیه طول کشید، اما باز کردن همان اتصال با دستدادن TLS ۶۰ تا ۱۱۰ میلیثانیه. این راهنما عددها را کامل میآورد و سه کاری را که بیش از مشخصات سرور در نتیجه اثر دارند قدمبهقدم توضیح میدهد: گرم نگهداشتن اتصال پیش از ۸:۴۵، تنظیم ساعت سرور با NTP داخلی، و عوضکردن DNS سرور به رزولور ایرانی.
سرخطی بورس یعنی چه و چرا چند میلیثانیه مهم است؟
سرخطی یعنی ثبت سفارش خرید یا فروش در همان لحظهای که سامانهی معاملات سفارش میپذیرد، تا سفارش در صف خرید یا فروش یک نماد جلوتر از بقیه بنشیند. در بورس تهران معاملات ساعت ۹ شروع میشود و پیش از آن، از ۸:۴۵ تا ۹، پیشگشایش است که در آن فقط سفارش ثبت میشود و معاملهای انجام نمیشود؛ جدول ساعت معاملات ۱۴۰۵ همین بازه را آورده است. چون صف بر اساس زمان رسیدن سفارش به هسته مرتب میشود، در نمادهای پرطرفدار، اختلاف چند میلیثانیه میتواند جای سفارش را در صف عوض کند.
دو قاعدهی رسمی هم بازی را محدود میکند. طبق الزامات ابلاغشده به کارگزاریها (فروردین ۱۳۹۹)، کارگزاری پیش از آغاز پیشگشایش اجازهی گرفتن و پردازش سفارش ندارد، و اگر دو سفارش یک مشتری روی یک نماد کمتر از ۳۰۰ میلیثانیه فاصله داشته باشند، دومی رد میشود. پس زودتر فرستادن کمکی نمیکند و پشتسرهم فرستادن هم. آنچه میماند دقیق فرستادن است.
مسیر سفارش سه حلقه دارد: از دستگاه شما تا سامانهی معاملات آنلاین کارگزاری (OMS)، از آن سامانه تا هستهی معاملات، و صف داخل هسته. حلقهی دوم و سوم دست کارگزاری و بورس است و از بیرون دیده نمیشود؛ سرور مجازی فقط حلقهی اول را عوض میکند. این مقاله دربارهی همان حلقه است، با عدد.
پینگ سرور ایران تا سامانههای کارگزاری چقدر است؟ اندازهگیری واقعی
مبدأ آزمایش سروری در شبکهی مهران هاست در دیتاسنتر سیروان بود، همان شبکهای که آیپی سرورهای ابری ایران از آن میآید؛ زمان: شنبه ۲۵ مهر ۱۴۰۵، ساعت ۲۲:۳۰ به وقت تهران، یعنی بیرون از ساعت معاملات. به هر سامانه پنج اتصال تازه و پنج درخواست روی اتصال باز فرستادیم:
| سامانه | کارگزاری | شبکهی میزبان | اتصال TCP | تا پایان دستدادن TLS | درخواست روی اتصال باز |
|---|---|---|---|---|---|
| online.agah.com | آگاه | ویستا سامانه آسا | ۳ تا ۱۲ ms | ۶۹ تا ۱۱۲ ms | ۴ تا ۸ ms |
| easytrader.ir | مفید | تدبیرپرداز | ۲ تا ۹ ms | ۶۲ تا ۱۱۳ ms | ۲٫۵ تا ۴٫۵ ms |
| farabixo.com | فارابی | افرانت | ۲ تا ۸ ms | ۷۹ تا ۹۲ ms | ۱۰ تا ۱۳ ms |
چهار نکته از این جدول:
- پینگ معمولی جواب نمیدهد. هر سه سامانه به ping (ICMP) پاسخ ندادند، پس عددی که بعضی فروشندهها «پینگ به کارگزاری» مینامند را با ping نمیشود سنجید؛ معیار درست زمان اتصال TCP است که در جدول آمده.
- شبکه کوتاه است. اتصال TCP به هر سه سامانه بین ۲ تا ۱۲ میلیثانیه برقرار شد؛ همه در دیتاسنترهای داخل کشورند و مسیر از گذرگاه بینالملل نمیگذرد.
- دستدادن TLS گران است. باز کردن اتصال امن ۶۰ تا ۱۱۰ میلیثانیه طول کشید، ده تا بیست برابر خود مسیر (یک اتصال فارابیکسو هم ۲۷۹ میلیثانیه شد)؛ بخش بعدی را ببینید.
- تفاوت سامانهها در پاسخ است، نه در شبکه. روی اتصال باز، ایزیتریدر در ۲٫۵ تا ۴٫۵ و فارابیکسو در ۱۰ تا ۱۳ میلیثانیه جواب داد، با آنکه فاصلهی شبکهای هر دو تقریباً یکی بود. این تفاوت مال صفحهی اصلی سامانه است، نه مسیر ثبت سفارش، و برای مقایسهی کارگزاریها مبنای کافی نیست.
این اعداد بیرون از ساعت معاملات و از یک مبدأ گرفته شدهاند؛ صبحها که هزاران کاربر همزمان وارد سامانه میشوند، زمان پاسخ سمت کارگزاری بالا میرود. سامانهی سنجش شما هم باید همان سروری باشد که قرار است سفارش بفرستد، نه کامپیوتر خانه.
چرا اتصال به سامانهی کارگزاری را باید پیش از ۸:۴۵ باز کرده باشید؟
چون گرانترین بخش یک درخواست، باز کردن اتصال است نه فرستادن سفارش. در همان شب، درخواست HTTP ساده بدون رمزنگاری به همین سامانهها و دیجیکالا در ۵ تا ۱۸ میلیثانیه پاسخ گرفت، اما همان درخواست روی HTTPS با اتصال تازه، تا پایان دستدادن TLS ۶۰ تا ۱۱۳ میلیثانیه طول کشید. این الگو در سه شبکهی مستقل تکرار شد؛ علتش را نمیدانیم و حدس هم نمیزنیم، اما نتیجهی عملیاش روشن است: اگر سفارش ساعت ۸:۴۵ روی یک اتصال تازه برود، حدود صد میلیثانیه فقط صرف سلامواحوالپرسی TLS میشود.
پس:
- از چند دقیقه پیش از ۸:۴۵ در سامانهی معاملات وارد باشید و صفحه را باز نگه دارید؛ درست قبل از لحظهی ارسال صفحه را تازه نکنید.
- اگر ابزار خودکار یا اسکریپت دارید، باید اتصال را از قبل بسازد و برای ارسال سفارش از همان اتصال استفاده کند (keep-alive، HTTP/2 یا WebSocket)، نه اینکه برای هر سفارش اتصال تازه بزند.
- اتصال بیکار را بعضی سامانهها بعد از چند دقیقه میبندند؛ نزدیک لحظهی ارسال، یک درخواست سبک بفرستید تا اتصال زنده بماند.
ساعت سرور برای سرخطی: NTP داخلی در برابر خارجی
کسی که سفارش را «راس ۸:۴۵:۰۰» میفرستد، به ساعت سرور خودش اعتماد کرده است. اگر ساعت ۵۰ میلیثانیه جلو باشد سفارش زودتر از موعد میرسد و اگر عقب باشد، از صف عقب میافتد. ساعت سرورهای لینوکسی با NTP تنظیم میشود و دقت NTP به فاصلهی شما تا سرور زمان بستگی دارد. همان شب از همان سرور اندازه گرفتیم:
| سرور زمان | موقعیت | رفتوبرگشت | نتیجه |
|---|---|---|---|
| دو عضو ir.pool.ntp.org (پژوهشگاه IPM و هاستایران) | داخل ایران | ۲ تا ۳ ms | پاسخ پایدار |
| دو عضو دیگر همان ir.pool.ntp.org | بیرون از ایران | ۸۴ و ۱۷۵ ms | پاسخ پایدار، اما دور |
| ntp.ubuntu.com (پیشفرض اوبونتو) | بیرون از ایران | ۷۹ تا ۱۴۷ ms | پاسخ پایدار، اما دور |
| time.cloudflare.com | بیرون از ایران | ۷۷ تا ۸۸ ms | پاسخ پایدار، اما دور |
| time.google.com | بیرون از ایران | — | از ایران پاسخ نداد |
دو نکتهی غافلگیرکننده: منطقهی ایرانِ NTP Pool در همان روز فقط ۴ سرور فعال داشت و خود سایتش نوشته بود سرور کافی ندارد؛ برای همین نام ir.pool.ntp.org گاهی سرور خارجی تحویل میدهد. و این سرورها با هم هم اختلاف داشتند: تخمین هرکدام از ساعت سرور ما تا حدود ۲۰ میلیثانیه با دیگری فرق میکرد. یعنی «ساعت دقیق» یک عدد مطلق نیست؛ چیزی که میشود کنترل کرد نزدیکبودن منبع زمان و پایداری آن است. منبعی با رفتوبرگشت ۲ میلیثانیه خطای چندمیلیثانیهای دارد، و منبعی با رفتوبرگشت ۱۵۰ میلیثانیه خطای چنددهمیلیثانیهای. در روز قطعی اینترنت بینالملل هم سرورهای خارجی اصلاً در دسترس نیستند.
تنظیم chrony با منابع داخلی روی لینوکس
اوبونتو بهطور پیشفرض با systemd-timesyncd و فقط یک سرور خارجی تنظیم میشود. chrony چند منبع را همزمان میسنجد و نزدیکترینشان را انتخاب میکند:
apt install -y chrony
# in /etc/chrony/chrony.conf: comment out the existing "pool ..." lines, then add:
pool ir.pool.ntp.org iburst maxsources 4
systemctl restart chrony
chronyc sources -v # the line marked ^* is the selected source
chronyc tracking # "System time" = current error, "Root delay" = distance to the reference
در خروجی chronyc sources ستون Last sample باید اختلاف چندمیلیثانیهای نشان دهد و منبع انتخابشده (^*) ترجیحاً همان سرورهای داخلی باشد. اگر سرور داخلی پایداری میشناسید، با یک خط server <address> iburst اضافهاش کنید.
ساعت ویندوز سرور
بسیاری از ابزارهای سرخطی ویندوزیاند. ویندوز با w32tm تنظیم میشود؛ در PowerShell با دسترسی مدیر:
w32tm /config /manualpeerlist:"ir.pool.ntp.org,0x8" /syncfromflags:manual /update
Restart-Service w32time
w32tm /resync
w32tm /query /status
سرویس زمان ویندوز برای همگامسازی دقیق در حد میلیثانیه طراحی نشده و فاصلهی همگامسازیاش طولانی است؛ هر صبح پیش از بازار w32tm /resync بزنید و خروجی w32tm /stripchart /computer:ir.pool.ntp.org /samples:5 را ببینید تا اختلاف ساعت را بدانید.
DNS سرور را داخلی کنید: ۴ میلیثانیه در برابر ۹۰
پیش از هر اتصال تازه، نام سامانه باید به آیپی تبدیل شود. سرورهای ابری مهران هاست بهطور پیشفرض با رزولورهای عمومی 8.8.8.8 و 1.1.1.1 تحویل میشوند که برای هر کاری مناسباند، جز این یکی. همان شب، پرسیدن نام easytrader.ir از رزولورهای مختلف این زمان را گرفت:
| رزولور | زمان پاسخ |
|---|---|
| 217.218.127.127 و 217.218.155.155 (مخابرات) | ۴ تا ۸ ms |
| 178.22.122.100 و 185.51.200.2 (شکن) | ۰ تا ۸ ms |
| 8.8.8.8 (گوگل) | ۵۶ تا ۸۸ ms |
| 1.1.1.1 (کلادفلر) | ۸۴ تا ۱۰۸ ms |
| 208.67.220.220 (OpenDNS) | ۸۸ تا ۹۲ ms |
رزولور خارجی هر پرسش بیکش را از گذرگاه بینالملل رد میکند و در روز قطعی اینترنت بینالملل اصلاً جواب نمیدهد. روی اوبونتو ۲۲.۰۴، رزولور را در /etc/systemd/resolved.conf عوض کنید:
[Resolve]
DNS=217.218.127.127 217.218.155.155
FallbackDNS=8.8.8.8
systemctl restart systemd-resolved
resolvectl status | grep -A2 "DNS Servers"
resolvectl query easytrader.ir
اگر resolvectl status هنوز رزولورهای قبلی را برای کارت شبکه نشان میدهد، آنها در netplan تعریف شدهاند؛ همانجا در بخش nameservers عوضشان کنید و netplan apply بزنید. روی ویندوز سرور، در PowerShell (نام کارت شبکه را از Get-NetAdapter بخوانید):
Set-DnsClientServerAddress -InterfaceAlias "Ethernet" -ServerAddresses 217.218.127.127,217.218.155.155
Resolve-DnsName easytrader.ir
چه سروری برای سرخطی؟ مشخصات، سیستمعامل و محل
سرخطی به پردازندهی قوی نیاز ندارد؛ به مسیر کوتاه و پایدار نیاز دارد. انتخابها:
| روش کار | سیستمعامل | منابع پیشنهادی | نکته |
|---|---|---|---|
| ابزار دسکتاپی یا مرورگر روی سرور | ویندوز سرور ۲۰۲۲ | ۴ گیگابایت رم، ۲ هسته، ۴۰ گیگابایت دیسک | کف پنل برای ویندوز ۲ گیگابایت رم و ۳۲ گیگابایت دیسک است، اما مرورگر و ابزار کنار هم بیشتر میخواهند |
| اسکریپت یا ابزار خط فرمان | اوبونتو ۲۲.۰۴ | ۱ تا ۲ گیگابایت رم، ۱ هسته | سبک، ارزان و بدون هزینهی رابط گرافیکی |
محل سرور باید ایران باشد. سامانههای کارگزاری در دیتاسنترهای داخل کشورند و سرور خارج از ایران دستکم ۷۷ میلیثانیه، یعنی نزدیکترین لوکیشن اروپا در اندازهگیری پینگ سرورهای خارج، از آنها دور است؛ برای سرخطی این یعنی باخت پیش از شروع. اتصال به سرور ویندوزی هم با ریموت دسکتاپ است.
سرور ابری مهران هاست ساعتی حساب میشود و در کمتر از یک دقیقه تحویل میشود؛ میتوانید یک سرور ایران بسازید، همین آزمایشها را با سامانهی کارگزاری خودتان تکرار کنید و اگر عدد راضیتان نکرد حذفش کنید. فقط یادتان باشد سرور خاموش هم بخشی از نرخ ساعتی را میپردازد و فقط حذف، هزینه را قطع میکند؛ جزئیات در راهنمای سرور ابری ساعتی.
اتصال سرور به سامانهی کارگزاری خودتان را چطور بسنجید؟
چون ping جواب نمیدهد، با curl زمان اتصال و پاسخ را جدا بگیرید. حلقهی اول سه بار اتصال تازه میسازد و دستور دوم سه درخواست را روی یک اتصال میفرستد؛ نشانی را با سامانهی کارگزاری خودتان عوض کنید:
U=https://online.agah.com/
for i in 1 2 3; do
curl -s -o /dev/null -w 'new: dns=%{time_namelookup} tcp=%{time_connect} tls=%{time_appconnect}\n' $U
done
curl -s -o /dev/null -o /dev/null -o /dev/null \
-w 'reuse=%{num_connects} ttfb=%{time_starttransfer}\n' $U $U $U
در خروجی اول، dns باید چند میلیثانیه باشد (اگر بیش از ۵۰ است، رزولور خارجی است)، و در خروجی دوم خطهایی که reuse=0 دارند زمان درخواست روی اتصال باز را نشان میدهند — عددی که در لحظهی سرخطی واقعاً مهم است. روی ویندوز همین دستور با curl.exe در PowerShell اجرا میشود. آزمایش را صبح، نزدیک ساعت بازار هم تکرار کنید.
سرور مجازی چه چیزی را در سرخطی تضمین نمیکند؟
سرور سریع فقط سهم شما را از مسیر کوتاه میکند. سرعت سامانهی کارگزاری در صبحهای شلوغ، فاصلهی آن سامانه تا هسته، و ترتیب صف داخل هسته بیرون از دسترس شماست؛ تبلیغی که «تضمین سرخطی» میدهد چیزی را وعده داده که در اختیارش نیست. مقررات هم ثابت نیست: سازمان بورس و کارگزاریها گاهی قواعد پیشگشایش، تعداد ایستگاههای همزمان یک کد معاملاتی یا ارسال گروهی را عوض میکنند، پس پیش از هر استفاده از ابزار خودکار، اطلاعیههای کارگزاری خودتان را بخوانید. و سامانههایی که دادهی بازار را منتشر میکنند، مثل TSETMC و کدال، به آیپی دیتاسنتری جواب نمیدهند؛ ماجرایش را در تست دسترسی سرور ایران نوشتهایم. برای بازارهای خارجی و متاتریدر، راهنمای سرور مجازی ترید را ببینید.
سؤالات پرتکرار
بهترین سرور برای سرخطی بورس چیست؟
سروری در دیتاسنتر داخل ایران، با DNS و ساعت تنظیمشده روی منابع داخلی. در اندازهگیری ۲۵ مهر ۱۴۰۵ از شبکهی سرورهای ابری مهران هاست، اتصال TCP به سامانههای آگاه، مفید و فارابی ۲ تا ۱۲ میلیثانیه و درخواست روی اتصال باز ۲٫۵ تا ۱۳ میلیثانیه طول کشید. برای ابزارهای دسکتاپی ویندوز سرور با ۴ گیگابایت رم و برای اسکریپت، لینوکس با ۱ تا ۲ گیگابایت رم کافی است. سرور خارج از ایران برای سرخطی مناسب نیست.
پینگ مناسب برای سرخطی چقدر است؟
سامانههای کارگزاری معمولاً به ping جواب نمیدهند، پس معیار درست زمان اتصال TCP و زمان پاسخ روی اتصال باز است. از سرور داخل دیتاسنترهای ایران، اتصال به سامانههای آگاه، مفید و فارابی بین ۲ تا ۱۲ میلیثانیه برقرار شد. مهمتر از این عدد، این است که اتصال را پیش از ۸:۴۵ باز کنید، چون دستدادن TLS برای یک اتصال تازه ۶۰ تا ۱۱۰ میلیثانیه طول کشید.
ساعت سرور را برای سرخطی چطور دقیق کنم؟
روی لینوکس chrony نصب کنید و آن را روی منابع زمان داخلی مثل ir.pool.ntp.org بگذارید؛ در آزمایش ما سرورهای داخلی این مجموعه ۲ تا ۳ میلیثانیه فاصله داشتند و سرور پیشفرض اوبونتو ۷۹ تا ۱۴۷ میلیثانیه. روی ویندوز با دستور w32tm همین منبع را تنظیم کنید و هر صبح پیش از بازار همگامسازی را دستی اجرا کنید. سرورهای زمان با هم تا حدود ۲۰ میلیثانیه اختلاف داشتند، پس منبع نزدیک و پایدار مهمتر از نام آن است.
با سرور مجازی خارج از ایران میشود سرخط زد؟
نه بهشکل رقابتی. سامانههای معاملات آنلاین کارگزاریها در دیتاسنترهای داخل ایراناند و نزدیکترین لوکیشنهای اروپا، آلمان، در اندازهگیری ما حدود ۷۷ تا ۸۲ میلیثانیه با ایران فاصله داشتند، در حالی که سرور داخلی ۲ تا ۱۲ میلیثانیه. مسیر بینالملل افت بسته و قطعی هم دارد. برای سرخطی سرور ایران بگیرید و سرور خارج را برای کارهایی نگه دارید که به اینترنت بینالملل نیاز دارند.
آیا TSETMC و کدال از روی سرور مجازی باز میشوند؟
معمولاً نه. در آزمایشهای ما اتصال به www.tsetmc.com و codal.ir از آیپی دیتاسنتری، چه داخل ایران و چه خارج، برقرار نشد، در حالی که سامانههای معاملاتی کارگزاریها از همان سرور پاسخ دادند. اگر ابزار شما دادهی بازار را از این دو سایت میخواند، باید آن را از جای دیگری بگیرد یا روی اینترنت خانگی اجرا شود. این محدودیت از سمت آن سایتهاست، نه از شبکهی سرور.