Рыночной заявкой называется заявка, которая исполняется по существующей, на данный момент, рыночной цене.

Стоп-лимит – это стоп-заявка, которая исполняется в случае достижения ценой определенного значения. Может использоваться как для входа в позицию, так и для выхода из нее, чаще всего используется для закрытия позиции, если цена инструмента идет в противоположном направлении от позиции. Параметрами Стоп-лимита в системе QUIK являются: инструмент, по которому выставляется Стоп-лимит, цена при которой будет выставлена заявка на совершение сделки, цена заявки выставляемой в систему, объем заявки и срок действия Стоп-лимита.

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

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

Используя торговые роботы, на языке Lua, можно выставлять все доступные в терминале QUIK торговые заявки.

Создадим новый скрипт с именем «018 Рыночная заявка Стоп-лимит Тэйк-профит.lua», который будет выставлять рыночную заявку на покупку через пять секунд после запуска скрипта, далее скрипт выставит Стоп-лимит на продажу и Тэйк-профит. Цена Стоп-лимита будет на один процент ниже, чем цена покупки. Цена начала расчета Тэйк-профита будет равна цена сделки плюс один процент, отступ от максимума цены будет равняться один процент. После начала расчета Тэйк-профита необходимо будет снять Стоп-лимит.

Из предыдущего скрипта «017 Лимитированная заявка.lua» скопируем строки кода с 1 по 5.

Из предыдущего примера торгового робота мы знаем, что нам понадобятся переменные, которые будут содержать идентификатор транзакции, причем у каждого типа транзакции должен быть уникальный идентификатор.
Нам понадобятся следующие идентификаторы:

1.для заявки на покупку;
2.для Стоп-лимита;
3.для Тэйк-профита;
4.для снятия стоп лимита.

Создадим соответствующие переменные на языке Lua.

Предположим, что мы не будем запускать скрипты одновременно, тогда, для заявки на покупку можно взять идентификатор из предыдущего примера торгового робота. Строка кода 7.

Для Стоп-лимита, на закрытие позиции на покупку, будем использовать идентификатор, начинающийся с цифры 2. Строка кода 8.

Для Тэйк-профита будем использовать идентификатор, начинающийся с цифры 3. Строка кода 9.

Для транзакции снимающей Стоп-лимит, после активации Тэйк-профита будем использовать идентификатор, начинающийся с цифры 9. Строка кода 9.

Для транзакции снимающей Тэйк-профит, после исполнения Стоп-лимита будем использовать идентификатор, начинающийся с цифры 8. Строка кода 10.

Также нам понадобятся переменные содержащие статус каждой транзакции. Создадим их используя язык Lua.

Для заявки на покупку. Строка кода 12.

Для Стоп-лимита. Строка кода 13.

Для Тэйк-профита. Строка кода 14.

Для снятия Стоп-лимита. Строка кода 15.

Для снятия Тэйк-профита. Строка кода 16.

Для каждой транзакции понадобится переменная, которая будет содержать информационное сообщение. Создадим соответствующие переменные на языке Lua.

Для заявки на покупку. Строка кода 17.

Для Стоп-лимита. Строка кода 18.

Для Тэйк-профита. Строка кода 19.

Для снятия Стоп-лимита. Строка кода 20.

Для снятия Тэйк-профита. Строка кода 21.

Выставлять Стоп-лимит и Тэйк-профит мы будем только в том случае если наша заявка будет исполнена, для этого нам потребуется знать ее состояние, для определения состояния необходим номер заявки, следовательно, понадобится переменная содержащая номер заявки на покупку, создадим ее на языке Lua.

Нам будет необходимо снять Стоп-лимит после того, как начнет рассчитываться Тэйк-профит, следовательно, необходимо знать номер Стоп-лимита. Создадим переменную, которая будет содержать номер Стоп-лимита.

В случае если сработает Стоп-лимит, то необходимо будет снять Тэйк-профит, для снятия Тэйк-профита потребуется его номер, создадим переменную, которая будет содержать номер Тэйк-профита.

Как Вы возможно заметили, все переменные, относящиеся к транзакциям, содержат в имени букву «B» означающую операцию покупки. Таким образом, я маркирую переменные, для транзакций относящиеся к длинной позиции. Если в скрипте предусмотрено открытие длинных и коротких позиций, то используя такую маркировку легко определить, какая переменная относится к длинной позиции, а какая к короткой.

