Нужна поддержка с однократным предупреждением после переключения тренда

Я новичок в скрипте pine и хочу получать однократное оповещение в случае переключения тренда (с зеленого на красный и с красного на зеленый).

Кто может помочь мне получить оповещения для этого скрипта?

//@version=4
study("Hilo script with alert",overlay=true)
period=input(10,"Period")
shift=input(1,"Shift")
exp=input(false,"EMA")
max=exp?ema(high[shift],period):sma(high[shift],period)
min=exp?ema(low[shift],period):sma(low[shift],period)
pos=close>max?-1:close<min?1:0
pos:=pos==0?nz(pos[1]):pos
hilo=pos==1?max:min
plotbar(hilo,hilo,hilo,hilo,color=pos==1?color.red:color.green)

Большое спасибо за всю вашу помощь заранее

Моя идея заключалась в следующем:

sell = pos:=1
buy = pos==1
alertcondition(sell,title='sell', message='sell')
alertcondition(buy,title='buy', message='buy')

но я получаю предупреждение о каждой свече. И это не то, чего я хочу.

После поиска в интернете я смог найти это:

// Deternine if we are currently LONG
isLong = false
isLong := nz(isLong[1], false)
// Determine if we are currently SHORT
isShort = false
isShort := nz(isShort[1], false)
// Buy if the buy signal is triggered and we are not already long
buySignal = not isLong
// Sell if the sell signal is triggered and we are not already short
sellSignal= not isShort
if (buySignal)
    isLong := true
    isShort := false
if (sellSignal)
    isLong := false
    isShort := true
alertcondition(buySignal,title='buy',message='buy')
alertcondition(sellSignal,title='sell', message='sell')

Но я получаю некоторые ошибки в Tradingview:

//@version=4
study("Hilo script with alertr",overlay=true)
period=input(8,"Period")
shift=input(1,"Shift")
exp=input(false,"Exponential moving average")
max=exp?ema(high[shift],period):sma(high[shift],period)
min=exp?ema(low[shift],period):sma(low[shift],period)
pos=close>max?-1:close<min?1:0
isLong:=pos==0?nz(pos[1]):pos
isShort=pos==1?max:min
plotbar(isShort,isShort,isShort,isShort,color=pos==1?color.red:color.green)

// Deternine if we are currently LONG
isLong = false
isLong := nz(isLong[1], false)

// Determine if we are currently SHORT
isShort = false
isShort := nz(isShort[1], false)

// Buy only if the buy signal is triggered and we are not already long
buySignal = not isLong

// Sell only if the sell signal is triggered and we are not already short
sellSignal= not isShort

if (buySignal)
    isLong := true
    isShort := false

if (sellSignal)
    isLong := false
    isShort := true

alertcondition(sellSignal,title='sell', message='sell')
alertcondition(buySignal,title='buy', message='buy')

после вашего ценного отзыва я адаптирую эти строки:

isLong=pos==0?nz(pos[1]):pos
isShort=pos==1?max:min
plotbar(isShort,isShort,isShort,isShort,color=pos==1?color.red:color.green)

// Deternine if we are currently LONG
isLong = false
isLong := nz(isLong[1], false)

// Determine if we are currently SHORT
isShort = false
isShort := nz(isShort[1], false)

Теперь я получаю в строке 14 ошибку, отмеченную >>>>:

// Deternine if we are currently LONG
>>>>isLong = false
isLong := nz(isLong[1], false)

person C OEz    schedule 06.12.2019    source источник
comment
Прочтите эту страницу.   -  person Baris Yakut    schedule 06.12.2019
comment
Спасибо за эту подсказку. Что-то вроде этого?   -  person C OEz    schedule 06.12.2019
comment
Пожалуйста, не добавляйте новую информацию в качестве комментария. Вместо этого отредактируйте свой пост. Вы пробовали этот код на Tradingview?   -  person Baris Yakut    schedule 07.12.2019
comment
Ни у кого нет предложений?   -  person C OEz    schedule 09.12.2019
comment
Какую ошибку вы получаете?   -  person Baris Yakut    schedule 10.12.2019
comment
Сценарий обработки... строка 9: Необъявленный идентификатор isLong; строка 18: переменная isShort уже объявлена. Скрипт 'Hilo script with alertr' сохранен   -  person C OEz    schedule 10.12.2019
comment
Ну, сообщения об ошибках понятны. Вы должны использовать оператор = для объявления переменных. Вы должны использовать оператор := для переназначения значений уже определенным переменным.   -  person Baris Yakut    schedule 10.12.2019
comment
В строке 9 у вас есть оператор :=, но на самом деле он определяет переменную, поэтому вместо этого вы должны использовать =. В строке 18 у вас есть оператор =, но isShort уже определен в строке 10. Вместо этого вы должны использовать оператор := в строке 18.   -  person Baris Yakut    schedule 10.12.2019
comment
Итак, снова используйте = при первом объявлении переменной. Используйте := в следующий раз, когда вы хотите присвоить какое-либо значение ранее определенным переменным.   -  person Baris Yakut    schedule 10.12.2019
comment
Большое спасибо. Теперь я адаптировал этот скрипт и попал в строку 14, отмеченную ››››› в моем описании выше!   -  person C OEz    schedule 11.12.2019


Ответы (1)


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

Если вы используете оператор = для присвоения значений ранее определенной переменной, вы получите следующую ошибку:

строка x: переменная xxx уже объявлена.

Если вы используете оператор := без объявления переменной, вы получите следующую ошибку:

строка x: необъявленный идентификатор xxx;

Этот скрипт будет запускать оповещения только один раз. Чтобы увидеть это, я добавил два plotshape().

//@version=4
study("Hilo script with alert",overlay=true)
period=input(10,"Period")
shift=input(1,"Shift")
exp=input(false,"EMA")

var isLong = false
var isShort = false

max=exp?ema(high[shift],period):sma(high[shift],period)
min=exp?ema(low[shift],period):sma(low[shift],period)

buySignal = not isLong and (close >= max)       // Buy when close >= max and we are not already long
sellSignal = not isShort and (close < min)      // Sell when close < min and we are not already short

if (buySignal)          // Set the flags for buy condition
    isLong := true
    isShort := false

if (sellSignal)         // Set the flags for sell condition
    isLong := false
    isShort := true

plotshape(series=buySignal, text="BUY", style=shape.triangleup, location=location.belowbar, color=color.green, size=size.small)
plotshape(series=sellSignal, text="SELL", style=shape.triangledown, location=location.abovebar, color=color.red, size=size.small)

alertcondition(buySignal, title="BUY", message="BUY")
alertcondition(sellSignal, title="SELL", message="SELL")

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

Как видите, скрипт отображает только «КУПИТЬ» или «ПРОДАТЬ» всякий раз, когда ваш индикатор меняет цвет.

person Baris Yakut    schedule 11.12.2019