好的,所以我正在编写一些代码,当满足某个值时,它将继续打印0直到组结束。
我写了一些代码,用例子更容易展示:
# STop loss Script example
# Trade signal and dollar gain loss
sig <- c(0,0,0,0,1,1,1,1,1,1,1,0,0,0,1,1,1,0)
dollar <- c(0,0,0,0,100,150,190,-1000,100,100,100,0,0,0,100,100,100,0)
df <- data.frame(sig,dollar)
# initialize total column
df$total = 0
i=1
for (i in 1:nrow(df)) {
if (df$sig[i] == 1 ) {
df$total[i] = df$dollar[i] + df$total[i-1] # cum sum each dollar
} else if (df$sig[i] == 0) {
df$total[i] = 0 }
}
# Code for stop loss
# Initialize stop signal column
df$stop <- 0
stop = -500
i = 1
for (i in 1:nrow(df)) {
if (df$sig[i] == 1 & df$total[i] > stop) {
df$stop[i] = 1 }
}
现在我可以解释一下输出:
sig dollar total stop
1 0 0 0 0
2 0 0 0 0
3 0 0 0 0
4 0 0 0 0
5 1 100 100 1
6 1 150 250 1
7 1 190 440 1
8 1 -1000 -560 0
9 1 100 -460 1
10 1 100 -360 1
11 1 100 -260 1
12 0 0 0 0
13 0 0 0 0
14 0 0 0 0
15 1 100 100 1
16 1 100 200 1
17 1 100 300 1
18 0 0 0 0
止损代码,当我遇到一个df $总值&lt; -500然后我打印0而不是1.直接前进。但是,因为满足这个条件,只要df $ sig == 1,我希望继续使df $ total == 0.然后对于下一个df $ sig == 1(可能是第2组)离子线15,重复这个过程。
所需的输出也可能有帮助
> df
sig dollar total stop
1 0 0 0 0
2 0 0 0 0
3 0 0 0 0
4 0 0 0 0
5 1 100 100 1
6 1 150 250 1
7 1 190 440 1
8 1 -1000 -560 0
9 1 100 -460 0
10 1 100 -360 0
11 1 100 -260 0
12 0 0 0 0
13 0 0 0 0
14 0 0 0 0
15 1 100 100 1
16 1 100 200 1
17 1 100 300 1
18 0 0 0 0
到目前为止,我已尝试过此代码:
for (i in 1:nrow(df)) {
if (df$sig[i] == 1 & df$total[i] > stop) {
df$stop[i] = 1 }
else if (df$total[i-1] == 0) {
df$stop[i] = 0 }
}
的想法是,如果从1次迭代前的df $停止0为0,那么下一个d $停止将为0.这是有问题的,因为我已经领先0直到满足第一组df $ sig = 1。 ..因此我有前导0,df $ stop = 0并且它在所有迭代中运行0。
所以我考虑将所有0都转换为NA,这样代码就不会触发前导0。这引发了一个错误。有人看到方便的解决方案?
答案 0 :(得分:1)
您可以为此更改最后一部分:
for (i in 1:nrow(df)) {
if (df$sig[i] == 1 & df$total[i] > stop) {
df$stop[i] = 1
if (i > 1) {
if (df$sig[i - 1] == 1 & df$stop[i - 1] == 0) {
df$stop[i] = 0
}
}
}
}
结果是:
sig dollar total stop
1 0 0 0 0
2 0 0 0 0
3 0 0 0 0
4 0 0 0 0
5 1 100 100 1
6 1 150 250 1
7 1 190 440 1
8 1 -1000 -560 0
9 1 100 -460 0
10 1 100 -360 0
11 1 100 -260 0
12 0 0 0 0
13 0 0 0 0
14 0 0 0 0
15 1 100 100 1
16 1 100 200 1
17 1 100 300 1
18 0 0 0 0