This is a trend-based strategy that uses the intersection of the EMA and SMA to determine the direction of the trend, while the MACD provides the entry signal. At the same time, the strategy incorporates ATR as a trailing stop mechanism.
The strategy will enter a position when two conditions are met: the trend ribbon turns green and the MACD line crosses above the signal line. This strategy also takes into supports pyramiding, meaning it can enter a second time if the signal occurs again while the trend remains valid.
There are 3 exit points. The first 10% of the position is closed when the price increases by 2%. The second portion of 50% is closed when the price reaches the 5% take-profit target. The remaining 40% of the position waits for the exit signal, which occurs when the price closes below the ATR line.
The strategy uses a fixed dollar amount; each time an entry occurs, it will place an order with $100.
The strategy can be applied to other crypto assets. However, this will require changes to the input parameters.
IMPORTANT!
This is a trend strategy and works best in trending markets
This is long-only strategy
A trend identifier was added using the interaction between the EMA and SMA
Take-profit and stop-loss levels were included
Inputs for period selection were added, allowing you to evaluate the strategy’s performance on a monthly basis
Applicable to ETH-USD 30 min
| Bitmex | FTX |
Input | Value | Value |
Period | 39 | 38 |
Fast Length | 7 | 7 |
Slow Length | 14 | 16 |
Source | Close | Close |
Signal Smoothing | 3 | 3 |
Simple MA (Oscillator) | False (NA) | False (NA) |
Simple MA (Signal Line) | True | True |
Long Take Profit 1 (%) | 2 | 2.5 |
Long Take Profit 1 (Qty) | 10 | 10 |
Long Take Profit 2 (%) | 5 | 5 |
Long Take Profit 2 (Qty) | 50 | 40 |
SL Multiplier | 3.5 | 3.5 |
ATR Period | 6 | 5 |
Strategy Script Code
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © WunderTrading
//@version=5
strategy('MACD Strategy', overlay=true, pyramiding=2, commission_type=strategy.commission.percent, commission_value=0.04, initial_capital=100, default_qty_type=strategy.cash, default_qty_value=100, currency=currency.USD)
// FUNCTIONS
Ema(src, p) =>
ema = 0.
sf = 2 / (p + 1)
ema := nz(ema[1] + sf * (src - ema[1]), src)
ema
Sma(src, p) =>
a = ta.cum(src)
(a - a[math.max(p, 0)]) / math.max(p, 0)
Atr(p) =>
atr = 0.
Tr = math.max(high - low, math.max(math.abs(high - close[1]), math.abs(low - close[1])))
atr := nz(atr[1] + (Tr - atr[1]) / p, Tr)
atr
/// TREND
ribbon_period = input.int(39, 'Period', step=1)
leadLine1 = ta.ema(close, ribbon_period)
leadLine2 = ta.sma(close, ribbon_period)
p3 = plot(leadLine1, color=color.new(#53b987, 50), title='EMA', linewidth=1)
p4 = plot(leadLine2, color=color.new(#eb4d5c, 50), title='SMA', linewidth=1)
fill(p3, p4, color=leadLine1 > leadLine2 ? #53b987 : #eb4d5c, transp=60)
// MACD
fast_length = input(title='Fast Length', defval=7)
slow_length = input(title='Slow Length', defval=14)
src = input(title='Source', defval=close)
signal_length = input.int(title='Signal Smoothing', minval=1, maxval=50, defval=3)
sma_source = input(title='Simple MA(Oscillator)', defval=false)
sma_signal = input(title='Simple MA(Signal Line)', defval=true)
// Plot colors
col_grow_above = #26A69A
col_grow_below = #FFCDD2
col_fall_above = #B2DFDB
col_fall_below = #EF5350
col_macd = #0094ff
col_signal = #ff6a00
// Calculating
fast_ma = sma_source ? Sma(src, fast_length) : Ema(src, fast_length)
slow_ma = sma_source ? Sma(src, slow_length) : Ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? Sma(macd, signal_length) : Ema(macd, signal_length)
hist = macd - signal
//plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 )
// plot(macd, title="MACD", color=col_macd, transp=0)
// plot(signal, title="Signal", color=col_signal, transp=0)
// TAKE PROFIT AND STOP LOSS
long_tp1_inp = input.float(2, title='Long Take Profit 1 %', step=0.1) / 100
long_tp1_qty = input.int(10, title='Long Take Profit 1 Qty', step=1)
long_tp2_inp = input.float(5, title='Long Take Profit 2%', step=0.1) / 100
long_tp2_qty = input.int(50, title='Long Take Profit 2 Qty', step=1)
long_take_level_1 = strategy.position_avg_price * (1 + long_tp1_inp)
long_take_level_2 = strategy.position_avg_price * (1 + long_tp2_inp)
// Stop Loss
multiplier = input.float(3.5, 'SL Mutiplier', minval=1, step=0.1)
ATR_period = input.int(6, 'ATR period', minval=1, step=1)
// Strategy
entry_long = ta.crossover(macd, signal) and leadLine2 < leadLine1
entry_price_long = ta.valuewhen(entry_long, close, 0)
SL_floating_long = entry_price_long - multiplier * Atr(ATR_period)
exit_long = close < SL_floating_long
///// BACKTEST PERIOD ///////
testStartYear = input(2018, 'Backtest Start Year')
testStartMonth = input(1, 'Backtest Start Month')
testStartDay = input(1, 'Backtest Start Day')
testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, 0, 0)
testStopYear = input(9999, 'Backtest Stop Year')
testStopMonth = input(12, 'Backtest Stop Month')
testStopDay = input(31, 'Backtest Stop Day')
testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0)
testPeriod() =>
time >= testPeriodStart and time <= testPeriodStop ? true : false
if testPeriod()
strategy.entry('long', strategy.long, comment='Insert Enter Long Comment', when=entry_long)
strategy.exit('TP1', 'long', qty_percent=long_tp1_qty, limit=long_take_level_1) //, trail_points=entry_price_long * long_trailing / syminfo.mintick, trail_offset=entry_price_long * long_trailing / syminfo.mintick)
strategy.exit('TP2', qty_percent=long_tp2_qty, limit=long_take_level_2) //, trail_points=entry_price_long * long_trailing / syminfo.mintick, trail_offset=entry_price_long * long_trailing / syminfo.mintick)
strategy.close('long', when=exit_long, comment='Insert Exit Long comment')
// LONG POSITION
plot(strategy.position_size > 0 ? long_take_level_1 : na, style=plot.style_linebr, color=color.new(color.green, 0), linewidth=1, title='1st Long Take Profit')
plot(strategy.position_size > 0 ? long_take_level_2 : na, style=plot.style_linebr, color=color.new(color.green, 0), linewidth=1, title='2nd Long Take Profit')
plot(strategy.position_size > 0 ? SL_floating_long : na, style=plot.style_linebr, color=color.new(color.red, 0), linewidth=1, title='Long Stop Loss')

