Лучший способ объяснить некоторые вопросы это показать ответы на конкретном примере которых я в MetaEditor-е так и не нашел.
Есть необходимость иметь часто используемые функции в отдельном файл-модуле для использования их в разных экспертах. Из HELP-а удалось выяснить, что это делается созданием файла XXXX.mqh и присоединяется этот файл к исполняемому модулю так: #include "XXXX.mqh" и в какой папке его нужно держать. Все! Дальше начинаются вопросы.
- Какова структура написания файла XXXX.mqh?
- Какова структура вызова импортируемой функции?
- Откомпеллированный конечный файл советника XXXX.ex4 будет в себе содержать импортируемую функцию или параллельно с ним нужно будет таскать еще другие файлы (DLL, mqh или еще что-нибудь)?
Где посмотреть на конкретные примеры реализации этой идеи с использованием функций?
1. В файле - тексты пользовательских функций, точно так же написанные,
как они были бы в .mq4
2. Точно так же, как вызывается функция, описанная в .mq4
3. Будет содержать все необходимое.
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);
#include и #import - это разные вещи. Если использовать #include, то импорт не нужен. Просто сделайте так, как в моём примере выше.
Добрый день.
Вы знаете, я не понимаю почему у моего советника не доступны внешние переменные из окна интерфейса MT. Как только я убираю строку:
#include <01-00_AG_RFF_Trade_Lib.mqh>
Все работает как должно работать. Может вы сталкивались уже однажды с этой проблемой?
KimIV говорил:
В каком-то из прицепленных директивой компилятора #include файлов есть такая штука:
#property library
Это именно она отключает внешние параметры. Этот вопрос уже как-то обсуждался на форуме. Как поступить? Решений два:
1. Убрать #property и продолжать использовать #include.
2. Оставить #property и вместо #include использовать #import.
Вопрос в следующем : Я включаю фунцию расчета лота в которой есть сравнение ордер маджик ()==маджик
Получается что маджик я должен инициализировать в этом mqh файле ???
Нет, Все переменные которые будут выше чем строка инклюда будут видеться функциями в этом вашем файле.
Практически вы просто выносите функции в другой файл, а потом говорите компилятору когда их надо подключить вставив строку инклюда в нужном вам месте в тексте
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Лучший способ объяснить некоторые вопросы это показать ответы на конкретном примере которых я в MetaEditor-е так и не нашел.
Есть необходимость иметь часто используемые функции в отдельном файл-модуле для использования их в разных экспертах. Из HELP-а удалось выяснить, что это делается созданием файла XXXX.mqh и присоединяется этот файл к исполняемому модулю так: #include "XXXX.mqh" и в какой папке его нужно держать. Все! Дальше начинаются вопросы.
Где посмотреть на конкретные примеры реализации этой идеи с использованием функций?