Скопируем из предыдущего примера функцию OnTransReply(order), и добавим функцию обработку дополнительных транзакций. Функция OnTransReply(order) является частью интерпретатора QLua и создана специально для терминала QUIK.

Для транзакции заявки на покупку понадобится статус заявки, номер заявки и информационное сообщение.

Для транзакции Стоп-лимита понадобится статус Стоп-лимита, номер Стоп-лимита и информационное сообщение. Добавим соответствующий код в функцию OnTransReply(order).

Для транзакции Тэйк-профита понадобится статус, номер Тэйк-профита и информационное сообщение. Добавим соответствующий код в функцию OnTransReply(order).

Для транзакции снятия Стоп-лимита потребуется статус и информационное сообщение. Добавим соответствующий код в функцию OnTransReply(order).

Для транзакции снятия Тэйк-профита потребуется статус и информационное сообщение. Добавим соответствующий код в функцию OnTransReply(order).

Обработка транзакций готова, скопируем из предыдущего примера торгового робота созданную нами функцию информирования и записи в файл результатов транзакции ResTransaction(). Поменяем имя файла, в который будет вестись запись на «LogStopTake.txt».

Далее перейдем к основной функции программы mail(), пропишем function main(). Функция main() является основной функцией в языке Lua, поскольку именно с этой функции начинает выполняться скрипт, соответственно торговый робот первым делом выполнит функцию main().

Скопируем из предыдущего примера торгового робота строки кода, относящиеся к выставлению заявки на покупку, строки выполняющие проверку исполнения транзакции и вызов функции ResTransaction(). Имена скопированных переменных полностью совпадают с именами в новом скрипте торгового робота, так что менять почти ничего не нужно, но изменения все же будут. Посмотрим на получившейся код, а ниже будут описаны изменения.

И так, в скрипте торгового робота, были изменены следующие строки 72, 74, 76, 82, 84, 85, 88.

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

В строке кода 74 изменено имя таблицы.

В строке кода 76 мы записали переменную содержащую номер торгового счета.

В строке кода 82, было изменено имя переменной идентификатора на ID_B_Order.

Посмотрим на строку кода 84. В отличие от предыдущего примера, переменная содержащая ошибку транзакции создана сразу при отправке транзакции. В данном случае у нас нет необходимости делать ее видимой во всем скрипте, поскольку ее значение мы отправляем только в функцию ResTransaction(), также в строке было изменено имя таблицы для функции sendTransaction().

В строке кода 85 изменилось имя переменной содержащей статус транзакции, теперь она именуется Status_B_Order.

В строке кода 88, в которой вызывается функции ResTransaction() были изменены все имена переменных.

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

По условию нам необходимо выставить рыночную заявку на покупку фьючерса РТС. Для этого добавим в таблицу с параметрами заявки еще один параметр с именем «TYPE». Данный параметр является не обязательным и если он не указан, то по умолчанию выставляется лимитированная заявка.

Строка «TYPE» может содержать два значения либо «M» говорит, что заявка рыночная «Market», либо значение «L» говорит, что заявка лимитированная «Limit».

Также при выставлении рыночной заявки в строке таблицы с именем «PRICE», указывается значение «0». Помним, что все строки таблицы с параметрами заявки должны содержать строковые значения.

Когда мы указываем в строке «PRICE» значение «0». Система QUIK берет максимально или минимально возможную цену для инструмента в зависимости от операции покупка или продажа. В данном случае операция «Покупка» соответственно выставиться заявка по максимально возможной цене для текущего фьючерса. Максимально и минимально возможные цены можно посмотреть в таблице «Текущие торги», добавим соответствующие колонки в таблицу. Колонки называются «Макс. возм. цен.» и «Мин. возм. цен».

На данном этапе скрипт торгового робота выставляет рыночную заявку на покупку фьючерса РТС и проверяет выполнение транзакции. При выставлении рыночной заявки вероятность ее исполнения стремиться к ста процентам, но небольшая вероятность ее неисполнения существует. В данном примере мы будем проверять исполнена заявка или нет, т.е. необходимо получить ее состояние и оно должно быть «Исполнена». Из предыдущего раздела помним, что состояние заявок хранится в битовых флагах. Заявка считается исполненной, если значение бита 0 равно «0» и значение бита 1 равно «0».

