После состояния предупреждения, когда условие меняется с true / false. В настоящее время оповещения, если любое из условий выполняется. Не когда это меняется - PullRequest
1 голос
/ 24 мая 2019

Это часть соснового скрипта для торговли. В сценарии после «// Условие» я хочу, чтобы предупреждение генерировалось только тогда, когда условие меняется с длинного на короткое или с короткого на длинное. Не конец каждой свечи, как сейчас, потому что одно условие всегда верно. Это было изменено на исследование.

threshold = input(title="Threshold", type=float, defval=0.0014, step=0.0001)

buying  = l3_0 > threshold ? true : l3_0 < -threshold ? false : buying[1]
///// T edit
selling = l3_0 > -threshold ? true : l3_0 < threshold ? false : 
selling[1] //// T edit END

hline(0, title="base line")
bgcolor(l3_0 > 0.0014 ? green : l3_0 < -0.0014 ? red : gray, transp=20)
bgcolor(buying ? green : red, transp=20)
plot(l3_0, color=silver, style=area, transp=75)
plot(l3_0, color=aqua, title="prediction")

/////     Stragegy     
/////////////////////////////////////////////////////
//longCondition = buying
//if (longCondition)
    //strategy.entry("Long", strategy.long)

//shortCondition = buying != true
//if (shortCondition)
    //strategy.entry("Short", strategy.short)

///// Оповещения ///////////////////////////////////////////// ////////////// alertcondition (условие, заголовок, сообщение)

//Condition
long  = l3_0 > 0.0014
short = l3_0 < -0.0014


alertcondition(long, title = "ANN Long", message= "ANN Long")
alertcondition(short, title = "ANN Short", message= "ANN Short")

1 Ответ

1 голос
/ 24 мая 2019

Давайте рассмотрим небольшой пример с использованием MACD. Мы хотим идти long всякий раз, когда delta равен >= 0, и идти short всякий раз, когда delta равно <0. Кроме того, мы хотели бы остаться в нашей позиции, если не сработает противоположный сигнал (введите один раз и дождитесь противоположного сигнала).

Ваш код выглядит следующим образом:

//@version=3
study("My Script", overlay=true)

// Get the inputs
MACDLengthMACD = input(title="MACD Length", defval=9, minval=1, maxval=100)
fastLengthMACD = input(title="MACD Fast Length", defval=12, minval=1, maxval=100)
slowlengthMACD = input(title="MACD Slow Length", defval=26, minval=1, maxval=100)

// Standard MACD calculations
MACD = ema(close, fastLengthMACD) - ema(close, slowlengthMACD)
aMACD = ema(MACD, MACDLengthMACD)
deltaMACD = MACD - aMACD

buySignal = (deltaMACD >= 0)
sellSignal= (deltaMACD < 0)

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

В этом случае вы получите несколько сигналов на покупку или продажу, потому что buySignal и sellSignal будут true, если их условия true.

enter image description here

Однако эти сигналы должны быть true только для одного бара, чтобы активировать только один сигнал на покупку или продажу. Для этого вы можете использовать другую переменную (isLong, isShort в приведенном ниже коде) и использовать оператор ссылки на историю [], чтобы определить, были ли вы ДОЛГО или КОРОТКО.

Тогда, только активируйте свой сигнал ПОКУПКИ, если вы еще не ДОЛГО, и только свой сигнал ПРОДАЖИ, если вы еще не КОРОТКО. Таким образом, вы получите только один сигнал на покупку или продажу.

//@version=3
study("My Script", overlay=true)

// Get the inputs
MACDLengthMACD = input(title="MACD Length", defval=9, minval=1, maxval=100)
fastLengthMACD = input(title="MACD Fast Length", defval=12, minval=1, maxval=100)
slowlengthMACD = input(title="MACD Slow Length", defval=26, minval=1, maxval=100)

// Standard MACD calculations
MACD = ema(close, fastLengthMACD) - ema(close, slowlengthMACD)
aMACD = ema(MACD, MACDLengthMACD)
deltaMACD = MACD - aMACD

// 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 and (deltaMACD >= 0)

// Sell only if the sell signal is triggered and we are not already short
sellSignal= not isShort and (deltaMACD < 0)

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

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

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

Это приведет к:

enter image description here

...