DCA 전략


생성 날짜: 2023-09-26 17:28:27 마지막으로 수정됨: 2023-09-26 17:28:27
복사: 0 클릭수: 976
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

개요

이 전략은 달러 비용 평균 (DCA) 원리를 이용한 상장 거래의 재검토 절차이다. 초기 상장 후, 설정된 가격 편차 비율과 상장 수 규칙에 따라 포지션을 추가할 수 있다. 이 전략은 또한 정지 전략과 추적 정지 기능을 포함한다.

전략 원칙

이 전략은 먼저 재측정 시간 창 내에서, 하루의 폐가 가격이 0보다 크면 즉시 포지션을 더 많이 열고, 이 시점의 포지션 오픈 가격은 기본 가격 bo_level ᄂ을 사용한다. 그 후, 안전 주문이 존재하지 않는 경우, () so) 는 설정된 가격의 비율과 포지션 수를 기준으로 가능한 평소 포지션 주문을 모두 현재 에 두게 된다. 구체적으로, 안전 주문의 가격은 가장 최근의 안전 주문 가격 latest_so_level을 기반으로하고, 안전 주문의 긴 단계에 따라 safe_order_step_scale를 축소하여 다음 안전 주문 가격을 계산한다.

포지션 보유 단계에서 포지션이 0보다 크면 기본 가격과 목표 스톱 스톱 비율에 따라 스톱 스톱 가격을 계산한다. 추적 스톱 스톱 기능이 종료되면이 고정 스톱 가격을 사용한다. 그렇지 않으면 스톱 스톱 트래킹의 최고 가격 ttp_max을 스톱 스톱 트래킹의 최고 가격에 따라 지속적으로 업데이트하고 그에 따라 스톱 스톱 가격을 조정하여 추적 스톱 스톱을 구현한다.

전략적 강점 분석

  • DCA 전략은 가격 하락 후 자동으로 지분을 높이고, 평균 지분 비용을 낮추고, 시스템적 위험을 보호할 수 있다.

  • 사용자 정의 파라미터를 지원하며, 다양한 품종과 거래 스타일에 따라 포지션 개시 규칙과 중지 전략을 유연하게 구성할 수 있습니다.

  • 내장된 추적 스톱 기능으로, 시동에 따라 자동으로 스톱 위치를 조정할 수 있으며, 스톱이 너무 일찍 작동되는 것을 방지한다.

  • 리포트 매개 변수 설정이 유연하여 다양한 기간의 데이터를 테스트하고 전략의 효과를 평가할 수 있습니다.

  • 3commas 플랫폼과 결합하여, 추가 개발 없이 피드백 결과를 사용하여 실시간 로봇을 구성할 수 있다.

전략적 위험 분석

  • DCA 전략에는 가축의 위험이 있으며, 시장이 계속 하락하면 지분량이 더욱 증가하고 손실도 증가할 것이다. 합리적인 가축 규칙이 필요하다.

  • 고정 비율 스톱은 시장의 변동에 따라 조정할 수 없으며, 조기 스톱 또는 스톱 퇴장을 할 수 있다. 스톱 추적을 구성해야 한다.

  • 맞춤 위험이 있다는 것을 감지하고, 실장 효과는 거래 비용과 같은 요인에 의해 영향을 받는다.

  • 거래소와 3commas의 시스템 안정성에 주의를 기울여야 계획된 거래의 실패를 방지할 수 있습니다.

전략 최적화 방향

  • 다양한 품종의 변동율에 따라 가격의 비율을 동적으로 조정할 수 있으며, 매장 규칙을 최적화한다.

  • 변동률 지표와 결합하여 더 과학적인 정지 비율을 결정할 수 있다.

  • 특정 품종에 따라 다른 거래 시간에 따라 합리적인 재검토 시간 창을 설정할 수 있습니다.

  • 손실을 막는 전략을 도입할 수 있고, 큰 손실이 있을 때 손실을 막고 탈퇴할 수 있다.

  • 기계 학습 알고리즘과 결합하여 정책의 동적 최적화 파라미터를 사용할 수 있습니다.

