이중 트렌드 라인 지능 추적 BTC 투자 전략

저자:차오장, 날짜: 2023-11-22 15:18:53
태그:

img

전반적인 설명

이 전략은 주로 BTC에 대한 자동화 된 장기 투자에 사용됩니다. 트렌드 방향을 결정하기 위해 이중 EMA와 LSMA의 크로스오버를 사용하고 BTC 상승 추세를 효과적으로 추적하기 위해 동적 스톱 로스를 계산하기 위해 ATR 지표를 사용합니다.

전략 논리

  1. 이중 이동 평균을 형성하기 위해 25 기간 EMA와 100 기간 LSMA를 사용합니다. 그들의 크로스오버는 시장 트렌드를 결정하는 데 사용됩니다. LSMA는 잘못된 브레이크오프를 필터링하는 동안 EMA는 가격 변화에 신속하게 반응합니다.

  2. 빠른 EMA가 느린 LSMA를 넘을 때 상승 추세는 여전히 손상되지 않았다는 것을 결정하고 긴 포지션을 취합니다. 반대로 빠른 EMA가 느린 LSMA를 넘을 때 하락 추세가 시작되어 기존 포지션이 닫혔다는 것을 결정합니다.

  3. 긴 포지션을 취한 후, ATR 지표를 사용하여 계산된 동적 스톱 손실은 BTC의 상승 추세를 효과적으로 추적하기 위해 계속 조정됩니다. 구체적으로, 스톱 손실 라인의 초기 지점은 엔트리 가격입니다. 그 후, 각 조정은 ATR 진폭의 고정 비율로 상승합니다.

  4. 스톱 로스 라인은 BTC 상승 추세로 인한 부동 수익을 효과적으로 잠금 할 수 있으며, 스톱 로스 포인트가 최신 가격에 너무 가까워지도록 방지하여 빈번한 스톱 로스를 피할 수 있습니다. 또한 전략은 더 많은 수익을 잠금하기 위해 서로 다른 비율의 두 개의 이동 스톱 수익을 설정합니다.

이점 분석

  1. 트렌드를 결정하기 위해 이중 이동 평균을 사용하는 것이 더 신뢰할 수 있으며 잘못된 신호를 효과적으로 예방할 수 있습니다.

  2. ATR 동적 트레일링 스톱 손실은 빈번한 작은 스톱 손실을 피하면서 대부분의 이익을 잠금 할 수 있습니다.

  3. 상승 추세가 끝나거나 끝나지 않더라도, 이동 평균이 출구 신호를 내리는 한, 지위는 위험을 통제하기 위해 중단됩니다.

  4. 이 전략은 수동 개입 없이 높은 수준의 자동화를 가지고 있어 장기적인 라이브 거래에 적합합니다.

위험 분석

  1. 엄청난 손실을 피하기 위해 갑작스러운 주요 뉴스에 주의를 기울여야 합니다.

  2. 이중 이동 평균의 조합은 잘못된 신호를 줄일 수 있지만, 범위에 묶인 시장에서 완전히 피하는 것은 여전히 어렵습니다.

  3. ATR의 잘못된 매개 변수 설정도 스톱 손실 효과에 영향을 줄 수 있습니다. 다른 제품에 따라 조정이 필요합니다.

  4. 부적절한 이동 평균 기간 또는 시간 내에 업데이트되지 않는 것은 신호 지연으로 이어질 수 있습니다.

  5. 자동 거래가 중단되는 비정상적인 충돌을 피하기 위해 서버의 안정성을 보장합니다.

최적화 방향

  1. 볼링거 밴드와 같은 더 많은 지표가 추세를 결정하기 위해 추가 될 수 있습니다. 기계 학습 모델은 또한 가격을 예측하는 데 사용할 수 있습니다.

  2. ATR 동적 스톱 손실의 계산 방법은 스톱 손실을 더 원활하게 만들기 위해 조정 및 최적화 할 수 있습니다.

  3. 거래량에 기반한 알림 메커니즘과 내일 순환 기능을 추가하여 주요 뉴스로부터의 영향을 방지할 수 있습니다.

  4. 매개 변수는 다른 동전마다 다릅니다. 개인화된 매개 변수를 훈련하기 위해 더 많은 역사적 데이터를 사용할 수 있습니다.

요약

전체적으로, 이것은 매우 실용적인 자동화 BTC 투자 프로그램이다. 주요 트렌드를 결정하기 위해 이중 EMA를 사용하는 것은 매우 신뢰할 수 있습니다. ATR 후속 스톱 로스로, 괜찮은 이익을 얻을 수 있으며 유효 기간은 매우 길 수 있습니다. 매개 변수가 계속 최적화됨에 따라이 전략의 성능에는 여전히 개선의 여지가 있습니다. 라이브 거래 검증이 가치가 있습니다.


// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Wunderbit Trading

//@version=4
strategy("Automated Bitcoin (BTC) Investment Strategy", overlay=true, initial_capital=5000,pyramiding = 0, currency="USD", default_qty_type=strategy.percent_of_equity, default_qty_value=100,  commission_type=strategy.commission.percent,commission_value=0.1)

////////////  Functions

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)

//TEMA
TEMA(series, length) =>
    if (length > 0)
        ema1 = ema(series, length)
        ema2 = ema(ema1, length)
        ema3 = ema(ema2, length)
        (3 * ema1) - (3 * ema2) + ema3
    else
        na
tradeType = input("LONG", title="What trades should be taken : ", options=["LONG", "SHORT", "BOTH", "NONE"])

///////////////////////////////////////////////////
/// INDICATORS
source=close

/// TREND
trend_type1 = input("TEMA", title ="First Trend Line : ", options=["LSMA", "TEMA","EMA","SMA"])
trend_type2 = input("LSMA", title ="First Trend Line : ", options=["LSMA", "TEMA","EMA","SMA"])

trend_type1_length=input(25, "Length of the First Trend Line")
trend_type2_length=input(100, "Length of the Second Trend Line")

leadLine1 = if trend_type1=="LSMA"
    linreg(close, trend_type1_length, 0)
else if trend_type1=="TEMA"
    TEMA(close,trend_type1_length)
else if trend_type1 =="EMA"
    ema(close,trend_type1_length)
else
    sma(close,trend_type1_length)

leadLine2 = if trend_type2=="LSMA"
    linreg(close, trend_type2_length, 0)
else if trend_type2=="TEMA"
    TEMA(close,trend_type2_length)
else if trend_type2 =="EMA"
    ema(close,trend_type2_length)
else
    sma(close,trend_type2_length)

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)

//Upward Trend
UT=crossover(leadLine1,leadLine2)
DT=crossunder(leadLine1,leadLine2)

// TP/ SL/  FOR LONG
// TAKE PROFIT AND STOP LOSS
long_tp1_inp = input(15, title='Long Take Profit 1 %', step=0.1)/100
long_tp1_qty = input(20, title="Long Take Profit 1 Qty", step=1)

long_tp2_inp = input(30, title='Long Take Profit 2%', step=0.1)/100
long_tp2_qty = input(20, 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)

long_sl_input = input(5, title='stop loss in %', step=0.1)/100
long_sl_input_level = strategy.position_avg_price * (1 - long_sl_input)

// Stop Loss
multiplier = input(3.5, "SL Mutiplier", minval=1, step=0.1)
ATR_period=input(8,"ATR period", minval=1, step=1)

// Strategy
//LONG STRATEGY CONDITION

SC = input(close, "Source", input.source)
SL1 = multiplier * Atr(ATR_period)  // Stop Loss
Trail1 = 0.0
Trail1 :=  iff(SC < nz(Trail1[1], 0) and SC[1] < nz(Trail1[1], 0), min(nz(Trail1[1], 0), SC + SL1), iff(SC > nz(Trail1[1], 0), SC - SL1, SC + SL1))
Trail1_high=highest(Trail1,50)

// iff(SC > nz(Trail1[1], 0) and SC[1] > nz(Trail1[1], 0), max(nz(Trail1[1], 0), SC - SL1),

entry_long=crossover(leadLine1,leadLine2) and Trail1_high < close
exit_long = close < Trail1_high or crossover(leadLine2,leadLine1) or close < long_sl_input_level

///// BACKTEST PERIOD ///////
testStartYear = input(2016, "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()
    if tradeType=="LONG" or tradeType=="BOTH"
        if strategy.position_size == 0 or strategy.position_size > 0
            strategy.entry("long", strategy.long, comment="b8f60da7_ENTER-LONG_BINANCE_BTC/USDT_b8f60da7-BTC-Investment_4H", when=entry_long)
            strategy.exit("TP1", "long", qty_percent=long_tp1_qty, limit=long_take_level_1)
            strategy.exit("TP2", "long", qty_percent=long_tp2_qty, limit=long_take_level_2)
            strategy.close("long", when=exit_long, comment="b8f60da7_EXIT-LONG_BINANCE_BTC/USDT_b8f60da7-BTC-Investment_4H" )


// 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 ? Trail1_high : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Stop Loss")

더 많은