该策略结合了随机震荡指标(Stochastic Oscillator)与移动平均线(Moving Average),通过观察随机指标的超买超卖情况以及移动平均线的趋势来产生交易信号。当随机指标在超买区且移动平均线向下时产生做空信号,在超卖区且移动平均线向上时产生做多信号。同时,该策略还引入了随机指标过滤器,当随机指标K线在50以下维持一定数量K线后,与D线交叉也可以产生相应的交易信号。该策略还设置了止损(Stop Loss)来控制风险。
计算随机震荡指标,得到K线和D线。参数可调,包括随机指标周期、K值平滑、D值平滑、超买区和超卖区。
计算移动平均线,默认使用收盘价,周期可调。
计算随机指标过滤器。当K线在50以下维持一定K线后,产生过滤信号。周期可调。
产生多头信号的条件:随机指标在超卖区交叉向上 或 随机指标过滤器信号 且 移动平均线向上。
产生空头信号的条件:随机指标在超买区交叉向下 或 随机指标过滤器信号 且 移动平均线向下。
多头平仓条件:随机K线上穿移动平均线 且 均线转向下行。
空头平仓条件:随机K线下穿移动平均线 且 均线转向上行。
仓位管理使用固定资金比例,默认10%。同时设置止损,默认为2%。
结合超买超卖和趋势特征,可以在趋势中追涨杀跌。
随机指标过滤器避免在震荡行情频繁交易。
止损设置有助于控制回撤。
代码结构清晰,参数可调,适合进一步优化。
随机指标具有一定滞后性,可能错过最佳买卖点。
在趋势转折点抓单准确性欠佳,止损频率可能较高。
固定比例资金管理在连续亏损的情况下回撤较大。
引入更多过滤条件,如价格行为、其他辅助指标等,提高信号准确度。
对信号进行强弱划分,在强势信号出现时加大仓位。
对趋势转折点的判断进行优化,以期抓住更多行情。
对仓位管理进行优化,可以考虑浮动盈亏比仓位调整等。
尝试不同参数组合,寻找最优参数。
该策略在随机震荡指标的基础上,结合移动平均线对趋势进行判断,同时运用随机指标本身的过滤功能,产生相对可靠的交易信号。策略整体思路清晰,适合在趋势行情中运用。但是由于随机指标滞后性的存在,在行情转折点的表现可能欠佳,整体适应性和鲁棒性有待进一步考察。后续可以从过滤条件、仓位管理、参数优化等方面对策略进行完善。
/*backtest start: 2024-03-01 00:00:00 end: 2024-03-31 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Binance","currency":"BTC_USDT"}] */ // This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © Pablo_2uc //@version=5 strategy("Estrategia Estocástico + MA con Stop Loss y Filtro Estocástico", overlay=true) // Parámetros del Estocástico length = input.int(14, title="Longitud Estocástico") smoothK = input.int(3, title="Suavizado K") smoothD = input.int(3, title="Suavizado D") oversold = input.int(20, title="Sobreventa") overbought = input.int(80, title="Sobrecompra") // Parámetros de la Media Móvil maLength = input.int(9, title="Longitud MA") maSource = input(close, title="Fuente MA") // Capital inicial capital = 5000 // Tamaño de posición (10% del capital) positionSize = capital * 0.10 // Stop Loss (2% del precio de entrada) stopLossPercent = input.int(2, title="Stop Loss (%)") / 100 // Número de ruedas para el filtro estocástico filterPeriods = input.int(12, title="Ruedas de Filtro Estocástico") // Cálculo del Estocástico k = ta.sma(ta.stoch(close, high, low, length), smoothK) d = ta.sma(k, smoothD) // Cálculo de la Media Móvil ma = ta.sma(maSource, maLength) // Filtro estocástico stochasticFilter = ta.sma(k > 50 ? 1 : 0, filterPeriods) // Condiciones de entrada en largo y corto longCondition = (ta.crossunder(k, oversold) or ta.crossover(stochasticFilter, 1)) and ma > ma[1] shortCondition = (ta.crossover(k, overbought) or ta.crossover(stochasticFilter, 1)) and ma < ma[1] // Condiciones de salida exitLongCondition = ta.crossover(k, ma) and ma < ma[1] exitShortCondition = ta.crossunder(k, ma) and ma > ma[1] // Estrategia if (longCondition) strategy.entry("Long", strategy.long, qty=positionSize) strategy.exit("Exit Long", "Long", stop=close * (1 - stopLossPercent)) if (shortCondition) strategy.entry("Short", strategy.short, qty=positionSize) strategy.exit("Exit Short", "Short", stop=close * (1 + stopLossPercent)) // Cierre de posiciones if (exitLongCondition) strategy.close("Long") if (exitShortCondition) strategy.close("Short")