월말 반전 DCA 전략


생성 날짜: 2023-10-08 16:12:29 마지막으로 수정됨: 2023-10-08 16:12:29
복사: 1 클릭수: 734
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

개요

이 전략의 목적은 자산의 단기 하락 경향의 끝점을 식별하고, 그 지점에서 고정 투자가 일정 금액을 매입하는 것이다. 따라서 자산의 반전이 시작된 후 낮은 비용 가격으로 고정 투자가 가능하다.

원칙

이 전략은 월 시간 프레임 운영에 기초한다. 트렌드 반전의 시간을 판단하기 위해 매달 240 개의 1 시간 K 라인이 있다.

구체적으로, 전략은 EMA 단선과 EMA 느린 선의 차이를 계산하여 EMA를 계산합니다._CD와 EMA_CD의 신호선은, 빠른 선에서 신호선을 통과할 때, 단기 하향 트렌드가 끝났다고 판단하고, 구매 신호를 낸다.

구매 신호가 발신된 후, 전략은 그 달 말에 청산된다. 그리고 다음 달에는 이 과정을 반복하여 정기적으로 구매하고 한 달 동안 보유한다.

이 방법은 단기 하락의 끝에서 낮은 호흡을 맞추고 고정 투자가 될 수 있습니다.

장점

이 전략의 가장 큰 장점은 변동 상황을 필터링하여 추세가 변할 때만 구매하여 더 나은 가격으로 고정 투자가 가능하다는 것입니다.

또한, EMA를 사용하여 트렌드 반전점을 판단하는 것은 단순히 K선 반전으로 판단하는 것보다 안정적이고 정확하다. EMA는 짧은 시장 소음이 구매 시점에 미치는 영향을 평준화 할 수 있다.

마지막으로, 월말에 정해진 스톱로스는 매월의 투자 성과를 고정시켜 한 달의 최대 손실을 제한할 수 있다.

위험

이 전략의 가장 큰 위험은 구매 후 가격이 계속 하락하여 말기 종료 손실을 초래하는 것이다. 이러한 상황은 일반적으로 판단 역전 오류로 인한 것이다.

EMA 주기 변수를 조정하여 판단을 최적화하거나 RSI와 같은 다른 지표와 결합하여 역전 신호를 확인 할 수 있습니다.

또 다른 위험은 스톱포트 설정이다. 스톱포트가 너무 작으면 단기 변동에 의해 스톱포트가 될 수 있고, 너무 크면 손실을 제한할 수 없다. 최적의 변수를 찾기 위해 다양한 스톱포트를 테스트해야합니다.

최적화 방향

이 전략은 다음과 같은 부분에서 최적화될 수 있습니다.

  1. EMA 주기 변수를 최적화하여 트렌드 반전을 판단하는 최적의 변수 조합을 찾습니다.

  2. RSI와 같은 다른 지표 필터를 추가하여 역전 신호를 확인합니다.

  3. 다양한 스톱포트를 테스트하여 최대 손실을 제한하고 중매되지 않는 최적의 스톱포트를 찾습니다.

  4. 가격에 따라 실시간으로 중지 위치를 조정하는 이동식 중단을 중지 기반으로 추가하는 것이 고려 될 수 있습니다.

  5. 다른 시간 주기, 예를 들어, 일선, 직선 동작을 테스트하여 어떤 주기에서 전략이 가장 잘 작동하는지 확인할 수 있습니다.

요약하다

이 전략의 전체적인 아이디어는 명확하고 간단하며, EMA 지표를 통해 단기 트렌드 반전을 판단하고, 반전점의 말기에 투자 시장을 결정하여, 낮은 가격으로 투자 할 수 있습니다. 전략 최적화 공간은 주로 매개 변수 최적화 및 손해 방지 전략 조정입니다.

전략 소스 코드
/*backtest
start: 2023-09-07 00:00:00
end: 2023-10-07 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/
// © BHD_Trade_Bot

// @version=5
// strategy(
//  shorttitle            = 'DCA After Downtrend',
//  title                 = 'DCA After Downtrend (by BHD_Trade_Bot)',
//  overlay               = true,
//  calc_on_every_tick    = true,
//  calc_on_order_fills   = true,
//  use_bar_magnifier     = true,
//  pyramiding            = 100,
//  initial_capital       = 0,
//  default_qty_type      = strategy.cash,
//  default_qty_value     = 1000,
//  commission_type       = strategy.commission.percent,
//  commission_value      = 0.1)



// Backtest Time Period
start_year   = input(title='Start year'   ,defval=2017)
start_month  = input(title='Start month'  ,defval=1)
start_day    = input(title='Start day'    ,defval=1)
start_time   = timestamp(start_year, start_month, start_day, 00, 00)

end_year     = input(title='end year'     ,defval=2050)
end_month    = input(title='end month'    ,defval=1)
end_day      = input(title='end day'      ,defval=1)
end_time     = timestamp(end_year, end_month, end_day, 23, 59)

window() => true



// EMA
ema50 = ta.ema(close, 50)
ema200 = ta.ema(close, 200)

// EMA_CD
emacd = ema50 - ema200
emacd_signal = ta.ema(emacd, 20)
hist = emacd - emacd_signal

// Count n candles after x long entries
var int nPastCandles = 0
var int entryNumber = 0
nPastCandles := nPastCandles + 1



// ENTRY CONDITIONS

// 8 hours per day => 240 hours per month
entry_condition1 = nPastCandles > entryNumber * 240

// End of downtrend
entry_condition2 = ta.crossover(emacd, emacd_signal)

ENTRY_CONDITIONS = entry_condition1 and entry_condition2


if ENTRY_CONDITIONS and window()
    entryNumber := entryNumber + 1
    entryId = 'Long ' + str.tostring(entryNumber)
    strategy.entry(entryId, strategy.long)
    
    

// CLOSE CONDITIONS

// Last bar
CLOSE_CONDITIONS = barstate.islast

if CLOSE_CONDITIONS
    strategy.close_all()


    
// Draw
plot(ema50, color=color.orange, linewidth=3)
plot(ema200, color=entry_condition1 ? color.green : color.red, linewidth=3)