تبدیل اسکریپت ها از MetaTrader 4 به NetTradeX Advisors | IFCM ایران
IFC Markets کارگزار CFD آنلاین

تبدیل اسکریپت ها از MetaTrader 4 به NetTradeX Advisors

مقدمه

اسکریپت ها و مشاورین بسیاری برای پلت فرم تجاری MetaTrader 4 ایجاد شده اند. در گذشته، معامله گرانی که می خواستند از این اسکریپت ها در پلت فرم NetTradeX استفاده کنند نیاز به پروسۀ کامل کد منبع داشتند که زمان زیادی می گرفت. برای تسهیل این کار، یک کتابخانه برای سازگاری زبان های MQL4 و NTL+ ایجاد شده است. این کتابخانه باعث می شود تا روند تبدیل اسکریپت ها به زبان NTL+ برای اینکه در ترمینال NetTradeX Advisors اجرا شوند، ساده شود. به دلیل اختلافات موجود بین پلت فرم های MetaTrader و NetTradeX ( و بین زبان های MQL4 و NTL+ ) قاعدتاً نیاز پیدا خواهید کرد تا تغییرات کوچکی در اسکریپت های تبدیل شده اعمال نمایید. اصلی ترین بخش تطابق برعهدۀ کتابخانه MQL4.ntl می باشد که ترمینال NetTradeX Advisors را شامل می شود. هرچند، برنامه نویس باید اسکریپت اش را برای اجرا تغییر دهد. در این مقاله چگونگی استفاده از عملکردها از آن کتابخانه و تغییراتی که باید اعمال گردند نشان داده خواهند شد.

مبانی کار با کتابخانۀ MQL4.ntl

پیش از شروع کار اصلی تان باید در زبان MQL4 یک اسکریپتِ بطور کامل اشکال زدایی شده داشته باشد. برای تبدیل این کد به یک اسکریپت کاریِ NTL+ چه گام هایی باید برداشت؟

گام 1 - ابتدا، در درخت Script پنجرۀ Navigator در ترمینال NetTradeX Advisors باید یک فایل اسکریپت جدید ایجاد کنید. این فایل بسته به مقصدش باید در فایل Advisors یا Utilities باشد. سپس باید تمام متن اسکریپت را در آن فایل به زبان MQL4 کپی کنید.

گام 2 - اتصال کتابخانۀ MQL4.ntl . برای این منظور، خط #include "Libraries\MQL4.ntl" را به ابتدای فایل تان اضافه کنید. لازم به ذکر است که نیاز به کامپایل کردن کتابخانه MQL4.ntl نیست و برای کار کردن عملکردهای کتابخانه هیچ فایل جداگانه ای نیاز نیست. این کتابخانه برای اجرای مستقل طراحی نشده است و برای اهداف کمکی مورد استفاده قرار می گیرد.

گام 3 - تلاش برای کامپایل کردن اسکریپت تولید شده. برای این منظور در ویرایشگر کد روی گزینۀ Compile کلیک کنید یا اینکه کلید F7 را بزنید. کامپایلر به احتمال زیاد فهرستی از ایرادات و هشدارها را نمایش خواهد داد که باید مرحله به مرحله پاک شوند. در حال حاضر به دو نکتۀ کلیدی علاقه داریم: آیا کامپایلر کتابخانه را تشخیص داده است و آیا تمام عملکردهای خاص در اسکریپت مان هستند.

اگر کامپایلر قادر به تشخیص فایل کتابخانه نباشد، پیغام #include (فایل اسکریپت باز نشد) ظاهر خواهد شد. اگر چنین اتفاقی رخ داد مطمئن شوید که MQL4.ntl در مسیر خودش قرار دارد، در دستوردهنده های #include ذکر شده است و اسم صحیح اش ذکر شده است.

سه عملکرد با نام های از پیش تعریف شدۀ init()، start()، و deinit() در زبان MQL4 ویژه ترین عملکردها محسوب می شوند. تمام این عملکردها برای اجرا در ترمینال NetTradeX Advisors باید تعیین شوند. هرچند یکی از این عملکردها و دو تا از آنها،init() و deinit()، در چندین اسکریپت ممکن است وجود نداشته باشند. در این صورت کامپایلر با پیغام هایی نظیر "No matching signatures to 'init()'" یا "No matching signatures to 'deinit()'" شما را آگاه خواهد کرد. در چنین شرایطی باید عملکردهای deinit() و init() را به همراه فقط عملگر return 0 اضافه کنید.

int init()
{
	return 0;
}
int deinit()
{
	return 0;
}

اگر پیغام های "Failed to open script file" و "No matching signatures to 'init()'" / "No matching signatures to 'deinit()'" نمایش داده نشدند، می توان فرض کرد که اولین دوره با موفقیت اجرا شده است. هم اکنون می توانیم مشکلات محلی را حذف کنیم.

پیغام های متدوال کامپایلر، دلایل و راه های حذف شان

در این بخش به بیان پیام های معمول کامپایلر که در هنگام تطابق اسکریپت ایجاد می شوند می پردازیم. همچنین برای رفع ناسازگاری در کد، تصمیمات عملی ارائه داده می شوند.

