为什么即使我使用的是市价订单,pine script 也会在下一根蜡烛开盘时进入?

Why does pine script enter at the next candle open even when I am using a market order?

我正在尝试在 Pine Script 中实施基于 2 周期 RSI 的策略回测。 思路很简单

Objective

问题

显然,pine 脚本默认在下一根蜡烛打开时采取 long/short 位置。 但是,尽管通过指定限制属性下了市价单,但多头头寸是在下一根蜡烛的开盘价输入的。

更多细节

时间范围 - 1 天

代码 link - https://in.tradingview.com/chart/GDSsFCKq/#(代码 - SBILIFE(NSE 印度))

我不确定我做错了什么。请帮忙

代码

//@version=4
strategy("2RSI Strategy by Larry Connor", overlay=true)
rsi_length = input(title="RSI Length", defval=2) 
buying_rsi_value = input(title="Buy at RSI Value", defval=5)
selling_rsi_value = input(title="Sell at RSI Value", defval= 40)
price = close
rsi = rsi(price, rsi_length)
buy = crossunder(rsi, buying_rsi_value)
sell = crossover(rsi, selling_rsi_value)

date = tostring(dayofmonth) + '-' + tostring(month) + '-' + tostring(year)
disable_date_ranges = input(title="Disable Date Ranges", defval=true)

start_date = input(title="Start Date", type=input.time, defval=timestamp("19 Oct 2020 
00:00 +0530"))
end_date = input(title="End Date", type=input.time, defval=timestamp("18 Oct 2021 
00:00 +0530"))
in_date_range = time >= start_date and time < end_date
    
ema_len = input(200, minval=1, title="EMA Length")
ema_src = input(close, title="EMA Source")
ema_200 = ema(ema_src, ema_len)

entry_condition= buy and ema_200 < price 

exit_condition = sell or entry_condition[10]

previous_day_close = close[1]
two_percent_of_prev_day_close = previous_day_close * 0.02
entry_price = previous_day_close - two_percent_of_prev_day_close

// plotchar(entry_condition, "debug", "", location.bottom)

capital_invested = input(title="Invested capital", defval=100000)
initial_capital = strategy.initial_capital
capital_to_be_invested = capital_invested
if(na(capital_invested) or capital_invested == 0)
    capital_to_be_invested = initial_capital

if (not na(rsi) and (in_date_range or disable_date_ranges))
    strategy.entry("buy", when=entry_condition and low < entry_price, limit= 
entry_price, long= true, qty = capital_to_be_invested/entry_price, comment="Long")
        
if (exit_condition)
    strategy.close("buy", true)

面对这个问题就是要了解历史数据的处理,历史数据是用在回溯测试中的。历史数据是每支蜡烛 4 个数据点 (OHLC)。指标的计算通常使用收盘价进行,而且我们没有足够的关于柱内价格移动的信息来做出警报发生的地点或时间的假设。因此,我们必须依靠给定蜡烛的收盘条件来建立历史柱的可变状态。在实时中,我们面临类似的问题,只是我们必须等待关闭以确认信号,否则我们会受到重绘的影响。因此,2 种数据类型(历史数据和实时数据)作为一个程序对齐 - 蜡烛收盘是一个确认且可操作的信号。为了确定收盘价,一根蜡烛将耗尽该期间的最后一个跳动点。这意味着我们的下一个可操作销售是下一个可用的销售,它发生在接下来的柱形图的第一个滴答中。这就是为什么在给定变量的状态发生变化后使用开盘价进行回溯测试的原因。如果蜡烛关闭,我们将如何执行订单?如上所述,我们可以实时放弃这一点,但这样做是将策略的 2 个差异化行为分开,这有效地使该策略具有独特性,而不是我们在历史数据上测试过的。只是策略构建的许多注意事项中的几个:)

干杯!

虽然我同意仅使用最高价、最低价、开盘价和收盘价的答案,而不同意其余的盘中走势,但有一种方法可以解决这个问题。

如果您使用 'security' 函数,您可以加载来自不同图表的数据。 这可以用于不同的股票,也可以用于不同的时间范围。

因此,如果您在日线图上进行交易,您可以使用类似的东西:

15minClose = security(systeminfo.tickerid, "15", close)

在这种情况下,您将在 1 日图表中获取当前交易品种的 15 分钟蜡烛的收盘数据。

因此,如果您想在一天的中间进行交易,您可以在满足其他要求的情况下检查 1500 万美元的收盘价?

有关更多信息,您可以在 pine 参考中查找安全功能。 https://www.tradingview.com/pine-script-reference/v4/#fun_security