همانطور که در مقاله «آموزش فیلترنویسی در سامانه tsetmc» توضیح دادیم، برای نوشتن و اجرا کردن فیلترها در سایت tsetmc نیاز به انجام تنظیمات اولیهای است که در مقاله بخش اول به آنها پرداخته شد. در این مقاله قصد داریم تا نحوه کدنویسی و تبدیل دستورات مد نظر به کد فیلتر را آموزش دهیم. در قسمت قبل گفتیم که برای نوشتن فیلتر ابتدا باید به بخش دیدهبان بازار رفته و سپس به بخش فیلتر مراجعه کرد. سپس باید قسمت فیلتر 0 را کلیک کنید. اکنون در بخش شرط میتوانید فیلتر مورد نظر خود را بنویسید.
قالب و فرمت فیلترها
در دو قالب ساده و قالب کدنویسی میتوان شرایط مورد نظر برای نمایش نمادهای سهام را تبدیل به کد کرد. در ادامه هر یک از این دو قالب معرفی میشوند.
قالب ساده
در این روش میتوان با استفاده از فیلدهای اطلاعاتی، عملگرها و توابع از پیش تعریف شده شرایط مدنظر را تبدیل به فیلتر قابل اجرا نمود. مثال زیر فیلتری را نشان میدهد که در خروجی آن قیمت آخرین معامله سهمها بیش از سه درصد از قیمت پایانی آنها بیشتر است.
3 < (pcp) - (plp)
این فیلتر در قسمت شرط به صورت زیر نمایش داده میشود:

در فیلتر زیر علاوه بر شرط بالا، حجم معامله شده از حجم مبنا بیشتر است.
(bvol) < (tvol) && < (pcp) - (plp)

قالب کدنویسی
در این روش علاوه بر ایجاد شروط با فیلدهای اطلاعاتی و عملگرها، میتوان دستورات در حلقه، متغیرهای جدید و توابع جدید تعریف نمود. این قالب نسبت به قالب ساده امکانات بیشتری دارد و حرفهایتر است. مثال زیر یک نمونه فیلتر است که در قالب کدنویسی نوشته شده است.

خروجی این فیلتر سهمهایی را نشان میدهد که قیمت آخرین معامله آنها کمتر از دو درصد با کمترین قیمت 22 روز گذشته فاصله دارد. در این فیلتر ابتدا یک متغیر به نام min تعریف شده است و سپس با استفاده از این متغیر، تاریخچه قیمت و دستور شرطی if کمترین قیمت 22 روز گذشته شناسایی شده است و در قسمت آخر اختلاف کمترین قیمت با قیمت آخرین معامله محاسبه میشود. اگر این اختلاف کمتر از دو درصد باشد، سهام در خروجی نمایش داده میشود.
حال با توجه به اینکه چه شروطی مد نظر کاربر است و با چه قالبی راحتتر است، میتوان یکی از دو قالب توضیح داده شده را انتخاب نمود و شروط مدنظر را در قالب انتخابی نوشت. در ادامه عملگرهای قابل استفاده، توابع از پیش آماده، فیلدهای ساده قابل استفاده و اطلاعات حقیقی و حقوقی معرفی میشوند.
عملگرها
در جدول زیر عملگرهای مورد استفاده در فیلترنویسی به همراه مدل نگارشی آنها در فیلترنویسی و یک مثال آورده شده است. برای ایجاد یک فیلتر قطعا باید از عملگرها که هم عملگرهای ریاضی و هم عملگرهای منطقی هستند، فروان استفاده نمود. لذا به خاطر سپاری نحوه نگارش آنها اهمیت بسیاری دارد.
عملگر | توضیح | مثال |
+ | جمع | (pf) + (pl) > 1000 |
- | تفریق | (pl) - (pc) > 100 |
* | ضرب | (pc) * (tvol) |
/ | تقسیم | (tval) / (tvol) |
% | باقیمانده تقسیم | (tno) % 10 |
&& | و | (pl) > 1000 && (pf)>1000 |
|| | یا | (pl) > 1000 || (pc)>1000 |
! | نقیض | ! ( (pl) - (pc) > 100) |
== | مساوی | (pl) == (py) |
> | بزرگتر | (pl) - (pc) > 100 |
< | کوچکتر | (pl) - (pc) < 100 |
>= | بزرگتر و مساوی | (pl) - (pc) >= 100 |
<= | کوچکتر و مساوی | (pl) - (pc) <= 100 |
!= | مخالف | (pf) != (pc) |
توابع از پیش آماده
در محیط فیلترنویسی برخی توابع از پیش آماده ریاضیاتی وجود دارد که درصورت نیاز به آنها نیاز به تعریف مجدد آنها نیست و از آنها با نحوه نگارشی خاصی که در ادامه در جدول زیر آمده است میتوان استفاده نمود.
توضیح | تابع |
قدرمطلق عدد x را برمی گرداند. | Math.abs(x) |
x را رو به بالا رند می کند. | Math.ceil(x) |
مقدار نمایی x را برمی گرداند. | Math.exp(x) |
x را رو به پایین رند می کند. | Math.floor(x) |
لگاریتم عدد x را بر می گرداند. | Math.log(x) |
بیشترین مقدار بین اعداد x,y,z,...,n را بر می گرداند. | Math.max(x,y,z,...,n) |
کمترین مقدار بین اعداد x,y,z,...,n را بر می گرداند. | Math.min(x,y,z,...,n) |
مقدار x به توان y را بر می گرداند. | Math.pow(x,y) |
عدد x را به نزدیکترین عدد صحیح روند می کند. | Math.round(x) |
جذر عدد x را بر می گرداند. | Math.sqrt(x) |
در ادامه فیلتری آورده شده است که از توابع از پیش ساخته استفاده میکند. این فیلتر سهمهایی را نشان میدهد که قیمت پایانی آنها با کمترین قیمت پایانی 60 روز اخیر حداکثر 30 درصد اختلاف دارد.

