Light Style© by Fisana

Перейти к содержимому


Инвестиционные фонды NordFx: профессиональное управление и прозрачность


NordFX

Фотография

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


  • Пожалуйста, авторизуйтесь, чтобы ответить
6 ответов в этой теме

#1 Liv

Liv

    живет тут

  • Пользователи ST test (off)
  • PipPipPipPipPip
  • 162 сообщений

Опубликовано 01 Июнь 2007 - 10:21

Для того, чтобы не делать одного и того же по нескольку раз нужно сделать один раз и разместить в библиотеку. После этого, включая ссылку на библиотеку, пользоваться во всех своих скриптах, индикаторах и советниках.
И так, начнём.
Загрузить MetaEditor можно четырьмя способами:
  • нажать кнопку Размещенное изображение в вашем терминале
  • правой кнопкой мышки щёлкнуть на каком-либо пользовательском советнике, индикаторе или скрипте в окне "Навигатор", вызвать контекстное меню и там выбрать "Изменить"
  • найти на диске программу MetaEditor.exe, которая должна находиться в корневом каталоге вашего терминала (обычно здесь: C:\Program Files\MetaQuote\ - или у вас последняя часть будет по другому) и запустить её
  • в системном меню "Пуск" найти ссылки на ваш терминал и там запустить MetaEditor
MetaEditor я буду называть в дальнейшем Редактор, так будет удобнее.

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

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

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

Сообщение изменено: Liv, 01 Июнь 2007 - 10:30 .

Удачи!

#2 Liv

Liv

    живет тут

  • Пользователи ST test (off)
  • PipPipPipPipPip
  • 162 сообщений

Опубликовано 01 Июнь 2007 - 11:01

Любая библиотека, как скомпиллированная библиотека .EX4, так и системные библиотеки Windows .DLL включаются в модуль очень просто:
MQL
/* сначала мы определяем саму библиотеку */
#import "kernel32.dll"
 /* в каждой библиотеке определяем функции, которые мы будем использовать */
 [color=blue;font-weight:bold]bool[/color] Beep([color=blue;font-weight:bold]double[/color]* dwFreq, [color=blue;font-weight:bold]double[/color]* dwDuration);
#import [color=green]"User32.lib"[/color]
 [color=blue;font-weight:bold]int[/color]* CallWindowProc([color=blue;font-weight:bold]int[/color]* lpPrevWndFunc, [color=blue;font-weight:bold]double[/color]* hWnd, [color=blue;font-weight:bold]string[/color]* Msg, [color=blue;font-weight:bold]int[/color]* wParam, [color=blue;font-weight:bold]int[/color]* lParam);
#import [color=green]"моя_библиотека.ex4"[/color]
 [color=blue;font-weight:bold]int[/color] MyCalculator([color=blue;font-weight:bold]int[/color] value,[color=blue;font-weight:bold]int[/color] value2);
 [color=grey]/* наконец - закрываем объявление */[/color]
#import


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

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

#3 Liv

Liv

    живет тут

  • Пользователи ST test (off)
  • PipPipPipPipPip
  • 162 сообщений

Опубликовано 01 Июнь 2007 - 11:35

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

Итак, заносим в нашу библиотеку первую функцию:
MQL
//////////////////////////////////////////////////////////////////////
// функция выдаёт строчку символов в виде текущего периода
[color=blue;font-weight:bold]int[/color] ПоказатьПериод([color=blue;font-weight:bold]int[/color] ТекущийПериод) {
 [color=blue;font-weight:bold]string[/color] ret; // это будем возвращать после назначения
 // смотрим - какой период и назначаем соответствующую строчку
 [color=blue;font-weight:bold]switch[/color](ТекущийПериод) {
[color=blue;font-weight:bold]case[/color] [color=navy;]PERIOD_M1[/color]:  ret=[color=green]"M1"[/color] ; [color=blue;font-weight:bold]break[/color]:
[color=blue;font-weight:bold]case[/color] [color=navy;]PERIOD_M5[/color]:  ret=[color=green]"M5"[/color] ; [color=blue;font-weight:bold]break[/color]:
[color=blue;font-weight:bold]case[/color] [color=navy;]PERIOD_M1[/color]5:  ret=[color=green]"M15"[/color] ; [color=blue;font-weight:bold]break[/color]:
[color=blue;font-weight:bold]case[/color] [color=navy;]PERIOD_M30[/color]:  ret=[color=green]"M30"[/color] ; [color=blue;font-weight:bold]break[/color]:
[color=blue;font-weight:bold]case[/color] [color=navy;]PERIOD_H1[/color]:  ret=[color=green]"H1"[/color] ; [color=blue;font-weight:bold]break[/color]:
[color=blue;font-weight:bold]case[/color] [color=navy;]PERIOD_H4[/color]:  ret=[color=green]"H4"[/color] ; [color=blue;font-weight:bold]break[/color]:
[color=blue;font-weight:bold]case[/color] [color=navy;]PERIOD_D1[/color]:  ret=[color=green]"D1"[/color] ; [color=blue;font-weight:bold]break[/color]:
[color=blue;font-weight:bold]case[/color] [color=navy;]PERIOD_W1[/color]:  ret=[color=green]"W1"[/color] ; [color=blue;font-weight:bold]break[/color]:
[color=blue;font-weight:bold]case[/color] [color=navy;]PERIOD_MN1[/color]:  ret=[color=green]"MN1"[/color] ; [color=blue;font-weight:bold]break[/color]:
 }
 [color=blue;font-weight:bold]return[/color](ret);
}


