تابع ONTIMER
جهت آشنایی با تابع ONTIMER بهتر است وارد فضای متاتریدر شویم.
تابع جدیدی بسازید و نام گذاری کنید.
سایر مراحل را بدون ایجاد تغییر به پایان برسانید.
مثل همیشه فایل اکسپرت ساخته شد.
یک بار دیگر با کلیک کردن بر دکمه new فایل جدید بسازید. نام آن را class2 قرار دهید.
در مرحله بعدی تابع onTimer را تیک دار کنید. سپس به finish برسانید.
دو کلاس test11 و class2 را مشاهده میکنید.
اکسپرت اولی، شامل تابع های OnTnit ، OnDeinit و OnTick میباشد.
اما در اکسپرت دوم که تابع onTimer را فعال کردید، تغییراتی را در آن مشاهده میکنید. از جمله کدی که در تابع OnTnit وجود دارد.
عملکرد کد تعریف شده بدین صورت است که: تایمری را به وجود می آورد. هر زمان که این تایمر صفر شود، تابع onTimer خوانده می شود. دقت نمایید چیزی که باید درون آن نوشته شود بر حسب ثانیه میباشد. یعنی عدد 60 که به طور پیش فرض تعریف شده به این معناست که هر 60 ثانیه تابع onTimer فراخوانی می شود. (هر 1 دقیقه) دیگر کاری به تابع های دیگر ندارد. هر 60 ثانیه، بعد از اینکه اکسپرت run شود این تایمر شروع به کار میکند. زمانی که کدهای تابع onTimer به پایان برسد باید 60 ثانیه دیگر بگذرد و این تابع مجددا فراخوانی شود.
البته میتوانید عدد 60 را به هر عددی که بخواهید تغییر دهید. چنانچه عدد 1 را قرار دهید هر 1 ثانیه، تابع onTimer فراخوانی خواهد شد.
میتوانید تابع دیگری را به نام EventSetMillisecondTimer بنویسید که در آن میلی ثانیه ها را قرار دهید. به عنوان مثال عدد 1000 برابر است با 1 ثانیه.
به این معنا که هر 1 ثانیه تابع onTimer فراخوانی میشود. یا با قرار دادن عدد 500 ، هر نیم ثانیه تابع فراخوانی میشود.
بنابراین می توانید از دو تابع استفاده نمایید.
تابع EventSetTimer برای ثانیه ، و تابع EventSetMillisecondTimer برای کمتر از ثانیه.
همچنین در تابع OnDeinit نیز کد دیگری را مشاهده میکنید.
عملکرد آن به این شیوه میباشد: تایمری که در تابع بالا ساخته شده را از بین میبرد. زمانی که اکسپرت از روی چارت پاک می شود این تابع فراخوانی می شود. در اندیکاتور به آن نیازی نیست چرا که این اتفاق می افتد و تایمر از بین میرود. اما در اکسپرت باید این تابع وجود داشته باشد.
چنانچه این تابع وجود نداشته باشد، برنامه به شما اخطاری نمیدهد. مثلا اگر کامنت کنید و compile را کلیک کنید برنامه اخطاری نمیدهد. اما ناچاریم دستور وجود داشته باشد.
نکته :
عملیات بالا سبب اشغال شدن حافظه می شود.
در آخر تابع onTimer نیز قابل مشاهده میباشد.
این تابع با توجه به زمانی که تعیین شده فراخوانی خواهد شد. تابع onTimer بهترین تابعی است برای نوشتن توابعی که با زمان سروکار دارند. زیرا با توجه به زمانی که تعریف داده اید فراخوانی میشود بدون اینکه حرکت بازار را درنظر داشته باشد. لذا بهترین جا برای توابع زمانی است.
اینک به نوشتن برنامه میپردازیم.
مسئله شماره 1:
برنامه بنویسید که زمان باقی مانده از کندل جاری را در دستور کامنت نمایش دهد؟
تابع TimeCurrent زمان فعلی را نمایش میدهد. که با کامنت کردن آن با توجه به زمان تعریف شده فراخوانی میشود. در مثال بالا ثانیه تعریف شده لذا سر یک 1 ثانیه کامنت خواهد شد. compile را کلیک کنید. وارد متاتریدر شوید.
نام کلاس را درون چارت درگ کنید.
تاریخ روز قابل مشاهده میباشد.
می توانید مقدار را در دیتاتایپ long قرار دهید. (میتوانید از دیتا تایپ intاستفاده کنید اما احتمال دارد مقدار آن زیاد باشد و از مقدار int خارج شود، لذا دیتاتایپ long گزینه مناسبی است). سپس تابعی به نام time بگذارید و با تابع TimeCurrent مساوی کنید.
آنچه که در برنامه مشاهده میکنید مقدار ثانیه های طی شده از 1/1/1970 را نمایش میدهد. از آن زمان حساب شده و همچنان در حال بیشتر شدن میباشد. بنابراین شما یک عدد دارید.
اینک یک متغیر دیگری تعریف کنید همان long را استفاده نمایید. Timecandel را مساوی با آرایه تایم کنید و کندل شماره صفر ، به معنای کندل جاری است. سپس یک خط پایین آمده و Timecandel را درون دستور کامنت قرار دهید.
compile را کلیک کنید. وارد متاتریدر شوید.
مشاهده میکنید که یک ثانیه دیگر اضافه شده است. این همان ثانیه ای است که کندل فعلی در این چارت یک ساعته شروع شده است. و ثانیه های طی شده را نمایش میدهد. اختلافی بین دو ثانیه ها را مشاهده میکنید.
پس کافیست این دوتا را با هم جمع و تفریق کنید تا ثانیه ای که از این کندل طی شده را نمایش دهد. در حالی که شما برعکس آن را مدنظر دارید. چنانچه بخواهید ثانیه طی شده را به دست بیاورید اندکی دستورها را باید اصلاح کنید. به عنوان مثال:
مقدار بزرگتر را منهای مقدار کوچک تر کنید. compile را کلیک کنید. وارد متاتریدر شوید.
تعداد ثانیه های گذشته شده را مشاهده میکنید.
تایم یک دقیقه را کلیک کنید تا عدد بر اساس 1 دقیقه محاسبه شود.
میبینید که تا به حال 44 ثانیه از زمان گذشته است. و اگر عدد به 60 برسد کندل جدید شروع خواهد شد.
میبینید کندل جدید شروع شد.
اما اگر برعکس آن را مدنظر داشته باشید. یعنی نمیخواهید مدت زمان گذشته را ببینید بلکه میخواهید مدت زمان مانده را بررسی کنید برای این حالت باید: زمان جاری چارت را بدانید چند دقیقه میباشد بعد از آن زمان را به اضافه دقیقه ها کنید و بعد منها را انجام دهید. به عنوان مثال:
متغیری بسازید و نام آن را ekh قرار دهید (به معنای اختلاف) تابع period دوره جاری چارت را بر حسب دقیقه نمایش میدهد. برای اینکه مقدار ثانیه را هم به دست آورید باید آن را ضرب در 60 کنید تا مقدار ثانیه نیز به دست بیاورید. بعد از آن، به اضافه Timecandel کنید حال مقدار به دست آمده از مثدار اولیه بزرگتر خواهد بود.
در پایان ekh را در کامنت جهت پرینت کردن قرار دهید. compile را کلیک کنید. وارد متاتریدر شوید.
مشاهده میکنید که یک دقیقه (60 ثانیه) بیشتر شده است.
باید عملیات منها را انجام دهید تا مقدار باقی مانده از کندل را به دست بیاورید.
compile را کلیک کنید. وارد متاتریدر شوید.
مقدار ثانیه باقی مانده از کندل را مشاهده میکنید. بعد از اتمام ثانیه ها، کندل بعدی شروع میشود.
مقدار 5 دقیقه را کلیک کنید تا نمای سریع تر و کلی تری را بر حسب ثانیه مشاهده کنید.
برحسب 15 دقیقه را کلیک کنید نمای متفاوت دیگری را مشاهده خواهید کرد. عدد 693 را میبینید که بر اساس ثانیه محاسبه شده است. به معنای اینکه بعد از 693 ثانیه کندل به پایان میرسد.
شرطی را تعریف کنید که اگر period مساوی مساوی یک دقیقه بود همین دستور را به کامنت کند. compile را کلیک کنید. نباید خطا بدهد سپس وارد متاتریدر شوید.
پست 1 دقیقه در حال کار کردن میباشد.
حال تایم بعدی را مساوی با 5 دقیقه کنید. میتوانید جهت زیبایی کد جلوی نام “s” قرار دهید.
برای نمایش دقیقه در کدنویسی مراحل زیر را انجام دهید.
ابتدا از int استفاده کنید و مقدار را ضربدر 60 کنید. (1 دقیقه برابر است با 60 ثانیه) به عبارت دیگر: ekh برا ساس ثانیه میباشد. (فرض کنید 100 ثانیه تا شروع کندل جدید وجود داشته باشد) 100 را تقسیم بر 60 کنید در این صورت عدد 1 را نمایش میدهد (به معنای 1 دقیقه و چند مقدار از ثانیه) سپس 1 دقیقه را ضربدر 60 کنید. بعد از آن 100 را منفی 60 کنید نتیجه عدد 40 خواهد بود. ( یعنی 1 دقیقه و 40 ثانیه تا شروع کندل جدید باقی مانده است.)
بعد از compile کردن با دو خطا مواجه میشوید. به این معنا که احتمال دارد مقدار ekh از int بزرگتر باشد لذا مقداری از محاسبات از دست برود.
برای رفع مشکل و خطا:
چونکه شما int مدنظر دارید برای اینکه دیتا تایپ دیگر را تبدیل به int کنید، پرانتز باز و بسته کرده و مجدد int را درون آن بنویسید. اما صرف پرینت شدن int کافی نیست بلکه پرینت شدن حاصل تقسیم هم مدنظر دارید. بنابراین تقسیم را نیز درون پرانتز قرار دهید. به عنوان مثال:
کد بالا به این معناست که حاصل پرانتز (ekh/60) را تبدیل به int کند سپس در متغیر m بریزد. برای فرمول بعدی نیز همین عملیات را اجرا کنید.
اینک خطای ایجاد شده در compile اصلاح شده است. وارد متاتریدر شوید.
2 دقیقه و 3 ثانیه تا اتمام کندل باقی مانده است. میتوانید جهت زیبایی ظاهری در نمایش فاصله بین اعداد را بیشتر کنید.
Period بعدی تایم های 15 ، 30 و 60 دقیقه میباشند که میتوانید تنها دقیقه آن ها را در کدنویسی بیاورید و سایر مراحل مانند کد قبلی اجرا شوند. به عنوان مثال :
Compile را کلیک کرده و وارد متاتریدر شوید. به ترتیب زمان ها بررسی میشوند.
در تمام زمان ها بعد از اتمام وقت نمایش شده کندل جدید شروع میشود.
نکته :
شیوه محاسبه دقیقه و ثانیه از 0 تا 60 میباشد. لذا در کدنویسی لزومی به گذاشتن int نیست. بهتر است به جای آن char قرار دهید. زیرا از زیر 60 بودن حاصل فرمول اطمینان دارید. بنابراین char کفایت میکند.
برای 4 ساعته شرط دیگری بسازید و مساوی با 240 کنید یعنی برابر است با یک ساعت.
متغیر دیگری از نوع char ساخته و نام آن را h بگذارید. یک ساعت را تقسیم بر 3600 ثانیه کنید. برای به دست آوردن دقیقه، اول h را ضربدر 3600 کنید سپس منهای مقدار به دست آمده کنید. مجددا کل فرمول را تقسیم بر 60 کنید.
برای به دست آوردن ثانیه ها، مانند دستورهای قبلی کدنویسی میشود. Compile را کلیک کرده و وارد متاتریدر شوید. به تصویر زیر دقت نمایید.
جهت به دست آوردن تایم روزانه Period را مساوی مساوی 1440 کنید. و به صورت “یا” با علامت ) || ) کنار دستور if قرار دهید.
1 ساعت و 51 دقیقه و 10 ثانیه کندل به پایان خواهد رسید.
برای هفتگی و ماهیانه نیز باید درون کد نویسی ها تغییراتی ایجاد کرد . به عنوان مثال: شرط if را ضربدر 7 کنید برای مقدار هفتگی و ضربدر 30 کنید تا مقدار ماهانه چاپ شود. سایر مراحل حاصل به دست آمده ساعت و دقیقه و ثانیه را مانند تصویر کدنویسی نمایید. به عنوان مثال :
و همچنین سایر زمان ها به درستی چاپ شده اند.
در دستورهایی که تا به حال نوشته شده اند چندین دستور if وجود دارد.
میتوان به جای آن else if بگذارید. فایده آن این است که اگر یک دستور درست باشد شرط بعدی را چک نمیکند بلکه خود بخود دستورهای بعدی else چک نمیشوند.
مسئله دیگر این است که میتوانید در قسمت بالا، متغیرهای d ، h ، m ، s را قرار دهید.
در کد ها میتوانید char را بردارید زیرا در بالا قید شده اند.
پاسخها