Ограничить вычисления советника в функции OnTick по появлению нового бара на графике также можно двумя способами, с помощью свойства SERIES_LASTBAR_DATE функции SeriesInfoInteger или с помощью функции CopyTime.
То есть здесь мы проводим вычисления в функции OnTick только при появлении нового бара на графике символа, пропуская все промежуточные тики.
Делаем мы это, получая время открытия последнего бара и используя статическую локальную переменную для сравнения.
Если вы, предположим, хотите, после того как поймали StopLoss, прекратить на сегодня торговлю советником, вам нужно правильно обработать это StopLoss событие.
Как известно, функция OnTrade вызывается при открытии или закрытии позиции, установке, модификации или удалении отложенного ордера, отмене отложенного ордера при нехватке средств либо по истечении срока действия, срабатывании отложенного ордера, модификации открытой позиции.
Поэтому в функции OnTrade нужно выделить только события совершения сделок, а затем из сделок выделить событие закрытия позиции по StopLoss:
Здесь функция HistorySelect запрашивает историю сделок и ордеров за все время, затем с помощью функции HistoryDealsTotal мы получаем индекс последней сделки и сравниваем его со статической переменной, хранящей индекс предыдущей сделки. Таким образом, мы выделяем только события совершения сделок.
С помощью функции HistoryDealGetTicket получаем тикет последней сделки и, используя свойство DEAL_COMMENT функции HistoryDealGetString, получаем комментарий к сделке.
Если комментарий содержит sl, тогда это была сделка закрытия позиции по StopLoss.
flagStopLoss это глобальная переменная, которую мы теперь можем использовать в функции OnTick.
Здесь эксперт прекращает вычисления, если получен StopLoss и не наступил новый дневной бар.
Это флаги flagStopLoss и IsNewBarD1 соответственно.
Так как для каждого финансового инструмента (символа) возможна только одна открытая позиция, в функции OnTick нужно организовать проверку наличия открытой позиции, чтобы не пытаться открыть ее заново, при ее фиксированном объеме.
Здесь функция PositionSelect копирует данные об открытой позиции символа в программное окружение. Затем, с помощью свойства POSITION_TYPE функции PositionGetInteger, выясняется, является ли открытая позиция позицией на продажу или покупку.
Позиции — это наличие купленных или проданных контрактов по финансовому инструменту.
Длинная позиция (Long) образуется в результате покупок в ожидании повышения цены, короткая позиция (Short) — результат продажи актива в расчете на снижение цены в будущем.
На одном счете по каждому финансовому инструменту может существовать только одна позиция.
По каждому символу в любой момент времени может быть только одна открытая позиция — длинная или короткая.
Объем позиции может увеличиваться в результате новой торговой операции в том же направлении.
То есть объем длинной позиции будет увеличен после новой покупки (операции Buy) и уменьшится после продажи (операции Sell).
Позиция считается закрытой, если в результате торговой операции объем обязательств стал равен нулю.
Такая операция называется закрытием позиции.
После выполнения различных проверок в функции OnTick следуют вычисления сигналов торговой системы эксперта.
Как правило, для вычисления сигналов торговой системы требуются исторические данные символа.
Сделать это можно с помощью функции CopyRates и структуры MqlRates, содержащей исторические цены бара символа.
Здесь в массив структуры MqlRates копируются данные последних трех баров, а затем меняется порядок доступа к массиву.
Наконец, после вычислений сигналов торговой системы эксперта можно открывать или закрывать позиции.
Но перед совершением сделки было бы неплохо проверить корректность объема, с которым мы собираемся выйти на рынок.
Сделать это можно, используя свойства SYMBOL_VOLUME_MIN и SYMBOL_VOLUME_MAX.
Открытие и закрытие позиции, изменение объема открытой позиции, изменение значения Stop Loss и Take Profit у открытой позиции, установка, модификация и удаление отложенных ордеров, все это может быть сделано с помощью функции OrderSend.
Тип торговой операции, которую будет пытаться выполнить функция OrderSend, определяется структурой MqlTradeRequest.
Первый параметр action структуры MqlTradeRequest определяет тип торговой операции функции OrderSend с помощью перечисления ENUM_TRADE_REQUEST_ACTIONS.
Это может быть немедленное совершение сделки на покупку или продажу (TRADE_ACTION_DEAL), изменение значений Stop Loss и Take Profit у открытой позиции (TRADE_ACTION_SLTP), установка отложенного ордера на покупку или продажу (TRADE_ACTION_PENDING), изменение параметров отложенного ордера (TRADE_ACTION_MODIFY), удаление отложенного ордера (TRADE_ACTION_REMOVE).
Если вы хотите совершить немедленную сделку на покупку или продажу, в этом случае тип исполнения ордера для данного финансового инструмента или символа определяется брокером.
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии