» Календарь |
« Май 2024 » | Пн | Вт | Ср | Чт | Пт | Сб | Вс | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
|
|
Торговые советники (Expert Advisors)
- Читать1Закрыть
Введение.
- Читать Закрыть 2
Создаем нового советника .
- Читать Закрыть 3
Настраиваем параметры.
- Читать Закрыть 4
Структура советника. Специальные функции.
Таких параметров у эксперта может быть несколько. Все они должны быть одного из стандартных типов, описанных в прошлом выпуске.
- Читать Закрыть 5
Создаем собственные функции.
- Читать Закрыть 6
Исходный код нашего первого советника.
- Читать Закрыть 7
Хранение данных в переменных.
выполнения функции init().
- Читать Закрыть 8
Параметры функций.
Формальные параметры функций
Как уже говорилось в разделе «Создание собственных функций» функцию можно описать следующим образом:
тип имя ( формальные параметры ) { действия }
Формальные параметры функции — это значения, которые
передаются в функцию. Они указываются через через запятую в круглых
скобках после имени функции. Для каждого параметра указывается тип
(любой из стандартных: массивы, int, bool, datetime, double, color, string).
В функцию не может быть передано более 64 параметров.
Областью видимости формальных параметров функции является сама
функция, т.е. доступ к их значениям может быть получен только в пределах
этой функции.
В описании функции параметрам можно присваивать значения по
умолчанию. При этом следует иметь в виду, что все параметры, следующие
за первым параметром со значением по умолчанию, должны также иметь
значения по умолчанию:
int GetSomethingUseful ( int a, int b = 0, bool f = true, double r = 5.9) { ... }
В этом случае все или часть параметро по умолчанию можно упускать при
вызове функции, а вместо них автоматически будут подставлены значения
по умолчанию:
- Вызов GetSomethingUseful(3, 5, false) будет эквивалентен вызову GetSomethingUseful(3, 5, false, 5.9).
- Вызов GetSomethingUseful(3, 5) будет эквивалентен вызову GetSomethingUseful(3, 5, true, 5.9).
- Вызов GetSomethingUseful(3) будет эквивалентен вызову GetSomethingUseful(3, 0, true, 5.9).
При этом следует помнить, что если мы пропускаем какой-то параметр,
имеющий значение по умолчанию, то и все последующие параметры также
должны не указываться.
Если мы импортируем функцию из другого модуля, то такие параметры таких функций не могут иметь значения по умолчанию.
Все, что я рассказал выше, касалось передачи параметров в функцию по
значению. Чтобы все стало ясно, давайте рассмотрим небольшой пример:
void MyFirstFunction () { int a = 10; MySecondFunction ( a ); }
void MySecondFunction ( int b ) { b = b + 1; Print ( b ); }
В этом примере мы вызываем MySecondFunction, передавая в качестве
параметра значение переменной «a» (в нашем случае — 10). Таким образом,
при вызове MySecondFunction переменной «b» — формальному параметры
функции — будет присвоено значение 10, которое будет следующей строчкой
увеличено на единицу и выведено в лог. Однако при этом значение
переменной a в MyFirstFunction не изменится и останется равным 10.
Существует и другой способ передачи параметров в функцию — по ссылке
(используя после описания типа знак амперсенда — &). Рассмотрим
новый пример:
void MyFirstFunction () { int a = 10; MySecondFunction ( a ); }
void MySecondFunction ( int& b ) { b = b + 1; Print ( b ); }
В этом примере мы вызываем MySecondFunction, передавая в качестве
параметра ссылка на переменную «a». Таким образом, в функции
MySecondFunction всегда, когда будет идти обращение к переменной b,
реально будет идти обращение к переменной a. Т.е. следующей строчкой
значение переменной «a» будет увеличено на единицу и выведено в лог.
После завершения функции MySecondFunction переменная «а» будет равна 11.
В качестве параметров по ссылке можно передавать как переменные
стандартных типов (но только в пределах одного модуля), так и массивы
(как в пределах одного модуля, так и в другие модули).
- Читать Закрыть 9
Операторы. Арифметические операции.
Составной оператор
В выпуске «Использование констант в эксперте» мы научились описывать
константы и разобрались, что же в коде нашего первого эксперта означают
следующие строчки:
#define STATE_SQUARE 0 #define STATE_LONG 1 #define STATE_SHORT 2
В выпуске Внешние переменные мы научились задавать параметры эксперта, и нам стали понятны следующие строчки:
extern int MAPeriod = 13; extern double LotsNumber = 1.0;
Кроме локальных и статических переменных мы рассмотрели и глобальные
(на уровне одного модуля) переменные, в результате приоткрылась завеса
над еще двумя строчками нашего эксперта:
int CurrentState; int MyOrderTicket;
Теперь рассмотрим более подробно, что же в нашем эксперте делает функция init().
int init() { //---- if (iMA(NULL, 0, MAPeriod, 0, MODE_EMA, PRICE_CLOSE, 0) > Close[0]) CurrentState = STATE_SHORT; else CurrentState = STATE_LONG;
MyOrderTicket = 0; //---- return(0); }
Как мы знаем из выпуска «Функции init(), start() и deinit()» эта функция запускается в следующих случаях:
- после присоединения советника к графику;
- после старта MetaTrader 4 и подгрузки исторических данных;
- после смены инструмента или периода графика;
- после перекомпиляции программы в редакторе MetaEditor;
- после изменения настроек эксперта;
- после смены торгового счета.
Если отбросить комментарии, которые начинаюся с двойного флэша (//),
то мы увидим, что эта функция состоит из нескольких команд (назовем их операторами),
разделенных точкой запятой (;). Когда нам нужно объединить несколько
операторов в один связный блок (например, в функцию), мы используем
конструкцию, которая называется составной оператор.
Иными словами мы эти операторы заключаем в фигурные скобки { и }. После
закрывающей фигурной скобки { не должно стоять точки с запятой.
Пример составного оператора:
if (b==3) { b = b + 1; Print (b); }
Оператор присваивания. Арифметические операции
Формат оператора присваивания:
переменная = выражение;
В качестве левой части оператора присваивания может выступать также
элемент массива. Вначале вычисляется выражение, которое потом
присваивается переменной.
Пример оператора присваивания:
b = b + 1;
Допустим, что перед выполнением этого оператора переменная «b» была
равна 7. Тогда вначале вычисляется выражение в правой части ( 7+1 = 8 ),
а затем значение этого выражение (8) присваивается переменной «b».
В выражении может использоваться несколько типов операций. Рассмотрим самый простой тип — арифметические операции:
Операция |
Пример |
Сложение двух аргументов |
j + k |
Вычитание второго аргумента из первого |
j — k |
Умножение аргументов |
j * k |
Получить частное от деления первого аргумента на второй |
j / k |
Получить остаток от деления первого аргумента на второй |
j % k |
Изменить знак аргумента |
-k |
Вне выражений (в виде отдельного оператора) можно применять операции:
- Увеличение аргумента на единицу: j++
- Уменьшение аргумента на единицу: j-
Пример:
j++; // верное выражение
k = (j++) + 3; // неверное выражение
- Читать Закрыть 10
Операции отношения и логические операции.
Операции отношения
Как мы уже знаем, один из стандартных типов переменных в языке MetaQuotes Language 4 — тип bool. Переменная типа bool
может принимать только два значения: ИСТИНА (true) и ЛОЖЬ (false).
Значение ЛОЖЬ представляется в виде нулевого значения, а ИСТИНА —
ненулевого.
Значение операции отношения или логической операции будет иметь тип bool.
Операции отношения
Операция |
Результат |
a == b |
Истина, если a равно b Ложь, если a не равно b |
a != b |
Истина, если a не равно b Ложь, если a равно b |
a < b |
Истина, если a меньше b Ложь, если a больше или равно b |
a <= b |
Истина, если a меньше или равно b Ложь, если a больше b |
a > b |
Истина, если a больше b Ложь, если a меньше или равно b |
a >= b |
Истина, если a больше или равно b Ложь, если a меньше b |
Примечание: в связи с тем, что числа с плавающей точкой (тип double)
не могут быть представлены точно в связи с ограниченным количеством
значащих цифр после запятой (в MetaQuotes Language 4 точность — 15
значащих цифр), нельзя производить сравнение таких чисел на равенство
(==) или неравенство (!=) без предварительной нормализации (о
нормализации вещественных чисел я расскажу в следующих выпусках).
Логические операции
Напомню, что значение ЛОЖЬ (false) представляется в виде нулевого значения, а ИСТИНА (true) — ненулевого.
В этом выпуске я рассмотрю логические операции НЕ (!), ИЛИ (||) и И (&&).
Логическое отрицание НЕ (!)
Операнд A |
Значение выражения !A |
ИСТИНА (true) |
ЛОЖЬ (false) |
ЛОЖЬ (false) |
ИСТИНА (true) |
Пример:
bool b;
b = false; // переменная b равна false (ЛОЖЬ)
b = !b; // переменная b равна true (ИСТИНА)
b = !b; // переменная b равна false (ЛОЖЬ)
Логическая операция ИЛИ (||)
Результат логической операции ИЛИ равен true, если хотя бы один из
операндов равен true. Если оба операнда равны false, то и результат
логического ИЛИ также будет равен false.
Операнд A |
Операнд B |
Значение выражения A || B |
ЛОЖЬ (false) |
ЛОЖЬ (false) |
ЛОЖЬ (false) |
ЛОЖЬ (false) |
ИСТИНА (true) |
ИСТИНА (true) |
ИСТИНА (true) |
ЛОЖЬ (false) |
ИСТИНА (true) |
ИСТИНА (true) |
ИСТИНА (true) |
ИСТИНА (true) |
Пример:
bool a = true; // a равно true
bool b = false; // b равно false
b = b || a; // b равно true
Логическая операция И (&&)
Результат операции логического И будет равен true только в случае,
если оба операнда равны true. Во всех иных случаях результат операции
будет равен false.
Операнд A |
Операнд B |
Значение выражения A && B |
ЛОЖЬ (false) |
ЛОЖЬ (false) |
ЛОЖЬ (false) |
ЛОЖЬ (false) |
ИСТИНА (true) |
ЛОЖЬ (false) |
ИСТИНА (true) |
ЛОЖЬ (false) |
ЛОЖЬ (false) |
ИСТИНА (true) |
ИСТИНА (true) |
ИСТИНА (true) |
Пример:
bool a = true; // a равно true
bool b = false; // b равно false
b = b && a; // b равно false
- Читать Закрыть 11
Побитовые операции.
Для начала необходимо рассказать о формате представления чисел в компьютере.
Мы в нашей жизни привыкли к десятичному представлению чисел: 56, 777, 10957 и т.д. Десятичное представление числа 10957 означает, что 10957 = 1×104 +0×103+9×102+5×101+7×100. Иными словами десятичное число — это a0*100+a1*101+a2*102+
+an*10n. Т.е. сумма произведений соответствующей цифры (ai) на соответствующую степень числа 10 (10i).
В компьютере внутренний формат представления чисел — двоичный. В двоичном формате
все числа состоят из нулей и единиц, а в качестве множителя
используется не число 10, возведенное в степень, а соответствующая
степень числа 2. Например, двоичное число 10001101 равно десятичному
(обычному) числу 1×27+0×26+0×25+0×24+1×23+1×22+0×21+1×20 = 128+0+0+0+8+4+0+1 = 141.
Каждая такая двоичная цифра (1 или 0) называется битом.
Теперь мы знаем достаточно, чтобы рассмотрить побитовые операции.
Побитовые операции
Дополнение до единицы. В каждом разряде единица заменяется нулем, а нуль — единицей. Пример:
int b = 141; // начальное значение переменной b равно 141, // что в двоичном представлении равно 10001101 b = ~b; // переменная b стала равна 01110010, т.е. 114
Сдвиг вправо. Двоичное представление первого
операнда сдвигается вправо на количество разрядов, равное значению
второго операнда. Освобождающиеся «левые» разряды будут заполняться
нулями. Пример:
int b = 141; // начальное значение переменной b равно 141, // что в двоичном представлении равно 10001101 b = b >> 2; // переменная b стала равна 00100011, т.е. 67
Сдвиг влево. Двоичное представление первого операнда
сдвигается влево на количество разрядов, равное значению второго
операнда. Появившиеся «правые» разряды будут заполняться нулями. Пример:
int b = 141; // начальное значение переменной b равно 141, // что в двоичном представлении равно 10001101 b = b << 2; // переменная b стала равна 1000110100, т.е. 564
Побитовая операция И. Результат будет содержать
единицу в тех разрядах, где соответствующие разряды первого и второго
операнда содержат единицу. В других случаях соответствующий бит
результата будет равен 0. Пример:
int a = 25; // начальное значение переменной a равно 25, // что в двоичном представлении равно 00011001 int b = 141; // начальное значение переменной b равно 141, // что в двоичном представлении равно 10001101 a = a & b; // переменная a стала равна 00001001, т.е. 9
Побитовая операция ИЛИ. Результат будет содержать
ноль в тех разрядах, где соответствующие разряды первого и второго
операнда содержат ноль. В других случаях соответствующий бит результата
будет равен 1. Пример:
int a = 25; // начальное значение переменной a равно 25, // что в двоичном представлении равно 00011001 int b = 141; // начальное значение переменной b равно 141, // что в двоичном представлении равно 10001101 a = a | b; // переменная a стала равна 10011101, т.е. 157
Побитовая операция исключающее ИЛИ. Значение
результирующего выражения будет содержать 1 в тех разрядах, в которых x и
y имеют разные двоичные значения, и 0 — во всех остальных разрядах.
Пример:
int a = 25; // начальное значение переменной a равно 25, // что в двоичном представлении равно 00011001 int b = 141; // начальное значение переменной b равно 141, // что в двоичном представлении равно 10001101 a = a ^ b; // переменная a стала равна 10010100, т.е. 148
- Читать Закрыть 12
Условный оператор.
Вернемся к рассмотрению нашего первого советника и расскажу об
условном операторе if-else, который я использовал в функции init().
int init() { //---- if (iMA(NULL, 0, MAPeriod, 0, MODE_EMA, PRICE_CLOSE, 0) > Close[0]) CurrentState = STATE_SHORT; else CurrentState = STATE_LONG;
MyOrderTicket = 0; //---- return(0); }
Формат условного оператора if-else:
if (выражение) первый_оператор else второй_оператор
Принцип работы оператора: вычисляется значение выражения в скобках;
если оно равно true, то выполняется «первый_оператор», в противном
случае — «второй_оператор».
В нашем первом эксперте в функции init() есть такая строчка:
if (iMA(NULL, 0, MAPeriod, 0, MODE_EMA, PRICE_CLOSE, 0) > Close[0]) CurrentState = STATE_SHORT; else CurrentState = STATE_LONG;
В этой строчке вычисляется выражение iMA(NULL, 0, MAPeriod, 0,
MODE_EMA, PRICE_CLOSE, 0) > Close[0]. Забегая вперед, скажу, что в
этом выражении сравнивается значение экспоненциальной скользящей средней
по цене закрытия с периодом, определенным внешней переменной MAPeriod, и
цена закрытия текущего бара ( Close[0] ).
Если значение скользяйшей средней больше цены закрытия, то выполняется первый оператор:
CurrentState = STATE_SHORT;
Если — меньше, то второй:
CurrentState = STATE_LONG;
Если в качестве оператора есть необходимость выполнить сразу
несколько операторов, то можно использовать составной оператор, т.е.
заключить в фигурные скобки необходимые нам операторы. При этом после
закрывающей фигурной скобки точка с запятой уже не ставится.
Пример использования составного оператора можно найти и в нашем эксперте:
if (!IsTesting()) return(MarketInfo(s, MODE_LOTSIZE)*MarketInfo(StringSubstr(s, 0, 3)+"USD", MODE_BID)/AccountLeverage()); else { p = iClose(StringSubstr(s, 0, 3)+"USD", Period(), iBarShift(StringSubstr(s, 0, 3)+"USD", Period(), CurTime(), true)); return(MarketInfo(s, MODE_LOTSIZE)*p/AccountLeverage()); }
Если у нас нет необходимости в выполнении второго оператора (в
случае, если выражение в круглых скобках не равно true), то часть else
можно опустить:
if (выражение) первый_оператор
Пример из нашего эксперта:
if (s == "CHFJPY") { p = iClose("USDCHF", Period(), iBarShift("USDCHF", Period(), CurTime(), true)); return(MarketInfo(s, MODE_LOTSIZE)/(AccountLeverage()*p)); }
Если несколько операторов if-else вложены друг в друга, а часть
операторов имеет пропущенную часть else, то else всегда связывается с
ближайшим предыдущим оператором if в том же блоке, не имеющим части
else.
Обычно операторы в коде эксперта выполняются последовательно — один
за другим. Однако часто требуется изменить последовательность их
выполнения в зависимости от каких-то условий. В этом выпуске я
рассмотрел один из способов изменения этой последовательности: условный оператор if-else.
- Читать Закрыть 13
Цикл while.
Обычно операторы в коде эксперта выполняются последовательно — один
за другим. Однако часто требуется изменить последовательность их
выполнения в зависимости от каких-то условий. В прошлом выпуске я
рассмотрел один из способов изменения этой последовательности: условный
оператор if-else. Применение этого оператора оправдано, когда есть
необходимость выполнить две разные последовательности действий в
зависимости от какого-то условия.
В этом выпуске я планирую рассказать об операторе цикла while.
Уже само название говорит о том, что этот оператор применяется в тех
случаях, когда нужно повторить какое-то количество раз одну и ту же
последовательность операторов.
Формат оператора цикла while:
while (выражение) оператор;
Каждый раз перед выполнением «оператора» будет проверяться значение
«выражения». Если «выражение» истинно, то «оператор» будет выполнен.
Далее «выражение» проверяется еще раз. Если оно опять истинно, то
«оператор» будет выполнен еще раз. И так будет продолжаться до тех пор,
пока «выражение» будет равно true. Как только выражение станет ложным,
произойдет выход из цикла и управление будет передано оператору,
следующему за циклом while.
Цикл while может быть не выполнен ни разу, если «выражение» изначально (при первой проверке) было ложным.
Если требуется, чтобы в теле цикла выполнялся не один оператор, а
несколько, нужно использовать составной оператор, т.е. заключить
несколько операторов в фигурные скобки {}. После закрывающей фигурной
скобки } не должно стоять точки с запятой.
К сожалению, в нашем первом эксперте я не использую цикл while, поэтому пример его использования мне придется просто придумать:
int i = 0; while ( i < 9 ) { Print( i ); i++; } Print ("Done");
При первой проверке «выражение» (i<9) будет истинным (т.к. 0<9)
и будет выполнен составной оператор, который состоит из функции Print
(вывода информации в журнал экспертов), которая выведет число 0 в
журнал, и из оператора i++, который увеличивает переменную i на единицу.
Далее выражение i<9 будет вычислено еще раз. На этот раз оно опять
будет истинным. В результате в лог файл будет выведено текущее значение
переменной i (т.е. 1), а после этого значение переменной будет опять
увеличено на единицу и станет равным 2. Цикл будет повторяться до тех
пор, пока значение переменной i не станет равным 9. Тогда выражение
i<9 перестанет быть истинным и цикл прервется, а управление будет
передано следующему оператору:
Print ("Done");
- Читать Закрыть 14
Цикл for.
Операторе цикла while используется, когда необходимо повторить
некоторую последовательность действий несколько раз (или ни одного).
Подобную задачу можно решить также с помощью другого оператора цикла — оператора for.
Формат оператора цикла for:
for ( выражение1; выражение2; выражение3 ) оператор;
Выполнение оператора цикла for начинается с вычисления «выражения1».
Это своего рода инициализация цикла, которая выполняется только один раз
и предшествует последующим действиям.
После этого вычисляется «выражение2». Если оно истинно, то
выполняется «оператор». Далее вычисляется «выражение3». Первая итерация
цикла закончена. Вторая итерация начинается опять с вычисления
«выражения2». Если оно истинно, то выполняется «оператор». Далее опять
вычисляется «выражение3» и так продолжается до тех пор, пока
«выражение2» будет истинным. Если же уже на первой итерации «выражение2»
будет ложным, то цикл не исполнится ни разу.
Если вникнуть в логику работы оператора цикла for, то можно заметить,
что она полностью соответствует следующему фрагменту кода с
использование оператора цикла while:
выражение1; while ( выражение2 ) { оператор; выражение3; }
В прошлом выпуске мы рассмотрели пример использования оператора цикла while:
int i = 0; while ( i < 9 ) { Print( i ); i++; } Print ("Done");
Этот пример можно переписать с использованием оператора цикла for:
int i; for (i = 0; i < 9; i++) Print( i ); Print ("Done");
Не будет ошибкой, если любое из трех или все три выражения в
операторе цикла for будут отсутствовать, однако разделяющие их точки с
запятыми (;) опускать нельзя. Если отсутствует «выражение2», то
принимается, что оно всегда равно true.
«Выражение1» и «выражение3» могут состоять из нескольких выражений,
объединенных запятой. В этом случае вычисляется каждое из выражение,
причем порядок вычисления будет слева направо:
for (i = 0, j = 0; i < 9; i++) Print ( "i = ", i, " j= ", j );
- Читать Закрыть 15
Операторы Break и Сontinue.
Досрочный выход из цикла с помощью оператора break
Достаточно часто возникает потребность досрочно выйти из цикла — для этого используется оператор break.
Оператор досрочного завершения цикла break
Оператор break используется для досрочного выхода из
ближайшего вложенного внешнего оператора цикла while или for. Также
оператор break используется для выхода из оператора switch.
Пример использования этого оператора:
int i;
for ( i = 0; i<10; i++ )
{
...
if ( i == 5 ) break;
}
В нашем примере цикл исполнится не 10 раз, а только 6, т.к. в тот
момент, когда переменная i будет равна 5, в операторе if-else условие
i=5 станет истинным и будет выполнен оператор break, т.к. произойдет
досрочный выход из цикла.
Досрочное завершение очередной итерации цикла с помощью оператора continue
Иногда нам нужно не навсегда выйти из цикла, а просто завершить
досрочно очередную его итерацию. Для этого используется оператор continue.
Оператор continue прерывает выполнение текущей
итерации и передает управление на начало ближайшего внешнего оператора
цикла for или while, запуская на исполнение следующую итерацию.
Пример использования оператора continue:
int i;
for ( i = 0; i < 10; i++)
{
...
continue;
Print ("Изучаем оператор continue"); // этот оператор никогда не будет выполнен
}
- Читать Закрыть 16
Переключатель Switch.
Достаточно часто возникают ситуации, когда нам надо заложить в
эксперте не два, а больше варианта развития событий. Например,
переменная i может принимать целочисленные значения от 1 до 5 и в
зависимости от того, какое значение имеет эта переменная, возможны 5
различных последовательностей операторов. Такую задачу легко можно
решить с использованием множества вложенных условных операторов if-else.
if (i == 1)
оператор1;
else
if (i == 2)
оператор2;
else
if (i == 3)
оператор3;
else
if (i == 4)
оператор4;
else
if (i == 5)
оператор5;
Такой код будет работать, но его очень тяжело читать и воспринимать.
Для большей наглядности в таких случаях лучше использовать оператор
переключения switch.
Формат оператора switch:
switch(выражение)
{
case константа1: операторы1
case константа2: операторы2
...
default: операторы_default
}
Принцип работы этого оператора: сначала вычисляется значение
«выражения», потом среди констант «константа1», «константа2» и др.
ищется константа, которая равна результату «выражения». Если такая
константа найдена, то оправление передается на соответствующую группу
операторов. После этого последовательно выполняются все операторы этой
группы и всех последующих, пока не будет выполнен последний оператор в
операторе switсh или не будет осуществлен досрочный выход из оператора
switсh с помощью оператора break. Если же не было найдено подходящей
константы, то управление передается на группу операторов
«операторы_default».
Метка default и группа операторов «операторы_default» могут
отсутствовать. В этом случае просто не будет выполняться никаких
действий, если ни одна из констант не соответствует результату
«выражения». Default не обязательно должен быть последним.
Каждый вариант case может быть помечен целой константой, символьной константой или константным выражением.
Теперь в качестве примере перепишем наш пример с переменной i и 5 вариантами действий с помощью оператора switch:
switch (i)
{
case 1: оператор1; break;
case 2: оператор2; break;
case 3: оператор3; break;
case 4: оператор4; break;
case 5: оператор5; break;
}
- Читать Закрыть 17
Учим эксперта торговать.
Уверены, что Вам уже не терпиться научить Вашего эксперта торговать.
Язык MetaQuotes Language 4 позволяет осуществлять ПОЛНЫЙ контроль над
торговым счетом — открывать/закрывать позиции, размещать/модифицировать и
удалять ордера, получать информацию об открытых позициях и уже закрытых
сделках и многое-многое другое.
В этом выпуске хотим привести полный список торговых функций, которые
можно вызывать в эксперте, а в следующих выпусках подробно остановлюсь
на каждой функции.
Функция |
Краткое описание |
HistoryTotal |
Количество закрытых позиций и удаленных ордеров |
OrderClose |
Закрывает позицию |
OrderCloseBy |
Закрывает позицию другой позицией (локированной) |
OrderClosePrice |
Цена закрытия выбранного функцией OrderSelect() ордера/позиции |
OrderCloseTime |
Дата и время закрытия выбранного функцией OrderSelect() ордера/позиции |
OrderComment |
Комментарий выбранного функцией OrderSelect() ордера/позиции |
OrderCommission |
Комиссия выбранного функцией OrderSelect() ордера/позиции |
OrderDelete |
Удаляет отложенный ордер |
OrderExpiration |
Дата истечения выбранного функцией OrderSelect() ордера/позиции |
OrderLots |
Количество лотов в выбранном функцией OrderSelect() ордере/позиции |
OrderMagicNumber |
«Магическое» число выбранного функцией OrderSelect() ордера/позиции |
OrderModify |
Изменяет уровень и дату эксперации отложенного ордера, уровни Stop
Loss и Take Profit и «магическое» число открытой позиции или отложенного
ордера |
OrderOpenPrice |
Цена открытия выбранного функцией OrderSelect() ордера/позиции |
OrderOpenTime |
Дата и время размещения/открытия выбранного функцией OrderSelect() ордера/позиции |
OrderPrint |
Выводит параметры ордера в журнал |
OrderProfit |
Прибыль/убыток выбранного функцией OrderSelect() ордера/позиции |
OrderSelect |
Выбрать ордер для получения информации по нему |
OrderSend |
Открытие позиции или установка отложенного ордера |
OrderStopLoss |
Stop Loss выбранного функцией OrderSelect() ордера/позиции |
OrdersTotal |
Количество открытых позиций и отложенных ордеров |
OrderSwap |
Величина сториджа выбранного функцией OrderSelect() ордера/позиции |
OrderSymbol |
Аббревиатура инструмента выбранного функцией OrderSelect() ордера/позиции |
OrderTakeProfit |
Take Profit выбранного функцией OrderSelect() ордера/позиции |
OrderTicket |
Тикет выбранного функцией OrderSelect() ордера/позиции |
OrderType |
Тип выбранного функцией OrderSelect() ордера/позиции |
- Читать Закрыть 18
функция OrderSelect.
Формат функции OrderSelect():
bool OrderSelect ( int index, int select, int pool=MODE_TRADES )
Как мы видим, функция возвращает значение логического типа: true —
когда ордер или позиция были успешно выбраны, false — в случае какой-то
ошибки. Код этой ошибки можно получить впоследствии с помощью функции GetLastError().
Ордер/позицию можно выбрать двумя способами:
- по номеру тикера;
- по порядковому номеру ордера/позиции в списке.
Если Вы знаете тикер ордера или позиции, то в качестве параметра select надо передать значение SELECT_BY_TICKET, а в качестве параметра index — номер тикера ордера или позиции. Третий параметр в этом случае не используется и его можно опустить.
Пример выбора по тикеру:
//---- выбираем ордер/позицию с тикером 77777
if ( OrderSelect (77777, SELECT_BY_TICKET) == true)
Print("Ордер #77777 выбран успешно");
else
Print("OrderSelect() вернул ошибку - ",GetLastError());
Если Вы не знаете тикера, то существует другой способ выбрать ордер
или позицию. Для этого Вам надо выбрать ордер или позицию из списка
открытых позиций или неудаленных отложенных ордеров (значение параметра pool равно MODE_TRADES) или из списка закрытых позиций или удаленных ордеров (параметр pool равен MODE_HISTORY). В обоих случаях параметр select должен быть равен SELECT_BY_POS. В параметре index Вы должны указать порядковый номер этой позиции или ордера в списке открытых позиций или неудаленных отложенных ордеров (pool равен MODE_TRADES) или в списке закрытых позиций и удаленных отложенных ордеров (pool равен MODE_HISTORY).
Этот способ очень полезен, когда Вам нужно «пробежаться», например, по всем открытым позициям:
int pos;
int total = OrdersTotal();
for ( pos = 0; pos
- Читать Закрыть 19
функция HistoryTotal.
Зачастую, чтобы найти нужную нам позицию, приходится «пробежаться» по
всему списку. Для этого нам нужно знать общее количество позиций и
ордеров в списке закрытых позиций и удаленных отложенных ордеров. В этом
нам поможет функция HistoryTotal().
Формат функции HistoryTotal():
int HistoryTotal ()
Эта функция возвращает количество закрытых позиций или удаленных
отложенных ордеров, которые загруженны в клиентском терминале MetaTrader
4 в соответствии с текущими настройками вкладки «История счета».
Пример использования HistoryTotal():
int pos;
int total = HistoryTotal();
for ( pos = 0; pos
- Читать Закрыть 20
функция OrderClosePrice.
|
|
» Статистика |
Онлайн всего: 1 Гостей: 1 Пользователей: 0
|
|