سلام به همگی! امروز میخوام اولین اطلاعیه عمومی از پروژهای که روش کار میکنم را باهاتون به اشتراک بذارم. پروژهای که روش کار میکنم یه زبان خاص دامنه (DSL - Domain-Specific Language) هست که مخصوصاً برای کاربران فارسیزبان طراحی شده تا بتونن به راحتی استراتژیهای معاملاتی خودشون رو بدون نیاز به یادگیری زبانهای برنامهنویسی و درگیر شدن با کتابخونه های مختلف تعریف کنن و ازش بکتست بگیرن. این زبان به شکلی طراحی شده که ساده و قابل فهم باشه و بتونه پیچیدگیهای برنامهنویسی رو از سر راه کاربران برداره. در فاز اولیه پروژه مواردی که سعی میکنم رعایت بشن به این صورتن:
یادگیری ماشین، رمزنگاری سمت کاربر و ... میمونه برای فازهای بعد!
در حال حاضر پروژه در مرحله MVP قرار داره و بخشهای مهمی از کار رو پیش بردم. دامنه backtestscript.com رو تهیه کردم و بیشتر صفحه فرود (landing page) سایت هم آماده شده. البته برای بخش پایگاه داده که فعلاً برای جمعآوری ایمیل کاربران نیاز دارم، یکم از برنامه عقب افتادم (چون اولین بارم بود با NextJS دارم کد میزنم😅)، ولی مطمئنم این هفته جمع میشه.
یکی از مهمترین قسمتهای پروژه، جمعآوری دادههاست. تا الان تمرکزم روی دادههای بورس تهران بوده و تونستم ورکر (با پایتون🐉) لازم برای جمعآوری این دادهها رو بنویسم و دادهها رو در پایگاه داده QuestDB ذخیره کنم. هدفم اینه که کل پروژه رو با استفاده از فریمورک NextJS پیادهسازی کنم، بنابراین توی یکی دو روز آینده کدهایی که نوشتم رو باید برای NextJS بازنویسی میکنم. البته در آینده دادههای مربوط به بازارهای دیگه مثل رمز ارزها، بورس آمریکا و حتی آپلود دستی فایل کاربر رو هم اضافه میکنم، ولی فعلاً تمرکزم روی چند تا نماد از بورس تهران بود.
یکی از چالشهای اصلی در طراحی زبان، این بود که بتونم یک زبان برنامه نویسی که بهطور کامل از زبان فارسی پشتیبانی کنه و در عین حال ساده و قابل درک باشه رو ارائه بدم. برای این کار، سرور زبان رو با جاوا و antlr نوشتم برای تست اولیه. با چالشهایی مثل پشتیبانی از متن راستبهچپ (RTL) در ادیتور روبرو شدم. در ابتدا از Monaco Editor استفاده کردم، ولی با توجه به مشکلاتش در پشتیبانی از RTL، تصمیم گرفتم به جای اون از CodeMirror استفاده کنم. با اینکه CodeMirror امکانات کمتری داره، ولی سبکتره (برنامه خیلی سریعتر الان اجرا میشه 💯) و پشتیبانی خوبی از RTL ارائه میده. الان دارم سرور زبان رو با TypeScript بازنویسی میکنم تا بتونم اون رو در مرورگر کاربر اجرا کنم. امروز بخش خوبی را منتقل کردم ولی دوباره باید lexer را مثل پست «مینی پایتون ...» اینجا هم بنویسم 😮💨.
برای اینکه یه ایدهای از این زبان به دست بیارید، میخوام یه snippet کوتاه از نحوه تعریف استراتژی در این زبان رو باهاتون به اشتراک بذارم. البته این فقط یک بخش کوچیک از امکانات زبانه و خیلی بیشتر از اینها رو میتونید باهاش انجام بدید.
متغیر ورودی کاپپا را با مقدار 1 در نظر بگیر
رابطه فرآیند_هاکس را با ورودیهای ستون هدف و عدد کاپپا به این صورت تعریف کن:
بررسی کن که کاپپا بزرگتر از 0 باشد
متغیر آلفا را با مقدار توان(- کاپپا) در نظر بگیر
1 ردیف قبلی خود * آلفا + هدف را برگردان
یا مثلا
سیگنال هاکس_ویلیامز را با ورودیهای ستون بسته و ستون هاکس و ستون درصد_دامنه_ویلیامز به این صورت تعریف کن
اگر بسته کمتر از هاکس بود و درصد_دامنه_ویلیامز کمتر از -0.8 بود، بخر
اگر بسته بیشتر از هاکس بود و درصد_دامنه_ویلیامز بیشتر از -0.2 بود، بفروش
به نماد وبملت ستون هاکس را با رابطه فرآیند_هاکس اضافه کن
به نماد وبملت ستون درصد_دامنه_ویلیامز را با رابطه درصد_دامنه_ویلیامز با پنجره_زمانی 14 اضافه کن
به نماد وبملت ستون سیگنال_هاکس_ویلیامز را با سیگنال هاکس_ویلیامز اضافه کن
همونطور که میبینید، با استفاده از این زبان میتونید به راحتی استراتژیهای پیچیده رو به زبانی ساده و قابل فهم تعریف کنید. اگر هنوز یکم مبهم بنظرتون میرسه، به شکل زیر توجه کنین. صرفا با وارد کردن دستور یکسری رابطه را روی دادههای نماد محاسبه میکنیم و ستون اضافه میکنیم، درست مثل اکسل ولی به فارسی!
جزئیات بیشتر را موقعی که سایت بالا اومد روی بخش داکیومنت میتونید ببینین!
برنامهم اینه که تا آخر این هفته یه داشبورد ساده برای تعریف استراتژی روی چند نماد خاص و انجام بکتست رو آماده کنم. البته بنا به تجربه اطمینان میدم که ممکنه این یک هفته بشه دو هفته و فراتر از آن 😁. با پیشرفت بیشتر پروژه، دوباره پست میذاریم ولی فعلا کد زدن اولویت اوله. ممنون که تا اینجا همراه من بودید! منتظر آپدیتهای بعدی باشید!