применить - проверить несколько условий перед перемещением строк - PullRequest
1 голос
/ 01 июля 2019

Я хочу использовать apply для перебора матрицы, сравнивающей цены открытия и максимума с лимитом.

Изначально я использовал цикл while, но он был медленным, поэтому его перенесли на применение.

Я попытался +1 к StartingRow, как показано ниже.

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)

ИСПРАВЛЕНИЕ: Первоначально это было некорректно, но с моей стороны это была ошибка при копировании кода, описанный результат от применения.

Пример матрицы 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 (что составляет <предел) и т. Д. До тех пор, пока разница не станет больше, чем предел (или меньше, чем стоп-лосс), и в этот момент функция запускается снова, но с Open [2]. </p>

Результат применения:

     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

Однако этот результат сравнивает (High-Open) с лимитом за тот же период.

Я хочу сравнить High-Open (разницу) с лимитом. Если это превышает предел, то первое условие выполнено. Если условие не выполнено, я хочу сохранить ту же цену открытия, но сравнить ее с максимумом следующего периода и снова протестировать против лимита.

Только тогда я хочу подать заявку, чтобы перейти к сравнению Open и High от периода 2 до Limit.

Цена открытия должна оставаться неизменной до тех пор, пока условие не будет выполнено. В настоящее время применяется сравнение High (t = 1) -Open (t = 1) с лимитом, но не сравнивает Open с какими-либо высокими значениями будущих периодов.

1 Ответ

0 голосов
/ 02 июля 2019

Я не совсем уверен, что понял результат, который вы ожидаете (вы можете добавить к вашему сообщению и пример точного результата, который вы ожидаете), но что-то похожее на то, что я предлагаю, может сработать:

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 в случае, если никакое значение не выполняет сравнения.

...