Цикл по двум R-фреймам данных для создания третьего фрейма данных - PullRequest
0 голосов
/ 20 июня 2019

Я пытаюсь протестировать торговую стратегию.

Я кодирую в R 3,6

Данные представлены в двух кадрах. Первый - это пять лет ежедневной ценовой активности (то есть пять дней). Вторым фреймом данных является ценовая активность за те же пять лет только на одноминутном уровне (то есть пять минут). Эти данные включают сеансы минимума, максимума, открытия и закрытия.

Моя стратегия состоит в том, чтобы циклически проходить по соответствующим дням минутного кадра данных, обращаясь к данным на дневном кадре данных и заполняя их, чтобы определить следующее:

  1. Условие, которое гарантирует открытие позиции (т.е. длинной или короткой).
  2. Достигнута ли цель или стоп-цена.
  3. Записать «торговлю» на третий фрейм данных (ORBOorders).

Встроенные циклы работают не так, как я думал, и я не могу понять, почему.

Я знаю, что могу сделать код проще, но он все время вытягивается, поэтому я могу понять, где он, я иду не так.

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

Это стратегия, которая стремится поймать цену, когда она выходит за пределы диапазона, установленного в первые пять минут дня.

Это код, определяющий направление движения цены после первых 5 минут. Счетчик не работает. Цель состоит в том, чтобы узнать индекс конкретного события в пределах установленного пятиминутного кадра данных (то есть до сегодняшнего дня); Я буду использовать это в следующем пакете кода ниже. Счетчик начинается в 6 в течение шестой минуты. Выходные данные никогда не превышают 7, поэтому они не учитываются при каждой итерации цикла. Я не могу понять, почему.

for (i in 1:length(fiveyrdaily$Date)){
    todaysdate <- subset(fiveyrminutes, fiveyrdaily$Date[i] == fiveyrminutes$Date) # subset so I'm only seeing the respective days in the minutes dataframe
    counter3 <- 6  # start a counter so I can track which position I'm in within the minutes dataframe, start after ORBO
    for (t in counter:length(todaysdate$Date)){  #loop over the minutes dataframe
         if ((fiveyrdaily$FiveHighClose[i] == 0) & (todaysdate$Close[t] > fiveyrdaily$FiveMinuteHigh[i])) {
             fiveyrdaily$FiveHighClose[i] <- todaysdate$Close[t]
             fiveyrdaily$FiveHighAfterClose[i] <- todaysdate$High[t] #record the session's high
             counter3 <- counter3 + 1
             fiveyrdaily$counterhigh[i] <- counter3 # record the position of this event within the subset of the minute dataframe
          }
          else if ((fiveyrdaily$FiveLowClose[i] == 0) & (todaysdate$Close[t] < fiveyrdaily$FiveMinuteLow[i])) {
               fiveyrdaily$FiveLowClose[i] <- todaysdate$Close[t]
               fiveyrdaily$FiveLowAfterClose[i] <- todaysdate$Low[t] # record the session's low
               counter3 <- counter3 + 1
               fiveyrdaily$counterlow[i] <- counter3
          }
          counter3 <- counter + 1
     }
 }

Это цикл for, чтобы определить, следует ли покупать и записать результат.