В скрипте «017 Рыночная заявка.lua» мы искали нужную заявку в Таблице заявок по ее номеру, для этого использовали два цикла один вложенный в другой. Такой способ поиска заявки и определения ее состояния был продемонстрирован для того чтобы потренироваться с циклами, а также с таблицами терминала QUIK.

В интерпретаторе QLua существует функция обратного вызова OnOrder(), которая автоматически вызывается терминалом QUIK при выставлении новой заявки и при изменении состояния существующей заявки. Функция возвращает таблицу, содержащую строки со всеми доступными параметрами для заявки, строки идентичны строкам таблицы, которую возвращает функция getItem(«orders», i) . Используем функцию OnOrder() для определения состояния выставленной рыночной заявки. Поскольку функция OnOrder() вызывается при изменении любой заявки, нам необходимо определить, что это именно нужная нам заявка, для этого используем номер заявки, присвоенный ей торговой системой при выполнении транзакции ее выставления.

Добавим функцию OnOrder(), после функции OnTransReply().

В функцию добавим проверку номера заявки, если номер заявки, по которому была вызвана функция, совпадает с номером заявки выставленной скриптом, то введем проверку состояния данной заявки. Если заявка исполнена, то нам необходимо передать эту информацию в основную функцию main(). Для этого создадим новую переменную с именем State_B_Order, поместим ее в начальные строки скрипта.

Далее присвоим переменной State_B_Order присвоено значение «Исполнена» в условии проверки состояния заявки.

В строке кода 54 проверяем номер заявки. Если номер заявки в нашей переменной Num_B_Order совпадает с номером заявки, из-за которой была вызвана функция OnOrder(), то переходим к проверке состояния заявки.

В строке кода 55 прописано условие, в котором проверяется состояние заявки, условие выполнится если заявка будет иметь статус Исполнена. Точно такую же проверку мы делали в предыдущем скрипте «017 Рыночная заявка.lua».

Строка кода 56. Если условие выполняется, присвоим переменной State_B_Order значение «Исполнена».

Как уже говорилось ранее, информация поступает в терминал QUIK не мгновенно, поэтому добавим цикл ожидания исполнения заявки. Но до начала работы цикла необходимо убедится, что наша заявка была принята системой. Для этого введем условие проверяющее, что статус транзакции равен 3. Напомню статус транзакции содержащий значение 3 говорит о том, что заявка принята системой. Если рыночная заявка была принята системой, то она в любом случае будет исполнена это только вопрос времени, конечно, это касается только ликвидных финансовых инструментов.

Код с условием проверки и цикл ожидания исполнения заявки вставим ниже строки с вызовом функции ResTransaction().

Далее по условию необходимо выставить стоп-заявку типа Стоп-лимит. Стоп-лимит для фьючерса РТС будет выставлен только в том случае, если рыночная заявка исполнена. Стоп-лимит будет закрывать нашу позицию, в случае если цена идет в противоположную сторону от нашей позиции. По условию мы находимся в длинной позиции соответственно нам нужно выставить заявку на продажу фьючерса РТС.

Добавим условие проверки, исполнения заявки, используя язык Lua.

Код выставления Стоп-лимита для фьючерса РТС будет прописан внутри данного условия. Перед тем как записывать таблицу с параметрами Стоп-лимита необходимо произвести расчет цены, при которой сработает Стоп-лимит и цены, по которой будет выставлена заявка на продажу фьючерса РТС.

Сначала рассчитаем стоп цену, при которой сработает Стоп-лимит. По условию Стоп-лимит сработает, если цена опустилась ниже на 1% от нашей цены покупки. Для расчета стоп цены нам необходимо знать цену нашей сделки. Для этого создадим переменную с именем TradeB и помести ее в начало скрипта торгового робота.

Далее нам будет необходимо получить цену сделки фьючерса РТС и присвоить ее значение в переменную.Для того чтобы получить цену сделки используем специальную функцию обратного вызова? интерпретатора QLua, под названием OnTrade(). Данная функция вызывается терминалом QUIK при получении сделки. Функция возвращает таблицу с параметрами сделки. Описание ключей и параметров есть в документе «6 Работа с другими приложениями.pdf». Текущие параметры всех сделок мы можем посмотреть в окне терминала QUIK — «Таблица сделок». Откроем окно из меню «Создать окно» далее пункт меню «Сделки».

