Function not defined mql4 как исправить

Директива #define может быть использована для присвоения мнемонических имен выражениям. Существует две формы:

#define identifier expression // беспараметрическая форма
#define identifier(par1. par8) expression // параметрическая форма

Директива #define подставляет expression вместо всех последующих найденных вхождений identifier в исходном тексте. identifier заменяется только в том случае, если он представляет собой отдельный токен. identifier не заменяется, если он является частью комментария, частью строки, или частью другого более длинного идентификатора.

Идентификатор константы подчиняется тем же правилам, что и для имен переменных. Значение может быть любого типа:

#define ABC 100
#define PI 3.14
#define COMPANY_NAME "MetaQuotes Software Corp."
.
void ShowCopyright()
<
Print ( "Copyright 2001-2009, " ,COMPANY_NAME);
Print ( "https://www.metaquotes.net" );
>

expression может состоять из нескольких токенов, таких как ключевые слова, константы, константные и неконстантные выражения. expression заканчивается с концом строки и не может быть перенесено на следующую строку.

#define TWO 2
#define THREE 3
#define INCOMPLETE TWO+THREE
#define COMPLETE (TWO+THREE)
void OnStart()
<
Print ( "2 + 3*2 = " ,INCOMPLETE*2);
Print ( "(2 + 3)*2 = " ,COMPLETE*2);
>
/* Результат
2 + 3*2 = 8
(2 + 3)*2 = 10
*/

Параметрическая форма #define

При параметрической форме все последующие найденные вхождения identifier будут заменены на expression с учетом фактических параметров. Например,

// пример с двумя параметрами a и b
#define A 2+3
#define B 5-1
#define MUL(a, b) ((a)*(b))

double c=MUL(A,B);
Print ( "c=" ,c);
/*
выражение double c=MUL(A,B);
равносильно double c=((2+3)*(5-1));
*/
// Результат
// c=20

Обязательно заключайте параметры в круглые скобки при использовании параметров в expression, так как это позволит избежать неочевидных ошибок, которые трудно найти. Если переписать пример без использования скобок, то результат окажется совсем другой:

// пример с двумя параметрами a и b
#define A 2+3
#define B 5-1
#define MUL(a, b) a*b

double c=MUL(A,B);
Print ( "c=" ,c);
/*
выражение double c=MUL(A,B);
равносильно double c=2+3*5-1;
*/
// Результат
// c=16

При использовании параметрической формы допускается не более 8 параметров.

// правильная параметрическая форма
#define LOG (text) Print ( __FILE__ , "(" , __LINE__ , ") :" ,text) // один параметр – ‘text’

// неправильная параметрическая форма
#define WRONG_DEF(p1, p2, p3, p4, p5, p6, p7, p8, p9) p1+p2+p3+p4 // более 8 параметров от p1 до p9

Читайте также:  Лучшие сайты для майнинга криптовалют

Директива #undef

Директива #undef предназначена для отмены макроса, объявленного ранее.

#define MACRO

void func1()
<
#ifdef MACRO
Print ( "MACRO is defined in " , __FUNCTION__ );
#else
Print ( "MACRO is not defined in " , __FUNCTION__ );
#endif
>

#undef MACRO

void func2()
<
#ifdef MACRO
Print ( "MACRO is defined in " , __FUNCTION__ );
#else
Print ( "MACRO is not defined in " , __FUNCTION__ );
#endif
>

void OnStart ()
<
func1();
func2();
>

/* Результат:
MACRO is defined in func1
MACRO is not defined in func2
*/

MQL для чайников, программирование на MQL4, MQL5

На прошлом уроке «Язык MQL — Урок 2» мы научили наш первый скрипт MT4 — «test » , написанный на языке MQL4 рассчитывать размер лота, а точнее запрашивать у нас размер средств которыми мы хотим рискнуть при торговле на форекс при помощи терминала Metatrader 4. В данном уроке я предлагаю заняться самим расчетом данного лота !

Для расчета желаемого лота, скрипту MT4 необходимо знать «какими средствами мы располагаем» на нашем депозите форекс. Можно конечно в ручную ему это сообщать (как мы сделали с риском), но зачем делать лишнюю работу, если в нашем распоряжении язык MQL4? Пусть наш скрипт «test» сам берет эту цифру из торгового терминала Metatrader 4 !

Для этих целей ( для определения размера средств в MT4 ) в языке MQL4 предназначена функция — AccountFreeMargin ()

Все вычислительные операции в советниках или скриптах MQL необходимо делать в функции start .

Поэтому добавим в эту функцию строчку:
double Free= AccountFreeMargin ();

теперь в переменной типа double (число с плавающей точкой) и именем Free у нас будет содержаться размер свободных средств.

Еще нам необходимо знать стоимость одного лота по заданной валютной паре — для этого воспользуемся функцией MarketInfo ( string symbol, int type).

Эта функция возвращает различную информацию в зависимости от переданных ей параметров. Первым идет строковый параметр для указания валюты. Можно указать напрямую (например: «EURUSD» ), но мы хотим универсальности от нашего скрипта, написанного на MQL (что бы скрипт сам определял валютную пару на графике, котором он запущен).

Воспользуемся функцией Symbol () котороя вернет нам название текущей валюты.

