- Главное событие экспертов: OnTick
- Основные принципы и понятия: ордер, сделка, позиция
- Типы торговых операций
- Типы ордеров
- Режимы исполнения ордеров по цене и объемам
- Сроки действия отложенных ордеров
- Расчет залога для будущего ордера: OrderCalcMargin
- Оценка прибыли торговой операции: OrderCalcProfit
- Структура торгового запроса MqlTradeRequest
- Структура проверки запроса MqlTradeCheckResult
- Проверка корректности запроса: OrderCheck
- Результат отправки запроса: структура MqlTradeResult
- Отправка торгового запроса: OrderSend и OrderSendAsync
- Совершение покупки или продажи
- Модификация уровней Stop Loss и/или Take Profit позиции
- Трейлинг стоп
- Полное и частичное закрытие позиции
- Полное и частичное закрытие встречных позиций (хедж)
- Установка отложенного ордера
- Модификация отложенного ордера
- Удаление отложенного ордера
- Получение списка действующих ордеров
- Свойства ордеров (действующих и в истории)
- Функции для чтения свойств действующих ордеров
- Отбор ордеров по свойствам
- Получение списка позиций
- Свойства позиций
- Функции для чтения свойств позиций
- Свойства сделок
- Выборка ордеров и сделок из истории
- Функции для чтения свойств ордеров из истории
- Функции для чтения свойств сделок из истории
- Типы торговых транзакций
- Событие OnTradeTransaction
- Синхронные и асинхронные запросы
- Событие OnTrade
- Контроль за изменениями торгового окружения
- Особенности создания мультисимвольных экспертов
- Ограничения и преимущества экспертов
- Создание заготовки эксперта в Мастере MQL
Оценка прибыли торговой операции: OrderCalcProfit
Одна из функций MQL5 API — OrderCalcProfit — позволяет заранее оценить финансовый результат торговой операции при выполнении предполагаемых условий. Например, с помощью неё можно узнать сумму прибыли при достижении уровня Take Profit и сумму убытка при срабатывании Stop Loss.
bool OrderCalcProfit(ENUM_ORDER_TYPE action, const string symbol, double volume,
double openPrice, double closePrice, double &profit)
Функция вычисляет размер прибыли или убытка в валюте счета для текущего рыночного окружения и на основании переданных параметров.
В параметре action указывается тип ордера, причем разрешено использовать только рыночные ордера ORDER_TYPE_BUY или ORDER_TYPE_SELL из перечисления ENUM_ORDER_TYPE. Название финансового инструмента и его объем передаются в параметрах symbol и volume. Цены входа и выхода из рынка задаются параметрами openPrice и closePrice, соответственно. Последним параметром по ссылке передается переменная profit, в которую будет записано значение прибыли.
Функция возвращает признак успеха (true) или ошибки (false).
Формула расчета финансового результата, применяемая внутри OrderCalcProfit, зависит от типа инструмента.
Идентификатор |
Формула |
---|---|
SYMBOL_CALC_MODE_FOREX |
(ClosePrice - OpenPrice) * ContractSize * Lots |
SYMBOL_CALC_MODE_FOREX_NO_LEVERAGE |
(ClosePrice - OpenPrice) * ContractSize * Lots |
SYMBOL_CALC_MODE_CFD |
(ClosePrice - OpenPrice) * ContractSize * Lots |
SYMBOL_CALC_MODE_CFDINDEX |
(ClosePrice - OpenPrice) * ContractSize * Lots |
SYMBOL_CALC_MODE_CFDLEVERAGE |
(ClosePrice - OpenPrice) * ContractSize * Lots |
SYMBOL_CALC_MODE_EXCH_STOCKS |
(ClosePrice - OpenPrice) * ContractSize * Lots |
SYMBOL_CALC_MODE_EXCH_STOCKS_MOEX |
(ClosePrice - OpenPrice) * ContractSize * Lots |
SYMBOL_CALC_MODE_FUTURES |
(ClosePrice - OpenPrice) * Lots * TickPrice / TickSize |
SYMBOL_CALC_MODE_EXCH_FUTURES |
(ClosePrice - OpenPrice) * Lots * TickPrice / TickSize |
SYMBOL_CALC_MODE_EXCH_FUTURES_FORTS |
(ClosePrice - OpenPrice) * Lots * TickPrice / TickSize |
SYMBOL_CALC_MODE_EXCH_BONDS |
Lots * ContractSize * (ClosePrice * FaceValue + AccruedInterest) |
SYMBOL_CALC_MODE_EXCH_BONDS_MOEX |
Lots * ContractSize * (ClosePrice * FaceValue + AccruedInterest) |
SYMBOL_CALC_MODE_SERV_COLLATERAL |
Lots * ContractSize * MarketPrice * LiqudityRate |
В формулах использованы следующие обозначения:
- Lots — объем позиции в лотах (долях контракта);
- ContractSize — размер контракта (одного лота, SYMBOL_TRADE_CONTRACT_SIZE);
- TickPrice — стоимость тика (SYMBOL_TRADE_TICK_VALUE);
- TickSize — размер тика (SYMBOL_TRADE_TICK_SIZE);
- MarketPrice — последняя известная цена Bid/Ask в зависимости от типа сделки;
- OpenPrice — цена открытия позиции;
- ClosePrice — цена закрытия позиции;
- FaceValue — номинальная цена облигации (SYMBOL_TRADE_FACE_VALUE);
- LiqudityRate — коэффициент ликвидности (SYMBOL_TRADE_LIQUIDITY_RATE);
- AccruedInterest — накопленный купонный доход (SYMBOL_TRADE_ACCRUED_INTEREST).
Функцию OrderCalcProfit можно применять только в экспертах и скриптах. Для расчета потенциальной прибыли/убытка в индикаторах нужно реализовать альтернативный способ, например, самостоятельные вычисления по формулам.
Чтобы обойти ограничение на применение функций OrderCalcProfit и OrderCalcMargin в индикаторах, был разработан набор функций, выполняющих расчеты по формулам из этого раздела, а также раздела Маржинальные требования. Функции находятся в заголовочном файле MarginProfitMeter.mqh, внутри общего пространства имен MPM (от "Margin Profit Meter").
В частности, для расчета финансового результата важно иметь стоимость одного пункта конкретного инструмента. В вышеприведенных формулах она опосредованно участвует в разности цен открытия и закрытия (ClosePrice - OpenPrice).
Вычислить стоимость одного ценового пункта позволяет функция PointValue.
namespace MPM
|
В начале функции мы запрашиваем все свойства символа, необходимые для расчета. Затем в зависимости от типа инструмента получаем прибыль/убыток в валюте прибыли этого инструмента. Обратите внимание, здесь отсутствуют облигации, формулы которых учитывают номинальную цену и купонный доход.
double result = 0;
|
Наконец, переводим сумму в валюту счета, если она отличается.
string account = AccountInfoString(ACCOUNT_CURRENCY);
|
Для конвертации сумм используется вспомогательная функция Convert. Она, в свою очередь, зависит от функции FindExchangeRate, производящей поиск среди всех доступных символов такого, который содержит курс из валюты current в валюту account.
bool Convert(const string current, const string account,
|
Функция FindExchangeRate просматривает символы в Обзоре рынка и возвращает название первого подходящего Forex-символа, если их несколько, в параметре result. Если котировка соответствует прямому порядку валют "current/account", функция вернет +1, а если обратному — "account/current" — -1.
int FindExchangeRate(const string current, const string account, string &result)
|
С полным кодом функций можно ознакомиться в прилагаемом файле MarginProfitMeter.mqh.
Проверим работу функции OrderCalcProfit и группы функций MPM с помощью тестового скрипта ProfitMeter.mq5: вычислим оценку прибыли/убытка для виртуальных трейдов по всем символам Обзора рынка, причем сделаем это двумя способами — встроенным и собственным.
Во входных параметрах скрипта можно выбрать типа операции Action (покупка или продажа), размер лота Lot и длительность удержания позиции в барах Duration. Финансовый результат рассчитывается для котировок Duration последних баров текущего таймфрейма.
#property script_show_inputs
|
В теле скрипта подключаем заголовочные файлы и выводим "шапку" с параметрами.
#include <MQL5Book/MarginProfitMeter.mqh>
|
Затем в цикле по символам выполняем расчеты двумя способами и печатаем результаты для сравнения.
for(int i = 0; i < SymbolsTotal(true); i++)
|
Попробуйте запустить скрипт для разных счетов и наборов инструментов.
Profits/Losses for buying 1.0 lots of 13 symbols in Market Watch on last 20 bars H1
|
В идеале числа в каждой строке должны совпасть.