策略
双重确认的优势均线策略A-Dual-Moving-Average-Confirmation-Advantage-Line-Strategy
ChaoZhang · PineScript · 突破 · 2024-01-23 10:49:57
概述
本策略是一个只做多头的趋势跟踪策略,它通过Aroon指标和线性回归移动平均线的双重确认来产生交易信号。该策略适用于中长线趋势交易。
策略原理
本策略使用Aroon指标的上轨和下轨的交叉来判断趋势方向。当上轨从下轨向上突破时生成买入信号。当上轨从上轨向下跌破时生成卖出信号。为了过滤假突破,策略还引入了线性回归移动平均线LSMA作为辅助判断标准。只有当收盘价高于LSMA时才会触发买入信号。 具体来说,策略的交易信号生成规则为:
- 买入信号生成条件:上轨突破下轨(Aroon指标判定双轨交叉形成上升趋势)且当日收盘价高于LSMA移动平均线(收盘价处于上升趋势中)
- 卖出信号生成条件:上轨跌破下轨(Aroon指标判定双轨交叉形成下降趋势)且当日收盘价低于LSMA移动平均线(收盘价处于下降趋势中)
优势
- 使用Aroon指标判断趋势方向,避免被噪音干扰
- 增加LSMA移动平均线作为辅助过滤条件,避免假突破带来不必要的交易
- 只做多头,符合大盘的长期向上特征,避免做空带来的无限亏损风险
- 策略参数设置简单,容易实施
风险
- 策略只做多头,在震荡行情中难以获利
- 固定参数设置可能导致过拟合风险
- 趋势反转时难以及时止损
要防范风险,可以设置止损策略,或者结合其他指标判断趋势反转时机,及时止损。
优化方向
- 可以考虑加入做空机会,在下跌行情中也可以获利
- 可以测试不同周期参数的指标效果
- 可以加入机器学习模块,实现参数的自动优化
总结
本策略总体来说是一个较为简单实用的双重确认趋势跟踪策略。它使用Aroon判定趋势方向和LSMA过滤噪音的思路简单直接,在参数设置得当的情况下,可以获得不错的效果。该策略适合中长线持有,避免被短期市场噪音干扰。通过加入止损策略等模块进行优化,可以进一步扩大策略优势,减小风险。
参数
| 参数 | 默认值 | 说明 |
|---|---|---|
| v_input_1 | true | From Day |
| v_input_2 | true | From Month |
| v_input_3 | 2010 | From Year |
| v_input_4 | 31 | To Day |
| v_input_5 | 12 | To Month |
| v_input_6 | 2021 | To Year |
| v_input_7 | 15 | Aroon Legnth |
| v_input_8 | 20 | Length LSMA |
| v_input_9_close | 0 | Source: close |
源码(47 行)
/*backtest
start: 2023-01-16 00:00:00
end: 2024-01-22 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © exlux99
//@version=4
strategy(title = "Aroon Strategy long only", overlay = true, pyramiding=1,initial_capital = 100, default_qty_type= strategy.percent_of_equity, default_qty_value = 100, calc_on_order_fills=false, slippage=0,commission_type=strategy.commission.percent,commission_value=0.1)
//Time
fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
fromYear = input(defval = 2010, title = "From Year", minval = 1970)
//monday and session
// To Date Inputs
toDay = input(defval = 31, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 12, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2021, title = "To Year", minval = 1970)
startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = true
//INPUTS
length = input(15, minval=1, title="Aroon Legnth")
upper = 100 * (highestbars(high, length+1) + length)/length
lower = 100 * (lowestbars(low, length+1) + length)/length
lengthx = input(title="Length LSMA", type=input.integer, defval=20)
offset = 0//input(title="Offset", type=input.integer, defval=0)
src = input(close, title="Source")
lsma = linreg(src, lengthx, offset)
long = crossover(upper,lower) and close > lsma
longexit = crossunder(upper,lower) and close < lsma
if(time_cond)
strategy.entry("long",1,when=long)
strategy.close("long",when=longexit)