我有一个循环,当某个条件退出时开始。它在值低于-1.0时开始。当条件超过1.0
时,循环退出 #Loop for long entry and exit signal
entry <- -1.0 #Input value for entry
exit <- 1.o #Input value for exit
mydf$sig_long[[1]] = ifelse(mydf$roll.z.score.n3[[1]] < (entry), 1, 0)
for (i in 2:nrow(mydf)){
mydf$sig_long[i] = ifelse(mydf$roll.z.score.n3[i] < (entry), 1,
ifelse(mydf$roll.z.score.n3[i] > (exit), 0,
mydf$sig_long[i-1]))
}
我想学习如何使用相同的循环,而不是退出值&gt; 1.0在设定的行数后退出。例如,我将nline变量设置为5.它将循环并打印1,在初始输入后总共5行。下面的示例数据框:
roll.z.score.n3
1 0
2 0
3 0.651651537
4 -1.153593891
5 -0.926552368
6 -0.369016769
7 0.65405595
8 -1.139305279
9 0.358231351
10 1.135314685
11 0.944997472
12 -0.293105191
13 -1.146659778
14 -0.66246734
15 -1.131901741
16 -0.600480649
17 -1.152333435
18 1.1025176
19 -0.144684006
20 -0.678000883
21 -1.146875039
22 -1.132235788
23 0.115583229
24 0.645489447
25 1.148754398
26 0.988193418
27 -0.818892395
脚本运行后,我会使用zoo来对sig_long列进行+1行。
new.df$sig_long <- Lag(new.df$sig_long,1)
好的,我看到了这个问题。当我们指定循环的第一部分进入和退出-1.0和1.0之间时,这将在new.df $ sig_long列中的这两个条件之间打印1。如果我将nlines设置为5,则会出现问题。进入/退出可能会退出sig_long列中的3行中的交易。如果是这种情况,rollum在该列中没有1来计算,即使我想要保留5行,如果只有3 1来自条目...它将无法进行计算5行保持时间。也许我们可以像这样使用循环的第一部分,以便在输入条件下打印1:
new.df$sig_long <- ifelse(new.df$roll.z.score.n3 < -1.0 , 1, 0) #Set 1 at entry criteria
在每个&lt; -1.0值。接下来将是如何计算从那一点开始的+5行。计数直到... 1,2,3,4,5,否则0 ... 0,直到下一个+1 ....计数到1,2,3,4,5,否则0,0直到下一个+1 ....
我可以看到逻辑......如果newdf $ sig_long == 1,则计算到nlines 5,否则为0,重复......
然后循环的第二部分将起作用我认为new_sig_long列
答案 0 :(得分:0)
做了很多改变。现在应该可以了:
zz = '
roll.z.score.n3 sig_long
1 NA 0
2 NA 0
3 -1.135974424 0
4 0.193311168 1
5 0.714285714 1
6 -1.148753543 1
7 -0.942160394 1
8 -0.695763683 1
9 1.140646864 1
10 0.985196899 0
11 -0.768766574 0
12 -1.011293858 0
13 -0.516703612 1
14 -1.120897077 1
15 1.091089451 1
16 0.968364052 0
17 0.872871561 0
18 1.099524999 0
19 0.918397948 0
'
df <- read.table(text = zz, header = TRUE)
df = na.omit(df)
df$sig_long[[1]] = ifelse(df$roll.z.score.n3[[1]] < (-1), 1, 0)
for (i in 2:nrow(df)){
df$sig_long[i] = ifelse(df$roll.z.score.n3[i] < (-1), 1,
ifelse(df$roll.z.score.n3[i] > 1, 0,
df$sig_long[i-1]))
}
df$sig_long <- Lag(df$sig_long, 1)
colnames(df[, 2]) = "sig_long"
df = na.omit(df)
nlines = 5
df$rollsum = rollsumr(df$sig_long, k = nlines, fill = 0)
colnames(df[, 3]) = "rollsum"
df$new_sig_long[[1]] = ifelse(df$roll.z.score.n3[[1]] < (-1), 1, 0)
for (i in 2:nrow(df)){
df$new_sig_long[i] = ifelse(df$roll.z.score.n3[i] < (-1) & df$rollsum[i] < 5, 1,
ifelse(df$roll.z.score.n3[i] > 1 | df$rollsum[i] >= 5, 0,
df$sig_long[i-1]))
}
df
输出:
> df
roll.z.score.n3 sig_long rollsum new_sig_long
# 4 0.1933112 1 0 0
# 5 0.7142857 1 0 1
# 6 -1.1487535 1 0 1
# 7 -0.9421604 1 0 1
# 8 -0.6957637 1 5 0
# 9 1.1406469 1 5 0
# 10 0.9851969 0 4 1
# 11 -0.7687666 0 3 0
# 12 -1.0112939 0 2 1
# 13 -0.5167036 1 2 0
# 14 -1.1208971 1 2 1
# 15 1.0910895 1 3 0
# 16 0.9683641 0 3 1
# 17 0.8728716 0 3 0
# 18 1.0995250 0 2 0
# 19 0.9183979 0 1 0
如果您愿意,可以使用lag
的{{1}}。