#Open a long position
for (i in 1:length(fiveyrdaily$Date)){
     if ((fiveyrdaily$counterhigh[i] < fiveyrdaily$counterlow[i]) & openposition < 2) {

          #entryprice is the price predetermined ticks above the high
          entryprice <- fiveyrdaily$FiveHighAfterClose[i] + (openticksaway * tickvalue)
          #create stoploss
          stoplossprice <- entryprice - stoplossvalue
          #uncover target closest to five minute high
          if (possibletargets > fiveyrdaily$FiveHighAfterClose[i]){ fiveyrdaily$ORBOtarget[i] <- min(possibletargets)}

          poscounter <- fiveyrdaily$counterhigh[i]
          beginforloop <- todaysdate[poscounter]

          for (c in beginforloop:length(todaysdate$Date)){ #see where to open position starting from the occurence of the high
               if ((entryprice > todaysdate$Low[c]) & (entryprice < todaysdate$High[c]) & (openposition < 2)){ #determine if conditions warrant entry
                    openposition <- openposition + 1 # open a position
                    if (openposition > 0){ #trade management
                         openpos <- 1
                         if ((stoplossprice < todaysdate$high[c]) & (stoplossprice > todaysdate$Low[c])){ # determine if stoploss has been hit
                              orderdate <- c(orderdate, todaysdate[c]) #enter data into orders dataframe
                              orderstrategy <- c(orderstrategy, "ORBO")
                              ordertype <- c(ordertype, "Long")
                              ordersymbol <- c(ordersymbol, "ES")
                              orderentry <- c(orderentry, entryprice)
                              orderclose <- c(orderclose, stoplossprice)
                              orderprofit <- c(orderprofit, abs((entryprice - stoplossprice) * pointvalue))
                              openpos <- 0
                         }
                         else if ((fiveyrdaily$ORBOtarget[i] < todaysdate$high[c]) & (fiveyrdaily$ORBOtarget[i] > todaysdate$Low[c])){ # determine if target has been hit
                              orderdate <- c(orderdate, todaysdate[c]) #enter data into orders dataframe
                              orderstrategy <- c(orderstrategy, "ORBO")
                              ordertype <- c(ordertype, "Long")
                              ordersymbol <- c(ordersymbol, "ES")
                              orderentry <- c(orderentry, entryprice)
                              orderclose <- c(orderclose, stoplossprice)
                              orderprofit <- c(orderprofit, abs((fiveyrdaily$ORBOtarget[i] - entryprice) * pointvalue))
                              openpos <- 0
                         }
                    }
               }
          }
    }
}

Вот данные, которые находятся в дневном фрейме данных - пять дней:

> tail(fiveyrdaily)
           Date  Time    Open    High     Low   Close     Vol      OI UpperBand
1254 06/12/2019 16:15 2883.50 2889.75 2875.25 2881.00 1205406 2495060   2919.12
1255 06/13/2019 16:15 2894.75 2900.50 2886.75 2898.50  523312  448119   2925.39
1256 06/14/2019 16:15 2893.00 2899.75 2884.25 2894.75 1318938  951568   2927.99
1257 06/17/2019 16:15 2895.50 2902.75 2892.00 2896.25 1649621 1595842   2932.71
1258 06/18/2019 16:15 2914.00 2936.50 2910.25 2926.25 2257843 2093571   2944.19
1259 06/19/2019 16:15 2925.50 2936.75 2915.25 2933.50 1639495 2093571   2954.61
     LowerBand MidLine      PP   RSI OverBot OverSld SlowK SlowD OverBot.1
1254   2751.13 2835.13 2892.58 56.24      70      30 86.82 87.54        80
1255   2749.21 2837.30 2882.00 59.06      70      30 87.60 88.11        80
1256   2748.24 2838.11 2895.25 58.19      70      30 89.01 87.81        80
1257   2746.94 2839.82 2892.92 58.46      70      30 91.79 89.47        80
1258   2743.68 2843.94 2897.00 63.41      70      30 92.63 91.14        80
1259   2740.02 2847.31 2924.33 64.51      70      30 95.20 93.21        80
     OverSld.1  Volume Momentum ZeroLine   InOrOut GapUpOrDown TypeOfDay PPTrend
1254        20 1205406    49.25        0 Disregard   Disregard      Bear Uptrend
1255        20  523312    93.50        0 Disregard      Gap Up      Bull Uptrend
1256        20 1318938   114.75        0 Disregard   Disregard      Bull Uptrend
1257        20 1649621   105.75        0 Disregard   Disregard      Bull Uptrend
1258        20 2257843   173.75        0 Disregard      Gap Up      Bull Uptrend
1259        20 1639495   184.00        0 Disregard   Disregard      Bull Uptrend
     FiveMinuteLow FiveMinuteHigh FiveMinHtoL DollarFiveHtoL FiveHighClose
