===简介和清单=== 该脚本由3个指标组成,用于从YouTube上重新创建FALSE SIGNAL的策略。 第一个指标是SMA(简单移动平均线)。 其次是HEMA,由alexgrover开发。 第三个是Alex Orekhov(everget)的《半趋势》。 每个指标的得分都属于他们,我只是修改了这些指标和SMA,使虚假信号的策略具有一些额外的选项、设置等,还将所有代码更新为PineScript 5。
===策略=== 默认设置已经符合错误信号的要求,因此您无需更改任何内容。 对于LONG(绿色背景显示长条目)。 HEMA必须位于SMA上方。 蜡烛主体必须完全位于HEMA上方(灯芯可以接触HEMA,但有启用/禁用此过滤器的选项)。 Halftrend必须触发购买箭头(向上看为浅绿色)。
对于空头方向(红色背景显示空头入场点)。 1、HEMA*必须低于SMA。 2、蜡烛主体必须完全位于HEMA下方(wick可以接触HEMA,但可以选择启用/禁用此过滤器)。 3、半趋势必须触发卖出箭头(向下看橙色)。 *错误信号建议将卖空的HEMA周期改为40,而不是50。
请查看FALSE SIGNAL的YouTube频道了解更多信息。
===总体改进=== 升级至PineScript 5。 一些性能改进。 只有多头时SMA为绿色,空头为红色。 只有多头时HEMA采用湖绿色,空头采用橙色。
===个人笔记=== 高时间段(1小时以上)可能需要很长时间才能触发条目、耐心等待或使用较低的时间段。
再次感谢组成此脚本的指标的作者和创建此策略的错误信号。
回测测试
/*backtest
start: 2022-02-25 00:00:00
end: 2022-04-22 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}]
args: [["v_input_5",true],["ContractType","rb2210",360008]]
*/
// Source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ - © José Manuel Gassin Pérez-Traverso
// Credit for each indicator belongs to its author.
//@version=5
indicator(title="HALFTREND + HEMA + SMA (FALSE SIGNAL)", shorttitle="HALFTREND + HEMA + SMA (FALSE SIGNAL)", overlay=true)
//== Constantes
c_negro = color.rgb(0, 0, 0, 0)
c_verde_radiactivo = color.rgb(0, 255, 0, 0)
c_verde = color.rgb(0, 128, 0, 0)
c_verde_oscuro = color.rgb(0, 80, 0, 0)
c_rojo_radiactivo = color.rgb(255, 0, 0, 0)
c_rojo = color.rgb(128, 0, 0, 0)
c_rojo_oscuro = color.rgb(80, 0, 0, 0)
c_red_t = color.new(color.red, 90)
c_amarillo = color.rgb(255, 255, 0, 0)
noneColor = color.new(color.white, 100)
//== Estrategia
GRUPO_ESTRATEGIA = "Strategy"
ESTRATEGIA_vela_completa_fuera_hema = input.bool(title="K线BAR位置", tooltip="Full candle must be outside the HEMA / Wicks can touch the HEMA but body must be out", defval=false, group=GRUPO_ESTRATEGIA)
//== Simple Moving Average (SMA)
GRUPO_SMA = "Simple Moving Average (SMA)"
len = input.int(150, minval=1, title="周期", group=GRUPO_SMA)
src = input(close, title="数据源", group=GRUPO_SMA)
offset = input.int(title="偏移", defval=6, minval=-500, maxval=500, group=GRUPO_SMA)
sma = ta.sma(src, len)
//== Hull Estimate (HEMA) - Source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ - © alexgrover
GRUPO_HEMA = "Hull Estimate (HEMA)"
length = input.int(title="周期", defval=50, minval=1, group=GRUPO_HEMA)
hema = 3 * ta.wma(close, length / 2) - 2 * ta.ema(close, length / 2)
//== HALFTREND - Copyright (c) 2021-present, Alex Orekhov (everget)
GRUPO_HT = "Halftrend"
amplitude = input(title='振幅', defval=1, group=GRUPO_HT)
channelDeviation = input(title='通道偏差', defval=2, group=GRUPO_HT)
showArrows = input(title='显示箭头', defval=true, group=GRUPO_HT)
showChannels = input(title='显示通道', defval=true, group=GRUPO_HT)
var int trend = 0
var int nextTrend = 0
var float maxLowPrice = nz(low[1], low)
var float minHighPrice = nz(high[1], high)
var float up = 0.0
var float down = 0.0
float atrHigh = 0.0
float atrLow = 0.0
float arrowUp = na
float arrowDown = na
atr2 = ta.atr(100) / 2
dev = channelDeviation * atr2
highPrice = high[math.abs(ta.highestbars(amplitude))]
lowPrice = low[math.abs(ta.lowestbars(amplitude))]
highma = ta.sma(high, amplitude)
lowma = ta.sma(low, amplitude)
if nextTrend == 1
maxLowPrice := math.max(lowPrice, maxLowPrice)
if highma < maxLowPrice and close < nz(low[1], low)
trend := 1
nextTrend := 0
minHighPrice := highPrice
minHighPrice
else
minHighPrice := math.min(highPrice, minHighPrice)
if lowma > minHighPrice and close > nz(high[1], high)
trend := 0
nextTrend := 1
maxLowPrice := lowPrice
maxLowPrice
if trend == 0
if not na(trend[1]) and trend[1] != 0
up := na(down[1]) ? down : down[1]
arrowUp := up - atr2
arrowUp
else
up := na(up[1]) ? maxLowPrice : math.max(maxLowPrice, up[1])
up
atrHigh := up + dev
atrLow := up - dev
atrLow
else
if not na(trend[1]) and trend[1] != 1
down := na(up[1]) ? up : up[1]
arrowDown := down + atr2
arrowDown
else
down := na(down[1]) ? minHighPrice : math.min(minHighPrice, down[1])
down
atrHigh := down + dev
atrLow := down - dev
atrLow
ht = trend == 0 ? up : down
var color buyColor = color.aqua
var color sellColor = color.orange
htColor = trend == 0 ? buyColor : sellColor
buySignal = not na(arrowUp) and trend == 0 and trend[1] == 1
sellSignal = not na(arrowDown) and trend == 1 and trend[1] == 0
//== Plots
// SMA
sma_color = ohlc4 > sma ? c_verde_radiactivo : c_rojo_radiactivo
plot(sma, title="SMA", color=sma_color, linewidth=4, offset=offset)
// HEMA
hema_color = hema > sma ? color.aqua : color.orange
plot(hema, title="HEMA", color=hema_color, linewidth=2)
// HALFTREND
htPlot = plot(ht, title='HalfTrend', linewidth=2, color=htColor, display=display.none)
atrHighPlot = plot(showChannels ? atrHigh : na, title='ATR High', style=plot.style_circles, color=color.new(sellColor, 0))
atrLowPlot = plot(showChannels ? atrLow : na, title='ATR Low', style=plot.style_circles, color=color.new(buyColor, 0))
fill(htPlot, atrHighPlot, title='ATR High Ribbon', color=color.new(sellColor, 90))
fill(htPlot, atrLowPlot, title='ATR Low Ribbon', color=color.new(buyColor, 90))
plotshape(showArrows and buySignal ? atrLow : na, title='Arrow Up', style=shape.triangleup, location=location.absolute, size=size.tiny, color=color.new(buyColor, 0))
plotshape(showArrows and sellSignal ? atrHigh : na, title='Arrow Down', style=shape.triangledown, location=location.absolute, size=size.tiny, color=color.new(sellColor, 0))
//== Señales estrategia
min = ESTRATEGIA_vela_completa_fuera_hema ? low : math.min(open, close)
max = ESTRATEGIA_vela_completa_fuera_hema ? high : math.max(open, close)
long_sma_y_hema = hema > sma
short_sma_y_hema = hema < sma
long_halftrend = buySignal
short_halftrend = sellSignal
long_vela = min > hema and max > hema
short_vela = min < hema and max < hema
long = long_sma_y_hema and long_halftrend and long_vela
short = short_sma_y_hema and short_halftrend and short_vela
color_fondo = long ? color.new(color.lime, 85) : short ? color.new(color.red, 80) : noneColor
bgcolor(color_fondo)
//== Alertas
alertcondition(long, title="▶ LONG", message="[{{exchange}}:{{ticker}}] LONG ENTRY")
alertcondition(short, title="▶ SHORT", message="[{{exchange}}:{{ticker}}] SHORT ENTRY")
if long
strategy.entry("Enter Long", strategy.long)
else if short
strategy.entry("Enter Short", strategy.short)