【问题标题】:Pine Script Multi Time Frame - My strategy is repainting and I can't figure out whyPine Script Multi Time Frame - 我的策略是重新粉刷,但我不知道为什么
【发布时间】:2021-04-30 18:21:14
【问题描述】:

我以为我了解如何避免重绘,但我仍然看到我的图表上的交易没有与警报对齐,反之亦然。

我的脚本从 60m 图表中获取数据以在 15m 图表上进行交易。我正在访问 60m 的历史数据(至少返回 4 个柱),如果barstate.isconfirmed,我只会在 15m 上进行交易。我看到交易触发警报然后消失,或者从未触发警报的交易回溯显示。

据我所知,我编写脚本是为了让未来的数据不会影响历史决策,但显然有些事情正在发生。我很茫然

//@version=4
strategy(title="60-15 ETH/USD", precision=2, default_qty_type=strategy.cash, initial_capital=100.0, currency="USD", commission_type=strategy.commission.percent, commission_value=0.1)

// get input  
i_length        = input(group="Stochastic", title="Stochastic Length", minval=1, defval=15)                                     
i_k             = input(group="Stochastic", title="Stochastic %K", minval=1, defval=2)
i_d             = input(group="Stochastic", title="Stochastic %D", minval=1, defval=10)
i_trailingStop  = input(group="Trade Settings", title="Trailing Stop?", type=input.bool, defval=true)                           // should stop loss be dynamic, based on most recent high, or static, based on entry price?
i_stopPercent   = input(group="Trade Settings", title="Stop Percent", type=input.float, defval=0.05, maxval=1.0, minval=0.001)  // how much (percentage) can price fall before exiting the trade
i_takeProfit    = input(group="Trade Settings", title="Take Profit", type=input.float, defval=0.06, maxval=1.0, minval=0.001)   // how much (percentage) can price rise before exiting the trade
i_sellThreshold = input(group="Trade Settings", title="Sell Threshold", type=input.float, defval=75.0, maxval=100, minval=0.0)  // when stochastic %D crosses under this value, exit the trade
i_buyThreshold  = input(group="Trade Settings", title="Buy Threshold", type=input.float, defval=40.0, maxval=100, minval=0.0)   // stochastic %D must be below this value to enter a trade


// declare order variables
var recentHigh  = 0.0   // the highest high while in a trade
var stop        = 0.0   // the price that will trigger as stop loss
var entryPrice  = 0.0   // the price when the trade was entered

// build stochastic
sto = stoch(close, high, low, i_length)
K   = sma(sto, i_k)
D   = sma(K, i_d)

// get stochastic trend
stoch_upTrend = D > D[1]

// get stochastic trend for 60 minute
stoch_60         = security(syminfo.tickerid, "60", D)
stoch_60_upTrend = (stoch_60[4] >= stoch_60[8])

// entry
if (D < i_buyThreshold) and stoch_upTrend and stoch_60_upTrend and barstate.isconfirmed and strategy.position_size == 0
    recentHigh := close
    entryPrice := close
    stop       := (close * (1-i_stopPercent)) 
    strategy.entry(id="60-15-Long", long=strategy.long, comment='buy')

// update recent high, trailing stop
if close > recentHigh  
    recentHigh := close
    stop       := i_trailingStop ? (recentHigh * i_stopPercent) : stop

// exit
strategy.exit(id="60-15-Long", stop=stop, comment='sell-stop')
if close > (entryPrice * (1+i_takeProfit)) and barstate.isconfirmed
    strategy.close(id="60-15-Long", comment='sell-profit')
if crossunder(D, i_sellThreshold) and barstate.isconfirmed
    strategy.close(id="60-15-Long", comment='sell-trend')
    
// plot
plot(K, title="%K", color=color.blue, linewidth=1)
plot(D, title="%D", color=color.orange, linewidth=1)
plot(stoch_60, title="Hourly Stochastic (D)", color= stoch_60_upTrend ? color.green : color.red, style=plot.style_stepline)
upperBand  = hline(i_sellThreshold, title="Upper Limit", linestyle=hline.style_dashed)
middleBand = hline(50, title="Midline", linestyle=hline.style_dotted)
lowerBand  = hline(i_buyThreshold, title="Lower Limit", linestyle=hline.style_dashed)
fill(lowerBand, upperBand, color=color.purple, transp=75)

【问题讨论】:

  • 这是未触发警报的条目的屏幕截图。所有条件都正确,但显然这笔交易没有实时显示,这意味着条件不实时正确,并且追溯更改了? (imgur.com/a/SUVthmc)
  • 我遇到了完全相同的问题。似乎“barstate.isconfirmed”工作不可靠。

标签: pine-script repaint algorithmic-trading stochastic


【解决方案1】:

我意识到这现在已经很老了,但我认为问题在于 (D D[1] 也可以重新绘制。 您可以尝试添加 if barstate.isconfirmed 作为父范围,然后在其下方添加其他 if 语句。

但如果这不起作用,那么您需要将 D D[1] 更改为 stoch_upTrend = D[1] > D[2] . 这样你就可以回顾前一个柱来检查条件是否满足,并且这个柱已经被关闭了。由于您正在查看的酒吧已经关闭,因此它不会改变。它要么是真的,要么不是真的。因此,您也不需要 barstate.isconfirmed 作为 if 语句的一部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-28
    • 1970-01-01
    • 2012-08-17
    • 2021-09-22
    • 1970-01-01
    • 2023-02-06
    • 2015-05-05
    • 1970-01-01
    相关资源
    最近更新 更多