Создадим функцию OnTrade() ниже функции OnOrder(), используя язык Lua.

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

Теперь в переменной Trade_B будет записана цена сделки фьючерса РТС, и мы можем рассчитать цену для Стоп-лимита. Для расчета стоп цены нам понадобятся еще две переменные. Первая переменная будет содержать процент, на который должна опустится цена, чтобы сработал Стоп-лимит. Во вторую переменную будет записана рассчитанная стоп цена. Создадим переменные, строки кода пропишем в начале функции main().

Далее рассчитаем стоп цену для фьючерса РТС используя арифметические действия языка Lua.

Стоп-цену рассчитали, но в текущем виде мы не можем ее использовать. Ситуация заключается в следующем. Рассмотрим пример, допустим цена сделки фьючерса РТС равна 115740, тогда стоп-цена, фьючерса, РТС будет равна

115740 – 115740 * 0,01 = 114582,6

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

Сначала мы разделим полученный результат на 10114582,6 / 10 = 11458,26

Далее отбросим дробную часть цены11458,26 — 11458,26%1 = 11458 (Вспомним, конструкция %1 отбрасывает дробную часть числа)

Далее умножим получившееся значение на 10 и прибавим один шаг цены для того чтобы минимизировать отброс дробной части.

11458 * 10 + 10 = 114590

В результате преобразований получили корректное значение для стоп-цены фьючерса РТС равное 114590 пунктов.В коде это выглядит следующим образом.

Теперь значение стоп-цены фьючеса РТС подходит для использования в Стоп-лимите.

Далее нам нужно будет указать цену, по которой будет выставлена заявка на продажу фьючерса РТС. Если в рыночной заявке мы использовали значение «0», строка таблицы с именем «PRICE», то в Стоп-лимите мы так сделать не можем нам нужно указать точную цену сделки. Просто вычтем из стоп цены определенное значение, например 300 пунктов и для фьючерса на RTS, с большой долей вероятности позиция закроется.

Создадим переменную с именем Spread и запишем в нее наше значение отступа цены для фьючерса РТС.

Выставление Стоп-лимита для фьючерса РТС не многим отличается от выставления рыночной заявки фьючерса РТС. Создадим таблицу с параметрами для стоп-заявки типа Стоп-лимит. Таблицу назовем StopLimitSell. Таблица будет содержать следующие строки кода на языке Lua.

Разберем подробно строки таблицы.

Строка «ACTION» содержит указание выставить новую стоп-заявку.
Строка «STOP_ORDER_KIND» указывает тип стоп-заявки в данном случае Стоп-лимит.
Строка «ACCOUNT» вам уже хорошо известна это номер торгового счета.
Строка «OPERATION» указывает, что будет выставлена заявка на продажу.
Строки «CLASSCODE» и «SECCODE» указывают класс бумаги и код торгового инструмента соответственно.
В строке «PRICE» мы указываем цену, по которой будет выставлена заявка на продажу. В этой же строке мы ее рассчитываем путем вычитания из стоп цены установленного спреда.
Строка «STOPPRICE» содержит значение стоп цены. Стоп цена это цена, при достижении которой в торговую систему будет отправлена заявка на закрытие позиции.
Строка «QUANTITY» содержит количество контрактов.
Строка «TRANS_ID» содержит идентификатор транзакции для Стоп-лимита.
Строка «EXPIRY_DATE» указывает срок действия стоп-заявки. В данном случае «GTC» означает до отмены. Еще возможны значения «TODAY» – до окончания текущей торговой сессии или указываем определенную дату в формате «ГГГГММДД»

Таблица для выставления Стоп-лимита для фьючерса РТС готова.

Создадим переменную с именем Err_Stop в которую запишем ошибку транзакции и вызовем функцию sendTransaction() для нашего Стоп-лимита.

Добавим цикл ожидания выполнения транзакции и вызовем функцию ResTransaction() для записи результатов транзакции в файл.