فیلدهای ساده قابل استفاده
در جدول زیر فیلدهای ساده قابل استفاده آورده شده است که در نوشتن فیلترها کاربرد فراوان دارد و لذا به خاطرسپاری آنها برای تسلط بر فیلترنویسی لازم و ضروری است. در مثالهای قبل همانطورکه قابل ملاحظه است، فراوان از این فیلدها استفاده شده است.
فیلد | توضیح | فیلد | توضیح |
(l18) | نماد | (pd1) | قیمت خرید - سطر اول |
(l30) | نام | (zd1) | تعداد خریدار - سطر اول |
(tno) | تعداد معاملات | (qd1) | حجم خرید- سطر اول |
(tvol) | حجم معاملات | (po1) | قیمت فروش - سطر اول |
(tval) | ارزش معاملات | (zo1) | تعداد فروشنده - سطر اول |
(py) | قیمت دیروز | (qo1) | حجم فروش- سطر اول |
(pf) | اولین قیمت | (pd2) | قیمت خرید - سطر دوم |
(pmin) | کمترین قیمت | (zd2) | تعداد خریدار - سطر دوم |
(pmax) | بیشترین قیمت | (qd2) | حجم خرید- سطر دوم |
(pl) | آخرین قیمت | (po2) | قیمت فروش - سطر دوم |
(plc) | تغییر آخرین قیمت | (zo2) | تعداد فروشنده - سطر دوم |
(plp) | درصد تغییر آخرین قیمت | (qo2) | حجم فروش- سطر دوم |
(pc) | قیمت پایانی | (pd3) | قیمت خرید - سطر سوم |
(pcc) | تغییر قیمت پایانی | (zd3) | تعداد خریدار - سطر سوم |
(pcp) | درصد تغییر قیمت پایانی | (qd3) | حجم خرید- سطر سوم |
(eps) | eps | (po3) | قیمت فروش - سطر سوم |
(pe) | p/e | (zo3) | تعداد فروشنده - سطر سوم |
(tmin) | آستانه مجاز پایین | (qo3) | حجم فروش- سطر سوم |
(tmax) | آستانه مجاز بالا | (bvol) | حجم مبنا |
(z) | تعداد سهام | (cs) | گروه صنعت |
(mv) | ارزش بازار |
|
|
اطلاعات حقیقی و حقوقی
برای نوشتن بسیاری از فیلترها به خصوص فیلترهای شناسایی پول هوشمند نیاز به استفاده از اطلاعات حقیقی و حقوقی است. در بخش اول نحوه فعالسازی دسترسی به این اطلاعات گفته شد. در این قسمت نحوه نگارش فیلدهای مربوط به اطلاعات حقیقی و حقوقی در جدول زیر آورده شده است.
توضیح | فیلد |
تعداد خریدار حقیقی | (ct).Buy_CountI |
تعداد خریدار حقوقی | (ct).Buy_CountN |
حجم خرید حقیقی | (ct).Buy_I_Volume |
حجم خرید حقوقی | (ct).Buy_N_Volume |
تعداد فروشنده حقیقی | (ct).Sell_CountI |
تعداد فروشنده حقوقی | (ct).Sell_CountN |
حجم فروش حقیقی | (ct).Sell_I_Volume |
حجم فروش حقوقی | (ct).Sell_N_Volume |
در فیلتر زیر سهمهایی نشان داده میشود که حجم خرید حقیقی و از حجم خرید حقوقی بیشتر است.

