===简介和清单=== 该脚本由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)