Выставление Cтоп-лимита для фьючерса РТС готово.
Далее, по условию необходимо выставить стоп-заявку типа Тэйк-профит, у которого цена начала расчета на один процент выше цены покупки, и отступ от максимума, при котором позиция будет закрыта, равняется один процент.

Создадим переменную с именем Price_Take, которая будет содержать цену начала расчета Тэйк-профита, переменную с именем Take_Percent, которая будет содержать значение процента для Тэйк-профита и переменную с именем Take_FromMax_Percent содержащую значение отступа от максимума, также в процентах.

Переменные запишем ниже соответствующих переменных для Стоп-лимита, т.е. в самом начале функции main().

В переменных Take_Percent и Take_FromMax_Percent записано одно и тоже значение 1% только в разном формате. Take_Percent мы будем использовать для своих расчетов цены начала расчета Тэйк-профита, а Take_FromMax_Percent мы будем использовать в таблице параметров для стоп-заявки типа Тэйк-профит, такого формата требует терминал QUIK. Если в Take_FromMax_Percent мы пропишем 0,01 то QUIK будет считать это как одна сотая процента (0,01%).

Теперь рассчитаем значение цены фьючерса РТС, при которой начнет рассчитываться Тэйк-профит, и приведем полученное значение к корректному формату, как и при расчете стоп цены фьючерса РТС.

В строке кода 141 мы рассчитывает цену фьючерса РТС, при которой начнет рассчитываться Тэйк-профит путем прибавления к цене сделки одного процента от цены сделки. Например, цена сделки равна 115740.

Price_Take = 115740 + 115740 * 0,01 = 116897,4

В строке кода 142 делим полученное значение на 10.

Price_Take = 116897,4 / 10 = 11689,74

В строке кода 143 отбрасываем дробную часть числа

Price_Take = 11689,74 — 11689,74 %1 = 11689

В строке кода 144 умножаем полученное значение на 10 и прибавляем один шаг цены для того чтобы минимизировать отброс дробной части.

Price_Take = 11689 * 10 + 10 = 116900

Теперь у нас есть все данные, чтобы заполнить таблицу для отправки транзакции.

Строка «ACTION» содержит указание выставить новую стоп-заявку.
Строка «STOP_ORDER_KIND» указывает тип стоп-заявки в данном случае Тэйк-профит.
Строка «ACCOUNT» вам уже хорошо известна это номер торгового счета.
Строка «OPERATION» указывает, что будет выставлена заявка на продажу.
Строки «CLASSCODE» и «SECCODE» указывают класс бумаги и код торгового инструмента соответственно.
Строка «STOPPRICE» содержит значение стоп цены, при которой начнет рассчитываться Тэйк-профит.
Строка «QUANTITY» содержит количество контрактов.
Строка «TRANS_ID» содержит идентификатор транзакции для Стоп-лимита.
Строка «EXPIRY_DATE» указывает срок действия стоп-заявки. В данном случае «GTC» означает до отмены. Еще возможны значения «TODAY» – до окончания текущей торговой сессии или указываем определенную дату в формате «ГГГГММДД».
Строка «OFFSET» содержит значение отступа от максимума.
Строка «OFFSET_UNITS» указывает единицы измерения отступа. В данном случае «PERCENTS» – означает проценты. Проще говоря, эта строка указывает, что значение в строке «OFFSET» является процентом от максимума. Строка может принимать два значения либо «PERCENTS», как в нашем примере либо «PRICE_UNITS». «PRICE_UNITS» – это единицы цены, т.е. пункты.
Строка «SPREAD» содержит защитный спред для заявки, которая будет отправлена в систему, это точно такой же спред, который мы использовали при расчетах Стоп-лимита. Например максимум цены 1000 пунктов, защитный спред 5 пунктов цена отпускается на один процент до 990 пунктов, Тэйк-профит отправляет заявку с ценой 990 — 5 = 985 пунктов.
Строка «SPREAD_UNITS» указывает единицы измерения защитного спреда. Возможны два варианта, как в нашем примере «PRICE_UNITS» – единицы цены и «PERCENTS» – значение в процентах.

Таблица для выставления Тэйк-профита, для фьючерса РТС готова.

