Перейти к содержанию
Форекс Форум трейдеров Академии «MasterForex-V»

Создание библиотек


Рекомендуемые сообщения

Для того, чтобы не делать одного и того же по нескольку раз нужно сделать один раз и разместить в библиотеку. После этого, включая ссылку на библиотеку, пользоваться во всех своих скриптах, индикаторах и советниках.

И так, начнём.

Загрузить MetaEditor можно четырьмя способами:

  • нажать кнопку http://forex.orotukan.ru/images/btn01.jpg в вашем терминале
  • правой кнопкой мышки щёлкнуть на каком-либо пользовательском советнике, индикаторе или скрипте в окне "Навигатор", вызвать контекстное меню и там выбрать "Изменить"
  • найти на диске программу MetaEditor.exe, которая должна находиться в корневом каталоге вашего терминала (обычно здесь: C:\Program Files\MetaQuote\ - или у вас последняя часть будет по другому) и запустить её
  • в системном меню "Пуск" найти ссылки на ваш терминал и там запустить MetaEditor

MetaEditor я буду называть в дальнейшем Редактор, так будет удобнее.

 

В Редакторе, в главном меню "Файл" -> "Создать", или нажать самую левую кнопку (с плюсом) под меню, или нажать на клавиатуре Ctrl+N. Откроется окно "Мастер создания советника". Мы пока вибираем "Библиотека функций" -> "Далее"

http://forex.orotukan.ru/images/new01.jpg

 

Затем нужно ввести имя вашей библиотеки в поле "Имя:", например так: моя_библиотека и нажать кнопку "Готово". Если вы введёте, здесь же, все свои данные (для копирайта :) ), то они запомнятся и будут везде проставляться автоматически.

 

Итак, заготовка для нашей библиотеки готова. Мы будем её периодически пополнять, по мере нашего обучения.

Внимание

 Для того, чтобы исходный код был с расцвеченным синтаксисом нужно его поместить между двумя инструкциями: 
[MQL]
...
[/MQL]
точно так же, как квотирование.

Изменено пользователем Liv
Ссылка на комментарий
Поделиться на другие сайты

Любая библиотека, как скомпиллированная библиотека .EX4, так и системные библиотеки Windows .DLL включаются в модуль очень просто:

MQL
/* сначала мы определяем саму библиотеку */

#import "kernel32.dll"

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

 bool Beep(double* dwFreq, double* dwDuration);

#import "User32.lib"

 int* CallWindowProc(int* lpPrevWndFunc, double* hWnd, string* Msg, int* wParam, int* lParam);

#import "моя_библиотека.ex4"

 int MyCalculator(int value,int value2);

 /* наконец - закрываем объявление */

#import

 

Файлы библиотек будут искаться в такой последовательности:

  1. experts\libraries
  2. experts
  3. системные каталоги

Не желательно использовать полный путь доступа к указаной библиотеке, т.к. файл может переместиться в другое место и тогда придётся перекомпиллировать модуль.

 

Для большей информации по импорту библиотек, нужно выделить слово import и нажать клавишу F1.

Ссылка на комментарий
Поделиться на другие сайты

Одна из функций, которая периодически используется, это функция предствления таймфрэйма в красивый строковый вид. Сам MQL использует для этого целые числа, маскируя их в константах такого вида: PERIOD_M1.

 

Итак, заносим в нашу библиотеку первую функцию:

MQL
//////////////////////////////////////////////////////////////////////

// функция выдаёт строчку символов в виде текущего периода

int ПоказатьПериод(int ТекущийПериод) {

 string ret; // это будем возвращать после назначения

 // смотрим - какой период и назначаем соответствующую строчку

 switch(ТекущийПериод) {

case PERIOD_M1:  ret="M1" ; break:

case PERIOD_M5:  ret="M5" ; break:

case PERIOD_M15:  ret="M15" ; break:

case PERIOD_M30:  ret="M30" ; break:

case PERIOD_H1:  ret="H1" ; break:

case PERIOD_H4:  ret="H4" ; break:

case PERIOD_D1:  ret="D1" ; break:

case PERIOD_W1:  ret="W1" ; break:

case PERIOD_MN1:  ret="MN1" ; break:

 }

 return(ret);

}

 

Внимание! Инструкция switch использует только целые константы.

 

Соответствено, PERIOD_M1 и т.д. - это встроенные целые константы, обозначающие период таймфрэйма.

После проверки соответствия, переменной ret назначается строка, обозначающая наше представление периода, а не целое число минут. После чего проверка прерывается (break) и с помощью инструкции return(ret) функция возвращает строчку.

 

