Pine script 如果指示器在某个时间段内或该时间段结束时触发,则返回结果

Pine script 如果指示器在某个时间段内或该时间段结束时触发,则返回结果,pine-script,Pine Script,现在,我使用一个自定义指示器生成一行,其值为每4小时1,其他时间为0。每次线超过0.5时,我使用该指示器向我的机器人生成购买警报 study("Buy every 4 hours") is_newbar(res) => t = time(res) not na(t) and (na(t[1]) or t > t[1]) plot(is_newbar("240") ? 1 : 0) 这将一天分为6个时段和6次购买。如果RSI低于

现在,我使用一个自定义指示器生成一行,其值为每4小时1,其他时间为0。每次线超过0.5时,我使用该指示器向我的机器人生成购买警报

study("Buy every 4 hours")
is_newbar(res) =>
    t = time(res)
    not na(t) and (na(t[1]) or t > t[1])
plot(is_newbar("240") ? 1 : 0)
这将一天分为6个时段和6次购买。如果RSI低于30,我有没有办法在期末前返回1,如果RSI没有低于30,我可以在期末生成1

我基本上想要一个DCA策略,如果另一个指标显示有机会,该策略将略微加速购买

更新 多亏了PineCoders,我才能够将第二个指示符合并到信号中,但如果zscoreSignal在上一个周期中有一个1,我无法想出如何使新的_周期等于0

//@version=4
study("DCA buys")

buys_per_day = input(6) //number of buys to make per day
minutes_between_buys = 24 * 60 / buys_per_day

z_score_period = input(30) //period to calculate zscore from
xStdDev = stdev(close, z_score_period)
xMA = sma(close, z_score_period)
zscore = (close - xMA) / xStdDev

is_newbar(res) =>
    t = time(res)
    not na(t) and (na(t[1]) or t > t[1])
new_period = is_newbar(tostring(minutes_between_buys))

x = crossunder(zscore, -3.1)
var zscoreXdn = false
if new_period
    zscoreXdn := false
else if not zscoreXdn and x
    zscoreXdn := true
zscoreSignal = zscoreXdn and not zscoreXdn[1]

signal = new_period or zscoreSignal ? 1 : 0
plot(signal, "signal")
红色X表示由于在此期间之前的Z分数信号而不应发生的信号。

第1版 只需将RSI条件添加到您的需求中即可。请注意,使用此代码,当4小时事件之间发生多个交叉时,您可以在4小时内获得>1个信号:

//@version=4
study("Buy every 4 hours")
is_newbar(res) =>
    t = time(res)
    not na(t) and (na(t[1]) or t > t[1])
r = rsi(close, 14)
signal = is_newbar("240") or crossunder(r, 30) ? 1 : 0
plot(signal, "signal")

// For validation.
plot(r, "RSI")
hline(30)
plotchar(is_newbar("240"), "is_newbar(240)", "4", location.top, size = size.tiny)
plotchar(crossunder(r, 30), "crossunder(r, 30)", "X", location.top, size = size.tiny)

版本2 此版本仅允许RSI信号每4小时出现一次:

//@version=4
study("Buy every 4 hours")
is_newbar(res) =>
    t = time(res)
    not na(t) and (na(t[1]) or t > t[1])
new4HourPeriod = is_newbar("240")

// Trigger an RSI signal only once per period.
r = rsi(close, 14)
x = crossunder(r, 30)
var rsiXdn = false
if new4HourPeriod
    rsiXdn := false
else if not rsiXdn and x
    rsiXdn := true
rsiSignal = rsiXdn and not rsiXdn[1]

signal = new4HourPeriod or rsiSignal ? 1 : 0
plot(signal, "signal")

// For validation.
plot(r, "RSI")
hline(30)
plotchar(new4HourPeriod, "new4HourPeriod", "4", location.top, size = size.tiny)
plotchar(rsiXdn, "rsiXdn", "X", location.bottom, size = size.tiny)
plotchar(rsiSignal, "rsiSignal", "▼", location.bottom, size = size.tiny)
bgcolor(signal == 1 ? color.green : na)
版本1 只需将RSI条件添加到您的需求中即可。请注意,使用此代码,当4小时事件之间发生多个交叉时,您可以在4小时内获得>1个信号:

