Не могу понять, как заставить мой код скрипта pine иметь три разных временных графика для оценки

В настоящее время я использую этот код для своей стратегии. У меня все настроены оповещения, но проблема в том, что я смотрю, когда %D на 1-дневном, 5-дневном и 30-дневном графиках падает ниже 17,5, поэтому всякий раз, когда я получаю оповещение для одного, я должен вручную проверять, были ли другие. находятся в. Есть ли способ переделать какой-то код, чтобы оповещение было отправлено только в том случае, если линия %D упадет ниже для всех трех графиков?

Я считаю, что это можно сделать с помощью функции security(), но я не могу точно понять это. Моя идея состоит в том, чтобы иметь amd_1, amd_5, amd_30 и рассчитать D для всех трех, нанести эти три на график, а затем настроить и предупредить, говоря, что если D1 ‹ 17,5 и D5 ‹ 17,5 и D30 ‹ 17,5, то отправить предупреждение. Любая помощь приветствуется. Спасибо!

//@version=4
strategy("stochastic")

amd_1 = security("NYSE:AMD", "1D", close)
amd_5 = security("NYSE:AMD", "5D", close)
amd_30 = security("NYSE:AMD", "30D", close)

length = input(21, minval=1, title="length")  
rsilength = input(21, minval=1, title="rsi length")  
smoothk = input(4, minval=1, title="smoothk")
smoothd = input(10, minval=1, title="smoothd")
showMarkers = input(true, "Show Markers")

rsi = rsi(close, rsilength)

sto = stoch(close,highest(length),lowest(length), length)
K = sma(sto,smoothk)
D = sma(K,smoothd)

//plot(rsi, title="rsi", color=color.black)
plot(D, title="%D",color=color.green)
plot(K, title="%K",color=color.red)

hline(78,title="upper limit", color=color.red)
hline(17, title="lower limit",color=color.blue)
//plot(sto, title = "sto",color=color.black)


// === INPUT BACKTEST RANGE ===
FromMonth = input(defval = 8, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 24, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2019, title = "From Year", minval = 2017)
ToMonth   = input(defval = 9, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 9999, title = "To Year", minval = 2017)

// === FUNCTION EXAMPLE ===
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
window()  => time >= start and time <= finish ? true : false // create function "within window of time"

// === EXECUTION ===
shares = 10000/close
buy = crossunder(D,17.5)
sell = crossover(D,78)

strategy.entry("buy", shares, when = window() and buy)  // buy long when "within window of time" AND crossover
strategy.close("buy", when = window() and sell)         // sell long when "within window of time" AND crossunder

plotshape(showMarkers and buy, "buy", shape.triangleup, location.bottom, color.green, 0, text = "buy", size = size.tiny)
plotshape(showMarkers and sell, "sell", shape.triangledown, location.top, color.maroon, 0, text = "sell", size = size.tiny)
bgcolor(showMarkers ? window() ? color.green : color.maroon : na)

person ColtonMSU    schedule 07.09.2019    source источник


Ответы (1)


Пришлось изменить уровни os/ob и даты, чтобы получить сигнал, так как ваши критерии очень строгие. Также добавлен код маркера и фона, чтобы вы могли раскомментировать, чтобы увидеть различные условия. У вас есть возможность использовать перерисовку или не перекрашивать линии старшего таймфрейма:

//@version=4
strategy("stochastic")

length = input(21, minval=1, title="length")  
rsilength = input(21, minval=1, title="rsi length")  
smoothk = input(4, minval=1, title="smoothk")
smoothd = input(10, minval=1, title="smoothd")
showMarkers = input(true, "Show Markers")
repaint = input(false, "Repaint Higher Timeframes")
showD1 = input(true, "Show 1 Day D")
showD2 = input(true, "Show 5 Day D")
showD3 = input(true, "Show 1 Month D")
obLevel = input(70)
osLevel = input(60)

rsi = rsi(close, rsilength)
sto = stoch(close,highest(length),lowest(length), length)
K = sma(sto,smoothk)
D = sma(K,smoothd)

d1 = repaint ? security(syminfo.tickerid, "1D", D) : security(syminfo.tickerid, "1D", D[1], lookahead = barmerge.lookahead_on)
d2 = repaint ? security(syminfo.tickerid, "5D", D) : security(syminfo.tickerid, "5D", D[1], lookahead = barmerge.lookahead_on)
d3 = repaint ? security(syminfo.tickerid, "M", D) : security(syminfo.tickerid, "30D", D[1], lookahead = barmerge.lookahead_on)
plot(showD1 ? d1 : na, "D 1D", color.aqua)
plot(showD2 ? d2 : na, "D 5D", color.blue)
plot(showD3 ? d3 : na, "D 30D", color.purple)

//plot(rsi, title="rsi", color=color.black)
plot(D, title="%D",color=color.green)
plot(K, title="%K",color=color.red)