No matching signatures to Print

اگر پیاده سازی عملکرد در NTL+ با تعداد متغییر مشخصات، مجاز نباشد، این نوع از پیام خطا را باعث می شود. در چنین مواقعی باید بگونه ای عملکرد تغییر داده شود که تعداد مشخصات در فراخوان دقیقاً با تعداد مشخصات در مقصد تطابق داشته باشد. In this way instead of Print (property1, property 2, property 3) а concatenation should be produced - Print(property 1+ property 2+ property 3).

Unexpected token 'unrecognized token'

یکی از دلایل بروز این پیام، تلاش برای اتصال فایل های کتابخانۀ زبان MQL4 از طریق دستوردهنده های #include است. زبان NTL+ با چنین کتابخانه هایی کار نمی کند و به همین دلیل اجرای این فایل ها غیرممکن است و این خط ها باید از برنامه پاک شوند.

'True'/'False' is not declared

اسامی متغییرهای منطقی در 88 با حروف کوچک شروع می شوند، به همین دلیل فقط True را به true و False را به false تغییر دهید

No conversion from '_bars&' to 'int' available

متغییر Bars در MQL4 تعیین کنندۀ تعداد بارها در نمودار کنونی است. در زبان NTL+ متغییر همنام Bars وجود دارد، به همین دلیل متغییرهای bars (با حرف b کوچک) در کتابخانۀ MQL4.ntl اضافه شده است، که برای نمودار کنونی تعداد میله ها را بازمی گرداند. این در اسکریپت تان باید بجای Bars استفاده شود.

Must return a value

این پیام زمانی ظاهر می شود که شما بدون مقدار بازگشت، عملگر “return” را فراخوانده باشید. عملکردی که این عملگر در آن استفاده می شود متفاوت از مقدار بازگشتی void معرفی می شود. اگر این پیغام نمایش داده شد، یا باید خود عملکرد را درست کنید یا اینکه مقدار برای return را مشخص کنید.

استفاده از عدد جادویی (Magic number)

