Рассчитать дату изменения технического индикатора канала Дончиана

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

На мой взгляд, лучший способ сделать это — использовать Дончиан Шанель и входить, когда цена закрытия равна или превышает все предыдущие максимумы постоянного тока. Для этого мне нужно:

n = (текущая дата алгоритма - дата начала).

Таким образом, индикатор начнет работать с первого дня и не «забудет» о предыдущих максимумах, поскольку стратегия работает с годами данных. Проблема, с которой я сталкиваюсь, заключается в том, что я не знаю, как написать код/функцию, которая будет выражать текущую дату стратегии таким образом, чтобы я мог превратить ее в простой расчет. Лучший код, который я могу придумать, это:

##Problem in line below##
dcn <- difftime(initdate, as.Date(datePos), units = c("days"))

### This part will work fine once dcn is working
BuySig<-function(price,DC...)
{ifelse(price=>DC,1,0)}
add.indicator(strategy=strategyname,name="DonchianChannel",
          arguments=list(HL=quote(mktdata$Close),n=dcn),label="DC")

dcn, конечно же, будет моим каналом Donichan Channel n. Проблема, с которой я сталкиваюсь, заключается в том, что независимо от того, что я пытаюсь использовать вместо as.Date(datePos), он продолжает говорить мне, что «объект datePos не найден». Я пытался использовать другие вещи, которые я указал ранее в своем коде, такие как: даты, отметка времени.

Любой совет будет действительно полезен.


person Cameron    schedule 28.11.2018    source источник
comment
as.Date ищет в вашей среде объект с именем datePos. Так где же прячутся эти данные? В кадре данных? В списке? То же самое касается инициализации. Многие вопросы, которые вы можете решить, создав воспроизводимый пример   -  person phiver    schedule 30.11.2018


Ответы (1)


Вы не можете использовать DonchianChannel с изменяющимся n. n должно быть фиксированным целым числом для этой функции. Вам нужно создать свою собственную функцию, которая торгует с «самыми высокими максимумами» с начала вашего набора данных.

Это достигает того, что вы хотите; просто сделайте из него функцию и предоставьте ее как функцию для add.indicator

library(quantmod)
getSymbols("SPY")

SPY_max <- runMax(Cl(SPY), n = 1, cumulative = TRUE)

SPY$all_time_high <-  Cl(SPY) >= SPY_max

chart_Series(SPY["2018/", 1:4])

tail(SPY[SPY$all_time_high == 1,], 10)
#            SPY.Open SPY.High SPY.Low SPY.Close SPY.Volume SPY.Adjusted all_time_high
# 2018-01-19   279.80   280.41  279.14    280.41  140920100     273.9762             1
# 2018-01-22   280.17   282.69  280.11    282.69   91322400     276.2038             1
# 2018-01-23   282.74   283.62  282.37    283.29   97084700     276.7901             1
# 2018-01-25   284.16   284.27  282.40    283.30   84587300     276.7998             1
# 2018-01-26   284.25   286.63  283.96    286.58  107743100     280.0046             1
# 2018-08-24   286.44   287.67  286.38    287.51   57487400     283.3048             1
# 2018-08-27   288.86   289.90  288.68    289.78   57072400     285.5416             1
# 2018-08-28   290.30   290.42  289.40    289.92   46943500     285.6796             1
# 2018-08-29   290.16   291.74  289.89    291.48   61485500     287.2167             1
# 2018-09-20   292.64   293.94  291.24    293.58  100360600     289.2860             

Когда столбец all_time_high возвращает 1, вы находитесь на максимальном уровне для рассматриваемого временного ряда.

введите здесь описание изображения

person FXQuantTrader    schedule 19.04.2019