r - 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 与任何未来期间的高值进行比较。
解决方案
我不完全确定我理解了您期望的输出(您可以添加到您的帖子和您期望的确切结果的示例),但类似于我建议的内容可能会起作用:
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]
High
Low
Summary
NA
推荐阅读
- latex - 在部分标题 LaTex 中使用罗马数字时出错
- drag-and-drop - PrimeNG DragDrop 多个 droppables
- javascript - Strapi- 将 AWS S3 设为我的文件上传提供商时遇到问题
- git - git remote 被拒绝 - 本地存储库
- flutter - 从 API 获取数据时如何显示进度指示器?
- php - 为什么我在使用 php artisan tinker 时收到 Laravel 错误 no such table
- c++ - 如何获得与 Python 相同的系统时间?
- python - 如何获取当前不是语言环境的特定字符串翻译?
- automated-tests - Botium CLI 可以从 convo 文件和话语中生成 Botium 测试脚本吗?
- vue.js - 如何使用 Prettier 禁用元素标签中的属性中断