Куча вопросов о том как использовать дополнительные файл-модули [mqh]

 

Лучший способ объяснить некоторые вопросы это показать ответы на конкретном примере которых я в MetaEditor-е так и не нашел.

Есть необходимость иметь часто используемые функции в отдельном файл-модуле для использования их в разных экспертах. Из HELP-а удалось выяснить, что это делается созданием файла XXXX.mqh и присоединяется этот файл к исполняемому модулю так: #include "XXXX.mqh" и в какой папке его нужно держать. Все! Дальше начинаются вопросы.

  1. Какова структура написания файла XXXX.mqh?
  2. Какова структура вызова импортируемой функции?
  3. Откомпеллированный конечный файл советника XXXX.ex4 будет в себе содержать импортируемую функцию или параллельно с ним нужно будет таскать еще другие файлы (DLL, mqh или еще что-нибудь)?

Где посмотреть на конкретные примеры реализации этой идеи с использованием функций?

 
albe:

Лучший способ объяснить некоторые вопросы это показать ответы на конкретном примере которых я в MetaEditor-е так и не нашел.

Есть необходимость иметь часто используемые функции в отдельном файл-модуле для использования их в разных экспертах. Из HELP-а удалось выяснить, что это делается созданием файла XXXX.mqh и присоединяется этот файл к исполняемому модулю так: #include "XXXX.mqh" и в какой папке его нужно держать. Все! Дальше начинаются вопросы.

  1. Какова структура написания файла XXXX.mqh?
  2. Какова структура вызова импортируемой функции?
  3. Откомпеллированный конечный файл советника XXXX.ex4 будет в себе содержать импортируемую функцию или параллельно с ним нужно будет таскать еще другие файлы (DLL, mqh или еще что-нибудь)?

Где посмотреть на конкретные примеры реализации этой идеи с использованием функций?


1. В файле - тексты пользовательских функций, точно так же написанные, как они были бы в .mq4

2. Точно так же, как вызывается функция, описанная в .mq4

3. Будет содержать все необходимое.

 
owl:


1. В файле - тексты пользовательских функций, точно так же написанные, как они были бы в .mq4

Пример моего файла My.mql сделанного по аналогии с существующими в нужной папке mql-файлами

/+------------------------------------------------------------------+
//| My. mqh |
//| Copyright © 2004, MetaQuotes Software Corp. |
//| https://www.metaquotes.net// |
//+------------------------------------------------------------------+
#define copyright "Copyright © 2004, MetaQuotes Software Corp."
#define link "https://www.metaquotes.net//"

#import "My.dll" - Вот это что такое и зачем, при чем тут DLL или ex4?
//----------------------------------------------------------------------------------------------------
// Это моя универсальная функция используемая несколькими советниками.

//----------------------------------------------------------------------------------------------------
string Preobr(int x) define;
{
string s="";
------------------

Какие-то вычисления

------------------

return(s);
}

Импорт функции, как я понимаю, идет только с моего файла My.mqh, к чему эти не нужные DLL и ex4.

2. Точно так же, как вызывается функция, описанная в .mq4 - с этим более менее ясно

3. Будет содержать все необходимое. - с этим ясно все.

 

Если у Вас нет специальных знаний, то лучше не использовать dll, в особенности те, кот. сделаны другими пользователями (они могут содержать вредоносные действия).


Используйте #include <ХХХ.mqh>, этого в подавляющем большинстве случаев вполне достаточно.
Общий смысл использования подобной технологии сводистся к простому: с большим файлом эксперта работать неудобно, поэтому его разбивают на несколько частей, каждую из частей записываюют в соотв. директорию.

Пусть у вас есть эксперт, содержащий пользовательские функции (которые, вообще говоря, могут быть использованы и в других программах).
Простой вариант эксперта My_expert.mq4 выглядит так:

int Alpha()
{
строки пользовательской функции Alpha()
}
int Betta()
{
строки пользовательской функции Betta()
}
int init()
{
строки специальной функции init()
}
int start()
{
строки специальной функции start(),
в том числе вызовы на исполнение пользовательских функций Alpha() и Betta()
}
int deinit()
{
строки специальной функции deinit()
}