Читайте также:  Socket 478 процессоры самый мощный

Второй параметр функции MarketInfo используем: MODE_MARGINREQUIRED (Размер свободных средств, необходимых для открытия 1 лота)

Теперь соберем все вместе и получим:
double One_Lot = MarketInfo ( Symbol (), MODE_MARGINREQUIRED );
Итак, переменная One_Lot будет содержать стоимость одного лота по текущей валюте.
С помощью простейших математических операций рассчитаем НАШ лот:
double Lot= Free*MaxRisk/ 100 /One_Lot;
Free — свободные средства
MaxRisk/100 — процент(наш параметр MaxRisk надо перевести в %. Для этого его делим на 100)
One_Lot — стоимость одного лота

Пример расчета лота для EURUSD (курс для примера возьмем 1.4615):
у нас есть Free=1000$ (свободные средства)
MaxRisk= 2
2% от 1000$ это 1000*2/100=20$

стандартный размер контракта (1 лот) = 100000
при покупке 100000 EUR мы должны заплатить 100000*1.4615=146150$
но у нас есть плечо (возьмем для примера 500), соответственно мы заплатим One_Lot=146150/500=292.3$ (все эти вычисления делает MarketInfo ( Symbol (), MODE_MARGINREQUIRED ))

Наш лот получится: Lot=20/292.3= 0,0684

Хорошо! Оптимальный лот для открытия торговой позиции в Metatrader 4 мы рассчитали.

А как же его теперь увидеть на экране монитора?
Для этого воспользуемся функцией Alert (), в качестве параметра укажем НАШ рассчитанный лот.

Ну и теперь компилируем и запускаем наш экспериментальный скрипт МТ4 – "test " (это мы уже делать умеем из прошлого урока MQL — 2).

В итоге мы получим следующее сообщение в терминале MT4:

В следующем уроке по изучению языка MQL, мы продолжим улучшать наш скрипт для Metatrader 4 и наполнять его полезными функциями.

    Opentraders – это независимое сообщество, создаваемое трейдерами и для трейдеров. Присоединяйтесь, нам по пути!

  • Войти
  • Регистрация

AM2
Андрей

Группа "Программирование на MQL"

Обсуждаем здесь вопросы разработки экспертов, делимся опытом, выкладываем уроки.

Внимание! Если Вы хотите заказать советник, то Вам в группу «Заказы на разработку советников»

Лучшее от AM2

100% ордеров в плюс или тысячи процентов годовых 19
2016-12-21 20:18:10

Советник – откусыватель убыточной позиции 23
2017-05-28 14:02:20

На какие "Машки" больше всего смотрят "Нонки" 33
2015-11-07 02:52:18

Запускаем стороннее приложение и выключаем компьютер с помощью средств MQL 3
2017-10-22 13:05:55

Как написать простейший советник, торгующий отложенными ордерами. 48
2013-02-28 20:53:04

  • Программирование на MQL

В программах на MQL4 часто невольно допускаются различные ошибки. В этом топике мы разберем наиболее часто встречающиеся из них.

Читайте также:  Два источника имеют одинаковые эдс и токи

Первое место в нашем топе ошибок занимает «крик души» терминала: «Потеряли индикатор!»

В таких случаях возмущению пользователей эксперта нет предела: «Советник не работает!» или «Ставлю советник на график и ничего не происходит!» Решение этого вопроса как всегда оказывается простым как все гениальное. Достаточно заглянуть на вкладку «Журнал» терминала и обнаружив там запись вроде:

2016.09.08 09:15:44.957 2016.01.04 00:51 cannot open file ‘C:Users1AppDataRoamingMetaQuotesTerminalMQL4indicatorsKELTNER_F12.ex4’ [2]

привести в соответствие имена индикаторов в советнике и в папке терминала. Если индикатор отсутствует, добавить его в папку с индикаторами.

Второе место по праву могут разделить ошибки Zero divide и Array out of range

Zero divide — Деление на ноль может возникнуть например в таком участке кода:

Устраняется ошибка проверкой делителя на корректное значение:

Ошибка Array out of range возникнет если в советнике скрипте или индикаторе вы обратитесь к несуществующей ячейке массива:

В нашем массиве задано при инициализации 3 элемента:

Нумерация элементов начинается с нуля: 0,1,2. Когда мы обращаемся к ячейке с номером 3 или 4 мы выходим за пределы массива, отсюда и ошибка. Правильным будет такой вариант:

Так компилируется без ошибок и показывает что к указанным элементам массива, можно обращаться:

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

Причиной может являться спешка или невнимательность. Например случайно задели не ту клавишу:

Нажав CTRL+Z или дождавшись окончания компиляции мы решим и этот вопрос.

И на последок рассмотрим еще одну ошибку которая встретилась мне совсем недавно в одном из топиков в «Столе заказов MQL»: zakaz.opentraders.ru/34761.html

Андрей посмотри не компилируется.Пишет ошибка ‘MathMod’ — illegal switch expression type.

Это ошибка использования оператора switch.
В коде выражение:

возвращало дробное значение. В новых версиях компилятора выражения и константы оператора switch должны быть целыми числами, поэтому такая запись помогла решить ошибку:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock detector