You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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()的源码,只需在绘制箭头的代码段后添加文本绘制逻辑即可实现自动标注,无需手动调整坐标:

  1. 定位源码中绘制买入(long)和卖出(short/exit)箭头的代码段,这部分通常会调用points()函数。
  2. 在买入箭头绘制代码后添加"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),确保在箭头旁清晰显示,颜色与箭头匹配。

  1. 在卖出箭头绘制代码后添加"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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 16:07:06