Внимание! Инструкция [color="#3333FF"]switch[/color] использует только целые константы.

Соответствено, PERIOD_M1 и т.д. - это встроенные целые константы, обозначающие период таймфрэйма.
После проверки соответствия, переменной ret назначается строка, обозначающая наше представление периода, а не целое число минут. После чего проверка прерывается ([color="#3333FF"]break[/color]) и с помощью инструкции [color="#3333FF"]return[/color](ret) функция возвращает строчку.

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

Для использования функцию нужно объявить в вашем модуле:
MQL
#import [color=green]"моя_библиотека.ex4"[/color]
 [color=blue;font-weight:bold]int[/color] ПоказатьПериод([color=blue;font-weight:bold]int[/color] ТекущийПериод);
#import


Теперь в вашем модуле эта функция может свободно использоваться:
MQL
[color=blue;font-weight:bold]string[/color] ТекущийПериод = ПоказатьПериод([color=violet;font-weight:bold]Period[/color]());


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

#4 Liv

Liv

    живет тут

  • Пользователи ST test (off)
  • PipPipPipPipPip
  • 162 сообщений

Опубликовано 06 Июнь 2007 - 09:38

Следующая функция в нашу библиотеку:
MQL
/*
Автор: MAMOHT направил эту функцию в "Хитрости и трюки MQL"
но я думаю, что её место в нашей библиотеке
*/

[color=blue;font-weight:bold]int[/color] ПроверкаПерекрещивания(
 [color=blue;font-weight:bold]double[/color] Массив1[], // два массива, которые проверяются
 [color=blue;font-weight:bold]double[/color] Массив2[],
 [color=blue;font-weight:bold]int[/color] Сдвиг=0, // сдвиг в историю, если надо
 [color=blue;font-weight:bold]int[/color] Расхождение=0, // минимальное расхождение в пунктах, которое не считается переплетением
 [color=blue;font-weight:bold]int[/color] Глубина=0 // как глубоко в историю искать факт пересечения
 ) {
[color=grey]/*
 Возвращает:
 0 - не пересекается
 1 - Массив1 пересекает Массив2 снизу вверх
 -1 - Массив1 пересекает Массив2 сверху вниз
*/[/color]

 [color=blue;font-weight:bold]int[/color] i;
 [color=blue;font-weight:bold]if[/color] (Массив1[Сдвиг] > Массив2[Сдвиг]) { // Массив1 больше, ищем пересечение снизу вверх
[color=blue;font-weight:bold]for[/color]( i=0; i<Глубина; i++) {
 [color=blue;font-weight:bold]if[/color]( Массив2[i + Сдвиг] - Массив1[i + Сдвиг] >= Расхождение*Po[color=blue;font-weight:bold]int[/color] ) //превысили минимальное расхождение
[color=blue;font-weight:bold]return[/color] (1);
}
 }
 [color=blue;font-weight:bold]if[/color] (Массив1[Сдвиг] < Массив2[Сдвиг]) { // Массив1 меньше, ищем пересечение сверху вниз
[color=blue;font-weight:bold]for[/color]( i=0; i<Глубина; i++) {
 [color=blue;font-weight:bold]if[/color]( Массив1[i + Сдвиг] - Массив2[i + Сдвиг] >= Расхождение*Po[color=blue;font-weight:bold]int[/color] ) //превысили минимальное расхождение
[color=blue;font-weight:bold]return[/color] (-1);
}
 }
 //если мы здесь, значит кривые совпадают
 //Массив1 == Массив2
 [color=blue;font-weight:bold]return[/color] (0);
}


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

#5 Liv

Liv

    живет тут

  • Пользователи ST test (off)
  • PipPipPipPipPip
  • 162 сообщений

Опубликовано 08 Июнь 2007 - 12:25

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

И так, вызов функции из библиотеки делается так:
MQL
#import "моя_библиотека.ex4"
 [color=blue;font-weight:bold]int[/color] ПроверкаПерекрещивания([color=blue;font-weight:bold]double[/color] Массив1[],[color=blue;font-weight:bold]double[/color] Массив2[],[color=blue;font-weight:bold]int[/color] Сдвиг,[color=blue;font-weight:bold]int[/color] Расхождение,[color=blue;font-weight:bold]int[/color] Глубина);
#import


Вызывается функция в модуле так:
MQL
[color=blue;font-weight:bold]int[/color] Крест = ПроверкаПерекрещивания(Массив1[],Массив2[],Сдвиг,Расхождение,Глубина);


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

#6 Ajvengo

Ajvengo

    живет тут

  • 20230101(0ff)
  • PipPipPipPipPip
  • 162 сообщений

Опубликовано 18 Январь 2008 - 08:20

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

в начале эксперта:
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.
"Организуй самого себя. Научись трудное делать привычным, привычное - легким и легкое - прекрасным". Константин Станиславский

#7 geforce092

geforce092

    пробегал

  • Пользователи
  • Pip
  • 5 сообщений

Опубликовано 02 Июль 2016 - 04:18

Привет друг. Могу ли я вас попросить помочь отвязать индикаторы от счета?
 
Дайте знать в мой скайп или почту: geforce092
 
gefforce092@mail.ru





Посетителей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных пользователей

Рейтинг брокеров форекс: кто лидер, кто аутсайдер и почему?




Masterforex-V NordFX

Rambler's Top100

Принимаем Z-Payment