تابع ONTIMER – درس دوم – کتاب آموزش زبان mql (دوره پیشرفته)

دوره-پیشرفته--1-کتاب-آموزش-mql

تابع ONTIMER

جهت آشنایی با تابع ONTIMER بهتر است وارد فضای متاتریدر شویم.

تابع جدیدی بسازید و نام گذاری کنید.

تابع ONTIMER

 

تابع ONTIMER 2

سایر مراحل را بدون ایجاد تغییر به پایان برسانید.

مثل همیشه فایل اکسپرت ساخته شد.

یک بار دیگر با کلیک کردن بر دکمه new فایل جدید بسازید. نام آن را class2 قرار دهید.

در مرحله بعدی تابع onTimer را تیک دار کنید. سپس به finish برسانید.

تابع-ONTIMER-4

دو کلاس  test11 و class2 را مشاهده می­کنید.

تابع ONTIMER 5

اکسپرت اولی، شامل تابع های OnTnit ، OnDeinit و  OnTick می­باشد.

اما در اکسپرت دوم که تابع onTimer را فعال کردید، تغییراتی را در آن مشاهده می­کنید. از جمله کدی که در تابع OnTnit وجود دارد.

عملکرد کد تعریف شده بدین صورت است که: تایمری را به وجود می آورد. هر زمان که این تایمر صفر شود، تابع onTimer خوانده می شود. دقت نمایید چیزی که باید درون آن نوشته شود بر حسب ثانیه می­باشد. یعنی عدد 60 که به طور پیش فرض تعریف شده به این معناست که هر 60 ثانیه تابع onTimer فراخوانی می شود. (هر 1 دقیقه) دیگر کاری به تابع های دیگر ندارد. هر 60 ثانیه، بعد از اینکه اکسپرت run شود این تایمر شروع به کار می­کند. زمانی که کدهای تابع onTimer به پایان برسد باید 60 ثانیه دیگر بگذرد و این تابع مجددا فراخوانی شود.

البته می­توانید عدد 60 را به هر عددی که بخواهید تغییر دهید. چنانچه عدد 1  را قرار دهید هر 1 ثانیه، تابع onTimer فراخوانی خواهد شد.

می­توانید تابع دیگری را به نام EventSetMillisecondTimer بنویسید  که در آن میلی ثانیه ها را قرار دهید. به عنوان مثال عدد 1000 برابر است با 1 ثانیه.

EventSetMillisecondTimer

به این معنا که هر 1 ثانیه تابع onTimer فراخوانی می­شود. یا با قرار دادن عدد 500 ، هر نیم ثانیه تابع فراخوانی می­شود.

بنابراین می توانید از دو تابع استفاده نمایید.

تابع EventSetTimer برای ثانیه ، و تابع EventSetMillisecondTimer برای کمتر از ثانیه.

همچنین در تابع OnDeinit نیز کد دیگری را مشاهده می­کنید.

تابع OnDeinit

عملکرد آن به این شیوه می­باشد: تایمری که در تابع بالا ساخته شده را از بین می­برد. زمانی که اکسپرت از روی چارت پاک می شود این تابع فراخوانی می شود. در اندیکاتور به آن نیازی نیست چرا که این اتفاق می افتد و تایمر از بین می­رود. اما در اکسپرت باید این تابع وجود داشته باشد.

چنانچه این تابع وجود نداشته باشد، برنامه به شما اخطاری نمی­دهد. مثلا اگر کامنت کنید و compile را کلیک کنید برنامه اخطاری نمی­دهد. اما ناچاریم دستور وجود داشته باشد.

تابع-OnDeinit 2

نکته :

عملیات بالا سبب اشغال شدن حافظه می­ شود.

در آخر تابع onTimer نیز قابل مشاهده می­باشد.

تابع-OnDeinit-3