Создадим переменную с именем Err_Take в которую запишем ошибку транзакции и вызовем функцию sendTransaction() для нашего Тэйк-профита. Добавим код ожидания исполнения транзакции и вызовем функцию ResTransaction(), которая запишет результат выполнения транзакции в файл.

На данный момент скрипт совершает покупку фьючерса РТС и выставляет две стоп-заявки, Стоп-лимит и Тэйк-профит. Далее необходимо написать код, который будет снимать соответствующую стоп заявку в зависимости от ситуации. Если сработает Стоп-лимит, то необходимо будет снять Тэйк-профит, если начнет рассчитываться Тэйк-профит, то необходимо снять Стоп-лимит. Поясню, что значит, начнет рассчитываться Тэйк-профит и почему его нужно снять. В данном случае Тэйк-профит начинает рассчитываться, если цена фьючерса РТС превысит цену указанную в Тэйк-профите, Тэйк-профит выставит заявку на продажу если цена фьючерса РТС опустится на один процент от максимума зафиксированного после выставления Тэйк-профита, соответственно позиция будет закрыта и необходимость в Стоп-лимите отпадает.

Нам нужно чтобы скрипт проверял состояние Стоп-лимита и Тэйк-профита все время пока существует текущая позиция. Для этого запишем цикл, который остановится только после нажатия кнопки «Остановить» в окне «Доступные скрипты». В теле этого цикла мы будем проверять состояние стоп заявок и снимать необходимые.

Первым делом будет проверяться состояние Стоп-лимита.

В интерпретаторе QLua есть функция обратного вызова под именем OnStopOrder() это функция вызывается терминалом QUIK каждый раз, когда выставляется новая стоп заявка или когда в стоп заявке меняются параметры.

Как только какая-то из наших стоп заявок сработает, то терминал вызовет функцию OnStopOrder(), в этой функции мы и пропишем условия определения состояния Стоп-лимита для фьючерса РТС.

Создадим функцию OnStopOrder(), ниже функции OnTrade(). Используя язык Lua.

Создадим переменную, которая будет отображать состояние Стоп-лимита для фьючерса РТС назовем ее Stop_B_Activ и присвоим значение «NO», переменную пропишем в начале кода, чтобы она была видна в функции OnOrder() и функции main(). Переменная Stop_B_Activ поменяет свое значение на «YES» если сработает Стоп-лимит.

Создадим переменную с именем Stop_Kill и начальным значением «NO». Переменная Stop_Kill поменяет свое значение на «YES» после того как будет отправлена транзакция на снятие Стоп-лимита. Эта переменная будет использоваться как ограничитель для количества транзакций на снятие Стоп-лимита фьючерса РТС.

Хорошо, переменные созданы, функция OnStopOrder(order) записана, но пока что она пустая. Как и в остальных случаях, нам нужно идентифицировать нашу заявку Стоп-лимит для фьючерса РТС, для этого используем ее номер. Пропишем, уже известное условие идентификации по номеру в функцию OnStopOrder(order).

Далее используя битовые флаги, запишем условие, которое проверяет, исполнена заявка Стоп-лимит для фьючерса РТС или нет. Если Стоп-лимит заявка исполнена, то запишем в переменную Stop_B_Activ значение «YES».

После того как Стоп-лимит исполнен, нам необходимо снять Тэйк-профит поскольку в нем больше нет необходимости текущая позиция закрылась. В тело цикла запишем условие проверяющее исполнение Стоп-лимита фьючерса РТС.

Если условие верно, то в теле условия запишем таблицу с параметрами на снятие Тэйк-профита по его номеру. Снятие стоп заявки почти не отличается от снятия обычной заявки, разница лишь в том, что в строке «ACTION» прописывается параметр «KILL_STOP_ORDER» и вместо строки «ORDER_KEY» прописывается строка «STOP_ORDER_KEY».

Создадим таблицу для снятие Тэйк-профита фьючерса РТС и заполним ее строки.

После таблицы пропишем уже хорошо известные строки. Создадим переменную с именем Err_KillTake, в которую запишем ошибку транзакции и вызовем функцию sendTransaction(). Ниже запишем цикл ожидания исполнения транзакции и вызовем функцию ResTransaction() чтобы записать результат в файл.

