0

我有一个代码需要很长时间才能运行。根据我的粗略估计,在我想要测试的一组组合上运行它需要几天时间,所以我总是在较小的一组上运行它。出于这个原因,我希望我可以将其转换为 foreach 循环结构以利用多核处理器。我一直在努力将以下代码转换为 foreach 循环。

pcall=c
lcall=d
pandlcall=c()
pandl=c()
cltime=c()
clpr=c()

for (i in 1:(dim(poss)[1]-1)) {
    for (j in 1:(length(b)-poss[i,2])) {
      if ((b[poss[i,2]+j]-b[poss[i,2]])/b[poss[i,2]]>=pcall) {
        pandlcall[i]=1
        pandl[i]=(b[poss[i,2]+j]-b[poss[i,2]])/b[poss[i,2]]
        cltime[i]=poss[i,2]+j
        clpr[i]=b[poss[i,2]+j]
        break
      } else {
        if ((b[poss[i,2]+j]-b[poss[i,2]])/b[poss[i,2]]<=lcall) {
          pandlcall[i]=-1
          pandl[i]=(b[poss[i,2]+j]-b[poss[i,2]])/b[poss[i,2]]
          cltime[i]=poss[i,2]+j
          clpr[i]=b[poss[i,2]+j]
          break
        } else {
          next
        }
      }
    }
  }

基本上我正在尝试创建一个外汇回测。如您所见,上面的代码在制定特定的损益标准时保存了特定的值。在运行了两个循环之后,我想要一个 data.frame pandlcall, pandl, cltime, clpr,这就是为什么我在每次迭代期间将此值保存为向量的原因。b并且poss是另一个 data.frames,如您所见,我在其上运行循环。

几天来我一直在努力重新制作它,以便它可以用于 dopar foreach。在我的试验和错误中,我替换了将向量中的值保存到列表中,所以我没有例如pandlcall[i]=1我有reslist[[1]][i]=1,所以最后我没有 data.frame 而是一个列表。在循环之前,我创建了这个空列表reslist=list(pandlcall,pandl,cltime,clprice)

对于这两个基本的 for 循环 (i & j),它可以工作,但是当我用 foreach 循环“替换”外部 for 循环时,它当然不起作用。我的想法就像我会创建一个包含这 4 个对象(“向量”)的列表,每个第 i 个循环都会在每个对象的第 i 个位置上放置一个值。

4

0 回答 0