关于如何乘以时间范围逻辑的问题

问题描述 投票:0回答:1

我有一个策略脚本,它使用更高的时间范围与图表上的当前时间范围。经过一些回溯测试和研究后,我发现了一种数学模式,通过这种模式,上限时间范围可以与图表上的当前时间范围配合使用。

这是我的发现: 示例 - 假设我将图表放在 1 小时的时间范围内。我注意到,如果我将 60(当前图表为 1 小时)乘以 120 (60*120),则答案为 7200(分钟),也等于 5D。然后我使用该时间范围 (5D) 作为我的主要时间范围。

对于要使用的第二个时间范围,使用相同的图表(1 小时时间范围)。我注意到,如果我将 60(当前图表为 1 小时)乘以 20 (60*20),则答案为 1200(分钟),也等于 20 小时。然后我使用该时间范围 (20H) 作为我的第二时间范围。

使用 120 和 20 将当前图表在几分钟内乘以这些数字让我发现回测的设置总是有利可图的。

所以这是我的问题:

有没有办法在 pinescript 中添加该方程?我希望我的策略脚本能够使用该方程自动计算要使用的时间范围,并分析图表所在的当前时间范围。举个例子就好了,我可以弄清楚其余的事情。

(以分钟为单位乘以)

enter image description here

pine-script pine-script-v5
1个回答
0
投票

您可以使用

timeframe.in_seconds()
获取当前时间范围(以秒为单位)。

然后您可以进行计算并使用

request.security()
中的结果。但是,
timeframe
request.security()
参数期望特定
format
中的 string。因此,您不能只将
7200
作为字符串传递。您需要将其转换为预期格式 -
5D
,在此示例中。

时间范围字符串遵循以下规则:

  • 它们由乘数和时间单位组成,例如“1S”、“30”(30分钟)、“1D”(一天)、“3M”(三个月)。

  • 单位用单个字母表示,分钟不使用字母:“S”表示秒,“D”表示天,“W”表示周,“M”表示 几个月。

  • 不使用乘数时,假设为1:“S”相当于“1S”,“D”相当于“1D”等。如果仅使用“1”,则解释为 “1min”,因为分钟没有使用单位字母标识符。

  • 没有“小时”单位; “1H”无效。一小时的正确格式是“60”(记住分钟没有指定单位字母)。

每个时间范围单位的有效乘数有所不同:

  • 在几秒内,只有离散的 1、5、10、15 和 30 乘法器有效。
  • 分钟,1 到 1440。
  • 天数,1 到 365。
  • 持续 1 至 52 周。
  • 几个月,1 到 12。

我已经编写了一个函数来为您完成此转换。

//@version=5
indicator("My script", overlay=true)

MONTH_IN_MIN = 43800
WEEK_IN_MIN = 10080
DAY_IN_MIN = 1440


f_convert_tf_to_string(p_tf_in_min) =>
    string ret_val = ""

    if (p_tf_in_min >= MONTH_IN_MIN)                                    // Month
        ret_val := str.tostring(int(p_tf_in_min / MONTH_IN_MIN)) + "M"
    else if (p_tf_in_min >= WEEK_IN_MIN)                                // Week
        ret_val := str.tostring(int(p_tf_in_min / WEEK_IN_MIN)) + "W"
    else if (p_tf_in_min >= DAY_IN_MIN)                                 // Day
        ret_val := str.tostring(int(p_tf_in_min / DAY_IN_MIN)) + "D"
    else if (p_tf_in_min >= 1)                                          // Minutes and hours
        ret_val := str.tostring(p_tf_in_min)
    // else -> Seconds not handled in this function


multiplier = 120
tf_in_min = timeframe.in_seconds(timeframe.period) / 60

htf = f_convert_tf_to_string(tf_in_min * multiplier)

if (barstate.islast)
    label.new(bar_index, high, "Timeframe: " + htf, textcolor=color.white)

close_htf = request.security(syminfo.tickerid, htf, close)  // 5D close price when used on 1h timeframe

plot(close_htf, "HTF - Close", color.white, 2)

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.