//@version=4
study("Buy every 4 hours")
is_newbar(res) =>
    t = time(res)
    not na(t) and (na(t[1]) or t > t[1])
r = rsi(close, 14)
signal = is_newbar("240") or crossunder(r, 30) ? 1 : 0
plot(signal, "signal")

// For validation.
plot(r, "RSI")
hline(30)
plotchar(is_newbar("240"), "is_newbar(240)", "4", location.top, size = size.tiny)
plotchar(crossunder(r, 30), "crossunder(r, 30)", "X", location.top, size = size.tiny)

版本2 此版本仅允许RSI信号每4小时出现一次:

//@version=4
study("Buy every 4 hours")
is_newbar(res) =>
    t = time(res)
    not na(t) and (na(t[1]) or t > t[1])
new4HourPeriod = is_newbar("240")

// Trigger an RSI signal only once per period.
r = rsi(close, 14)
x = crossunder(r, 30)
var rsiXdn = false
if new4HourPeriod
    rsiXdn := false
else if not rsiXdn and x
    rsiXdn := true
rsiSignal = rsiXdn and not rsiXdn[1]

signal = new4HourPeriod or rsiSignal ? 1 : 0
plot(signal, "signal")

// For validation.
plot(r, "RSI")
hline(30)
plotchar(new4HourPeriod, "new4HourPeriod", "4", location.top, size = size.tiny)
plotchar(rsiXdn, "rsiXdn", "X", location.bottom, size = size.tiny)
plotchar(rsiSignal, "rsiSignal", "▼", location.bottom, size = size.tiny)
bgcolor(signal == 1 ? color.green : na)

您需要找到并比较上一个事件
new_period
zscoreSignal
的时刻到倒数第二条的距离

//@version=4
study("Help (DCA buys)")

buys_per_day = input(6) //number of buys to make per day
minutes_between_buys = 24 * 60 / buys_per_day

z_score_period = input(30) //period to calculate zscore from
xStdDev = stdev(close, z_score_period)
xMA = sma(close, z_score_period)
zscore = (close - xMA) / xStdDev

is_newbar(res) =>
    t = time(res)
    not na(t) and (na(t[1]) or t > t[1])
new_period = is_newbar(tostring(minutes_between_buys))

x = crossunder(zscore, 0) // for testing, I had to change the value for the script to work
var zscoreXdn = false
if new_period
    zscoreXdn := false
else if not zscoreXdn and x
    zscoreXdn := true
zscoreSignal = zscoreXdn and not zscoreXdn[1]

signal = (new_period and barssince(new_period[1]) < barssince(zscoreSignal[1])) or zscoreSignal  ? 1 : 0
plot(signal, "signal")
/@version=4
研究(“帮助(DCA购买)”)
每天购买数量=输入(6)//每天要购买的数量
购买间隔分钟=每天24*60/次购买
z_score_period=输入(30)//计算zscore的周期
xStdDev=stdev(结束,z_分数段)
xMA=sma(收盘,z_分数_期间)
zscore=(close-xMA)/xStdDev
is_newbar(res)=>
t=时间(res)
不是na(t)和(na(t[1])或t>t[1])
新周期=是新的(两次购买之间的分钟)
x=crossunder(zscore,0)//为了进行测试,我必须更改脚本的值才能工作
var zscoreXdn=false
如果是新时期
zscoreXdn:=false
否则,如果不是zscoreXdn和x
zscoreXdn:=true
zscoreSignal=zscoreXdn而非zscoreXdn[1]
信号=(新周期和新周期[1])
您需要找到并比较上一个事件
new_period
zscoreSignal
时刻到倒数第二个条的距离

//@version=4
study("Help (DCA buys)")