استفاده از اعداد جادویی (Magic numbers) در نسخۀ کنونی زبان NTL+ پشتیبانی نمی شود. مقدار صفر اعداد جادویی برای تمامی پوزیشن های معاملاتی بازگشته است. توصیه می شود که در اسکریپت در زبان MQL4 توجه خاصی به استفاده از اعداد جادویی در عملگرهای شرطی شود. اگر نمی توانید موقعیت هایی که توسط این مشاور ایجاد می شوند را تشخیص دهید، اغلب فقط کافی است که عملکرد OrderMagicNumber() حذف کرده یا آن را تبدیل به توضیح کنید (یا آن را بعد از // قرار دهید یا بین /* و */ قرار دهید).

استفاده از متغییرهای ایستا

کلمۀ “static” (ایستا) در NTL+ استفاده نشده است. اگر لازم شد که مقدار متغییرها را بین اجرای عملکردها ذخیره کنید، چنین متغییرهایی باید جهانی ساخته شوند (بدون کلمۀ کلیدیstatic ) و آنها را خارج از عملکرد قرار دهید. اگر مایل بودید درصورتیکه فرض بر این شد که این مشخصات در خلال اجرا یا کار اسکریپت تغییر کنند، می توانید تغییر دهندۀ extern را اضافه کنید.

تعیین اندازۀ لات

اندازۀ کنونی لات برای تمام ابزارها، 100000 واحد است، پس اگر می خواهید ابزاری را با اندازۀ لات متفاوت استفاده کنید، (یعنی متفاومت با 100000) بطور جداگانه متغییر مربوطه را مشخص کنید و مقدار لازم برای اندازۀ لات را اختصاص دهید.

کارهای متنوع با فایل های DLL

کار با فایل های DLL در ترمینال های NetTradeX Advisors و MetaTrader4 بطور متفاوت انجام می شود. در MQL4، شرح کاملی از عملکرد از مدل DLL لازم است و در NTL+ چنین شرحی نیاز نیست. بجای تعیین

#import "name of file or module"
    Description of function1;
    Description of function2;
    Description of functionN;
#import

به راحتی بایدrandom_identifier("name of_file _or_module ");را ایجاد کنید که یک شی ء dll است. و بوسیلۀ
identifier.Cal ("name of_function", parameters of _functions_ separated by_commas);
یا
identifier. CallProc("name of_function", parameters of _function _separated by _commas); عملکردی که نیاز دارید را فرابخوانید.

بررسی کلمات کلیدی زبان

در MQL4 و NTL+ تفاوت هایی در کلمات کلیدی وجود دارند. مشاورین (Advisors) در زبان MQL4 می توانند اسامی متغییر ها یا عملکردها را استفاده کنند که در زبان NTL+ قابل دسترسی نیست و بالعکس. به عنوان مثال، کامپایلر برای خطی که در آن استفاده از پرانتزها توصیه نشده است، پیام Expected '(' را نمایش می دهد. یکی دلیل محتمل نیز می تواند انطباق نام متغییر با یکی از کلمات کلیدی باشد. اگر چنین انطباقی وجود داشته باشد، لازم است که در تمام جاهای کد برنامه، نام متغییر به نام دیگری تغییر کند. برای نمایش پنجرۀ Replace می تواند از کلید میانبر CTRL+H در ویرایشگر استفاده کرد.

Float value truncated in implicit convertion to integer

این پیام هشدار، زمانی به نمایش در می آید که تلاش کنید مقادیر float یا double در متغییر نوع int را اختصاص دهید. برای اجرای اسکریپت، اصلاح این ناسازگاری لازم نیست اما بهتر است که انجام شود. تبدیل از double به int و از float به int باید صراحتاً اجرا شود. به عنوان مثال، برای متغییر d از نوع double، این باید دارای شکل int(d) باشد.

فقدان تبدیل خودکار از bool به int و بالعکس

تبدیل خودکار در int i; bool b = true; i=b; در زبان NTL+ غیرممکن است. در این صورت پیغام “Can't implicitly convert from 'bool' to 'int'” نمایش داده می شود. به این ترتیب اگر نیاز به چنین تغییری پیدا کردید می توانید از ساختار زیر استفاده کنید:

int Run()
{
	// convertion from bool to int;
	bool a=false;
	int b = a?1:0;
	
	// convertion from int to bool
	int c=1;
	bool d = c==0?false:true;
}
Can't implicitly convert from 'datetime' to 'int'

در زبان NTL+ باید تبدیل از شی ء datetime به متغییر int صورت گیرد. که به این شکل انجام می شود: int i; datetime d; i = int (d);

ثابت های رنگ

برای کار کردن با رنگ های شیء در ابتدایی های گرافیکی، تعدادی ثابت (constants) در MQL4 وجود دارند. این نوع از ثابت ها به راحتی می توانند به 16 رنگ اصلی تغییر کنند مثلاً به سیاه یا سفید نشان داده شوند. تنها تفاوت، استفاده از رنگ در شاخص های گرافیکی است. اگر رنگی استفاده شود که توسط NTL+ تشخیص داده نشود، رنگ باید توسط مولفۀ RGB تعیین شود. به عنوان مثال، رنگ Tomato به این شکل تعیین می شود: color Tomato = 0xFF6347

کار با آرایۀ اطلاعات

کار با آرایۀ اطلاعات در MQL4 و NTL+ بطور متفاوت اجرا می شود. اعلانی مانند type name[] در NTL+ فقط برای آرایه های شاخص استفاده می شود. برای ذخیرۀ اطلاعات تمامی آرایه ها به شکل array <نوع> اسم; یا array <نوع> اسم (اندازه) اعلان می شوند. بنابراین، بجای string symb[3] = {"EURUSD", "GBPUSD", "AUDCAD"}; باید از array symb= {"EURUSD", "GBPUSD", "AUDCAD"}; استفاده شود.

عملکردهای بی پشتوانه

چندین عملکرد وجود دارند که در NTL+ پشتیبانی نمی شوند. این عملکردها یا باید حذف شوند یا اینکه منطق اسکریپت به روشی تغییر کند که ساختار NTL+ قابل استفاده باشد. اگر چنین عملکردهایی به شکل محوری استفاده شود، پیغام 'The function is not supported' یا 'No matching signatures to function_name' ظاهر خواهند شد.

فهرست عملکردهای بی پشتوانه:

  • SendMail()
  • گروه عملکردهای onArray
  • عملکردهای FileOpenHistory، FileIsLineEnding
  • گروه عملکردهای objects و ویژگی های شیء
  • عملکرد MarketInfo برای حالات زیر، مقدار صفر را باز می گرداند:
    • MODE_SWAPLONG
    • MODE_SWAPSHORT
    • MODE_STARTING
    • MODE_EXPIRATION
    • MODE_MINLOT
    • MODE_LOTSTEP
    • MODE_SWAPTYPE
    • MODE_PROFITCALCMODE
    • MODE_MARGINCALCMODE
    • MODE_MARGININIT
    • MODE_MARGINHEDGED
    • MODE_FREEZELEVEL
  • عملگر goto
  • عملکرد برای محاسبۀ شاخص سفارشی iCustom
  • گروه عملکردهای کار با ویندوز (Window functions)، MessageBox
  • TerminalCompany()، TerminalName()، TerminalPath()
  • مشخصات #property

خلاصه

در این مقاله طور نمونه به معرفی مشکلاتی پرداختیم که در هنگام تبدیل اسکریپت ها از MetaTrader به NetTradeX رخ می دهند. این روند بطور قابل ملاحظه ای توسط کتابخانۀ MQL4.ntl که همراه با ترمینال فراهم شده است، تسهیل شده است. مزیت این کتابخانه یک کد باز کامل است که برنامه نویس می تواند به صلاحدید خودش تغییر دهد یا اضافه کند. ما نیز به آنچه تا اینجا انجام داده ایم بسنده نمی کنیم و به منظور تسهیل روند تبدیل، در کتابخانه عملکردهای جدید اضافه و عملکردهای موجود را به روز رسانی می کنیم.

Close support
Call to instagram Call to Telegram Call to WhatsApp Call Back