Внимание! У библиотечных функций не должно быть параметров по-умолчанию.

 

Для использования функцию нужно объявить в вашем модуле:

MQL
#import "моя_библиотека.ex4"

 int ПоказатьПериод(int ТекущийПериод);

#import

 

Теперь в вашем модуле эта функция может свободно использоваться:

MQL
string ТекущийПериод = ПоказатьПериод(Period());

 

Для большей информации по используемым функциям, инструкциям, константам выделите текст и нажмите клавишу F1.

Ссылка на комментарий
Поделиться на другие сайты

Следующая функция в нашу библиотеку:

MQL
/*

Автор: MAMOHT направил эту функцию в "Хитрости и трюки MQL"

но я думаю, что её место в нашей библиотеке

*/

int ПроверкаПерекрещивания(

 double Массив1[], // два массива, которые проверяются

 double Массив2[],

 int Сдвиг=0, // сдвиг в историю, если надо

 int Расхождение=0, // минимальное расхождение в пунктах, которое не считается переплетением

 int Глубина=0 // как глубоко в историю искать факт пересечения

 ) {

/*

 Возвращает:

 0 - не пересекается

 1 - Массив1 пересекает Массив2 снизу вверх

 -1 - Массив1 пересекает Массив2 сверху вниз

*/

 

 int i;

 if (Массив1[Сдвиг] > Массив2[Сдвиг]) { // Массив1 больше, ищем пересечение снизу вверх

for( i=0; i<Глубина; i++) {

 if( Массив2[i + Сдвиг] - Массив1[i + Сдвиг] >= Расхождение*Point ) //превысили минимальное расхождение

return (1);

}

 }

 if (Массив1[Сдвиг] < Массив2[Сдвиг]) { // Массив1 меньше, ищем пересечение сверху вниз

for( i=0; i<Глубина; i++) {

 if( Массив1[i + Сдвиг] - Массив2[i + Сдвиг] >= Расхождение*Point ) //превысили минимальное расхождение

return (-1);

}

 }

 //если мы здесь, значит кривые совпадают

 //Массив1 == Массив2

 return (0);

}

 

Задание: написать импорт - объявление этой функции из библитеки и пример использования.

Ссылка на комментарий
Поделиться на другие сайты

Никто и не попытался.... или лень, или не знают... :laugh:

 

И так, вызов функции из библиотеки делается так:

MQL
#import "моя_библиотека.ex4"

 int ПроверкаПерекрещивания(double Массив1[],double Массив2[],int Сдвиг,int Расхождение,int Глубина);

#import

 

Вызывается функция в модуле так:

MQL
int Крест = ПроверкаПерекрещивания(Массив1[],Массив2[],Сдвиг,Расхождение,Глубина);

 

А теперь, для собственного контроля - ответьте, где я ошибся? Ошибка не была запланирована, сделал я её не нарочно, но она есть и пока я её исправлять не буду.... :ninja:

Ссылка на комментарий
Поделиться на другие сайты

  • 7 месяцев спустя...

Наверное, ошибка заключается в том, что используются одни и те же переменные для определения функции и при вызове функции. Получается, что при таком вызове функции мы должны дважды определить переменные:

 

в начале эксперта:

double Массив1[], Массив2[];

int Сдвиг, Расхождение, Глубина;

 

а затем при подключении dll:

#import "моя_библиотека.ex4"

int ПроверкаПерекрещивания(double Массив1[],double Массив2[],int Сдвиг,int Расхождение,int Глубина);

#import

 

На мой взгляд, при вызове функции необходимо использовать набор переменных с другими именами. Например:

int Крест = ПроверкаПерекрещивания(xМассив1[], xМассив2[], xСдвиг, xРасхождение, xГлубина);

Или вообще не указывать переменные при подключении библиотеки:

#import "моя_библиотека.ex4"

int ПроверкаПерекрещивания(double, double, int, int, int);

#import

 

Кстати, встречный вопрос: у меня при подключении dll выпадает ошибка 'cannot call function *** from *.dll' (error 127). Что это за ошибка такая 127? В документации кода такой ошибки нет...

dll скомпилирована из C++ 5.0 и сидит в папке experts\libraries.

Ссылка на комментарий
Поделиться на другие сайты

  • 8 лет спустя...
Привет друг. Могу ли я вас попросить помочь отвязать индикаторы от счета?

 

Дайте знать в мой скайп или почту: geforce092

 

gefforce092@mail.ru

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...