BuyAtStop в OsEngine.

BuyAtStop в OsEngine.

Серия методов BuyAtStop предназначена для отложенного открытия длинных позиций при помощи условных заявок. После вызова метода во вкладке создается объект класса PositionOpenerToStopLimit, который содержит данные по условной заявке. Будем называть его условной позицией.

Рассмотрим принцип действия условных заявок. По сути это обычный ордер, но на биржу он отправляется только при выполнении определенных условий. Возьмем условный инструмент, текущая цена которого равна 100 у.е. Мы хотим купить один лот, когда цена превысит отметку в 120 у.е. При текущем раскладе этого сделать невозможно, но можно программе задать условие, что, когда цена достигнет отметки 120, высылать на биржу заявку на покупку одного лота. 

public void BuyAtStop(decimal volume, decimal priceLimit, decimal priceRedLine, StopActivateType activateType, int expiresBars, string signalType, PositionOpenerToStopLifeTimeType lifeTimeType)

Метод ничего не возвращает. Принимает следующие параметры:

  1. volume – объем для открывающего ордера;
  2. priceLimit – цена для ордера;
  3. priceRedLine – цена, при достижении которой на биржу будет отправлен ордер;
  4. activateType – тип активации. Необходимо использовать значение выше или равно;
  5. expiresBars – время жизни заявки, измеряемое количеством свечек (бары);
  6. signalType – строка, содержащая имя сигнала на открытие позиции;
  7. lifeTimeType – включает/выключает расчет времени жизни для заявки;

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

Модифицируем пример:

  1. Изменим метод CrossUp. Он будет сообщать нам, находится ли цена выше скользящей.
  2. Добавим метод GetBorderPrice, котрый будет расчитывать и возвращать цену с учетом отклонения.

И далее изменим обработчик события завершения свечи:

  1. Создадим параметр для типа int. С его помощью будем задавать допустимое проскальзывание.
  2. Определяем сигнал для открытия.
  3. В качестве условия используем цену, по достижению которой, вкладка откроет длинную позицию.
  4. Рассчитываем цену, по которой будет выслан ордер в момент срабатывания условия с учетом проскальзывания.
  5. Даем вкладке команду на открытие длинной позиции при достижении граничного значения.

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

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

  1. Добавляем две дополнительных проверки: во вкладке не должно быть активных условных позиций и активных обычных позиций.
  2. В качестве последнего параметра методу BuyAtStop передаем значение NoLifeTime.

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

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

public void BuyAtStop(decimal volume, decimal priceLimit, decimal priceRedLine, StopActivateType activateType, int expiresBars, string signalType)

Перегрузка метода, которая не требует параметра lifeTimeType, по умолчанию использует значение CandlesCount для расчета времени жизни для условной позиции.

public void BuyAtStop(decimal volume, decimal priceLimit, decimal priceRedLine, StopActivateType activateType, int expiresBars)

Версия метода, которая не требует параметров signalType и lifeTimeType. По умолчанию используется пустая строка для сигнала и значение CandlesCount для расчета времени жизни для условной позиции.

public void BuyAtStop(decimal volume, decimal priceLimit, decimal priceRedLine, StopActivateType activateType, string signalType)

Не требует параметров expiresBars и signalType. По умолчанию используется единица и значение CandlesCount для расчета времени жизни для условной позиции.

public void BuyAtStop(decimal volume, decimal priceLimit, decimal priceRedLine, StopActivateType activateType)

Не требует параметров expiresBars, signalType и lifeTimeType. По умолчанию используется единица, пустая строка для сигнала и значение CandlesCount для расчета времени жизни для условной позиции соответственно.

13:53
303

Комментарии

Нет комментариев. Ваш будет первым!