فیلدهای مربوط به سابقه قیمتها و معاملات
اکثر فیلترها ویژگیهای قیمتی و حجمی سهمها را در یک بازه زمانی در گذشته بررسی میکنند. لذا برای تبدیل این ویژگیها و شرایط به دسترسیهای مربوط به سابقه قیمت نیاز است. مثلا فرض کنید میخواهیم سهمی را در خروج مشاهده کنیم که برای 5 امین روز متوالی صف فروش بوده است و یا امروز در کف قیمتی یک ماه گذشته قرار دارد. برای نوشتن این فیلترها باید بر روی نحوه نمایش و نگارش فیلدهای سابقه قیمت و معاملات تسلط پیدا نمود. در جدول زیر فیلدهای مربوط به سابقه قیمت و معاملات آورده شده است.
فیلد | توضیح |
[ih] | اطلاعات سابقه معاملات |
[ih][n] | اطلاعات n روز قبل |
[ih][n].PClosing | قیمت پایانی در n روز قبل |
[ih][n].PDrCotVal | قیمت آخرین معامله در n روز قبل |
[ih][n].ZTotTran | تعداد معاملات در n روز قبل |
[ih][n].QTotTran5J | حجم معاملات در n روز قبل |
[ih][n].QTotCap | ارزش معاملات در n روز قبل |
[ih][n].PriceMin | کمترین قیمت در n روز قبل |
[ih][n].PriceMax | بیشترین قیمت در n روز قبل |
[ih][n].PriceYesterday | قیمت روز قبل در n روز قبل |
[ih][n].PriceFirst | اولین قیمت در n روز قبل |
سایر فیلدهای مربوط به آمارهای کلیدی نیز وجود دارد که کمتر مورد استفاده قرار میگیرد. تا اینجای کار با قالبهای فیلتر نویسی، انواع عملگرها، توابع پیش ساخته و فیلدهای پرکاربرد آشنا شدیم. در ادامه پس از تمرین و تسلط بر قالبها و نحوه نگارش عملگرها و فیلدها در آن، باید شرایط و ویژگیهای مد نظر برای فیلتر کردن سهمهای بازار را به صورت شفاف و بدون ابهام در نظر گرفت و یا برای راحتی کار آنها را در برگهای کاغذ یادداشت نمود، سپس هر یک از شروط را با استفاده از فیلدها، توابع از پیشساخته و عملگرها تبدیل به کد نمود. شاید نیاز باشد برای تبدیل شرایط مورد نظر برای فیلتر کردن سهام به کد از تعریف متغیر و توابع جدید یا دستورات حلقهای و تکرار شونده استفاده نمود. بسیاری از اندیکاتورهای مورد استفاده در تحلیل تکنیکال نیز با استفاده از دستورات حلقه میتوانند تبدیل به شروط فیلتر شوند. به طور مثال میتوان فیلتری نوشت که سهمهایی را نشان دهد که اندیکاتور RSI آنها کمتر از 30 باشد. ساختار نوشتن حلقه نیز نحوه نگارش خاصی دارد. مثال زیر نمونهای از دستورات حلقه آورده شده است.

فیلتر بالا سهمهایی را نشان میدهد که حجم معاملات امروز آن بیشتر از دو برابر میانگین حجم معاملات 20 روز گذشته بوده است. در این فیلتر از دستورات حلقه IF و for استفاده شده است.
کلام آخر
در این بخش به معرفی انواع قالبها و فرمتهای فیلترنویسی پرداختیم و سپس فیلدها و عملگرهای پرکاربرد معرفی شد. همه این فیلدها و عملگرها به همراه انواع دستورات حلقه در مثالهایی در بخشهای مختلف این مقاله آورده شد. با به خاطر سپاری فیلدها و نحوه نمایش اطلاعات قیمتها و معاملات میتوان انواع مختلفی از فیلترها را نوشت. فیلترها برگرفته از شرایط مد نظر کاربر و استراتژی معاملاتی وی هستند. بیشتر کاربردهای فیلتر نویسی برای انجام معاملات کوتاه مدت و نوسانگیری است. زیرا با فیلترنویسی نمیتوان جنبههای بنیادی و اقتصادی سهمها و کلیت بازار را مورد بررسی دقیق و کامل قرار داد. لذا توصیه میشود از ابزار فیلتر نویسی به عنوان یک ابزار مکمل برای انتخاب سهم مناسب استفاده شود.