تشخیص کندل های جدید موقع ساخت یک اندیکاتور در 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'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 ... };
اگر براتون مبهمه که چطور کار می کنه دو تا موضوع زیر رو حتما بررسی کنید