تابع enter_pack نام داشت. همان باید هشدار میبود. یک ایجنت پژوهشی یک کشاندکری BTC نوشته بود: وقتی پرپچوال بیش از 8 بیسیس پوینت بالاتر از اسپات معامله میشد، اسپات بخر، پرپ را شورت کن، بنشین. فاندینگ و بیسیس بقیه را میکردند. بکتست هر دو لگ را در همان میلیثانیه پر میکرد، روی مید، بهعلاوه یک تیک تعارف. منحنی دارایی یک راهپله بود. هیچکس هیجانانگیزش نمیخواند. همان نقطهٔ فروشش بود.
دوشنبه بردیمش روی پیپر.
دوشنبه: پکی که همیشه پر میشد
اولین سیگنال ساعت 11:17 UTC نشست. بیسیس روی صفحه 9.4 bps بود، پرپ گران. در بکتست، enter_pack 2 پرشدگی و باقیماندهٔ 0 برگرداند. در پیپر یک پرشدگی اسپات 0.40 BTC روی ask برگرداند، و یک شورت نشسته روی پرپ که معامله نشد.
اسپات کارمزد تیکر 4 bp و حدود 1 bp اسپرد پرداخته بود. قیمت پرپی که میخواستیم هنوز روی بوک بود، بعد نبود. 20 ثانیه بعد بیسیس اعلامشده 5 bps بود، چون تازه اسپات را لیفت کرده بودیم. 40 ثانیه بعد پرپ پر شد، بعد از حرکت. پک شده بودیم. پک شده بودیم روی بیسیسی که دیگر هزینهٔ ورود و خروج را نمیداد.
بکتست «+9.4 bps کری، باقیمانده 0» را ثبت میکرد. بلاتر 4 bps هزینهٔ تیکر اسپات داشت، یک لانگ بدون هج 40ثانیهای، و گپ ورود حدود 5. نمونهام 1 بود و، با این حال، اعتماد زیادی به راهپله داشتم.
سهشنبه: تابع را باز کردیم
enter_pack فهرستی از لگها و یک مید هدف میگرفت. حلقه میزد، هر لگ را در mid * (1 ± slip) پر میکرد، و 1 ردیف پورتفولیو مینوشت. timestamp دومی نبود. شاخهای نبود که در آن لگ دوم وجود نداشته باشد. تست واحد residual == 0 را assert میکرد.
این تستی است که حس بزرگسال بودن میدهد. هرگز شکست نمیخورد.
پک را به 2 سفارش با state خودشان شکستیم: ارسالشده، جزئی، پرشده، لغوشده. ناقص به شیء درجهٔ یک تبدیل شد. بازپخش تاریخی هنوز بوک واقعی نداشت، پس تقلب کردیم. پرشدگی دوم را با یک قرعه از انتظار دوشنبه تأخیر بده (میانگین 26 ثانیه، دُمی که خوشم نیامد)، و قیمتش را به اندازهٔ حرکت اسپات در همان پنجره جابهجا کن. خام بود، اما راهپله قبل از ناهار دندانه درآورد: پکهایی که با 3 bps وارد شدند، پکهایی که هرگز پک نشدند.
چهارشنبه: 3 ثانیه، بعد ولش کن
اگر لگ دوم ظرف 3 ثانیه روی پوزیشن ننشست، اولی را فلت کن. باید از همانجا شروع میکردیم. محافظهکارانه به نظر میرسد تا وقتی abort را قیمت بگذاری. فلت کردن یعنی برای ورود اسپات را کراس کردهای و برای خروج هم کراس میکنی. 2 کارمزد تیکر، 2 اسپرد، بدون کری، بدون فاندینگ. در بازپخش بازنویسیشده آن abortها نادر نبودند. روی بارهایی جمع میشدند که بیسیس از همه «واقعی»تر به نظر میرسید، که معمولاً همان بارهایی است که چیزی از قبل از اسپات رد میشود.
تا شب چهارشنبه 17 سیگنال پیپر برای جر و بحث داشتیم.
| بکتست، صبح دوشنبه | پیپر، تا چهارشنبه | |
|---|---|---|
| ورود | هر دو لگ روی مید، 1 timestamp | اسپات روی ask؛ پرپ 5–40s بعد، یا هرگز |
| باقیمانده | همیشه 0 | بدون هج در 10 از 17 سیگنال |
| کارمزد روی معاملهٔ فعال | 2 تیکر | 2 تیکر، یا 4 اگر abort کنیم |
| محرک PnL | بیسیس + فاندینگ | هرچه اسپات در مدت انتظار کرد |
همکاری هنوز نوتبوکی دارد که پک را مثل یک محصول لیستشده، BTC_CARRY، با «مالیات اجرا»ی ثابت 2 bp حساب میکند. آن نوتبوک را دوست داشتم. همان راهپلهای را میساخت که ایجنت ساخته بود. مالیات یک میانگین است. یتیمها یک توزیعاند. میانگینها در یک ساعت کمعمق زیر گرفته نمیشوند؛ 0.40 BTC اسپات باقیمانده میتواند.
پنجشنبه: باقیمانده، بعد قهوه
3 ثانیه تقریباً همهچیز را abort میکرد وقتی روی صف هم منتظر بودیم. پیپر را تا 15 شل کردیم. ساعت 02:11 UTC پنجشنبه، اسپات پر شد و پرپ نشد. هنوز در فاز سوگ «مینشیند، لیفت میشود» بودم که رفتم قهوه درست کنم.
02:11:08 پر شد BTCUSDT 0.40 buy
02:11:08 ارسال شد BTCUSDT-PERP 0.40 sell، post-only
02:11:41 هنوز در کار
02:26:00 mark باقیمانده −18.1 bps
BTC در یک پنجرهٔ آرام 18 bps ریخت. باقیمانده کل معامله بود. فاندینگ، وقتی چاپ شد، به پرپی بستانکار شد که نداشتیم. اسپات همانجا نشسته بود و لانگ بود. مسیر شبانهٔ بکتست اصلی هرگز پوزیشن تکلگ نداشت، پس هرگز سؤالی را نپرسیده بود که از هر بوک دیگری میپرسیم: بدترین باری که این باقیمانده میتواند چاپ کند چیست، و استاپ پوزیشنی که قصد نگهداشتنش را نداشتیم کجاست؟
7 پک کامل هم قهرمان نبودند. تا لگ دوم چاپ شود، لیفت اسپات خودمان از قبل روی ایندکس فشار آورده بود، و بیسیس ورود 3–5 bps بدتر از اسنپشاتی بود که سیگنال را شلیک کرده بود. آستانهٔ 8 bps عددی دربارهٔ یک صفحه بود.
آنچه دفعهٔ بعد رد میکنیم
یک چندلگ را بهصورت یک تابع پرشدگی واحد شیپ نمیکردیم. همین قاعده برای کری پرپ-اسپات، یک اسپرد تقویمی، یا کال ورتیکالی که ایجنت بهصورت 2 لیمیت میفرستد و بعد جشن میگیرد که هر دو روی مید «پر» شدهاند.
- وضعیت سفارش بهازای هر لگ، از جمله جزئیها. پک را والد 2 تیکت بدانید.
- تایمر حداکثر یتیمی که واقعاً شلیک میکند، و مسیر فلتی که در خروج 2 اسپرد میپردازد.
- Mark-to-book روی باقیمانده، با استاپی که برای باقیمانده سایز شده. نت پکشده ناسیونال غلط است.
- هیچ کری بستانکار نشود، هیچ فاندینگی انباشته نشود، تا وقتی هر دو لگ روی پوزیشن باشند. ناقص، ناقص است.
- mid-on-mid را بهعنوان پیشفرض برای هر چیزی که 2 تیکت دارد رد کنید. اگر باید حدس بزنید، روی لگ نازک بدتر حدس بزنید و روی پرشدگی دوم دیرتر.
و test_pack_is_atomic را به ریپو راه نمیدادیم. Atomic خاصیت موتور مچینگ است، نه تابع کمکی. اسپات BTC و پرپچوال BTC دو بوکیاند که گاهی قافیه میشوند. پیپر جایی است که قافیهشان قطع میشود، و همین تنها دلیل جالب بودن راهپله بود.



