即使再次满足相同条件也保持一个值

Keeping one value even if same condition is meet again

所以我想我需要先解释一下我是如何尝试让这个策略发挥作用的,然后再解决问题所在。

所以我正在考虑创建一个策略,如果 xx 蜡烛显然是 under/over 一个 ema(9) 从第一个蜡烛是 over/under 那个 ema 做一个触发线并做一个 buy/sell 如果 ema(1) crclearly osses 那条线。

所以我的第一个问题是我得到了多个触发器,而我只想要一个触发器

当我得到多个触发器时,我的 triggerLine 移动,我不希望它移动,所以我需要控制多个触发器

这是我目前的代码:

//@version=4
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © mattehalen



strategy("Mathias & Christer EMA", shorttitle="M&C_EMA",overlay=true, process_orders_on_close = true, default_qty_type =  strategy.percent_of_equity, default_qty_value = 100)
len = input(9, title="Length", type=input.integer)
src = input(close, title="Source", type=input.source)
//show4h = input(true, title="show 4h", type=input.bool)
maxLoss = input(3000)

//ema4h = security(syminfo.ticker, "240", rsi(src, len))
ema4h                   = ema(src, len)
emaCurrent              = ema(src, 1)
difference              = (emaCurrent - ema4h)/ema4h
myATR                   = atr(1)

BuyFirstTrigger         = (difference>myATR) and (emaCurrent>ema4h)
BuyTriggerLineBarssince = barssince(BuyFirstTrigger)
BuyTriggerLine          = close[BuyTriggerLineBarssince] 
BuySignalTest           = crossover(close[1],BuyTriggerLine) and (BuyTriggerLineBarssince > 6)
BuySignalTestBarssince  = barssince(BuySignalTest)
bgcolor(BuySignalTest? color.green : na, transp=20)
bgcolor(BuyFirstTrigger and not BuyFirstTrigger[1]? color.green : na, transp=80)


SellFirstTrigger         = ((difference*-1)>myATR) and (emaCurrent<ema4h)
SellTriggerLineBarssince = barssince(SellFirstTrigger)
SellTriggerLine          = close[SellTriggerLineBarssince]
SellSignalTest           = crossunder(close[1],SellTriggerLine) and (SellTriggerLineBarssince > 6)
SellSignalTestBarssince  = barssince(SellSignalTest)
//bgcolor(SellSignalTest and SellSignalTestBarssince[1]>SellTriggerLineBarssince? color.red : na, transp=20)
//bgcolor(SellFirstTrigger and not SellFirstTrigger[1] and SellTriggerLineBarssince[1]>SellTriggerLineBarssince? color.red : na, transp=80)





plot(myATR,title="myATR",display=display.none)
plot(difference,title="difference",display=display.none)
plot(emaCurrent,title="emaCurrent")
plot(ema4h,title="ema4h", color=color.purple, linewidth=5)

//bgcolor(BuyTriggerLineBarssince[1]<emaCurrent? color.black : na, transp=20)
plot(BuyTriggerLineBarssince,title="BuyTriggerLineBarssince",display=display.none)
plot(BuySignalTestBarssince,title="BuySignalTestBarssince",display=display.none)
plot(BuyTriggerLine,"BuyTriggerLine",color.green,linewidth=5)

plot(SellTriggerLineBarssince,title="SellTriggerLineBarssince",display=display.none)
plot(SellSignalTestBarssince,title="SellSignalTestBarssince",display=display.none)
plot(SellTriggerLine,"SellTriggerLine",color.red,linewidth=5)

//--------------------------------------------------

//--------------------------------------------------
//
BuySignal       = BuySignalTest and BuySignalTestBarssince[1]>BuyTriggerLineBarssince
BuySignalBarssince = barssince(BuySignal)
BuySignalOutBarssince = barssince(crossunder(close[1],ema4h[1]))
BuySignalOut   = crossunder(close[1],ema4h[1]) and BuySignalOutBarssince[1]>BuySignalTestBarssince[1]
plot(BuySignalOutBarssince,title="BuySignalOutBarssince",display=display.none)


SellSignal      = SellSignalTest and SellSignalTestBarssince[1]>SellTriggerLineBarssince
SellSignalBarssince = barssince(ema4h[1]>ema4h[0] and ema4h[1]>80)
SellSignalOutBarssince = barssince(crossover(close[1],ema4h[1]))
SellSignalOut   = crossover(close[1],ema4h[1]) and SellSignalOutBarssince[1]>SellSignalTestBarssince[1]


if BuySignal
    strategy.close("short", comment = "Exit short")
    strategy.entry("long", true)
    strategy.exit("Max Loss", "long", loss = maxLoss)

if BuySignalOut
    strategy.close("long", comment = "Exit Long")
if SellSignal
    // Enter trade and issue exit order on max loss.
    strategy.close("long", comment = "Exit Long")
    strategy.entry("short", false)
    strategy.exit("Max Loss", "short", loss = maxLoss)
if SellSignalOut
    // Force trade exit.
    strategy.close("short", comment = "Exit short")


plotchar(BuySignal, "BuySignal", "⬆", location.belowbar, color.lime,size =size.huge )
plotchar(BuySignalOut, "BuySignalOut", "█", location.belowbar, color.lime,size =size.small)
plotchar(SellSignal, "SellSignal", "⬇", location.abovebar ,color.red,size =size.huge)
plotchar(SellSignalOut, "SellSignalOut", "█", location.abovebar, color.red,size =size.small)

为了仅在第一次满足条件时return一个值,您可以使用以下代码形式:

a = 0
a := condition ? 1 : reset ? 0 : a[1]

并使用 change(a) ? 来验证是否 conditionreset 是第一次满足。让我们以这段代码为例:

a = 0,b = 0
a := rising(close,14) ? 1 : falling(close,14) ? 0 : a[1]
b := change(a) ? 1 : 0

这里我们要b到return1第一次close大于或小于前14次中的任何一次close,否则为0,两者risingfalling 可以连续 return true,但是 b 只在第一次给出 1 函数 return true.

绿色图是使用前面代码的图,而红色图总是 return 1 当 risingfalling 都为真时为 0.

如果您不想重置 a,请使用:

a = 0
a := condition ? 1 : a[1]