Заметки по 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)
Сноски и пояснения
- pyramiding — максимальное количество входов в одном направлении. При нулевом значении (по умолчанию) удовлетворена может быть только одна заявка. ↩︎
- calc_on_order_fills=false — мы отключаем пересчет при заполнении заявки. Это значит, что параметры стратегии будут пересчитываться при каждом новом закрытии бара. ↩︎
- tp и sl устанавливают значения в тиках (минимальный шаг цены), где мы будем забирать прибыль или ограничивать убыток (Take Profit и Stop Loss соответственно). ↩︎
- maxidf показывает максимальное количество заявок, которое может быть открыто в одном направлении. По умолчанию равно 5. Значение можно изменить в настройках стратегии. maxidf далее используется во встроенной функции strategy.risk.max_intraday_filled_orders, которая ограничивает количество открытых заявок внутри дня. ↩︎
- В предыдущих 4 строчках описываются условия разрыва на графике и как определяется направление. ↩︎
- Прописаны условия входа в позицию и отмены. Мы уже разбирали эти функции ранее. Не буду задерживаться. А вот ниже уже более интересная и сложная часть кода. ↩︎
- 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«. ↩︎ - strategy.cancel() — команда для отмены сделки. ↩︎