如何在R语言chart.Posn()函数箭头旁自动添加BUY/SELL文本?
在quantstrat的chart.Posn()箭头旁自动添加BUY/SELL文本
需求说明
需要在quantstrat包的chart.Posn()函数生成的绿色买入箭头、红色卖出箭头附近自动添加"BUY"和"SELL"文本,要求无需手动调整坐标,且已修改该函数源码放大了箭头尺寸。
可复现代码
library(quantstrat) start_date <- as.Date("2018-02-02") end_date <- as.Date("2018-09-24") init_date <- as.Date("2018-01-01") init_equity <- "50000" adjustment <- TRUE symbol <- "AAPL" getSymbols(symbol, src = "yahoo", from = start_date, to=end_date, adjust = adjustment) portfolio.st <- "basic_port" account.st <- "basic_account" strategy.st <- "basic_strategy" rm.strat(portfolio.st) rm.strat(account.st) stock(symbol, currency = currency("USD"), multiplier = 1) initPortf(name = portfolio.st, symbols = symbol, initDate =init_date) initAcct(name = account.st, portfolios = portfolio.st, initDate = init_date, initEq =init_equity) initOrders(portfolio.st, symbol, init_date) strategy(strategy.st, store = TRUE) add.indicator(strategy = strategy.st, name = "SMA", arguments = list(x = quote(Cl(mktdata)), n=10), label ="nFast") add.indicator(strategy = strategy.st, name = "SMA", arguments = list(x = quote(Cl(mktdata)), n=30), label = "nSlow") add.signal(strategy = strategy.st, name= "sigCrossover", arguments = list(columns = c("nFast", "nSlow"), relationship = "gte"), label = "longenter") add.signal(strategy = strategy.st, name= "sigCrossover", arguments = list(columns = c("nFast", "nSlow"), relationship = "lt"), label = "longexit") #Add rules for entering positions #enter long position add.rule(strategy.st, name = "ruleSignal", arguments = list(sigcol = "longenter", sigval = TRUE, orderqty = 100, ordertype = "market", orderside = "long", orderset= "ocolong", prefer = "Close", TxnFees = -.8, replace = FALSE), type = "enter", label = "EnterLong") #stoploss long add.rule(strategy.st, name = "ruleSignal", arguments = list(sigcol = "longenter", sigval = TRUE, TxnFees=-.8, replace = FALSE, orderside = "long", ordertype = "stoplimit", orderqty = "all", tmult = TRUE, prefer = "Close", order.price=quote(as.numeric(mktdata$AAPL.Low[timestamp])), orderset="ocolong"), type = "chain", parent = "EnterLong", path.dep=TRUE, label = "stop_loss_long", enabled=TRUE) #Apply strategy applyStrategy(strategy.st, portfolios = portfolio.st,debug = TRUE) updatePortf(portfolio.st) updateAcct(account.st) updateEndEq(account.st) st<- "2018-05-01 00:00:00" fn<-"2018-06-20 00:00:00" chart.Posn(portfolio.st, Symbol = symbol, Dates = paste(st, fn, sep="::"))
解决方案
由于你已经修改了chart.Posn()的源码,只需在绘制箭头的代码段后添加文本绘制逻辑即可实现自动标注,无需手动调整坐标:
- 定位源码中绘制买入(long)和卖出(short/exit)箭头的代码段,这部分通常会调用
points()函数。 - 在买入箭头绘制代码后添加"BUY"文本标注:
if (!is.null(long.signals)) { text(x = long.signals$x, y = long.signals$y * 0.99, labels = "BUY", col = "darkgreen", font = 2, cex = 0.8) }
利用买入信号的原生坐标,将文本轻微向下偏移(乘以0.99),确保在箭头旁清晰显示,颜色与箭头匹配。
- 在卖出箭头绘制代码后添加"SELL"文本标注:
if (!is.null(short.signals)) { text(x = short.signals$x, y = short.signals$y * 1.01, labels = "SELL", col = "darkred", font = 2, cex = 0.8) }
同理,将卖出文本轻微向上偏移(乘以1.01),颜色用深红色匹配卖出箭头。
修改后的完整箭头绘制代码段示例
假设你已修改箭头尺寸的原代码如下:
# 原箭头绘制代码(已放大尺寸) if (!is.null(long.signals)) { points(long.signals$x, long.signals$y, pch = 24, col = "darkgreen", bg = "green", cex = 1.5) } if (!is.null(short.signals)) { points(short.signals$x, short.signals$y, pch = 25, col = "darkred", bg = "red", cex = 1.5) }
修改后添加文本的代码:
# 绘制买入箭头并添加BUY标注 if (!is.null(long.signals)) { points(long.signals$x, long.signals$y, pch = 24, col = "darkgreen", bg = "green", cex = 1.5) text(x = long.signals$x, y = long.signals$y * 0.99, labels = "BUY", col = "darkgreen", font = 2, cex = 0.8) } # 绘制卖出箭头并添加SELL标注 if (!is.null(short.signals)) { points(short.signals$x, short.signals$y, pch = 25, col = "darkred", bg = "red", cex = 1.5) text(x = short.signals$x, y = short.signals$y * 1.01, labels = "SELL", col = "darkred", font = 2, cex = 0.8) }
修改完成后,调用chart.Posn()时会自动在箭头旁生成对应的标注文本,坐标随箭头位置自动适配,无需手动调整。
内容的提问来源于stack exchange,提问作者Serhat Akay
相关产品推荐
相关产品推荐