1254       2881.25        2889.75        8.50          425.0          0.00
1255       2892.00        2895.75        3.75          187.5       2896.00
1256       2886.25        2893.75        7.50          375.0       2894.75
1257       2892.00        2897.00        5.00          250.0       2897.25
1258       2910.25        2915.50        5.25          262.5       2920.75
1259       2923.25        2927.25        4.00          200.0       2930.00
     FiveHighAfterClose FiveLowClose FiveLowAfterClose ORBOtarget counterhigh
1254               0.00      2881.00           2880.75          0           0
1255            2896.00      2891.75           2891.00          0           6
1256            2894.75      2886.00           2885.00          0           7
1257            2897.50         0.00              0.00          0           7
1258            2921.75         0.00              0.00          0           7
1259            2931.50      2922.50           2922.25          0           7
     counterlow DollarOpentoHigh DollarOpentoClose DollarOpentoLow
1254          7            312.5             125.0           412.5
1255          7            287.5             187.5           400.0
1256          7            337.5              87.5           437.5
1257          0            362.5              37.5           175.0
1258          0           1125.0             612.5           187.5
1259          7            562.5             400.0           512.5

Это данные в минутном фрейме - пять минут:

Date  Time    Open    High     Low   Close   Up Down UpperBand
509796 06/19/2019 16:10 2932.25 2932.50 2932.25 2932.50  717  430   2935.66
509797 06/19/2019 16:11 2932.25 2932.50 2932.25 2932.25  125  276   2935.46
509798 06/19/2019 16:12 2932.25 2932.75 2932.25 2932.75  612  604   2934.95
509799 06/19/2019 16:13 2932.50 2933.25 2932.50 2933.00  830  153   2934.66
509800 06/19/2019 16:14 2933.25 2933.25 2932.75 2933.00  676  376   2934.26
509801 06/19/2019 16:15 2932.75 2934.00 2932.75 2933.25 2929 2026   2933.90
       LowerBand MidLine      PP   RSI OverBot OverSld SlowK SlowD OverBot.1
509796   2930.27 2932.96 2932.42 47.94      70      30 45.45 40.66        80
509797   2930.24 2932.85 2932.42 46.22      70      30 53.70 46.21        80
509798   2930.45 2932.70 2932.33 50.07      70      30 63.83 54.33        80
509799   2930.56 2932.61 2932.58 51.92      70      30 72.73 63.42        80
509800   2930.76 2932.51 2932.92 51.92      70      30 83.33 73.30        80
509801   2930.97 2932.44 2933.00 53.90      70      30 85.00 80.35        80
       OverSld.1 Volume Momentum ZeroLine
509796        20   1147    -0.50        0
509797        20    401    -1.00        0
509798        20   1216     1.75        0
509799        20    983     1.75        0
509800        20   1052     2.00        0
509801        20   4955     1.75        0

Это вывод для фрейма данных заказов, обратите внимание, как он пуст - ORBOorders:

ORBOorders
  orderdate orderstrategy ordertype ordersymbol orderentry orderclose
1                                                        0          0
  orderprofit
1           0

Вот такие проблемы:

-counter3 не работает (чтобы найти точку, после которой я должен купить)

- Вторая партия кода выдает эту ошибку:

Ошибка в beginforloop: длина (текущая дата $ Date): аргумент длины 0 Дополнительно: предупреждающее сообщение: In if (возможные цели> fiveyrdaily $ FiveHighAfterClose [i]) {: условие имеет длину> 1 и будет использоваться только первый элемент

- В кадре данных ORBOorder абсолютно нет данных.

Заранее спасибо за любую помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...