buys_per_day = input(6) //number of buys to make per day
minutes_between_buys = 24 * 60 / buys_per_day

z_score_period = input(30) //period to calculate zscore from
xStdDev = stdev(close, z_score_period)
xMA = sma(close, z_score_period)
zscore = (close - xMA) / xStdDev

is_newbar(res) =>
    t = time(res)
    not na(t) and (na(t[1]) or t > t[1])
new_period = is_newbar(tostring(minutes_between_buys))

x = crossunder(zscore, 0) // for testing, I had to change the value for the script to work
var zscoreXdn = false
if new_period
    zscoreXdn := false
else if not zscoreXdn and x
    zscoreXdn := true
zscoreSignal = zscoreXdn and not zscoreXdn[1]

signal = (new_period and barssince(new_period[1]) < barssince(zscoreSignal[1])) or zscoreSignal  ? 1 : 0
plot(signal, "signal")
/@version=4
研究(“帮助(DCA购买)”)
每天购买数量=输入(6)//每天要购买的数量
购买间隔分钟=每天24*60/次购买
z_score_period=输入(30)//计算zscore的周期
xStdDev=stdev(结束,z_分数段)
xMA=sma(收盘,z_分数_期间)
zscore=(close-xMA)/xStdDev
is_newbar(res)=>
t=时间(res)
不是na(t)和(na(t[1])或t>t[1])
新周期=是新的(两次购买之间的分钟)
x=crossunder(zscore,0)//为了进行测试,我必须更改脚本的值才能工作
var zscoreXdn=false
如果是新时期
zscoreXdn:=false
否则,如果不是zscoreXdn和x
zscoreXdn:=true
zscoreSignal=zscoreXdn而非zscoreXdn[1]
信号=(新周期和新周期[1])
谢谢您,这很有帮助。有没有办法抑制多重信号?对于每4小时周期信号,第一次RSI交叉,或者如果没有发生,则在周期结束时发出信号,无论RSI如何?我的想法是在每次收盘时,确定RSI是否交叉,如果是,检查自开始时间以来是否已经发生另一次,如果没有,返回信号。还必须确定这是否是一个结束时间,如果是的话,检查RSI交叉是否在开始后发生,如果没有,发送信号。添加了一个v2,可以这样做。再次感谢。这非常接近。我知道在这段时间里,它只发出一次RSI交叉信号,但当RSI交叉发生时,它仍然发出周期结束的信号。我希望如果RSI交叉发生的话,它会跳过结束期信号,在任何24小时内仍然只有6个信号。我拍了一张我的原始信号和你的v2的截图。我希望跳过的信号在这张图中有红色的X,因为在这段时间里它们有RSI交叉。我会让你自己试试的。这不是一个指标编写服务。你有足够的逻辑和示例代码在那里,以达到你自己想要的。如果您在尝试编写逻辑代码时遇到问题,请发布您的尝试,也许有人会提供帮助。谢谢您,这很有帮助。有没有办法抑制多重信号?对于每4小时周期信号,第一次RSI交叉,或者如果没有发生,则在周期结束时发出信号,无论RSI如何?我的想法是在每次收盘时,确定RSI是否交叉,如果是,检查自开始时间以来是否已经发生另一次,如果没有,返回信号。还必须确定这是否是一个结束时间,如果是的话,检查RSI交叉是否在开始后发生,如果没有,发送信号。添加了一个v2,可以这样做。再次感谢。这非常接近。我知道在这段时间里,它只发出一次RSI交叉信号,但当RSI交叉发生时,它仍然发出周期结束的信号。我希望如果RSI交叉发生的话,它会跳过结束期信号,在任何24小时内仍然只有6个信号。我拍了一张我的原始信号和你的v2的截图。我希望跳过的信号在这张图中有红色的X,因为在这段时间里它们有RSI交叉。我会让你自己试试的。这不是一个指标编写服务。您有足够的逻辑和示例代码,可以在您的应用程序中达到您想要的位置