В этом примере все строки программы собраны в одном файле эксперта My_expert.mq4, из которого после компиляции получается My_expert.ех4.

А вот пример этого же эксперта, но собранного несколько иначе:

#include <My_Fun_Alpha.mqh>
#include <My_Fun_Betta.mqh>
int init()
{
строки специальной функции init()
}
int start()
{
строки специальной функции start(),
в том числе вызовы на исполнение пользовательских функций Alpha() и Betta()
}
int deinit()
{
строки специальной функции deinit()
}

При этом всё содержание пользовательских функций должно быть записано во внутрь включаемых файлов, соответственно, My_Fun_Alpha. mqh и My_Fun_Betta.mqh, а сами файлы должны находиться в директории include.

В этом случае этот эксперт My_expert.ех4 будет иметь точно такой же исполняемый код, как и его брат-близнец My_expert.ех4, исходный код которого не разбивался на части.
При компиляции такого эксперта (за миг до собственно компиляции) редактор МЕ сделает следующее: пойдёт по пути, указанному в строке #include <My_Fun_Alpha.mqh> , возьмёт там указанный файл, извлечёт из него содержание (собственно код) и вставит этот код в то место, где в эксперте указана строка #include <My_Fun_Alpha.mqh> (вместо этой строки); потом то же проделает со строкой, касающейся Бетты; и лишь после этого начнёт компиляцию уже полностью собранного эксперта.

Легко заметить, что и в первом и во втором варианте на компиляцию попадает один и тот же код эксперта. Разница состоит лишь в том, что второй вариант удобнее, т.к. в директории include со временем накапливается множество готовых к употреблению пользовательских функций, которые можео использовать тем же способом для составления кода другого эксперта.

Ещё можно добавить, что файл ех4 является самодостаточным - для того, чтоб он работал, не требуется, чтоб в include находились исходные коды пользовательских функций. Файл ех4 можно скопировать, передать другим трейдерам и там использовать. Он является полноценным независимо от технологии его получения.

 

Все разобрался. Большое спасибо всем помогавшим. В конечном счете получаем:

1. Структура модуля

Собственно в скобках (#Import - #Import) происходит объявление доступных функций:
#import "XXXX.ex4"
string Preobr(int x);
#import

И далее сам блок с исполнительным кодом функции:
string Preobr(int x)
{
..........................
return(s);
}

2. И сама программа исполняемого эксперта должна содержать строчку
#include <"XXXX.ex4"> и после этого вызов нужной функции становится доступным
string SSS=Preobr(X);

 
albe:

Все разобрался.

#include и #import - это разные вещи. Если использовать #include, то импорт не нужен. Просто сделайте так, как в моём примере выше.
 
SK. писал(а) >>
#include и #import - это разные вещи. Если использовать #include, то импорт не нужен. Просто сделайте так, как в моём примере выше.

Добрый день.

Вы знаете, я не понимаю почему у моего советника не доступны внешние переменные из окна интерфейса MT. Как только я убираю строку:

#include <01-00_AG_RFF_Trade_Lib.mqh>

Все работает как должно работать. Может вы сталкивались уже однажды с этой проблемой?

 

KimIV говорил:

В каком-то из прицепленных директивой компилятора #include файлов есть такая штука:

#property library

Это именно она отключает внешние параметры. Этот вопрос уже как-то обсуждался на форуме. Как поступить? Решений два:

1. Убрать #property и продолжать использовать #include.

2. Оставить #property и вместо #include использовать #import.

 

Вопрос в следующем : Я включаю фунцию расчета лота в которой есть сравнение ордер маджик ()==маджик

Получается что маджик я должен инициализировать в этом mqh файле ???

 
и получается что все переменные которые я буду использовать я должен инициализировать в этом файле ???
 

Нет, Все переменные которые будут выше чем строка инклюда будут видеться функциями в этом вашем файле.

Практически вы просто выносите функции в другой файл, а потом говорите компилятору когда их надо подключить вставив строку инклюда в нужном вам месте в тексте

Причина обращения: