
이 전략은 MACD 지표를 사용하여 트렌드 방향을 판단하고, EMA 평균선과 SMA 평균선 교차를 보조 판단으로 사용합니다. 입문 신호는 MACD 직선에서 신호선을 통과하고 상승 추세이며, 정지는 ATR에 의해 계산된 부동의 정지선으로 가격이 떨어집니다. 전략은 또한 순차적으로 출전을 설정하여, 먼저 일부 포지션을 평정하여 이익을 얻습니다.
빠른 EMA 상에서 느린 EMA를 통과하면 단기 가격 변화의 추세가 장기적인 추세보다 낫다는 것을 나타내고 구매 신호로 판단한다. 동시에, 빠른 SMA 상에서 느린 SMA를 통과하는 것은 단기 가격 상승의 동력이 장기적인 것보다 낫다는 것을 나타냅니다. 따라서 MACD 직선 상의 신호 선과 추세 방향의 EMA&SMA 교차 신호를 결합하여 더 강한 입시 시기를 결정할 수 있다.
ATR을 이용하여 스톱로스를 계산한다. ATR은 가격의 변동 범위를 효과적으로 반영한다. 가격이 그 변동 범위를 넘어오면 스톱로스를 탈퇴한다. ATR의 주기가 조정될 수 있으며, 주기를 축소하는 것은 스톱로스를 더 정확하지만 더 쉽게 뚫을 수 있으며, 주기를 확대하는 스톱로스는 더 넓지만 쉽게 뚫을 수 없다.
대량 출장, 먼저 소규모 상승 후 상위 수익금의 일부를 평정한다. 그리고 가격이 크게 상승하면 상위 수익금의 일부를 평정한다. 마지막으로 상위 추적의 일부를 중지 손실이 발생하는 때까지 보유한다. 이렇게하면 수익의 일부를 잠금하고 일정 시간 동안 이익을 보유 할 수 있다.
MACD 변수를 최적화하여 트렌드를 더 정확하게 판단할 수 있습니다.
ATR 주기 변수를 최적화하여 더 적절한 스톱로드를 설정합니다.
출구 비율 및 포지션 제어 최적화, 피지배 위험을 줄이
이동 스톱을 추가하거나 변동률 지표를 고려하여 스톱을 최적화하십시오.
이 전략은 MACD, EMA/SMA 등 여러 지표를 사용하여 트렌드 방향을 판단하여 정확한 입시 시기를 얻습니다. 동시에 부동의 ATR을 사용하여 이익을 잠금하고 트렌드를 추적하는 것이 더 효과적입니다. 출장 시 분량 평형 포지션을 설정하여 재원을 회수하고 이익을 보장하고 잠시 동안 유지합니다. 일반적으로 이 전략은 안정성이 좋으며 좋은 효과를 얻을 수 있습니다.
/*backtest
start: 2022-10-30 00:00:00
end: 2023-11-05 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/
// © Deobald
//@version=4
strategy("MACD Strategy", overlay=true)
// FUNCTIONS
Ema(src,p) =>
ema = 0.
sf = 2/(p+1)
ema := nz(ema[1] + sf*(src - ema[1]),src)
Sma(src,p) => a = cum(src), (a - a[max(p,0)])/max(p,0)
Atr(p) =>
atr = 0.
Tr = max(high - low, max(abs(high - close[1]), abs(low - close[1])))
atr := nz(atr[1] + (Tr - atr[1])/p,Tr)
/// TREND
ribbon_period = input(34, "Period", step=1)
leadLine1 = ema(close, ribbon_period)
leadLine2 = sma(close, ribbon_period)
p3 = plot(leadLine1, color= #53b987, title="EMA", transp = 50, linewidth = 1)
p4 = plot(leadLine2, color= #eb4d5c, title="SMA", transp = 50, linewidth = 1)
fill(p3, p4, transp = 60, color = leadLine1 > leadLine2 ? #53b987 : #eb4d5c)
// MACD
fast_length = input(title="Fast Length", type=input.integer, defval=3)
slow_length = input(title="Slow Length", type=input.integer, defval=5)
src = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 2)
sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, 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(1, title='Long Take Profit 1 %', step=0.1)/100
long_tp1_qty = input(10, title="Long Take Profit 1 Qty", step=1)
long_tp2_inp = input(5, title='Long Take Profit 2%', step=0.1)/100
long_tp2_qty = input(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(2.2, "SL Mutiplier", minval=1, step=0.1)
ATR_period=input(17,"ATR period", minval=1, step=1)
// Strategy
entry_long=crossover(macd,signal) and leadLine2 < leadLine1
entry_price_long=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(2020, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0)
testPeriod() => true
if testPeriod()
strategy.entry("long", strategy.long, comment="Long", 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_all("long", when=exit_long, comment="exit long" )
// LONG POSITION
plot(strategy.position_size > 0 ? long_take_level_1 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="1st Long Take Profit")
plot(strategy.position_size > 0 ? long_take_level_2 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="2nd Long Take Profit")
plot(strategy.position_size > 0 ? SL_floating_long : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Stop Loss")