Как генерировать торговые сигналы на покупку и продажу, используя ggplot в r - PullRequest
0 голосов
/ 27 июня 2018

Я создал ggplot с моим набором данных, имеющим цену закрытия и два набора пределов (верхний предел 1 = ucl1, нижний предел 1 = lcl1, верхний предел 2 = ucl2, нижний предел 2 = lcl2), используя следующие команды

date=seq(as.Date('2000-1-3'),length.out=6486,by=1)
ggplot(mrfdata,aes(x=date))+geom_line(aes(y=ucl2),colour="blue")+geom_line(aes(y=lcl2),colour="blue")+geom_line(aes(y=close),colour="red")+geom_line(aes(y=ucl1),colour="green")+geom_line(aes(y=lcl1),colour="green")+ggtitle("7 days") +  xlab("ma of 7 days") + ylab("standard deviation")
library(shiny)
ui <- basicPage(
  plotOutput("zoom", height = "350px"),
  plotOutput("overall", height = "150px",
             brush =  brushOpts(id = "brush", direction = "x")
  )
)

server <- function(input, output){
  mrfdata=data.frame(date=date,ucl2=ucl2,ucl1=ucl1,close=close,lcl1=lcl1,lcl2=lcl2) 


  p <- ggplot(mrfdata,aes(x=date))+geom_line(aes(y=ucl2),colour="blue")+geom_line(aes(y=lcl2),colour="blue")+geom_line(aes(y=close),colour="red")+geom_line(aes(y=ucl1),colour="green")+geom_line(aes(y=lcl1),colour="green")+ggtitle("7 days") +  xlab("ma of 7 days") + ylab("standard deviation")


  output$zoom <- renderPlot({
    if (!is.null(input$brush)) {
      p <- p +xlim(as.Date("1970-01-01") + input$brush$xmin, as.Date("1970-01-01") + input$brush$xmax)
    }
    p
  })

  output$overall <- renderPlot(p)
}

shinyApp(ui, server)

Теперь мне нужно сгенерировать торговые сигналы покупки и продажи, используя этот график. Сигнал на покупку всякий раз, когда цена закрытия пересекает lcl1 и ucl2. Сигнал на продажу, когда цена закрытия пересекает ucl1 и lcl2. Я провел много исследований, но, поскольку я новичок в R, не могу применять команды. Любая помощь будет оценена.

1 Ответ

0 голосов
/ 27 июня 2018

Мы не знаем, как вы определяете пределы. Вы могли бы сделать это:

mrfdata$Buy=ifelse(mrfdata$close>mrfdata$lcl1 & mrfdata$close<mrfdata$ucl2 ,1,0)
mrfdata$Sell=ifelse(mrfdata$close<mrfdata$ucl1 & mrfdata$close>mrfdata$lcl2,-1,0)

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

mrfdata$Buy1=ifelse(mrfdata$close>mrfdata$lcl1 & mrfdata$close<mrfdata$ucl2 & mrfdata$close>mrfdata$MAv,1,0)
mrfdata$Sell1=ifelse(mrfdata$close<mrfdata$ucl1 & mrfdata$close>mrfdata$lcl2& mrfdata$close<mrfdata$MAv,-1,0)

За покупки вы получите:

enter image description here

UPDATE

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

interspoints=function(v1orig,v1ref,datav=NULL){
  above <- v1orig>v1ref
  crossp <- diff(above)!=0
  inters.pts <- which(crossp)
  list(crosp=crossp,dfbp=data.frame(datav=datav[inters.pts],intpts=inters.pts,v1orig=v1orig[inters.pts]))
}
###
#Buy signal whenever close price intersects lcl1 and ucl2.

interspoints(mrfdata$close,mrfdata$lcl1,mrfdata$date)

interspoints(mrfdata$close,mrfdata$ucl2,mrfdata$date)
...