hline(obLevel,title="upper limit", color=color.red)
hline(osLevel, title="lower limit",color=color.blue)
//plot(sto, title = "sto",color=color.black)


// === INPUT BACKTEST RANGE ===
FromMonth = input(defval = 8, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 24, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2000, title = "From Year", minval = 2017)
ToMonth   = input(defval = 9, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 9999, title = "To Year", minval = 2017)
// === FUNCTION EXAMPLE ===
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
window()  => time >= start and time <= finish ? true : false // create function "within window of time"

// === EXECUTION ===
shares = 10000/close
var inLong  = false
buy = false
sell = false
buyTrigger  = d1 < osLevel and d2 < osLevel and d3 < osLevel
sellTrigger = d1 > obLevel and d2 > obLevel and d3 > obLevel
if buyTrigger and not inLong and window()
    buy     := true
    inLong  := true
else
    if sellTrigger and inLong and window()
        sell    := true
        inLong  := false

strategy.entry("buy", shares, when = buy)  // buy long when "within window of time" AND crossover
strategy.close("buy", when = sell)         // sell long when "within window of time" AND crossunder

plotshape(showMarkers and buy, "buy", shape.triangleup, location.bottom, color.green, 0, text = "buy", size = size.tiny)
plotshape(showMarkers and sell, "sell", shape.triangledown, location.top, color.maroon, 0, text = "sell", size = size.tiny)
// plotshape(showMarkers and buyTrigger, "buyTrigger", shape.triangleup, location.bottom, color.green, 0, text = "buyTrigger", size = size.tiny)
// plotshape(showMarkers and sellTrigger, "sellTrigger", shape.triangledown, location.top, color.maroon, 0, text = "sellTrigger", size = size.tiny)
// bgcolor(showMarkers ? buyTrigger ? color.green : sellTrigger ? color.maroon : na : na)
bgcolor(showMarkers ? inLong ? color.green : color.maroon : na)
// bgcolor(showMarkers ? window() ? color.green : color.maroon : na)

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

Это месячный график с отключенными графиками d1 и d2 и снятым флажком Перерисовать старшие таймфреймы:

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

Тот же график с установленным флажком Перерисовать старшие таймфреймы. Происходят две вещи: вы видите, что фиолетовая линия d3 соответствует вашей текущей зеленой линии D TF, подтверждая, что она верна. Входы/выходы происходят раньше, т.к. перерисовка версии старшей линии TF не задерживается.

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

person PineCoders-LucF    schedule 08.09.2019
comment
Это потрясающе, спасибо. У меня есть некоторые вопросы. Таким образом, похоже, что линии d1, d2 и d3 должны отображать линию %D для каждого соответствующего таймфрейма. Я думаю, что да, но на вашем графике я вижу, что вы смотрите на данные за годы. Когда я делал это, я просто смотрел на 1-, 5- и 30-дневные графики, и индикатор %D довольно часто пересекал 20 и 80 за неделю. Я не думаю, что они на самом деле правильно строят линию %D для каждого временного интервала, потому что, если вы пойдете вниз и посмотрите на месяц, линии будут в основном прямыми, когда они должны колебаться. Какие-нибудь мысли? Спасибо - person ColtonMSU; 08.09.2019
comment
Я отредактировал строку для d3. Разрешение должно было быть "1M", а не "30D", поэтому вам нужно изменить эту строку. Ваши линии d1, d2 и d3 являются фактическими линиями старших таймфреймов. Вы можете легко убедиться в этом, так как у вас есть линия D для текущего графика TF, выделенная зеленым цветом. Просто перейдите на таймфреймы 1D, 5D и 1M, установите флажок Перерисовать старшие таймфреймы в разделе Настройки/Входные данные скрипта, чтобы разрешить перерисовку линий старшего ТФ, и вы увидите линия D из вызова security(), соответствующая текущему зеленому графику TF. - person PineCoders-LucF; 08.09.2019
comment
Эй, извините, я новичок в этом, поэтому я могу что-то упустить. Я установил флажок, чтобы разрешить перерисовку с более высоких временных рамок, и эти линии по-прежнему прямые. Так какими же должны быть остальные строки? Я думал, что это (скажем, вы были на 1-дневном графике), что это будут 5-дневные и 1-месячные линии %D. Так они бы зеркально отразились. Если бы я переключился на 5-дневный график, он был бы таким же, как зеленая линия на их графике. Спасибо - person ColtonMSU; 08.09.2019
comment
Я изменил ваш код, чтобы вы могли выборочно построить d1, d2 и d3 и показать вам, как d3 соответствует фактической линии D за 1 месяц. Линии с более высоким TF имеют длинные плоские области на более низких TF, потому что они не меняются часто, будучи от более высокого TF. Линия d1, например, всегда будет иметь одно и то же значение на всех 1H-барах любого заданного дня, так как она получена из 1D TF. - person PineCoders-LucF; 08.09.2019