本策略运用双EMA均线的金叉死叉来判断入场和出场时机。具体来说,当快EMA线从下方向上突破慢EMA线时产生金叉信号,做多;当快EMA线从上方向下跌破慢EMA线时产生死叉信号,做空。该策略简单易行,是一种非常常见的交易策略。
该策略的核心代码如下:
fast = input(25, title="Fast")
slow = input(75, title="Slow")
matype1=ema(source, fast)
matype2=ema(source, slow)
longCondition = crossover(matype1, matype2)
shortCondition = crossunder(matype1, matype2)
if (longCondition)
strategy.entry("Long", strategy.long)
if (shortCondition)
strategy.entry("Short", strategy.short)
该策略首先设置快慢两个EMA均线,其中快EMA线周期为25,慢EMA线周期为75。然后计算两条EMA线的值。当快EMA线从下方向上突破慢EMA线时,产生longCondition条件为真;当快EMA从上方向下跌破慢EMA时,产生shortCondition条件为真。满足相应条件时,做多或做空。
该策略利用了EMA均线的平滑特点,可以有效过滤市场Noise,同时又能快速捕捉趋势的变化。两条EMA均线间的金叉死叉交叉为一个较强的交易信号,可以有效控制交易风险。
该策略有以下几点优势:
操作思路简单直观,容易理解实现。
利用EMA平滑市场波动,有效过滤False Signal。
金叉死叉是较强的交易信号,可以有效控制风险。
可灵活调整EMA周期,适用于不同市场环境。
容易与其他技术指标组合使用。
可通过优化EMA参数来获得更好的策略效果。
该策略也存在一些风险:
在震荡行情中,EMA交叉频繁,会产生大量无效交易信号。
EMA具有滞后性,可能错过短线机会。
仅靠EMA交叉无法确定趋势转折点,存在一定盈利上限。
固定的EMA周期不能适应市场的变化。
需要较强的资金支持,否则衍生风险大。
需要严格的止损约束,否则单笔损失可能很大。
该策略可以从以下几个方面进行优化:
优化EMA周期参数,适应不同市场情况。
增加其他指标过滤,如MACD、布林带等,提高信号质量。
增加趋势判断指标,如ATR止损、ADX等,减少无效交易。
结合更多时间周期分析,判断趋势方向。
利用机器学习方法动态优化EMA周期。
优化仓位管理,以控制风险。
优化止损策略,降低单笔损失。
本策略运用双EMA均线的金叉死叉交叉作为交易信号,形成一个较为经典的趋势跟随策略。该策略简单易行,容易与其他技术指标组合,适用于对趋势判断要求不高的投资者。但也存在一定的盈利上限和风险,需要进行适当优化以适应不同市场环境。总体来说,该策略提供了一个非常好的策略开发基础,可供投资者进行深入研究。
/*backtest start: 2023-09-16 00:00:00 end: 2023-10-16 00:00:00 period: 1h basePeriod: 15m 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/ // Double EMA CROSS By © EmreE (Emre Ertürk) Also thx for KivancOzbilgic color based bars //@version=4 strategy(title="Double EMA CROSS", shorttitle="DEC", overlay=true) matype = input("ema") hidema = input(false) sourcetype = input(close, title="Source Type") source=close // STEP 1: // Configure backtest start date with inputs startDate = input(title="Start Date", type=input.integer, defval=1, minval=1, maxval=231) startMonth = input(title="Start Month", type=input.integer, defval=1, minval=1, maxval=12) startYear = input(title="Start Year", type=input.integer, defval=2020, minval=1800, maxval=2100) // STEP 2: // See if this bar's time happened on/after start date afterStartDate = (time >= timestamp(syminfo.timezone, startYear, startMonth, startDate, 0, 0)) fast = input(25, title="Fast") slow = input(75, title="Slow") matype1=ema(source, fast) matype2=ema(source, slow) signalcolor = source > matype2 ? color.blue : color.red signal = cross(fast, slow) hizliema=plot(hidema ? na : matype1, color=color.green, linewidth=2,transp=0, title="Fast EMA") yavasema=plot(hidema ? na : matype2, color=color.red, linewidth=2,transp=0, title="Slow EMA") //kesisme=plot(signal, style=cross, color=signalcolor, linewidth=5, title="Kesişme") longCondition = crossover(matype1, matype2) if (afterStartDate and longCondition) strategy.entry("Long", strategy.long) shortCondition = crossunder(matype1, matype2) if (afterStartDate and shortCondition) strategy.entry("Short", strategy.short) //-------------------------------------------------------- //volume based color bars length=input(21, "length", minval=1) avrg=sma(volume,length) vold1 = volume > avrg*1.5 and close<open vold2 = volume >= avrg*0.5 and volume<=avrg*1.5 and close<open vold3 = volume < avrg *0.5 and close<open volu1 = volume > avrg*1.5 and close>open volu2 = volume >= avrg*0.5 and volume<=avrg*1.5 and close>open volu3 = volume< avrg*0.5 and close>open cold1=#800000 cold2=#FF0000 cold3=color.orange colu1=#006400 colu2=color.lime colu3=#7FFFD4 ac = vold1 ? cold1 : vold2 ? cold2 : vold3 ? cold3 : volu1 ? colu1 : volu2 ? colu2 : volu3 ? colu3 : na barcolor(ac)