pine-script - 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 函数。谢谢您的回答。
解决方案
您的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
。
推荐阅读
- html - 如何水平对齐复选框元素内的图像和文本?
- python - 多元分布之间的距离
- c# - C# windows 服务安装后不返回剪贴板数据
- xodus - 如何通过写入事务减少内存使用量?
- c# - 如何获取 JSON 数组的所有值
- node.js - 如果未找到 id 或等于 null,则返回图像
- angular7 - Angular 7中的多个电子邮件输入
- javascript - 带有 DRM url 的 Google cast v3 CAF Receiver 应用程序
- html - 导航中的可点击框而不是框中的文本 - 显示块不起作用
- swift - 在 AudioKit 中停用 AudioSession