Announcement

Collapse
No announcement yet.

Как написать dll для советника на mql4

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • Как написать dll для советника на mql4

    Не раз сталкивался с тем, что вместе с советником на MQL прилагалась библиотека DLL. Мне стало интересно подробнее узнать обо всем этом.
    Сначала я нашел очень интересное видео-руководство по написанию DLL в среде Embarcadero Rad Studio C++Builder. Этот вопрос заинтересовал меня вдвойне, т.к. у меня был небольшой опыт разработки в C++Builder 6. У меня до сих пор сохранился на диске этот компилятор. По аналогии с представленным ниже видео я и собрал свою первую DLL в C++Builder 6.

    Для желающих более углубленно изучить этот процесс представляю следующие материалы:

    РУКОВОДСТВО ПО НАПИСАНИЮ DLL ДЛЯ MQL5 НА DELPHI
    www.mql5.com/ru/articles/96

    КАК ЗА 10 МИНУТ НАПИСАТЬ DLL БИБЛИОТЕКУ ДЛЯ MQL5 И ОБМЕНИВАТЬСЯ ДАННЫМИ?
    www.mql5.com/ru/articles/18

    Работа с C++ DLL
    www.metatrader5.com/ru/metaeditor/help/development/c_dll

    Ну а сейчас создадим вместе нашу первую DLL.

    Запускаем C++ Builder, переходим меню File->New->Other
    Click image for larger version  Name:	e256e960fa.png Views:	1 Size:	224.3 KB ID:	1397


    Нужный нам пункт указан на картинке, выбираем его.
    Click image for larger version  Name:	819c6ca31c.png Views:	1 Size:	217.9 KB ID:	1398


    Жмем “ОК”, 50% дела сделано
    Click image for larger version  Name:	34f0145762.png Views:	1 Size:	172.1 KB ID:	1399


    Откроется новое окно, в котором уже будет “заготовка” нашей будущей DLL.

    Со следующим кодом:

    Code:
     /---------------------------------------------------------------------------  #include <vcl.h> #include <windows.h> #pragma hdrstop //--------------------------------------------------------------------------- //   Important note about DLL memory management when your DLL uses the //   static version of the RunTime Library: // //   If your DLL exports any functions that pass String objects (or structs/ //   classes containing nested Strings) as parameter or function results, //   you will need to add the library MEMMGR.LIB to both the DLL project and //   any other projects that use the DLL.  You will also need to use MEMMGR.LIB //   if any other projects which use the DLL will be performing new or delete //   operations on any non-TObject-derived classes which are exported from the //   DLL. Adding MEMMGR.LIB to your project will change the DLL and its calling //   EXE's to use the BORLNDMM.DLL as their memory manager.  In these cases, //   the file BORLNDMM.DLL should be deployed along with your DLL. // //   To avoid using BORLNDMM.DLL, pass string information using "char *" or //   ShortString parameters. // //   If your DLL uses the dynamic version of the RTL, you do not need to //   explicitly add MEMMGR.LIB as this will be done implicitly for you //---------------------------------------------------------------------------  #pragma argsused int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved) {         return 1; } //---------------------------------------------------------------------------
    Комментарии можно убрать и добавим свою функцию. Мы будем передавать в DLL два целых числа, а в ответ получим их произведение. Вот такой простой пример, который показывает как легко передавать и получать данные из DLL в MQL4.

    Добавим свою функцию

    Code:
     //---------------------------------------------------------------------------  #include <vcl.h> #include <windows.h> #pragma hdrstop  #pragma argsused  int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved) {         return 1; } //---------------------------------------------------------------------------  extern "C" __declspec(dllexport) int test(int x, int y) {  return (x*y); //вернем из нашей функции произведение переменных  X и Y } //---------------------------------------------------------------------------
    Особое внимание нужно уделить макрокоманде, которая идет перед объявлением функции. Благодаря ей, мы получаем возможность работать с функциями внутри DLL.

    Code:
     extern "C" __declspec(dllexport)
    Теперь настроим среду и можем собирать нашу библиотеку.
    Переходим в меню Project->Options и убираем галочки из двух пунктов:
    Click image for larger version  Name:	91e40ae858.png Views:	1 Size:	163.7 KB ID:	1400


    C++ Linker-> Link with Dinamic RTL
    Click image for larger version  Name:	09fe4f4587.png Views:	1 Size:	160.6 KB ID:	1401


    Packages-> Link with runtime packages

    Компилируем наш проект нажатием кнопки RunF9 или на зеленый треугольник. После компиляции выскакивает следующая надпись:
    Click image for larger version  Name:	b0fc90c9f3.png Views:	1 Size:	144.7 KB ID:	1402


    Далее просто жмем ОК. Следовать данным рекомендациям нам не нужно т.к. мы не связываем нашу DLL с исполняемым файлом *.exe.

    Сейчас можно проверить, как она работает в паре с Metatrader 4. Для удобства, я предпочитаю закидывать DLL сразу в C:\Windows\System32, тогда нет нужды тягать ее с собой по всем терминалам на одной ОС.

    Рассмотрим как подключить DLL к программе на MQL4.

    Для этого в MetaEditor терминала создадим советник с именем TestDLL.

    Code:
      //+------------------------------------------------------------------+ //|                                                      TestDLL.mq4 | //|                                              Copyright 2015, AM2 | //|                                      http://www.forexsystems.biz | //+------------------------------------------------------------------+ #property copyright "Copyright 2015, AM2" #property link      "http://www.forexsystems.biz" #property version   "1.00" #property strict  #import "Project2.dll"  // подключаем нашу DLL int _test(int x,int y); //функция из  нашей  DLL #import extern int x=5; extern int y=7; //+------------------------------------------------------------------+ //|                                                                  | //+------------------------------------------------------------------+ int OnInit()   {    return(INIT_SUCCEEDED);   } //+------------------------------------------------------------------+ //|                                                                  | //+------------------------------------------------------------------+ void OnDeinit(const int reason)   {   } //+------------------------------------------------------------------+ //|                                                                  | //+------------------------------------------------------------------+ void OnTick()   {    Comment("\n",x," * ",y," = ",_test(x,y));   } //+------------------------------------------------------------------+
    Внимание, функция:

    Code:
     test(int x,int y)
    Из нашей DLL в коде MQL4 вызывается через подчеркивание “_”

    Code:
    Из нашей DLL в коде MQL4 вызывается через подчеркивание “_”
    Результат работы программы.
    Click image for larger version  Name:	7acd5e99e3.png Views:	1 Size:	10.9 KB ID:	1403

