Цели/остановки ATR никогда не достигаются

#pine-script

Вопрос:

Я пытаюсь добавить цели и остановки ATR и пользовательский размер позиции для каждой сделки. Есть цели x3 (TP1, TP2, TP3 — серые линии), и ордер «ВЫХОД на покупку» должен равномерно распределить размер позиции между целями.

Проблема в том, что цели никогда не достигаются, что может быть связано с тем, что ATR меняется на каждой свече. Но когда это указано в strategy.exit не должно ли оно оставаться прежним? Как мне ее решить? strategy.position_size Все ли мне нужно изменить для настройки размера позиции, например, для управления пользовательскими рисками?

введите описание изображения здесь

 //@version=5
strategy("Test Strategy", overlay = true)

// ———————————————————— Inputs {
atrLengthInput = input.int(14, "ATR Length")
slAtrMultiplierInput = input.float(1.5, "SL ATR Multiplier", step = 0.1)
tp1AtrMultiplierInput = input.float(1.5, "TP1 ATR Multiplier", step = 0.1)
tp2AtrMultiplierInput = input.float(2.5, "TP2 ATR Multiplier", step = 0.1)
tp3AtrMultiplierInput = input.float(3.5, "TP3 ATR Multiplier", step = 0.1)
// }

// ———————————————————— Calculations {
atr = ta.atr(14)

longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))

long_sl = close - atr * slAtrMultiplierInput
long_tp1 = close   atr * tp1AtrMultiplierInput
long_tp2 = close   atr * tp2AtrMultiplierInput
long_tp3 = close   atr * tp3AtrMultiplierInput

short_sl = close   atr * slAtrMultiplierInput
short_tp1 = close - atr * tp1AtrMultiplierInput
short_tp2 = close - atr * tp2AtrMultiplierInput
short_tp3 = close - atr * tp3AtrMultiplierInput
// }

// ———————————————————— Plots {
plot(long_sl, color = color.red)
plot(long_tp1, color = color.gray)
plot(long_tp2, color = color.gray)
plot(long_tp3, color = color.gray)
// }

// ———————————————————— Strategy calls {
strategy.entry("BUY", strategy.long, when = longCondition)
strategy.exit("BUY", "EXIT BUY", stop = long_sl, limit = long_tp1)

strategy.entry("SELL", strategy.short, when = shortCondition)
strategy.exit("SELL", "EXIT SELL", stop = short_sl, limit = short_tp1)
// }
 

Ответ №1:

Вы были здесь очень близки, есть всего несколько вещей, которые нам нужно сделать в Пайне, чтобы это сработало. Во-первых, нам нужно объявить эти остановки с помощью «var». Это позволяет нам «установить и сохранить» переменную, что предотвращает их пересчет на каждом баре, как описывает ваша основная проблема.

Затем нам нужно ввести их в поле «если», чтобы назначить их. Я воспользовался вашими условиями входа и проверил, что мы еще не были в pos (в противном случае мы бы повторно ввели наши остановки/лимиты).

Кроме того, нам нужно использовать позиционную ссылку when= в наших выходах, поэтому я добавил это в вызовы strategy.exit.

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

Обратите внимание на var-деф с «=» и назначение с:=, а также в ifs. Именно так вы можете условно присвоить новые значения переменной, уже определенной в Pine. Вот отредактированный код для сравнения.

Ура и всего наилучшего,

Бьоргум

 //@version=5
strategy("Test Strategy", overlay = true)

// ———————————————————— Inputs {
atrLengthInput        = input.int  (14,  "ATR Length")
slAtrMultiplierInput  = input.float(1.5, "SL ATR Multiplier",  step = 0.1)
tp1AtrMultiplierInput = input.float(1.5, "TP1 ATR Multiplier", step = 0.1)
tp2AtrMultiplierInput = input.float(2.5, "TP2 ATR Multiplier", step = 0.1)
tp3AtrMultiplierInput = input.float(3.5, "TP3 ATR Multiplier", step = 0.1)
// }

// ———————————————————— Calculations {

FLAT  = strategy.position_size == 0
LONG  = strategy.position_size > 0
SHORT = strategy.position_size < 0

var long_sl   = 0.0
var long_tp1  = 0.0
var long_tp2  = 0.0
var long_tp3  = 0.0

var short_sl  = 0.0
var short_tp1 = 0.0
var short_tp2 = 0.0
var short_tp3 = 0.0

atr = ta.atr(14)

longCondition  = ta.crossover (ta.sma(close, 14), ta.sma(close, 28))
shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))

if (FLAT or SHORT) and longCondition
    long_sl   := close - atr * slAtrMultiplierInput
    long_tp1  := close   atr * tp1AtrMultiplierInput
    long_tp2  := close   atr * tp2AtrMultiplierInput
    long_tp3  := close   atr * tp3AtrMultiplierInput

if (FLAT or LONG) and shortCondition
    short_sl  := close   atr * slAtrMultiplierInput
    short_tp1 := close - atr * tp1AtrMultiplierInput
    short_tp2 := close - atr * tp2AtrMultiplierInput
    short_tp3 := close - atr * tp3AtrMultiplierInput
// }

// ———————————————————— Plots {
plot(LONG  ? long_sl   : na, color = color.red  , style=plot.style_linebr)
plot(LONG  ? long_tp1  : na, color = color.green, style=plot.style_linebr)
plot(LONG  ? long_tp2  : na, color = color.gray , style=plot.style_linebr)
plot(LONG  ? long_tp3  : na, color = color.gray , style=plot.style_linebr)

plot(SHORT ? short_sl  : na, color = color.red  , style=plot.style_linebr)
plot(SHORT ? short_tp1 : na, color = color.green, style=plot.style_linebr)
plot(SHORT ? short_tp2 : na, color = color.gray , style=plot.style_linebr)
plot(SHORT ? short_tp3 : na, color = color.gray , style=plot.style_linebr)
// }

// ———————————————————— Strategy calls {
strategy.entry("BUY", strategy.long,   when = longCondition)
strategy.exit ("Long Exit", "BUY",     when = LONG,  stop = long_sl,  limit = long_tp1)

strategy.entry("SELL", strategy.short, when = shortCondition)
strategy.exit ("Short Exit", "SELL",   when = SHORT, stop = short_sl, limit = short_tp1)
// }
  
 

Комментарии:

1. Большое спасибо! 1) Я вижу, что ордера срабатывают в начале следующей свечи, а не в середине текущей свечи, где был достигнут TP1. Есть ли какой-нибудь способ изменить это поведение? 2) Есть ли такая возможность разделить капитал поровну между TP1, TP2 и TP3 вместо того, чтобы продавать все по цене TP1?

2. На самом деле, неважно, заказы выполняются так, как ожидалось. Моя вина! Второй вопрос остается открытым. Как мне разделить позицию между TP1, TP2 и TP3?

3. Вы можете заняться пирамидированием. Это настройка, которую мы можем поместить в строку стратегия (). Если у вас возникнут проблемы, скорее всего, лучше всего опубликовать новый вопрос. Желаю удачи и береги себя, мой друг !!

4. о! один вход и несколько выходов — вам нужно изучить qty= arg вызова strategy .exit. Существует также аргумент для процента, так что вы можете выбрать, насколько масштабировать каждый из них. Пирамидирование предназначено для нескольких записей, я приношу свои извинения