منطق ترکیبی؛ فیلترهایی که خودت میسازی
عملگرهای AND/OR، پرانتزگذاری و ترکیب شرایط تابلو با رفتار چندروزه — طراحی فیلتر برای استراتژی شخصی، نه کپی
داشتن جعبهابزار با دانستن قصاببودن فرق دارد. درس قبل متغیرها را شناختی؛ این درس منطق ترکیبشان را: عملگرهای مقایسه، درستها (&&) و یاها (||)، نقش پرانتز، و مهارت اصلی — ترجمهٔ استراتژی ذهنی به کدِ قابلآزمون. در پایان، چکلیست سهسطرِ روندِ درس b4-4 را با هم به یک فیلتر واقعی تبدیل میکنیم و میبینی چرا فیلتری که خودت میسازی، از صد فیلترِ کپیشده باارزشتر است — چون منطقش را میفهمی، میتوانی تعمیرش کنی و بکتستش بدهی.
اول عملگرها؛ زبان مقایسه در فیلترنویسی
شرط یعنی مقایسه. شش عملگر پایه: == مساوی (دو مساوی، نه یکتا!)، != نامساوی، > بزرگتر، < کوچکتر، >= بزرگتر یا مساوی و <= کوچکتر یا مساوی. مقایسه یا درست است (نماد در خروجی میماند) یا غلط (حذف میشود). عدد و متغیر و حاصل عبارتهای ریاضی، هر سه سر عملگر میتوانند بنشینند: (tvol)>3*[is5] یعنی «حجم امروز بزرگتر از سه برابر میانگین سهماهه».
خطای شمارهٔ یک تازهکارها، جاانداختنِ علامت مساوی است: (pl)==(tmax) شرطِ «آخرین قیمت دقیقاً روی سقف مجاز» است، ولی (pl)=(tmax) اصلاً شرط نیست — انتساب است و یا خطا میدهد یا نتیجهٔ ناخواسته. خطای شمارهٔ دو، فراموشکردن تفاوت == و >= است: اگر میخواهی «بیشتر یا برابر» بگویی حتماً >= بنویس؛ == سختگیر است و حالت مرزی را از دست میدهد. عادت سادهٔ پیشگیری: بعد از نوشتن هر فیلتر، سه سطر اولِ خروجیاش را دستی چک کن که واقعاً همان چیزی است که میخواستی.
یک ظرافت مقایسهایِ بورسی: مقایسههای «دقیقاً مساوی» روی قیمتها (مثل (pd1)==(tmax)) بهخاطر گردشدن اعداد ممکن است بهدقت متن کار نکند؛ راه سالمتر، بازه گذاشتن است — مثلاً بهجای مساویِ سقف، بنویس (pl)>=(tmax)*0.998 یعنی «حداکثر ۰٫۲ درصد زیر سقف». منطق خواناتر میشود و خطای گردشدن هم حذف میشود.
مرور نکات این بخش
- شش عملگر: == != > < >= <= — حاصل هر مقایسه، درست یا غلط
- == دو کاراکتر است؛ جاافتادن یکی، شرط را خراب میکند
- دو طرف عملگر میتواند عدد، متغیر یا عبارت ریاضی باشد
- بهجای مساویِ دقیق روی قیمتها، بازهٔ تلورانسی بگذار (مثلاً ۰٫۹۹۸× سقف)
- پس از هر فیلتر، چند خروجی را دستی راستیآزمایی کن
نکته طلایی
قانون شخصی بساز: هیچ فیلتری را بدون «سهسطرِ چکِ دستی» ذخیره نکن — سه نماد اولِ خروجی را در تابلو باز کن و ببین شرطت واقعاً برقرار است یا کدت جای دیگری را میکَنَد.
و / یا / نقیض؛ چسبهای منطق
شرطهای تکی را با سه چسب به هم میچسبانی. && یعنی «و»: هر دو طرف باید همزمان درست باشند — (plp)>1 && (tvol)>2*[is5] یعنی هم رشد قیمت داشتی هم حجم؛ نمادی که فقط یکیشان را داشته باشد، حذف میشود. || یعنی «یا»: کافی است یک طرف درست باشد — برای پوشش حالتهای جایگزین: (plp)>3 || (plp)<-3 یعنی «حرکت تند، بالا یا پایین». ! نقیض است و درستی را وارونه میکند؛ در فیلترنویسی بورسی کمتر مستقیم به کار میرود اما دانستنش بد نیست.
نکتهٔ حیاتی: اولویت. در جاوااسکریپت، && از || محکمتر است؛ یعنی a || b && c بدون پرانتز، به a || (b && c) خوانده میشود — و اینجا یکی از خطرناکترین منابع خطاست. قانون طلایی: هر جا بیش از یک عملگر منطقی داری، پرانتز بگذار حتی وقتی مطمئنی اولویت درست است؛ پرانتز، رایگان است و خواناییِ کد را نجات میدهد. فیلتر، متنی است که سه ماه بعد خودت میخوانی — برای آن روزِ آینده بنویسش.
با همین سه چسب، ساختارهای شرطی پیچیده هم میسازی. مثال واقعی: «حجم بالای میانگین باشد، اما نماد صف نباشد» = (tvol)>2*[is5] && (pl)!=(tmax). یا «یا نزدیک سقف مجاز باشد با حجم، یا صف خریدِ کامل با سرخط سنگین» = ((pl)>=(tmax)*0.994 && (tvol)>2*[is5]) || ((pd1)==(tmax) && (qd1)>(bvol)). دو سناریوی متمایزِ ورود، در یک فیلتر — و پرانتزها مرز این دو را مشخص نگه میدارند.
مرور نکات این بخش
- && یعنی و (هر دو لازم) | || یعنی یا (یکی کافی) | ! نقیض
- && از || محکمتر است؛ بدون پرانتز، تفسیر میتواند غلط شود
- قانون طلایی: بیش از یک عملگر منطقی = پرانتزِ اجباری
- الگوی پرکاربرد: (شرط پایه) && (استثنا را حذف کن)
- دو سناریوی متمایز را با || به یک فیلتر بدوز، نه با چسباندن شروط بیپرانتز
نکته طلایی
قبل از ذخیرهٔ فیلتر ترکیبی، آن را با صدای بلند بخوان: «فلان و فلان، یا فلان». اگر جملهات معنای استراتژیات را نمیداد، پرانتزت جابهجا است — منطقِ خواندنی همان منطقِ درست است.
ذهنیت جدولی؛ فیلتر را روی کاغذ امتحان کن
مهارت جداکردن حرفهای از کپیکار، ذهنیتِ جدولی است: قبل از اجرای فیلتر، چند نماد فرضی را روی کاغذ از شرطها عبور بده. جدول بکش: هر سطر یک نماد با مقادیر فرضی، هر ستون یک شرط، و خانههای درست/غلط. فیلتر (plp)>1 && (tvol)>2*[is5] && (pd1)!=(tmax) را با سه نماد چک کنیم: نماد اول با رشد ۲ درصد، حجم ۲٫۵ برابر میانگین و بدون صف → هر سه ستون درست → در خروجی میماند. نماد دوم با رشد ۴ درصد و حجم ۱٫۲ برابر → ستون دوم غلط → حذف. نماد سوم با رشد ۱٫۵ درصد، حجم ۳ برابر و قیمت روی سقف → ستون سوم غلط → حذف.
این تمرین بهظاهر کودکانه، دو کار بزرگ میکند: اول، منطقِ کد را با منطقِ ذهن تطبیق میدهد (مخصوصاً جای && و ||)؛ دوم، حسِ «شخصیت فیلتر» را میسازد — با دیدن اینکه چه نمادهایی رد میشوند، میفهمی فیلترت سختگیر است یا ولخوار. برای این کار، خروجی واقعی فیلتر هم بهدرد میخورد: اگر فیلترت روی کل بازارِ چندصدنمادی فقط ۲ خروجی دارد، بیششرط شده؛ اگر ۱۵۰ خروجی دارد، اصلاً فیلتر نیست — لیست بازار است.
عدد طلایی از تجربهٔ بازیگران بورسی: فیلتر صبحگاهی خوب، معمولاً بین ۳ تا ۱۵ خروجی دارد — بهقدری کم که فرصت بررسی تکتکشان را داری و بهقدری زیاد که شانسِ واقعی گزینه وجود داشته باشد. این بازه را قانون شخصیات کن و هر فیلتری را با آن تنظیم کن: زیاد خروجی دادی، یک شرط معنادار اضافه کن؛ کم دادی، سختگیرترین شرط را نرم کن.
مرور نکات این بخش
- جدول ذهنی: سطرها نماد، ستونها شرط؛ فیلتر را قبل از اجرا روی کاغذ بسنج
- پرسش شخصیتسنج فیلتر: چهکسی رد میشود و چرا؟
- خروجی ۲تایی = بیششرط | خروجی ۱۵۰تایی = لیست بازار، نه فیلتر
- بازهٔ کاربردی از تجربه: ۳ تا ۱۵ خروجی برای فیلتر صبحگاهی
- تنظیم: زیاد بود، شرطِ معنادار اضافه کن؛ کم بود، سختگیرترین را نرم کن
نکته طلایی
برای هر فیلتری که میسازی، در دفترش بنویس «چرا این نماد رد شد؟» برای دو نمادِ ردشدهٔ تصادفی؛ این عادت، درک عمیقتر از هر دورهای به تو میدهد.
ترجمهٔ استراتژی به کد؛ کارگاه گامبهگام
حالا کار اصلی: استراتژی ذهنی را به کد ترجمه کنیم. گام ۱ — استراتژی را به زبان آدمیزاد بنویس: «میخواهم سهمهایی را ببینم که در روند صعودی بزرگاند، امروز با رشد و حجم بالای میانگیناند، و هنوز صف نشدهاند تا فاصلهٔ ورود معقولی داشته باشم.» گام ۲ — هر بند را به خانوادهٔ متغیرها (درس قبل) وصل کن: «روند صعودی بزرگ» ← دادهٔ چندروزه؛ «رشد و حجم» ← قیمت و حجم امروز؛ «صف نشده» ← سطر اول حامی/مرزهای مجاز.
گام ۳ — بنویس، با پرانتز و خوانا: (plp)>1 && (tvol)>1.5*[is5] && (pl)>[ih][50].PClosing && (pl)!=(tmax). دقت کن چطور «روند صعودی» را با «قیمت امروز بالاتر از پایانیِ ۵۰ روز قبل» تقریب زدیم — چون میانگین متحرک دقیق در دیدهبان مستقیم تعریف نشده و این شرط، جانشینِ منطقیِ «بالای روند بودن» است. اینجا درس مهمی هست: هر تقریب را مکتوب کن و بدان چه چیزی را با چه چیتری جایگزین کردهای؛ وگرنه سه ماه بعد فکر میکنی فیلترت چیز دیگری میگوید.
گام ۴ — تست سهسطرِ دستی (نمادهای خروجی را در تابلو چک کن) و گام ۵ — تنظیم: اگر خروجی زیاد بود، مثلاً شرط سرانه اضافه کن: ((ct).Buy_I_Volume/(ct).Buy_CountI)>((ct).Sell_I_Volume/(ct).Sell_CountI). حالا فیلتر پنجشرطیات روند + حرکت + حجم + عدم صف + قدرت خریدار حقیقی را میسنجد. این پنجخطی، اسکلت فیلتر صبحگاهی درس بعد است — و از این پس، هر ایدهٔ جدیدت را با همین پنج گام به کد بدل میکنی.
مرور نکات این بخش
- گام ۱: استراتژی به زبان آدمیزاد — بدون کد
- گام ۲: هر بند ← خانوادهٔ متغیر مربوط (قیمت/حجم/صف/چندروزه/ct)
- گام ۳: نوشتن با پرانتز + مکتوبکردن هر تقریب (مثل [ih][50].PClosing بهجای MA50)
- گام ۴: تست دستی سه نمادِ خروجی در تابلو
- گام ۵: تنظیم با شمار خروجی — نمونهٔ نهایی: فیلتر پنجشرطی روند+حرکت+حجم+عدم صف+سرانه
نکته طلایی
در دیکشنری فیلترت (درس قبل) یک ستون «تقریبها» اضافه کن: هر جا چیزی را جایگزین میانگین متحرک یا مفهوم تکنیکالی کردی، ثبتش کن. فیلتر شفاف، فیلترِ قابلتعمیر است.
دامهای منطقی؛ وقتی فیلتر درست اجرا میشود و غلط فکر میکند
دام اول: && بیشحد. هر «و»ی که اضافه میکنی، خروجیات را رادیکالی کم میکند؛ پنجاه شرط با هم، معمولاً یعنی «هیچ نمادی هیچوقت». علاج: شرطها را اول جدا بساز (هرکدام را تنها اجرا کن و خروجیاش را بشمار)، بعد یکییکی با هم ترکیب کن و ببین کدام && خروجی را نصف میکند — همانجا حساسترین شرطت را پیدا میکنی و آگاهانه تصمیم میگیری نگهش داری یا نرمش کنی.
دام دوم: || بیهدف. هر «یا» بیدلیل، دایرهٔ فیلتر را باز میکند تا جایی که همهچیز قبول میشود. || فقط برای «سناریوهای همارزش» است — دو راهِ مختلفِ رسیدن به همان ایده — نه برای شروطی که لطفاً یکیشان صادق باشد. دام سوم: شرطهای همپوشان که چیزی تازه نمیآورند: (plp)>1 && (plp)>2 فقط همان دومی است؛ شرطِ دوم، اولی را کامل میبلعد و اولی فقط خطِ اضافه است — و هر خط اضافه، هزینهٔ فهم آیندهٔ توست.
و دام چهارم، ظریفترین: منطق درست، فرض غلط. فیلترت ممکن است بینقص اجرا شود اما بر فرضی غلط استوار باشد — مثل شرط «صف نبودن» با (pl)!=(tmax) که آخرین معامله را میسنجد نه سرخط را؛ درستترش (pd1)!=(tmax) بود. کد، غلطِ مفهومی را نمیبیند؛ فقط تو میبینی — با همان عادت صدابلوندخواندن و جدول کاغذی. در درس بعد، این منطقِ سالم را به ده فیلتر آمادهٔ کاربردی تبدیل میکنیم و در درسهای ۹ و ۱۰، به آنها و شروطشان با چشم آزمون و سلامتسنجی نگاه میکنیم.
مرور نکات این بخش
- دام ۱: && بیشحد → خروجیِ صفر؛ علاج: ساخت شرطبهشرط و شمردن اثر هر &&
- دام ۲: || بیهدف → فیلتر بیمرز؛ || فقط برای سناریوهای همارزش
- دام ۳: شرط همپوشان → خط اضافه؛ شرط سختتر، نرمتر را کامل میبلعد
- دام ۴: منطق درست اما فرض غلط — مثل سنجیدن «صف نبودن» با آخرین قیمت بهجای سرخط
- کد غلطِ مفهومی را نمیبیند؛ صدابلوندخوانی و جدول کاغذی میبیند
نکته طلایی
قانون نهایی این درس: «فیلتر خوب، فیلتری است که میتوانی دربارهاش توضیح بدهی چرا هر خطش آنجاست.» هر خطی که برایش توضیح نداری، یا اضافه است یا دام — در هر دو صورت، حذفش کن.
آنچه در این درس یاد گرفتی
- شش عملگر مقایسه؛ == دو کاراکتر است و جاافتادنِ آن، شرط را میکُشد
- && یعنی و، || یعنی یا، ! نقیض؛ && از || محکمتر است پس پرانتزِ اجباری
- ذهنیت جدولی: فیلتر را قبل از اجرا با نمادهای فرضی روی کاغذ بسنج
- بازهٔ خروجی سالم فیلتر صبحگاهی: حدود ۳ تا ۱۵ نماد — نه لیست بازار، نه خروجی خالی
- پنج گام ترجمه: زبان آدمیزاد ← اتصال به خانوادهٔ متغیرها ← کد با پرانتز ← تست دستی ← تنظیم
- هر تقریب را مکتوب کن (مثل جایگزینی MA50 با [ih][50].PClosing)
- چهار دام: && بیشحد، || بیهدف، شرط همپوشان، منطقِ درست با فرضِ غلط
مرور سریع نکات طلایی
قبل از کوییز، نکتههای مهم را از حفظ بگو — بعد کارت را برگردان.
کوییز درس
۵ سوال کوتاه برای تثبیت یادگیری — بعد از هر پاسخ، توضیح را میبینی.
ادامهٔ مسیر دنیای بورس
سه بازار، یک آکادمی — بقیهٔ دنیاهای تریدپرو