این تابع با توجه به زمانی که تعیین شده فراخوانی خواهد شد. تابع onTimer بهترین تابعی است برای نوشتن توابعی که با زمان سروکار دارند. زیرا با توجه به زمانی که تعریف داده اید فراخوانی می­شود بدون اینکه حرکت بازار را درنظر داشته باشد. لذا بهترین جا برای توابع زمانی است.

اینک به نوشتن برنامه می­پردازیم.

مسئله شماره 1:

برنامه بنویسید که زمان باقی مانده از کندل جاری را در دستور کامنت نمایش دهد؟

مسئله شماره 1

تابع TimeCurrent زمان فعلی را نمایش می­دهد. که با کامنت کردن آن با توجه به زمان تعریف شده فراخوانی می­شود. در مثال بالا  ثانیه تعریف شده لذا سر یک 1 ثانیه کامنت خواهد شد. compile را کلیک کنید. وارد متاتریدر شوید.

مسئله-شماره-1-2

نام کلاس را درون چارت درگ کنید.

مسئله-شماره-1-3

تاریخ روز قابل مشاهده می­باشد.

می توانید مقدار را در دیتاتایپ long قرار دهید. (می­توانید از دیتا تایپ  intاستفاده کنید اما احتمال دارد مقدار آن  زیاد باشد و از مقدار int خارج شود، لذا دیتاتایپ long گزینه مناسبی است).  سپس تابعی به نام time بگذارید و با تابع TimeCurrent مساوی کنید.

مسئله-شماره-1-4

 

مسئله-شماره-1-5

آنچه که در برنامه مشاهده می­کنید مقدار ثانیه های طی شده از 1/1/1970 را نمایش می­دهد. از آن زمان حساب شده و همچنان در حال بیشتر شدن می­باشد. بنابراین شما یک عدد دارید.

اینک یک متغیر دیگری تعریف کنید همان long را استفاده نمایید. Timecandel را مساوی با آرایه تایم کنید و کندل شماره صفر ، به معنای کندل جاری است. سپس یک خط پایین آمده و Timecandel را درون دستور کامنت قرار دهید.

مسئله-شماره-1-6

compile را کلیک کنید. وارد متاتریدر شوید.

مسئله-شماره-1-7

مشاهده می­کنید که یک ثانیه دیگر اضافه شده است. این همان ثانیه ای است که کندل فعلی در این چارت یک ساعته شروع شده است. و ثانیه های طی شده را نمایش می­دهد. اختلافی بین دو ثانیه ها را مشاهده می­کنید.

پس کافیست این دوتا را با هم جمع و تفریق کنید تا ثانیه ای که از این کندل طی شده را نمایش دهد. در حالی که شما برعکس آن را مدنظر دارید. چنانچه بخواهید ثانیه طی شده را به دست بیاورید اندکی دستورها را باید اصلاح کنید. به عنوان مثال:

مسئله-شماره-1-8

مقدار بزرگتر را منهای مقدار کوچک تر کنید. compile را کلیک کنید. وارد متاتریدر شوید.

مسئله-شماره-1-9

تعداد ثانیه های گذشته شده را مشاهده می­کنید.

مسئله-شماره-1-10

تایم یک دقیقه را کلیک کنید تا عدد بر اساس 1 دقیقه محاسبه شود.

مسئله-شماره-1-11

می­بینید که تا به حال 44 ثانیه از زمان گذشته است. و اگر عدد به 60 برسد کندل جدید شروع خواهد شد.

می­بینید کندل جدید شروع شد.

اما اگر برعکس آن را مدنظر داشته باشید. یعنی نمی­خواهید مدت زمان گذشته را ببینید بلکه می­خواهید مدت زمان مانده را بررسی کنید برای این حالت باید: زمان جاری چارت را بدانید چند دقیقه می­باشد بعد از آن زمان را به اضافه دقیقه ها کنید و بعد منها را انجام دهید. به عنوان مثال:

مسئله-شماره-1-13

متغیری بسازید و نام آن را ekh قرار دهید (به معنای اختلاف) تابع period دوره جاری چارت را بر حسب دقیقه نمایش می­دهد. برای اینکه مقدار ثانیه را هم به دست آورید باید آن را ضرب در 60 کنید تا مقدار ثانیه نیز به دست بیاورید. بعد از آن، به اضافه Timecandel کنید حال مقدار به دست آمده از مثدار اولیه بزرگتر خواهد بود.

در پایان ekh را در کامنت جهت پرینت کردن قرار دهید. compile را کلیک کنید. وارد متاتریدر شوید.

مشاهده می­کنید که یک دقیقه (60 ثانیه) بیشتر شده است.

باید عملیات منها را انجام دهید تا مقدار باقی مانده از کندل را به دست بیاورید.

مسئله-شماره-1-15

compile را کلیک کنید. وارد متاتریدر شوید.

مسئله-شماره-1-16

مقدار ثانیه باقی مانده از کندل را مشاهده می­کنید. بعد از اتمام ثانیه ها، کندل بعدی شروع می­شود.

مسئله-شماره-1-17

 

مسئله-شماره-1-18

مقدار 5 دقیقه را کلیک کنید تا نمای سریع تر و کلی تری را بر حسب ثانیه مشاهده کنید.

مسئله-شماره-1-19

برحسب 15 دقیقه را کلیک کنید نمای متفاوت دیگری را مشاهده خواهید کرد. عدد 693 را می­بینید که بر اساس ثانیه محاسبه شده است. به معنای اینکه بعد از 693 ثانیه کندل به پایان می­رسد.

شرطی را تعریف کنید که اگر period مساوی مساوی یک دقیقه بود همین دستور را به کامنت کند. compile را کلیک کنید. نباید خطا بدهد سپس وارد متاتریدر شوید.

مسئله-شماره-1-20

 

مسئله-شماره-1-21

پست 1 دقیقه در حال کار کردن می­باشد.

حال تایم بعدی را مساوی با 5 دقیقه کنید. می­توانید جهت زیبایی کد جلوی نام “s” قرار دهید.

مسئله-شماره-1-22

 

مسئله-شماره-1-23

 

مسئله-شماره-1-24

برای نمایش دقیقه در کدنویسی مراحل زیر را انجام دهید.

ابتدا از int استفاده کنید و مقدار را ضربدر 60 کنید. (1 دقیقه برابر است با 60 ثانیه) به عبارت دیگر: ekh برا ساس ثانیه می­باشد. (فرض کنید 100 ثانیه تا شروع کندل جدید وجود داشته باشد) 100 را تقسیم بر 60 کنید در این صورت عدد 1 را نمایش می­دهد (به معنای 1 دقیقه و چند مقدار از ثانیه) سپس 1 دقیقه را ضربدر 60 کنید. بعد از آن 100 را منفی 60 کنید نتیجه عدد 40 خواهد بود. ( یعنی 1 دقیقه و 40 ثانیه تا شروع کندل جدید باقی مانده است.)

مسئله-شماره-1-25

بعد از compile کردن با دو خطا مواجه می­شوید. به این معنا که احتمال دارد مقدار ekh از int بزرگتر باشد لذا مقداری از محاسبات از دست برود.

برای رفع مشکل و خطا:

چونکه شما int مدنظر دارید برای اینکه دیتا تایپ دیگر را تبدیل به int  کنید، پرانتز باز و بسته کرده و مجدد int را درون آن بنویسید. اما صرف پرینت شدن int کافی نیست بلکه پرینت شدن حاصل تقسیم هم مدنظر دارید. بنابراین تقسیم را نیز درون پرانتز قرار دهید. به عنوان مثال:

مسئله-شماره-1-26