요약하다

이 전략은 전반적으로 매우 실용적인 DCA 재검토 프로그램입니다. 그것은 좋은 사용자 정의 파라미터 설정을 지원하고, 포지션 개시 및 정지 규칙을 유연하게 구성할 수 있습니다. 동시에 내장된 추적 정지 기능은 고정된 정지의 결점을 보완합니다. 재검토 파라미터는 또한 매우 유연하며, 다른 품종과 시간대의 데이터를 테스트 할 수 있습니다.

전략 소스 코드
/*backtest
start: 2023-09-18 00:00:00
end: 2023-09-25 00:00:00
period: 15h
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/
// © rouxam

// Author: rouxam
// Inspired by the original work of ericlin0122

//@version=4
// strategy("Backtesting 3commas DCA Bot", overlay=true, pyramiding=99, process_orders_on_close=true, commission_type=strategy.commission.percent, commission_value=0.1)

// Strategy Inputs
price_deviation         = input(1.0, type=input.float,  title='Price deviation to open safety orders (%)', minval=0.0, step=0.1)/100
take_profit             = input(1.0, type=input.float,  title='Target Take Profit (%)', minval=0.0, step=0.1)/100
ttp                     = input(0.5, type=input.float,  title='Trailing Take Profit (%) [0 = Disabled]', minval=0.0, step=0.1)/100
base_order              = input(10.0, type=input.float, title='base order') 
safe_order              = input(20.0, type=input.float, title='safe order') 
safe_order_volume_scale = input(2.0, type=input.float,  title='Safety order volume scale', step=0.1) 
safe_order_step_scale   = input(1.5, type=input.float,  title='Safety order step scale', step=0.1) 
max_safe_order          = input(5,                      title='Max safe order', minval=1, maxval=99, step=1) 

// Date Inputs
from_month = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
from_day   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
from_year  = input(defval = 2021, title = "From Year")
to_month   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
to_day     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
to_year    = input(defval = 9999, title = "To Year")
start  = timestamp(from_year, from_month, from_day, 00, 00)  // backtest start window
finish = timestamp(to_year, to_month, to_day, 23, 59)        // backtest finish window
window = time >= start and time <= finish ? true : false // create function "within window of time"

var bo_level = 0.0
var latest_so_level = 0.0
var next_so_level = 0.0
var ttp_active = false
var ttp_max = 0.0
var ttp_level = 0.0
var take_profit_level = 0.0

if strategy.position_size <= 0.0
    ttp_max := 0.0
    ttp_active := false


// First Position
if(strategy.opentrades == 0 and window and close > 0)
    // Place Buy Order ASAP
    bo_level := open
    strategy.entry("BO", limit=bo_level, long=strategy.long, qty=base_order/bo_level)
    latest_so_level := open

// Dollar Cost Averaging
place_safety_orders = latest_so_level == bo_level
if place_safety_orders
    // Placing all possible exit orders on that candle
    for i = 1 to max_safe_order
        next_so_level := latest_so_level * (1 - price_deviation * pow(safe_order_step_scale,  i - 1))
        so_name = "SO" + tostring(i) 
        strategy.entry(so_name, long=strategy.long, limit=next_so_level, qty=safe_order * pow(safe_order_volume_scale, i - 1)/next_so_level)
        latest_so_level := next_so_level

// Take Profit
if strategy.position_size > 0
    take_profit_level := strategy.position_avg_price * (1 + take_profit)
    if ttp <= 0.0
        // No trailing take profit
        strategy.exit(id="TP", limit=take_profit_level)
    else
        // Trailing take profit
        if take_profit_level <= close
            ttp_max := max(high, ttp_max)
            ttp_active := true
        if ttp_active 
            // Update exit order
            ttp_level := ttp_max * (1 - ttp)
            strategy.exit(id="TTP", stop=ttp_level)