<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های کامران کیانلو</title>
        <link>https://virgool.io/feed/@kamran.kianloo</link>
        <description>الان در حال یادگیری MQL5  - کنجکاوی هام درباره برنامه نویسی رو اینجا می نویسم.</description>
        <language>fa</language>
        <pubDate>2026-04-15 10:30:22</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/1765086/avatar/pPbVd8.jpg?height=120&amp;width=120</url>
            <title>کامران کیانلو</title>
            <link>https://virgool.io/@kamran.kianloo</link>
        </image>

                    <item>
                <title>چک لیست دیتا ساینس به روش اعضای تیم مایکروسافت</title>
                <link>https://virgool.io/@kamran.kianloo/data-science-project-checklist-rn8gywr9uszr</link>
                <description>این چک لیست ترجمه و خلاصه دم دستی از چک لیست پروژه دیتاساینس و ماشین لرنینگ سایت دیتاکمپ هست که می تونید اینفوگرافیک اونو به زبان انگلیسی از این لینک دانلود کنید.خوبیش اینه که این چک لیست ترکیبی از فرآیندهای تیم دیتاساینس مایکروسافت و دومینو دیتا لب هست و میشه بهش اعتماد کرد.آپدیت: واقعیت اینه که تو بحث های تخصصی ترجمه واقعا کار آسونی نیست و من هم هیچ ادعایی تو ترجمه ندارم ولی به نظرم رسید اگر ترجمه بشه می تونه کمک کننده باشه. امیدوارم براتون مفید باشه به درد من که خیلی خورد.قواعد کلی در مدیریت پروژهبه طور کلی پروژه های دیتا ساینسی موفق خواهند بود که قواعد زیر را رعایت می کنندمعیار measurable: آیا موفقیت این پروژه بر بیزینس قابل سنجش است؟معیار reliable: چه نسبتی از پروژه های دیتاساینس قبلی در این بیزینس به اهداف خودشون دست یافتند؟معیار scalable: آیا می توان توان عملیاتی پروژه را بدون کاهش قابلیت اطمینان افزایش داد؟سایر قواعدبا اینحال تیم های داده ساسنس علاوه بر موارد بالا باید قواعد زیر را نیز رعایت کنندمعیار Iterative: پروژه ها به ندرت مثل یک خط ثابت و بدون چالش تمام می شوند - بلکه بارها نیاز داریم به قدم های عقب بازگردیم- از تکنیک های agile و scrum برای حل این چالش ها و برگشت به قدم های قبلی استفاده کنیدمعیار Reusable &amp; Recycable: توسعه هر پروژه از صفر هزینه زمان و انرژی زیادی می برد - هر پروژه را طوری درست کنید که از مدل ها کد ها و داکیومنت های آن در دفعات بعدی استفاده نماییدمعیار Reproducible: همه چیز را طوری درست کنید که هربار به آن بازگشتید بتوانید به سادگی آن را بفهمید و ویرایش کنید - حالا با کامنت گذاری و کد نویسی تمیز گرفته تا روش های دیگر چون بارها ممکن است در هر زمانی بخواهید به کدها برگردید و آن ها را ویرایش کنیدفازهای مدیریت پروژه دیتاساینسهر دو سازمان مایکروسافت و دومینو دیتا لب از شیوه های زیر برای فاز بندی پروژه های دیتاساینس خودشون استفاده می کنندفاز اول: Context Setting &amp; ideationفاز دوم: Data Collection &amp; Explorationفاز سوم: Modeling &amp; Testingفاز چهارم: Deployment &amp; User Testingفاز پنجم: Monitoringفاز اول: Context Setting &amp; Ideationقدم ۱:‌ چه مشکلی در بیزینس باید حل شود؟       - باید به صورت کاملا شفاف دغدغه های بیزیسن و دلیل ایجاد پروژه مشخص گرددقدم ۲: اعضای پروژه را مشخص کنید      - نقش افرادی که در پروژه حضور دارند و وظایف و اختیارات هر فرد را مشخص کنید مثل لید دیتاساینس- حسابدار-مدیر داده ها- مهندس داده و ...قدم ۳: پروژه های مشابه را که قبلا انجام دادید مرور کنید      - نتایج کلیدی پروژه های قبلی چه بود؟      - چه بخش هایی از پروژه های قبلی را می توانیم در این پروژه استفاده کنیم؟      - چه اشتباهاتی انجام دادید که باید از آن اجتناب کنید؟قدم ۴: معیارهای شاخص عملکردی - KPI ها را برای اندازه گیری میزان موفقیت تعیین نمایید       - معیارهای KPI باید طبق متد SMART مشخص گردند                - شاخص Specific: مشخص باشد به طوری که تمام افراد تیم آن را بفهمند.                 - شاخص Measurable: قابل اندازه گیری باشد به طوری بتوانیم به سادگی با دیدن عدد بفهمیم به KPI رسیدیم یا خیر                 - شاخص Achievable:‌ اعضای تیم توانایی و منابع لازم برای رسیدن به هدف را داشته باشند                 - شاخص Relevant: شاخص ها در راستانی اهداف سازمان و شرکت باشند                 - شاخص Time-Related: ددلاینی برای رسیدن به هدف مشخص گرددیک مثال از KPI غیر SMART: &#x27;افزایش بازدید سایت&#x27;یک مثال از SMART KPI: بهینه سازی UI و UX وبسایت برای افزایش ۱۰٪ نرخ تبدیل فروش تا پایان تابستانقدم ۵: اختیارات و انتظارات پروژه را مشخص کنید        - خروجی های پروژه چه مواردی باید باشد؟        - چه آیتم هایی برای رسیدن به خروجی مد نظر مورد نیاز است؟        - چه مواردی در پروژه گنجانده نمی گردد و شامل پروژه نخواهد شد؟قدم ۶: یک پلن برنامه ریزی برای پروژه بنویسد- نقاط عطف را برای مراحل میانی پروژه تعیین نمایید- ددلاین ها را برای هرکدام از نقاط عطف پروژه تعیین کنید- شرح کوتاهی از هر مرحله و خروجی مدنظر آن بنویسیدقدم ۷: تخمین تاثیرگذاری های پروژه- تعیین کنید اگر به اهداف دست پیدا کنید سازمان چقدر سود خواهد نمود- اگر عدم قطعیت در محاسبات وجود دارد یک محدوده برای آن مشخص نمایید- هرگونه مزیتی شرکت به دست خواهد آورد ولی به صورت کمی قابل اندازه گیری نیست را ذکر نماییدقدم ۸:‌ هزینه های پروژه را تخمین بزنید- پروژه چه هزینه هایی خواهد داشت؟- چقدر زمان باید صرف انجام پروژه گردد؟- چه منابعی برای انجام پروژه نیاز دارید؟قدم ۹: ریسک های پروژه را تخمین بزنید- تمام ریسک های پروژه را ذکر کنید- برای هر کدام از ریسک ها-  تاثیر آن را به صورت احتمال وقوع ضربدر شدت وقوع آن محاسبه نمایید.قدم ‍۱۰: تصمیم بگیرید می خواهید پروژه را ادامه دهید یا خیربا توجه به انتظارات پروژه- تاثیرات و ریسک های آن یکی از تصمیم های زیر را بگیرید- پروژه را در دستور کار قرار دهید و شروع کنید- پروژه را به صورت Hold نگه دارید و بعد از انجام اولیت های بالاتر به آن سر بزنید- پروژه را به طور کل کنسل کنیدقدم ۱۱: مسولیت های هر شخص را در تیم مشخص کنیدمی توانید از مدل RACI استفاده کنید - برای مثال برای هر تسک موارد زیر را مشخص کنید:- تعیین Responsible: مشخص کردن فرد مسیول انجام تسک است- تعیین Accountable: مشخص کردن فردی که مسیول اتخاذ تصمیم های کلیدی است- تعیین Consulted: مشخص کردن افرادی که که نظراتشان در مورد تصمیمات کلیدی خواسته شده است- تعیین Informed:  مشخص کردن افرادی که در مورد تصمیمات کلیدی باید آگاه شوندقدم ۱۲: تعیین کنید چطور قرار است با هم در ارتباط باشید؟- چگونه و از چه طریقی با هم در ارتباط خواهید بود؟- جلسات به چه صورت برگزار خواهد شد؟قدم ۱۳: دیتا سورس ها را مشخص کنید-آیا به این دیتاسورس دسترسی دارید؟این دیتاها کجا نگهداری می شود؟دیتاسورس به چه شکلی است؟چقدر بزرگ است؟آیا یک سند برای توضیح بخش های مختلف دیتا وجود دارد؟با توجه به دیتاسورس می توان از دیتای مصنوعی برای اثبات موارد مدنظر استفاده کردقدم ۱۴: از نظر قانونی موارد مورد نظر را بررسی کنیدآیا گزارش هایی که تحویل می دهیم قرار است توسط مراجع قانونی نظارت گردد (مثل مدل های مالی)آیا تمام دیتاسورس ها و مواردی که استفاده می کنیم قانونی هستند؟قدم ۱۵:‌ نوع تکنولوژی که می خواهید استفاده کنید را مشخص کنیدبر روی ابزارهایی که برای ذخیره سازی- پردازش و مدلینگ دیتا قرار است استفاده کنید به توافق برسیدقدم ۱۶:‌ چارت پروژه را طراحی کنیدبه صورت خلاصه تصمیمات خود در مورد پروژه- اهداف- اعضای پروژه- KPI ها - برنامه ریزی ها - دیتاسورس - تکنولوژی مورد نظر و شیوه تعامل افراد با یکدیگر را به صورت چارت بنویسیدفاز دوم: Data Collection &amp; Explorationقدم ۱: به دیتاساینتیست ها دسترسی به تمام دیتاست ها داده شودمجوز های لازم برای هر دیتاست را از تیم فنی بگیریدهر دیتاستی که لازم است خریده شود را تهیه کنید یا از داده های مصنوعی استفاده کنیدقدم ۲: دیتاها را منتقل کنیدهر دیتاسورس را به محیط آنالیزی خود منتقل کنیدقدم ۳: دیتاها را تحلیل کنیدتوزیع هر متغیر را در داده خودو با استفاده از هیستوگرام یا Bar Plot به صورت مصور ایجاد نماییدمقادیر از دست رفته (NaN) را برای هر متغیر تعیین تکلیف کنیدرابطه بین متغیرها (Features) را با متغیر هدف با استفاده از Scatter- Histogram - Box Plot و heatmap مشخص کنیدقدم ۴: شاخص های کلیدی عملکردی (KPI) ها را برای اندازه گیری میزان موفقیت مشخص کنیدبرای هر دیتاست:خلاصه ای از دیتاست را مشخص کنیدهرگونه مشکل کیفیت داده در سطح بالا را شرح دهیدکیفیت متغیر هدف را شرح دهیدکیفیت هرمتغیر دیگر (Features) را شرح دهیدرابطه بین هر متغیر با متغیر هدف را شرح دهیدقدم ۵: تصمیم بگیرید پروژه را ادامه دهید یا خیربا توجه به گزارش کیفیت داده ها یکی از تصمیم های زیر را بگیریدبه پروژه ادامه دهیدپروژه را متوقف کنید تا زمانی که دیتاهای بیشتری جمع آوری گرددپروژه را کنسل کنیدقدم ۶:‌ یک پایپ لاین برای داده ها ایجاد کنیدداده ها باید با پیشرفت پروژه به صورت منظم بروز گردند. پایپ لاین داده  باید:به صورت اتوماتیک به محل آنالیز انتقال داده شوند و تمیز گردند باید بر روی یک حالت برنامه ریزی خودکار تنظیم گردند که یا به صورت دسته ای آپدیت شوند یا به صورت یک جریان برقرار (streaming Updates)قدم ۷: پایپ لاین داده خود را داکیومنت کنیدنموداری از پایپ لاین داده خود و وابستگی های آن رسم کنیددر هر مرحله از پایپ لاین توضیح دهید که چه اتفاقی می افتدفاز سوم: Modeling &amp; Testingنکته: این فاز هر پروژه های ماشین لرنینگ هم آزمایش هایی که می خواهیم در پروژه انجام دهیم (مثل A/B تستینگ) را شامل می گردد. از هر مرحله ای که برای پروژه شما منطقی نیست گذر کنید.بخش یک Modelingقدم ۱: یک فرضیه را در نظر بگیریدآیا این فرضیه در حوزه کسب و کار شما معنا دارد؟آیا می توان نتیجه را اندازه گیری کرد؟آیا داده های کافی برای مشاهده اثر آماری معنا دار دارید؟آیا سوگیری های آماری وجود دارد که باید آن ها را در نظر بگیرید؟قدم ۲: داده های خود را به دو بخش Train و Test تقسیم کنیدقبل از شروع این مرحله مطمین شوید که بر روی داده های شما Data Engineering انجام شده باشد تا یک وقت داده ای را از دست ندهیدقدم ۳: مهندسی ویژگی ها - Data Featuresبرای مدل خود از طریق تکنیک های زیر Feature ایجاد کنیداز شیوه Median یا scale number Variable استفاده کنیدبا استفاده از binning از داده های عددی خود Feature Category ایجاد نماییدبا استفاده از Box-Cox یا Yeo-Johnton داده های خود را به متغیر های عددی تبدیل کنید تا یک توزیع نرمال را دنبال کننددسته بندی های کمیاب یا یا مرتبط را با هم ترکیب کنیدداده های زمانی - Datetimes را extract یا ترکیب کنیدمتغیرهای جدید از خلاصه آمارها ایجاد کنیداز داده های متنی یا غیرساختار یافته معیارهای کمی ایجاد کنیدقدم ۴:‌ مدل را fit کنید یا آزمایشی را بر روی آن انجام دهیداز ساده ترین مدل شروع به fit کردن کنید و سپس پیچیدگی را افزایش دهیدبرای دیتاست های بزرگ حتما با یک sample شروع کنیدقدم۵: نتایج را ارزیابی کنیداز معیارهایی مثل دقت-Accuracy | درستی-Precision  و Recall برای ارزیابی مدل خود استفاده کنید. اگر عملکرد به اندازه کافی خوب بود:آیا می توانید دیتاهای بیشتری جمع آوری کنیدآیا می توانید داده های بیشتری را دخیل کنید یا اصطلاحا مهندسی کنید - Engineer more featuresآیا می توانید از الگوریتم های دیگر استفاده کنید؟قدم۶:‌ گزارشی از نتایج آماده کنیدبه صورت منظم به اعضای پروژه فیدبک دهید و از آنها فیدبک دریافت کنیدیک زبان مشترک بین اعضای بیزینس و اعضای تکنیکال تیم دیتاساینس مشخص نماییدشکست ها را نیز همانند موفقیت ها گزارش دهیدبخش Testingقدم ۱: یک شرایط آزمایشی را ایجاد نماییدیک شرایط آزمایشی ایجاد کنید به صورت اتوماتیک عملکرد مدل یا آزمایش شما را تست کند و اشکالاتی که ممکن است دوباره تکرار شوند را مشخص کند. این موارد شامل حالت های زیر می شود: تست هایی در کد خودیک بک تست بر روی سایر نمونه کار ها یا time series های دیگرقدم ۲: تاثیری که بر روی کسب و کار شامل می شود را مجدد بررسی کنیدحالا شما عملکرد مدل خود را به صورت یک معیار دارید و می توانید به صورت عملی تاثیراتی را که انتظار داشتید بر روی بیزینس چک کنید. در مورد تاثیرات با اعضای کلیدی بیزینس بحث و مکالمه کنیدقدم ۳: رویکرد فنی که اتخاذ کردید را مجدد بررسی کنیدمطمین شوید که مدل نهایی از لحاظ تکنیکالی مناسب استآیا فرضیه هایی که برای مدل در نظر گرفته بودید معتبر هستند؟آیا نتایج به داده هایی که نمونه برداری می کنید حساس هستند؟آیا پارامتر های شما به صورت کلی مناسب هستند؟آیا کسی دیگر می تواند مجدد از مدل شما استفاده کند؟قدم ۴: قابلیت استقرار یا Deploy را با تیم فنی بررسی و تایید کنیدآیا تمام احتمالات ورودی و use-case ها را می تواند هندل کند؟آیا تمام منابع مورد نیاز در بخش production موجود است؟اگر دیتاسورس ها موجود نباشند آیا مدل به خوبی و با خطاهای مناسب می تواند شکست بخورد؟آیا پیش بینی به اندازه کافی سریع است؟قدم ۵: نگهداری نتایج nullهرچیزی که به مرحله Production نمیرسد باید در یک مخزن دانش - Knowledge Repository نگهداری شود تا پروژه های آینده برای آن وقت صرف نکنند.فاز چهارم: Deployment &amp; User Testingبخش Deploymentقدم ۱: یک پایپ لاین دیتا توسعه دهیدیک DAG یا Directed Acyclic Graph برای تمام دیتاسورس ها در محیط عملیاتی production ایجاد کنیدبرای آپدیت خودکار داده ها یک برنامه ریزی زمانی ایجاد نماییدقدم ۲: یک پایپ لاین برای مدل توسعه دهیدیک API برای مدل خود توسعه دهید تا توسط یک داشبورد- وبسایت یا نرم افزار دیگری قابل دسترس باشدقدم ۳: برای مانیتور اطلاعات برنامه ریزی کنیدمعیارهایی که باید Track شوند از جمله معیار عملکرد و معیار امنیت که به شما باگ ها را نشان دهد محدوده های قابل قبول برای آن معیار مشخص کنیدتعیین کنید که چطور Alert دریافت کنید اگر معیار از رنج خارج شدقدم ۴: یک سناریو A/B تستینگ ایجاد کنیدویژگی یا مدل جدید را برای تعدادی از کابران تستی امتحان کنیدمعیارها را با دقت زیر نظر داشته باشید اما تا زمانی که یک موضوع اهمیت آماری نداشته باشد از نظر گروه بندی جدید مقاوت داشته باشیدقدم ۵:‌ نتایج A/B تستینگ را تحلیل و گزارش نماییدمعیاری که برای اندازه گیری در هر گروه مشخص کردید را با هم مقایسه کنیدنتایج را گزارش دهید - حتی اگر آزمایش ها موفقیت آمیز نبودندقدم ۶: نتایج را برای تمام کاربران یا بیشتر آنها امتحان نماییداگر تست ها موفقیت آمیز بود feature یا مدل خود را برای تمام کاربران یا بیشتر آنها امتحان نمایید.یک گروه کوچک را نگه دارید که این ویژگی یا مدل را دریافت نمی کنند تا بتوانید در بلند مدت میزان افزایش عملکرد خود را با مدل یا ویژگی جدید بررسی نماییدبخش User Testingقدم اول: یک گزارش از خروجی کار بنویسیدبه صورت خلاصه وضعیت پروژه و مواردی که یاد گرفتید یا مشخص کنیدیک بررسی اجمالی از پروژه بنویسیدخلاصه ای از مشکلات پروژه که شما برای حل آن تلاش کردیدتوضیحی در مورد دیتاسورس ها و پردازش هایی که بر روی آنها انجام شدتوضیحی در مورد تکنیک مدل سازی استفاده شده و اینکه چطور مدل را ارزیابی کردیدخلاصه ای از معماری راه حلدورنمایی از مزایایی که پروژه برای کمپانی و مشتری ها به ارمقان می آوردهرگونه یادگیری که پیرامون اجرای پروژه - دیتا ساینس - حوزه کاری بیزینس و محصول داشتید را توضیح دهیددورنمایی از قدم بعدیقدم دوم: گرفتن فیدبک از مشتریانانجام نظر سنجی و مصاحبه با مشتریاننظرات- امتیازات و شبکه های اجتماعی را مانیتور کنیدفاز پنجم: Monitoringقدم ۱: یک پایپ لاین برای مانیتور توسعه دهیدیک پایپ لاین برای track کردن خودکار عملکرد و معیارهای Safety برای پلن مانیتورینگ خودتون تعریف کنیدقدم ۲: داشبورد ایجاد کنیدداشبوردهایی ایجاد کنید تا تغییرات متریک هارو در هر زمانی نشان دهندقدم ۳: alert ها را تنظیم کنیدمشخص کنید که از طریق ایمیل - پیامک - ربات و ... تغییرات غیرقابل پذیرش را به شما اعلام نماید.</description>
                <category>کامران کیانلو</category>
                <author>کامران کیانلو</author>
                <pubDate>Fri, 05 Apr 2024 16:21:30 +0330</pubDate>
            </item>
                    <item>
                <title>Statement Master - بخش اول</title>
                <link>https://virgool.io/@kamran.kianloo/statement-master-%D8%A8%D8%AE%D8%B4-%D8%A7%D9%88%D9%84-ft2fjmtftymi</link>
                <description>فرض کنید که با یک ربات معامله گری روبرو شدین و خیلی هم به نظر جذاب میاد.مثلا برنامه نویسش میگه که این ربات در طول 20 ماه تونسته 1000 دلارو تبدیل بکنه به 3.8 میلیون دلار !!!!(مثال واقعی - اکسپرت Bonnitta توی متاتریدر دقیقا همچین ادعایی رو داره روی EURUSD)این لحظه دوپامین که هیچی، تمام هورمون های بدن با همدیگه متحد میشن و ترشح میکنن که درباره این ربات بیشتر تحقیق کنی. اما چطور تحقیق کنیم؟ چه سوال هایی واقعا باید بپرسیم که بفهمیم این ربات به درد بخور هست یا نه؟ اینجا جاییه که Statement خونی به دادمون میرسه و کلی کمکمون می کنه تشخیص بدیم این ربات عملکردش چطوره و یک عالمه از سوالهای مارو جواب میده. یک نمونه استیتمنت در متاتریدرمثلا اینکه این ربات: تو چند تا معامله تونسته اینقدر سود به دست بیاره؟مدیریت ریسک رو چطور انجام داده؟ اصلا مدیریت ریسک داشته؟!بیشترین میزانی که حساب مارو تو ضرر برده چقدر بوده؟ چند تا معامله اش سود بوده و چند تاش ضررده؟ (مثلا 100 تا معامله انجام داده و 10 تاش فقط سودده بوده؟)به صورت میانگین چقدر روی هر معامله می تونیم انتظار سود داشته باشیم؟از چه اهرمی استفاده کرده؟ و ...جان کلام آیا واقعا این ربات به درد ما و خلقیات ما می خوره یا نه.تو چند تا پست آینده می خوایم با هم یک نمونه استیتمنت Forex رو بیاریم و دونه دونه فاکتورهاش رو چک کنیم و یادبگیریم تحلیلش کنم. اگر تو کریپتو یا بورس ایران کار می کنی هم این پست ها به دردت می خوره چون فاکتورهاش 99 درصد همه جا یکسانهتو پست های بعد با من همراه باش ;)</description>
                <category>کامران کیانلو</category>
                <author>کامران کیانلو</author>
                <pubDate>Thu, 27 Apr 2023 16:59:12 +0330</pubDate>
            </item>
                    <item>
                <title>تشخیص کندل های جدید در Expert Adviser Mql5</title>
                <link>https://virgool.io/@kamran.kianloo/%D8%AA%D8%B4%D8%AE%DB%8C%D8%B5-%DA%A9%D9%86%D8%AF%D9%84-%D9%87%D8%A7%DB%8C-%D8%AC%D8%AF%DB%8C%D8%AF-%D8%AF%D8%B1-expert-adviser-mql5-zsub3q0pttmz</link>
                <description>تشخیص کندل های جدید موقع ساخت یک اندیکاتور در MQL5 اونقدرها هم کار سختی نیست. توی تابع OnCalculate که به ما به عنوان تابع اصلی میده 2 تا ورودی خیلی جالب داریم. rates_total و prev_calculated متغیر rates_total تعداد کندلهایی که برای ما در چارت لود شدن رو برمیگردونهمتغیر prev_calculated تعداد کندلهایی که در تابع OnCalculate فراخانی شدند و محاسبات روشون انجام شده.ما برای تشخیص کندل های جدید در اندیکاjور کافیه تکه کد زیر رو در OnCalculate بنویسیم و راحت کندل های جدید رو تشخیص بدیم int limit = rates_total - prev_calculated; if(limit == rates_total){       // First Calculate}else if(limit){      // new Bar}اما این روند در Expert ها متفاوته چون اونجا ما تابع OnTick رو داریم که روند کارش مشابه OnCalculate هست اما هیچ ورودی ای مثل rates_total  و prev_calculated نداریم.این تکه کد رو دیروز تو مقالات mql5 دیدم و یک راه حل جمع و جور کاربردی داشت و اون هم استفاده ترکیبی از متغیر زمان و تریف اون ها به صورت static بود.لینک اصلی مقاله// Default tick event handler
   void OnTick()
   {
      // Check for new bar (compatible with both MQL4 and MQL5).
         static datetime dtBarCurrent  = WRONG_VALUE;
                datetime dtBarPrevious = dtBarCurrent;
                         dtBarCurrent  = (datetime) SeriesInfoInteger(
                                          _Symbol, _Period, SERIES_LASTBAR_DATE );
                bool     bNewBarEvent  = ( dtBarCurrent != dtBarPrevious );
   
      // React to a new bar event and handle it.
         if( bNewBarEvent )
         {
            // Detect if this is the first tick received and handle it.
               /* For example, when it is first attached to a chart and
                  the bar is somewhere in the middle of its progress and
                  it&#039;s not actually the start of a new bar. */
               if( dtBarPrevious == WRONG_VALUE )
               {
                  // Do something on first tick or middle of bar ...
               }
               else
               {
                  // Do something when a normal bar starts ...
               };
            
            // Do something irrespective of the above condition ...
         }
         else
         {
            // Do something else ...
         };
   
      // Do other things ...
   };اگر براتون مبهمه که چطور کار می کنه دو تا موضوع زیر رو حتما بررسی کنید نحوه تعریف متغیر ها به صورت Static در mql5 و کاربردشکار با datetime در mql5</description>
                <category>کامران کیانلو</category>
                <author>کامران کیانلو</author>
                <pubDate>Wed, 26 Apr 2023 08:01:57 +0330</pubDate>
            </item>
                    <item>
                <title>مخفی کردن اندیکاتورهای مورد استفاده در Expert</title>
                <link>https://virgool.io/@kamran.kianloo/%D9%85%D8%AE%D9%81%DB%8C-%DA%A9%D8%B1%D8%AF%D9%86-%D8%A7%D9%86%D8%AF%DB%8C%DA%A9%D8%A7%D8%AA%D9%88%D8%B1%D9%87%D8%A7%DB%8C-%D9%85%D9%88%D8%B1%D8%AF-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%AF%D8%B1-expert-rhtzkpc1vfs7</link>
                <description>همین الان داشتم روی یک اکسپرتی کار می کردم و برام مهم بود که استراژیم رو موقع Backtest یا حساب Real نمایش نده. پس لازم داشتم تا اندیکاتورها مخفی بشن.سرچ کردم دیدم براش تو MQL5 یک تابع خیلی خوب هست به نام TesterHideIndicatorمخفی کردن اندیکاتور ها در Expert فکر می کنم تو ساخت Expert ها خیلی به کار شما هم بیاد.</description>
                <category>کامران کیانلو</category>
                <author>کامران کیانلو</author>
                <pubDate>Tue, 25 Apr 2023 19:55:09 +0330</pubDate>
            </item>
                    <item>
                <title>میشه داخل یک اکسپرت MQL5 یک اندیکاتور DRAW کرد؟</title>
                <link>https://virgool.io/@kamran.kianloo/%D9%85%DB%8C%D8%B4%D9%87-%D8%AF%D8%A7%D8%AE%D9%84-%DB%8C%DA%A9-%D8%A7%DA%A9%D8%B3%D9%BE%D8%B1%D8%AA-mql5-%DB%8C%DA%A9-%D8%A7%D9%86%D8%AF%DB%8C%DA%A9%D8%A7%D8%AA%D9%88%D8%B1-draw-%DA%A9%D8%B1%D8%AF-vzgjuxcrtggh</link>
                <description>امروز تقریبا چند ساعت درگیر این موضوع بودم که چرا وقتی می خوام داخل یک اکسپرت MQL5 یک اندیکاتور Draw کنم بهم خطای Array Out Of Range میده. جالبیش اینجا بود که همین کد رو تو خود فایل اندیکاتور وقتی اجرا می کردم بدون مشکل بود ولی وقتی تنظیم می کردم که اندیکاتور رو تو فایل اکسپرت من Draw کنه خطای Array Out of range میداد. باهاش یه 3 ساعتی ور رفتم تا چیزای خوبی دستگیرم شد و در نهایت راه حل مشکل رو پیدا کردم.در بابت ++C و مصائب کار با آرایه داینامیکخب MQL5 عملا از روی ++C ساخته شده و توی ++C (که یادش بخیر دوران دانشگاه کار می کردیم) یادمه که خیلی درباره مقدار دهی به آرایه های داینامیک بحث بود که حتما باید برای ریختن دیتا تو آرایه داینامیک با آدرسش تو حافظه کار می کردیم. یادمه قبل آرایه علامت &amp; می ذاشتیم و سیستم خودش میرفت آدرس آرایه رو توی هارد پیدا می کرد و باهاش کار می کرد. این داستان واقعا تو نگاه اول پیچیده بود و دو سه روزی باید خوب حالت های مختلف رو تست می کردی تا کاملا میشد درک کرد که چطور با آرایه داینامیک میشه تو ++C کار کرد.حالا این چیزی که من فهمیدم اینه (یافته هام تا اینجاست - آپدیت شد تو همین پست میذارم)، توی MQL5 اومدن برای راحتی کار گفتن آقا جان، شما از آرایه که می خوای استفاده کنی کلا بیا و از همون اول استاتیک تعریفش کن یا اگر داینامیک تعریفش کردی اشکالی نداره که، با تابع ArrayResize اونو استاتیکش کن. اینطوری کلا کاربر رو از درگیری های کار با آرایه داینامیک فارغ کردن و فقط یک جا لازمه که از آرایه Dynamic استفاده بشه و اون هم برای زمانیه که می خوایم یک اندیکاتور خودمون بسازیم. روالش هم اینطوری گفته انجام بدیم که : اول آرایه داینامیک بسازبعد با تابع SetIndexBuffer به من معرفیش کن که به عنوان بافر می خوای استفاده اش کنیبعدم که دیگه ولش کن غمت نباشه خودم حافظه اش رو مدیریت می کنم. تو فقط توش دیتا بریز امااا یه نکته مهم داره که من هم سر همین گیره بودم این 3 ساعت روتابع SetIndexBuffer همونطور که توی داکیومنت اصلی MQL5 هم اومده برای ساخت اندیکاتور ها استفاده میشه نه چیزی دیگه - درواقع ادیکتاتور رو به آرایه ما Bind می کنه.حالا ما وقتی میایم و توی OnCalculate که مخصوص ساخت اندیکاتور هاست با آرایه داینامیک کار می کنیم هیچ مشکلی وجود نداره اما وقتی توی OnTick یا اصلا توی OnInit با آرایه داینامیک کار می کنیم بهمون خطای Array Out Of Range میده.جان کلام. حرف حسابش اینه که از آرایه داینامیک فقط برای ساخت اندیکاتور استفاده کن و اون هم داخل فایلی که به عنوان اندیکاتور معرفی کردی نه اینکه یک فایل رو به عنوان اکسپرت بسازی و بعد بخوای داخلش اندیکاتور ایجاد کنی. در این صورت خطا میده چون از نظرش اون فایل اکسپرته نه اندیکاتورخب ما می خوایم داخل اکسپرت یک اندیکاتور داشته باشیم، تکلیف چیه؟خیلی ساده و خلاصه میشه اینطوری پیش رفتاندیکاتور مورد نظر خودمون رو خیلی خوشگل مشگلا به عنوان یک فایل اندیکاتور جدا بسازیمتو قدم بعدی تو اکسپرت از طریق تابع ChartIndicatorAdd اندیکاتور مورد نظر خودمون رو به اکسپرت اضافه می کنیم. خیلی تمیز و شیک و مجلسی </description>
                <category>کامران کیانلو</category>
                <author>کامران کیانلو</author>
                <pubDate>Sun, 23 Apr 2023 21:56:46 +0330</pubDate>
            </item>
                    <item>
                <title>پیدا کردن نقاط حمایت و مقاومت - ورژن 1</title>
                <link>https://virgool.io/@kamran.kianloo/%D9%BE%DB%8C%D8%AF%D8%A7-%DA%A9%D8%B1%D8%AF%D9%86-%D9%86%D9%82%D8%A7%D8%B7-%D8%AD%D9%85%D8%A7%DB%8C%D8%AA-%D9%88-%D9%85%D9%82%D8%A7%D9%88%D9%85%D8%AA-%D9%88%D8%B1%DA%98%D9%86-1-ylt5bw7lmyez</link>
                <description>(آپدیت: کد هارو وسط متن ها نوشته بودم ولی چک کردم دیدم جالب نشده - گذاشتم آخر نوشته ها کدهارو)امروز می خواستم یک اندیکاتور بنویسم که خیلی ساده بتونه نقاط حمایت و مقاومت رو بهم نشون بده - خیلی برنامه پیچیده ای نمی خوام باشه فقط اینکه بتونه نقاط رو بررسی کنه که هر کندل نسبت به کندل قبل و بعدش اگر High بالاتر یا اگر Low پایین تری داشت اون نقطه رو یک نقطه حمایت و مقاومت در نظر بگیره.تو تیکه پایین خیلی موضوع خاصی رو نداریم و Property های برنامه رو تعیین می کنیماما با توجه به اینکه قراره روی خود چارت علامت بزنیم حتما property سوم که indicator_chart_window هست رو انتخاب می کنیم.یک متغیر برای شمارش تو OnCalculator نیاز داریم که حتما باید به صورت Global تعریف بشه که اسمش رو خیلی ساده j گذاشتم.تو OnInit چیز خاصی نیز نیست بنویسیم چون چیزی به صورت پیش فرض نداریم.تو Event OnCalculate چند تا نکته خیلی مهم هست که باید حتما بهش دقت بشه.تابع CopyRate رو نیازی نیست حتما تو هربار فراخانی OnCalculate به صورت کامل برای همه کندل ها فراخانی کنیم (این خیلی خیلی مهمه و قطعا اگر درست اجرا نشه باعث میشه برنامه منابع خیلی بیشتری رو از سرور بگیره)همینطور برای اینکه تو هر بار فراخانی تابع OnCalculate برنامه مدام وارد حلقه های بلا استفاده نشه می تونیم از prev_calculate استفاده کنیم. تو کدنویسی چند تا از برنامه نویس های خوب mql5 دیدم که متاسفانه از prev_calculate استفاده نمی کنن و این خب باعث میشه الکی منابع اضافه مصرف بشه.راستی ما دو تا فاز داریم که تو کد بالا بهش اشاره کردم قشنگفاز اول فاز کندل های قبل از &quot;حال حاضره&quot; و فاز دوم فاز کندل های بعد از &quot;حال حاضر&quot; این برنامه با Object ها کار می کنه و OBJ_ARROW میذاره پایین وبالای کندل ها#property copyright &amp;quotCopyright 2023, MetaQuotes Software Corp.&amp;quot#property version   &amp;quot1.00&amp;quot#property indicator_chart_windowint j = 0;int OnInit()  {   return(INIT_SUCCEEDED);  }int OnCalculate(const int rates_total,                const int prev_calculated,                const datetime &amp;time[],                const double &amp;open[],                const double &amp;high[],                const double &amp;low[],                const double &amp;close[],                const long &amp;tick_volume[],                const long &amp;volume[],                const int &amp;spread[])  {   int limit = rates_total - prev_calculated;   MqlRates rates[];   ArraySetAsSeries(rates,true);   if(limit == rates_total)     {           int count = CopyRates(_Symbol,PERIOD_CURRENT,1,rates_total,rates);      for(int i=1; i&lt;count-1; i++)        {         if(rates[i].low &lt; rates[i+1].low &amp; rates[i].low &lt; rates[i-1].low)           {            ObjectCreate(0,IntegerToString(j),OBJ_ARROW_BUY,0,rates[i].time,rates[i].low);            j++;           }         if(rates[i].high &gt; rates[i + 1].high &amp; rates[i].high &gt; rates[i-1].high)           {            ObjectCreate(0,IntegerToString(j),OBJ_ARROW_SELL,0,rates[i].time,rates[i].high);            j++;           }        }      }    else if(limit){      CopyRates(_Symbol,PERIOD_CURRENT,1,3,rates);         if(rates[1].low &lt; rates[2].low &amp; rates[1].low &lt; rates[0].low)           {            ObjectCreate(0,IntegerToString(j),OBJ_ARROW_BUY,0,rates[1].time,rates[1].low);            j++;           }         if(rates[1].high &gt; rates[2].high &amp; rates[1].high &gt; rates[0].high)           {            ObjectCreate(0,IntegerToString(j),OBJ_ARROW_SELL,0,rates[1].time,rates[1].high);            j++;           }               }      return(rates_total);     }خروجی برنامهمی خوام تو یک برنامه دیگه همین کار رو با یک اندیکاتور انجام بدم نه اینکه با Object باشه</description>
                <category>کامران کیانلو</category>
                <author>کامران کیانلو</author>
                <pubDate>Fri, 21 Apr 2023 14:30:30 +0330</pubDate>
            </item>
            </channel>
</rss>