Жадность на графике: Разрывы и пирамидинг

Заметки по Greedy Strategy, где Я разбираю заполнение направленных заявок и торговлю разрывов.

Стратегия открывает позицию, если образовался разрыв между текущим открытием и максимумом или минимумом предыдущего бара. Если цена открытия выше значения максимума предыдущего бара, то открывается длинная позиция, если цена открытия ниже минимума предыдущего бара — короткая. После открытия позиции заявки будут заполняться в том же направлении, пока цвет следующего бара совпадает с направлением. Это будет продолжатся, пока бар не сменит цвет или пока не будет достигнуто ограничение по открытым позициям внутри дня (maxidf).
Давайте разберем код Greedy Strategy с моими пояснениями.

Код Greedy Strategy

//@version=5
strategy("Greedy Strategy", pyramiding = 1001, calc_on_order_fills=false2, overlay=true)
tp = input(10)
sl = input(10)3
maxidf = input(title="Max Intraday Filled Orders", defval=5)4
strategy.risk.max_intraday_filled_orders(maxidf)
upGap = open > high[1]
dnGap = open < low[1]
dn = strategy.position_size < 0 and open > close
up = strategy.position_size > 0 and open < close5
if upGap
    strategy.entry("GapUp", strategy.long, stop = high[1])
else
    strategy.cancel("GapUp")
if dn
    strategy.entry("Dn", strategy.short, stop = close)
else
    strategy.cancel("Dn")
if dnGap
    strategy.entry("GapDn", strategy.short, stop = low[1])
else
    strategy.cancel("GapDn")
if up
    strategy.entry("Up", strategy.long, stop = close)
else
    strategy.cancel("Up")6
XQty = strategy.position_size < 0 ? -strategy.position_size : strategy.position_size
dir = strategy.position_size < 0 ? -1 : 1
lmP = strategy.position_avg_price + dir*tp*syminfo.mintick
slP = strategy.position_avg_price - dir*sl*syminfo.mintick
float nav = na
revCond = strategy.position_size > 0 ? dnGap : (strategy.position_size < 0 ? upGap : false)
if not revCond and XQty > 0
    strategy.order("TP", strategy.position_size < 0 ? strategy.long : strategy.short, XQty, lmP, nav, "TPSL",  strategy.oca.reduce, "TPSL")
    strategy.order("SL", strategy.position_size < 0 ? strategy.long : strategy.short, XQty, nav, slP, "TPSL",  strategy.oca.reduce, "TPSL")7
if XQty == 0 or revCond
    strategy.cancel("TP")
    strategy.cancel("SL")8
//plot(strategy.equity, title="equity", color=color.red, linewidth=2, style=plot.style_areabr)

Сноски и пояснения

  1. pyramiding — максимальное количество входов в одном направлении. При нулевом значении (по умолчанию) удовлетворена может быть только одна заявка. ↩︎
  2. calc_on_order_fills=false — мы отключаем пересчет при заполнении заявки. Это значит, что параметры стратегии будут пересчитываться при каждом новом закрытии бара. ↩︎
  3. tp и sl устанавливают значения в тиках (минимальный шаг цены), где мы будем забирать прибыль или ограничивать убыток (Take Profit и Stop Loss соответственно). ↩︎
  4. maxidf показывает максимальное количество заявок, которое может быть открыто в одном направлении. По умолчанию равно 5. Значение можно изменить в настройках стратегии. maxidf далее используется во встроенной функции strategy.risk.max_intraday_filled_orders, которая ограничивает количество открытых заявок внутри дня. ↩︎
  5. В предыдущих 4 строчках описываются условия разрыва на графике и как определяется направление. ↩︎
  6. Прописаны условия входа в позицию и отмены. Мы уже разбирали эти функции ранее. Не буду задерживаться. А вот ниже уже более интересная и сложная часть кода. ↩︎
  7. strategy.order() — встроенная команда для расположения заявки.
    Давайте разберем строку:
    strategy.order(«SL», strategy.position_size < 0 ? strategy.long : strategy.short, XQty, nav, slP, «TPSL», strategy.oca.reduce, «TPSL», when = not revCond and XQty > 0)
    Используемые аргументы смотрим в Справочнике:
    id = «SL» — идентификатор;
    direction = strategy.position_size < 0 ? strategy.long : strategy.short — определяем направление по условию и с помощью тернарного оператора;
    qty = XQty;
    limit = nav;
    stop = slP;
    oca_name = «TPSL» — метка группы заявок;
    oca_type = strategy.oca.reduce — встроенная функция для уменьшения размера позиции отмеченной группы;
    comment = «TPSL«.  ↩︎
  8. strategy.cancel() — команда для отмены сделки. ↩︎
Понравилась статья? Поделиться с друзьями: