首页 > 解决方案 > Pinescript,如何设置和指标值仅在进入新仓位而不在指标变化时修改?

问题描述

我有这个问题:我的指标显示了自两个 EMA 之间的新交叉以来最近 83 根蜡烛的最低点。strategy.entry 设置在交叉点,我想将止损设置为自进入以来最后 83 根蜡烛的最低点。当我已经有一个未平仓头寸并且emas之间有一个新的交叉时,就会出现问题。因此,停止指标会根据新的交叉点改变他的值。

这是代码和照片。

en//@version=4 

strategy("My strategy", overlay=true)

ema1 = ema(close, 40)
ema2 = ema(close, 70)
ema1Smooth = security(syminfo.tickerid, "60", ema1, barmerge.gaps_on, 
barmerge.lookahead_off)
ema2Smooth = security(syminfo.tickerid, "60", ema2, barmerge.gaps_on, 
barmerge.lookahead_off)

Stop = valuewhen(crossover(ema1Smooth, ema2Smooth), lowest(low, 83), 0) 
ProfitT = strategy.position_avg_price*1.003 

strategy.entry("Buy", long=true, when=crossover(ema1Smooth, ema2Smooth))
strategy.exit("Buy", limit=ProfitT, stop=Stop)

plot(ema1Smooth, "Fast", color.orange)
plot(ema2Smooth, "Slow", color.blue)
plot(Stop, "Stop", color.red)

在此处输入图像描述

因此,我的目标是在进入仓位时固定止损值,即使发生新的交叉也保持不变。我尝试了 valuewhen 函数。谢谢您的回答。

标签: pine-script

解决方案


您的Stop变量不会根据新的交叉更改其值。每根柱线都在改变价值,这就是 Pine 的工作原理。要实现您想要的,您必须Stop无条件地停止每个柱上的变量变化。

检查您是否已经在使用strategy.position_size. 如果大于零,您处于多头头寸,如果小于零,您处于空头头寸。所以你需要检查0。

我会改变这个:

Stop = valuewhen(crossover(ema1Smooth, ema2Smooth), lowest(low, 83), 0) 

对此:

var float Stop = na
if (strategy.position_size == 0) // if True we are not in any position
    Stop := valuewhen(crossover(ema1Smooth, ema2Smooth), lowest(low, 83), 0) // watch the 4 spaces at the beginning of the line

因为在计算轮次中是否有条件地设置变量是不确定的Stop,所以最好还是设置它,让条件解决。您的脚本的其他部分可能需要防范该na值,但最好使用na一些合成的低值而不是一些合成的低值,因为您可以选择一个安全/加密衍生品,它仍然是一个可行的值(并导致超级奇怪的行为)。请务必将此条件块放在该行之前strategy.entry


推荐阅读