Disclaimer: There is a risk of loss in trading futures, forex and options. Futures, forex and options trading are not appropriate for all investors. Only risk capital should be used when trading futures. All information is for educational use only and is not investment advice. Past performance is not indicative of future results.

This website is hosted and operated by AMP Global Clearing, LLC ("AMP"), which provides brokerage services to traders of futures and foreign exchange products. This website is intended for customer support, educational and informational purposes only and should NOT be viewed as a solicitation or recommendation of any product, service or trading strategy. No offer or solicitation to buy or sell derivative or futures products of any kind, or any type of trading or investment advice, recommendation or strategy, is made, given, or in any manner endorsed by AMP and the information made available on this Web site is NOT an offer or solicitation of any kind. The content and opinions expressed on this website are those of the authors and do not necessarily reflect the official policy or position of AMP.

All Users and Contributors along with their websites, products and services, are independent persons or companies that are in no manner affiliated with AMP. AMP is not responsible for, do not approve, recommend or endorse any User and/or Contributor Content referenced on this website and it’s your sole responsibility to evaluate All Content. Please be aware that any performance information provided by a user and/or contributor should be considered hypothetical.

HYPOTHETICAL PERFORMANCE RESULTS HAVE MANY INHERENT LIMITATIONS, SOME OF WHICH ARE DESCRIBED BELOW. NO REPRESENTATION IS BEING MADE THAT ANY ACCOUNT WILL OR IS LIKELY TO ACHIEVE PROFITS OR LOSSES SIMILAR TO THOSE SHOWN. IN FACT, THERE ARE FREQUENTLY SHARP DIFFERENCES BETWEEN HYPOTHETICAL PERFORMANCE RESULTS AND THE ACTUAL RESULTS SUBSEQUENTLY ACHIEVED BY ANY PARTICULAR TRADING PROGRAM.

ONE OF THE LIMITATIONS OF HYPOTHETICAL PERFORMANCE RESULTS IS THAT THEY ARE GENERALLY PREPARED WITH THE BENEFIT OF HINDSIGHT. IN ADDITION, HYPOTHETICAL TRADING DOES NOT INVOLVE FINANCIAL RISK, AND NO HYPOTHETICAL TRADING RECORD CAN COMPLETELY ACCOUNT FOR THE IMPACT OF FINANCIAL RISK IN ACTUAL TRADING. FOR EXAMPLE, THE ABILITY TO WITHSTAND LOSSES OR TO ADHERE TO A PARTICULAR TRADING PROGRAM IN SPITE OF TRADING LOSSES ARE MATERIAL POINTS WHICH CAN ALSO ADVERSELY AFFECT ACTUAL TRADING RESULTS. THERE ARE NUMEROUS OTHER FACTORS RELATED TO THE MARKETS IN GENERAL OR TO THE IMPLEMENTATION OF ANY SPECIFIC TRADING PROGRAM WHICH CANNOT BE FULLY ACCOUNTED FOR IN THE PREPARATION OF HYPOTHETICAL PERFORMANCE RESULTS AND ALL OF WHICH CAN ADVERSELY AFFECT ACTUAL TRADING RESULTS.

AMP has NOT endorsed or recommended the use any product, services offered by any 3rd party User or Contributor on this forum. No person employed by, or associated with, AMP is authorized to provide any information about any 3rd party User or Contributor content. All specific brokerage related questions should be directed towards AMP.

Copyright © 2017. All rights reserved.

Working...
X