首页 > 解决方案 > apply - 在移动行之前测试多个条件

问题描述

我想使用 apply 来迭代一个矩阵,将开盘价和高价与一个限制进行比较。

我最初使用了一个 while 循环,但它很慢,所以开始申请。

我已尝试为以下 StartRow +1。

Summary <- matrix(data=NA, nrow=1, ncol=1)
Overall <- matrix(data=NA, nrow=1, ncol=2)
Open <- matrix(data=NA, nrow=1, ncol=1)

MSingle <- function(x, StartingRow=1, Limit=0.01, StopLoss=0.01){
  Open = x[1]
  High = x[2]
  Low = x[3]
  #If the difference between High and Open exceeds Limit the function ends.
  if (!is.na(High-Open[StartingRow]) > Limit){
    Summary <<- 1
    Open <<- Open
    Row <<- cbind(Summary, Open)
    Overall <<- rbind(Overall, Row)
  }
  #If the difference between Open and Low exceeds the Stoploss the function ends.
  else if (!is.na(Open[StartingRow]-Low) > StopLoss){
    Summary <<- 0
    Open <<- Open
    Row <<- cbind(Summary, Open)
    Overall <<- rbind(Overall, Row)
  }
  #If neither of these are met then I want to compare the original Open price at time t...
  #...with the high and low prices at time t+1, t+2, and so on, until either of the first two...
  #...conditions is met.
  else{
    StartingRow = StartingRow + 1
  }
}

apply(EUR_USD2, 1, MSingle)

更正:这最初是 lapply 但在复制代码时这是我的错误,所描述的结果来自 apply。

矩阵 EUR_USD2 示例

       Open    High     Low   Close
[1,] 1.20037 1.20100 1.20037 1.20100
[2,] 1.20083 1.20095 1.20017 1.20030
[3,] 1.20035 1.20043 1.20035 1.20043
[4,] 1.20041 1.20050 1.20031 1.20046
[5,] 1.20049 1.20049 1.20046 1.20048`
[6,] 1.20050 1.20050 1.20048 1.20048
[7,] 1.20050 1.20069 1.20032 1.20048
[8,] 1.20048 1.20054 1.20027 1.20050
[9,] 1.20051 1.20087 1.20047 1.20087
[10,] 1.20082 1.20097 1.20076 1.20094

预期结果:

High[1] = 1.20100
Open[1] = 1.20037
Difference is 0.00063 (which is < Limit)

因此,我想保留相同的 Open[1],但移至 High[2]。

High[2] = 1.20095
Open[1] = 1.20037

差值为 0.00058(即 < Limit),依此类推,直到差值大于 Limit(或小于止损),此时函数再次启动,但使用 Open[2]。

申请结果:

     Summary    Open
          NA      NA
Open       1 1.20037
Open       1 1.20083
Open       1 1.20035
Open       1 1.20041
Open       1 1.20049
Open       1 1.20050
Open       1 1.20050
Open       1 1.20048
Open       1 1.20051

然而,这个结果只是比较了同一时期的(高开)和限价。

我想将高开(差异)与极限进行比较。如果这超出了限制,则满足第一个条件。如果条件不满足,那么我想保留相同的开盘价,但将其与下一个时期的最高价进行比较,并再次测试限价。

只有这样,我才想申请从第 2 期到限价比较开盘价和最高价。

在满足条件之前,开盘价必须保持不变。目前应用的是比较 High(t=1)-Open(t=1) 与 Limit 但不将 Open 与任何未来期间的高值进行比较。

标签: rloopsapply

解决方案


我不完全确定我理解了您期望的输出(您可以添加到您的帖子和您期望的确切结果的示例),但类似于我建议的内容可能会起作用:

s <- "Open High Low Close
1.20037 1.20100 1.20037 1.20100
1.20083 1.20095 1.20017 1.20030
1.20035 1.20043 1.20035 1.20043
1.20041 1.20050 1.20031 1.20046
1.20049 1.20049 1.20046 1.20048
1.20050 1.20050 1.20048 1.20048
1.20050 1.20069 1.20032 1.20048
1.20048 1.20054 1.20027 1.20050
1.20051 1.20087 1.20047 1.20087
1.20082 1.20097 1.20076 1.20094"

EUR_USD2 <- read.delim(textConnection(s), sep = " ")

myfun <- function(x, df, Limit, StopLoss) {

  highComp <- which(df$High - df$Open[x] > Limit)
  highCompMin <- if(length(highComp) == 0) 0 else min(highComp)
  lowComp <- which(df$Open[x] - df$Low > StopLoss)
  lowCompMin <- if(length(lowComp) == 0) 0 else min(lowComp)

  if(highCompMin == 0 & lowCompMin == 0) {
    result <- c(Summary = NA, Open = df$Open[x])
  } else if (highCompMin >= lowCompMin) {
    result <- c(Summary = 1, Open = df$Open[x])
  } else if (lowCompMin > highCompMin) {
    result <- c(Summary = 0, Open = df$Open[x])
  } else {
    result <- c(Summary = NA, Open = df$Open[x])
  }

  return(result)

}

t(sapply(1:nrow(EUR_USD2), function(x) myfun(x, df = EUR_USD2,
                                             Limit = 0.00062, StopLoss = 0.0005)))

### OUTPUT:
#      Summary    Open
# [1,]       1 1.20037
# [2,]       0 1.20083
# [3,]       1 1.20035
# [4,]      NA 1.20041
# [5,]      NA 1.20049
# [6,]      NA 1.20050
# [7,]      NA 1.20050
# [8,]      NA 1.20048
# [9,]      NA 1.20051
# [10,]      0 1.20082

对于每一行与整体和列i进行比较,以找到满足比较的最小索引,然后根据结果进行设置。如果没有值满足比较,则将该值设置为。 EUR_USD2$Open[i]HighLowSummaryNA


推荐阅读