📚 Hub Books: Онлайн-чтение книгРазная литератураЯзык программирования MQL5: Продвинутое использование торговой платформы MetaTrader 5. Издание 2-е, исправленное и дополненное - Тимур Машнин

Язык программирования MQL5: Продвинутое использование торговой платформы MetaTrader 5. Издание 2-е, исправленное и дополненное - Тимур Машнин

Шрифт:

-
+

Интервал:

-
+
1 ... 11 12 13 14 15 16 17 18 19 ... 23
Перейти на страницу:
эксперта можно открывать или закрывать позиции.

Но перед совершением сделки было бы неплохо проверить корректность объема, с которым мы собираемся выйти на рынок.

Сделать это можно, используя свойства 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).

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

Это может быть немедленное исполнение (Instant Execution), исполнение по запросу (Request Execution), исполнение по рынку (Market Execution), биржевое исполнение (Exchange Execution).

Выяснить тип исполнения ордера можно с помощью свойства SYMBOL_TRADE_EXEMODE функции SymbolInfoInteger.

Для немедленного исполнения (Instant Execution), исполнение рыночного ордера осуществляется по цене, которую вы предлагаете брокеру.

Если брокер не может принять ордер по предложенным ценам, он предложит трейдеру новые цены исполнения, которые будут содержаться в структуре MqlTradeResult.

Для немедленного исполнения (Instant Execution), заполнение структуры MqlTradeRequest для ордера на покупку будет иметь следующий вид.

Здесь с помощью функции SymbolInfoTick в структуру MqlTick получаются текущие цены символа для предложения их брокеру.

Далее для немедленного исполнения (Instant Execution) заполняются обязательные поля структуры MqlTradeRequest action, symbol, volume, price, sl, tp, deviation, type, type_filling.

На практике, максимально приемлемое отклонение от запрашиваемой цены deviation, задаваемое в пунктах, которое принимается брокером, не более 5 пунктов.

При сильном движении рынка, при поступлении ордера брокеру, если цена ушла на большее значение, произойдет так называемое «Перекотирование» (Requote) — брокер вернет цены, по которым может быть исполнен данный ордер.

Функция NormalizeDouble здесь используется для округления цен до количества десятичных знаков после запятой, определяющего точность измерения цены символа текущего графика.

Для ордера на продажу заполнение Instant Execution обязательных полей структуры MqlTradeRequest будет иметь следующий вид.

После заполнения полей структуры MqlTradeRequest рекомендуется проверить ее с помощью функции OrderCheck.

Результаты проверки будут содержаться в структуре MqlTradeCheckResult:

Функция OrderCheck возвращает true в случае успешной проверки структуры MqlTradeRequest, при этом код retcode Код ответа будет равен 0, в противном случае функция вернет false.

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

Здесь мы получаем последние цены, затем проверяем флаг на покупку и флаг на открытую позицию.

Затем заполняем структуру торгового запроса MqlTradeRequest.

ORDER_FILLING_FOK означает, что ордер может быть исполнен исключительно в указанном объеме.

Далее мы проверяем структуру MqlTradeRequest и отсылаем запрос на совершение торговой операции брокеру, используя функцию OrderSend.

Тоже самое мы делаем для открытия позиции на продажу.

Проверяем флаг на продажу и флаг на открытую позицию.

Затем заполняем структуру торгового запроса MqlTradeRequest.

Далее мы проверяем структуру MqlTradeRequest и отсылаем запрос на совершение торговой операции брокеру, используя функцию OrderSend.

Таким образом, запрос на совершение торговой операции отсылается, если есть сигнал на открытие позиции и при этом открытая позиция еще не существует.

После проверки OrderCheck производится повторная проверка структуры MqlTradeRequest в виде возвращаемого значения функции OrderSend.

Далее выполняется проверка кода результата операции структуры MqlTradeResult.

Исполнение ордера по запросу (Request Execution) я лично не встречал у брокеров.

Вместо немедленного исполнения (Instant Execution) брокер может предложить исполнение ордера по рынку (Market Execution) или биржевое исполнение (Exchange Execution).

В режиме исполнения по рынку (Market Execution) сделка совершается по цене, предложенной брокером, при этом реквоты отсутствуют.

В режиме биржевого исполнения (Exchange Execution) торговые операции якобы выводятся во внешнюю торговую систему и сделки выполняются по текущим рыночным ценам, при этом реквоты также отсутствуют.

При исполнении по рынку (Market Execution) или биржевом исполнении (Exchange Execution) обязательными для заполнения являются поля структуры MqlTradeRequest action, symbol, volume, type, type_filling.

После заполнения структуры MqlTradeRequest мы ее проверяем и посылаем запрос брокеру.

Далее мы формируем новый запрос, в котором устанавливаем значения Stop Loss и Take Profit у открытой позиции, исходя из цен, полученным от брокера.

После заполнения новой структуры MqlTradeRequest мы ее проверяем и посылаем новый запрос брокеру.

Тоже самое делаем при открытии позиции на продажу.

Заполняем структуру MqlTradeRequest.

После заполнения структуры MqlTradeRequest мы ее проверяем и посылаем запрос брокеру.

Далее мы формируем новый запрос, в котором устанавливаем значения Stop Loss и Take Profit у открытой позиции, исходя из цен, полученным от брокера.

После заполнения новой структуры MqlTradeRequest мы ее проверяем и посылаем новый запрос брокеру.

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

Для установки отложенного ордера на покупку или продажу (TRADE_ACTION_PENDING), требуется указание 11 полей структуры MqlTradeRequest: action, symbol, volume, price, stoplimit, sl, tp, type, type_filling, type_time, expiration.

При этом поле type может принимать следующие значения.

— ORDER_TYPE_BUY_LIMIT — отложенный ордер на покупку, при этом текущие цены выше цены ордера.

— ORDER_TYPE_SELL_LIMIT — отложенный ордер на продажу, при этом текущие цены ниже цены ордера.

— ORDER_TYPE_BUY_STOP — отложенный ордер на покупку, при этом текущие цены ниже цены ордера.

— ORDER_TYPE_SELL_STOP — отложенный ордер на продажу, при этом

1 ... 11 12 13 14 15 16 17 18 19 ... 23
Перейти на страницу:

Комментарии

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

Никто еще не прокомментировал. Хотите быть первым, кто выскажется?