کد بالا به این معناست که حاصل پرانتز (ekh/60) را تبدیل به int کند سپس در متغیر m بریزد. برای فرمول بعدی نیز همین عملیات را اجرا کنید.

اینک خطای ایجاد شده در compile اصلاح شده است. وارد متاتریدر شوید.

مسئله-شماره-1-27

 

مسئله-شماره-1-28

2 دقیقه و 3 ثانیه تا اتمام کندل باقی مانده است. می­توانید جهت زیبایی ظاهری در نمایش فاصله بین اعداد را بیشتر کنید.

Period بعدی تایم های 15 ، 30 و 60 دقیقه می­باشند که می­توانید تنها دقیقه آن ها را در کدنویسی بیاورید و سایر مراحل مانند کد قبلی اجرا شوند. به عنوان مثال :

مسئله-شماره-1-29

Compile را کلیک کرده و وارد متاتریدر شوید. به ترتیب زمان ها بررسی می­شوند.

مسئله-شماره-1-30

 

مسئله-شماره-1-31

 

مسئله-شماره-1-32

 

مسئله-شماره-1-33

در تمام زمان ها بعد از اتمام وقت نمایش شده کندل جدید شروع می­شود.

نکته :

شیوه محاسبه دقیقه و ثانیه از 0 تا 60 می­باشد. لذا در کدنویسی لزومی به گذاشتن int نیست. بهتر است به جای آن char قرار دهید. زیرا از زیر 60 بودن حاصل فرمول اطمینان دارید. بنابراین char کفایت می­کند.

برای 4 ساعته شرط دیگری بسازید و مساوی با 240 کنید یعنی برابر است با یک ساعت.

متغیر دیگری از نوع char ساخته و نام آن را h بگذارید. یک ساعت را تقسیم بر 3600 ثانیه کنید. برای به دست آوردن دقیقه، اول h را ضربدر 3600 کنید سپس منهای مقدار به دست آمده کنید. مجددا کل فرمول را تقسیم بر 60 کنید.

برای به دست آوردن ثانیه ها،  مانند دستورهای قبلی کدنویسی می­شود. Compile را کلیک کرده و وارد متاتریدر شوید. به تصویر زیر دقت نمایید.

مسئله-شماره-1-34

 

مسئله-شماره-1-35

 

جهت به دست آوردن تایم روزانه Period را مساوی مساوی 1440 کنید. و به صورت “یا”  با علامت ) || ) کنار دستور if قرار دهید.

مسئله-شماره-1-36

 

مسئله-شماره-1-37

1 ساعت و 51 دقیقه و 10 ثانیه کندل به پایان خواهد رسید.

برای هفتگی و ماهیانه نیز باید درون کد نویسی ها تغییراتی ایجاد کرد . به عنوان مثال: شرط if را ضربدر 7 کنید برای مقدار هفتگی و ضربدر 30 کنید تا مقدار ماهانه چاپ شود. سایر مراحل حاصل به دست آمده ساعت و دقیقه و ثانیه را مانند تصویر کدنویسی نمایید. به عنوان مثال :

مسئله-شماره-1-38

 

مسئله-شماره-1-39

 

و همچنین سایر زمان ها به درستی چاپ شده اند.

در دستورهایی که تا به حال نوشته شده اند چندین دستور if وجود دارد.

مسئله-شماره-1-40

می­توان به جای آن else if بگذارید. فایده آن این است که اگر یک دستور درست باشد شرط بعدی را چک نمی­کند بلکه خود بخود دستورهای بعدی else چک نمی­شوند.

مسئله دیگر این است که می­توانید در قسمت بالا، متغیرهای d ، h ، m ، s را قرار دهید.

مسئله-شماره-1-41

در کد ها می­توانید char را بردارید زیرا در بالا قید شده اند.

مسئله-شماره-1-42

 

نکته

 

 

 

سایر مقالات مرتبط

دیدگاه‌ خود را بنویسید

عناوین این پست
اسکرول به بالا