如何在R中使用ggplot生成买卖交易信号

时间:2018-06-27 07:44:38

标签: r ggplot2 trading

我用下面的命令制作了一个具有我的数据集且具有收盘价和两组限制的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)

现在我需要使用该gg图生成买入和卖出交易信号。 当收盘价与lcl1和ucl2相交时,买入信号。 只要收盘价与ucl1和lcl2相交,就卖出信号。 我已经做了很多研究,但是由于我是R语言的新手,所以无法应用命令。 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我们不知道您如何定义限制。您可以这样做:

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

更新

要找到相交点,您可以定义一个函数,然后将信号放在一起。

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)