Далее для того чтобы условие if Stop_B_Activ == «YES» then выполнилось только один раз изменим значение в переменной Stop_B_Activ на «TakeKill». Заявка Тэйк-профит снята, больше данные строки скрипта не потребуются.

Случай, когда исполнился Стоп-лимит, фьючерса РТС, мы предусмотрели теперь перейдем к случаю, когда начал рассчитываться Тэйк-профит. Проверять состояние Тэйк-профита, мы будем так же с помощью функции обратного вызова OnStopOrder() и битовых флагов. Битовые флаги для стоп заявок прописаны в документе «Интерпретатор языка Lua.pdf». Бит 15 отвечает за расчет минимума/максимума для стоп заявки типа Тэйк-профит. Если идет расчет, то бит 15 НЕ равен нулю. Создадим переменную с именем Take_B_Activ, которая будем менять свое значение c «NO» на «YES» когда Тэйк-профит начнет рассчитываться, запишем ее в начало скрипта.

В функцию обратного вызова OnStopOrder() запишем условие идентификации Тэйк-профита для фьючерса РТС. В теле условия пропишем условие проверки состояния битового флага если бит 15 НЕ равен нулю, то изменим значение в переменной Take_B_Activ на «YES».

Отлично, теперь если Тэйк-профит фьючерса РТС начнет рассчитываться, мы это узнаем, переменная Take_B_Activ будет равна «YES».

Все готово для написания кода, который будет снимать Стоп-лимит фьючерса РТС.

Запишем условие, если переменная Take_B_Activ равна «YES» и переменная Stop_Kill равна «NO», то отправим транзакцию на снятие Стоп-лимита. Переменная Stop_Kill будет ограничителем, который не допустит многоразовое выполнение кода на снятие Стоп-лимита. После отправки транзакции на снятие Стоп-лимита фьючерса РТС, переменная Stop_Kill изменит свое значение на «YES».

Далее в теле условия пропишем код на снятие Стоп-лимита фьючерса РТС, он идентичен коду на снятие Тэйк-профита для фьючерса РТС, разница заключается лишь в именах переменных.

Вот почти и весь код. Осталось только добавить строку с паузой для цикла while stopped == false do. Запишем соответствующую строку, значение пауза поставим 500 миллисекунд (0,5 секунды).

Осталось только протестировать скрипт в реальных торгах, сохраним его и запустим в работу. Перед тестирование изменим значения Стоп-лимита и Тэйк-профита. Стоп-лимит сработает после снижения цены фьючерса РТС на 0,1%, Тэйк-профит начнет рассчитываться после роста цены фьючерса РТС на 0,1% и закроет позицию с отступом от максимума на 0,1%.

Запустим терминал QUIK. Откроем таблицу стоп-заявок для отслеживания их состояния.

После запуска скрипта торгового робота, была выставлена рыночная заявка на покупку фьючерса РТС, которая исполнилась, после были выставлены стоп-заявки Стоп-лимит и Тэйк-профит для фьючерса РТС.

В колонке таблицы стоп-заявок можно отследить все параметры выставленных стоп-заявок для фьючерса РТС.

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

На данном этапе работа скрипта торгового робота закончена, Тэйк-профит для фьючерса РТС работает самостоятельно на сервере брокера. Остановим скрипт торгового робота вручную через окно «Доступные скрипты» кнопкой «Остановить».

Откроем Лог файл и посмотрим на работу скрипта торгового робота.

Как и полагается информация была записана в файл. 

Запустим еще раз скрипт торгового робота для тестирования срабатывания стоп-заявки типа Стоп-лимит для фьючерса РТС.

После запуска торгового робота были выставлены две новые стоп-заявки для фьючерса РТС. Через некоторое время сработал Стоп-лимит фьючерса РТС. Тэйк-профит был снят торговым роботом, позиция фьючерса РТС была закрыта.

Откроем лог файл, который записал торговый робот на языке Lua для терминала QUIK.

Остановим торгового робота вручную через окно «Доступные скрипты» кнопкой «Остановить». В результате получился торговый робот для терминала QUIK написанный на языке программирования Lua, который выставляет три типа заявок для фьючерса РТС. Это рыночная заявка на покупку фьючерса РТС, стоп-заявка типа Стоп-лимит для фьючерса РТС и стоп-заявка типа Тэйк-профит для фьючерса РТС.

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