시간 단계적 위치 추가를 기반으로 하는 간단한 양적 전략


생성 날짜: 2023-12-27 17:39:40 마지막으로 수정됨: 2023-12-27 17:39:40
복사: 0 클릭수: 684
avatar of ChaoZhang ChaoZhang
1
집중하다
1623
수행원

시간 단계적 위치 추가를 기반으로 하는 간단한 양적 전략

개요

이 전략은 시간 계단 포지션 방식을 이용한 양적 거래를 하는 간단한 전략이다. 전략의 주요 아이디어는 매일 일정한 시간에 포지션을 개설한 다중 포지션을 구축하고, 그 다음 각 포지션에 대해 다른 중지 손실 조건을 설정하여 분기 중지 또는 손실을 달성한다.

전략 원칙

이 전략은 크게 세 가지 핵심 논리에 기반하고 있습니다.

  1. 시간 계단

사용sessionTime매개 변수는 일일 거래 기간을 설정하고, 이 기간 동안, 매일 상장할 때 FIXED 계단형으로 점진적으로 매장되며, 매장 금액은 자본 풀의 최대 포지션 수의 평균 분배이다.

  1. 개인화 된 정지 손실

각 포지션 주문에 대해 각각 대응하는 정지점을 설정합니다.takeProfit정지점stopLoss각 주문마다 독립적인 스톱 스톱 로직이 있기 때문에, 스톱 스톱 스톱 로직을 배치하여 구현할 수 있다.

  1. 기간의 종료

당일 거래 기간이 끝날 때, 그 기간 동안의 모든 미정상 손실 주문에 대해 청산 할 수 있습니다.

전략적 이점

이 전략은 다음과 같은 장점을 가지고 있습니다.

  1. 리스크 분산, 포지션 내의 자금을 다른 주문에 분배하여 단일 주문 손실을 효과적으로 제어한다.

  2. 세트 스톱 스톱 손실, 각 주문에는 독립적인 스톱 스톱 손실 논리가 있으며, 모든 주문이 동시에 스톱 스톱 손실을 방지한다.

  3. 유연한 구성, 최대 포지션 수, 매일 거래 시간, 스톱 스톱 손실 비율 등의 파라미터를 사용자 정의 할 수 있습니다.

  4. 이해가 쉽고, 전략적 논리는 간단하고 명확하다.

전략적 위험

이 전략에는 위험도 있습니다.

  1. 수장된 위험은, 모든 주문이 스톱 라인에 도달하지 않은 상태에서 먼저 대응 스톱 라인을 촉발하면 큰 손실이 발생할 수 있습니다. 합리적인 스톱 라인 비율을 구성하여 회피 할 수 있습니다.

  2. 매일 개장 총액을 제한할 수 없으며, 특별한 상황이 발생할 경우, 너무 많은 주문이 동시에 매장되면 자금 견딜 수 있는 능력을 초과할 수 있다. 매일 매장 총액의 최대 한계를 추가하는 것을 고려할 수 있다.

  3. 시간대가 잘못 구성되면 거래 기회를 놓칠 수 있습니다. 거래 시간대는 목표 거래 품종의 활성 시간대에 참조하는 것이 좋습니다.

전략 최적화

이 전략은 다음과 같은 방향으로 최적화될 수 있습니다.

  1. 포지션 개시 조건 판단 논리를 추가하여 특정 기술 지표 신호가 충족될 때만 포지션을 개시하고, 맹목적으로 포지션을 추가하는 것을 피한다.

  2. 매일 매장되는 총액의 제한을 늘리고, 자본 펀드의 수용력을 초과하는 것을 방지한다.

  3. 서로 다른 주문에 대해 서로 다른 스톱 스톱 손실 비율을 설정하여 분기 스톱 스톱 손실을 달성하십시오.

  4. 주문 수를 증가시키고, 주문 수를 사용 가능한 자금과 연결시키는 논리.

요약하다

이 전략은 전체적으로 시간 계단 가설을 활용하여 양적 거래를 하는 매우 간단한 전략 템플릿이며, 전략 논리는 명확하지만, 또한 어느 정도의 위험과 최적화 공간이 존재하며, 개발자는 이를 바탕으로 적절한 최적화를 통해 보다 안정적이고 신뢰할 수 있는 양적 전략으로 만들 수 있다.

전략 소스 코드
/*backtest
start: 2022-12-20 00:00:00
end: 2023-12-26 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/
// © A3Sh

//@version=5
strategy("Simple_Pyramiding", overlay=true, pyramiding=99, initial_capital=500, default_qty_type=strategy.percent_of_equity, commission_type=strategy.commission.percent, commission_value=0.075, close_entries_rule='FIFO')

// Study of a Simple DCA strategy that opens a position every day at a specified time.
// A position is opened at the start time of the Timeframe.
// Positions exit individually when the take profit level is triggered.
// Option to activate Stop Loss and/or Position exit at the end of the Timeframe


// Backtest Window
start_time   = input(defval=timestamp("01 April 2021 20:00"), group = "Backtest Window", title="Start Time")
end_time     = input(defval=timestamp("01 Aug 2022 20:00"),  group = "Backtest Window", title="End Time")
window() => true


// Inputs
posCount     = input.int    (6,           group = "Risk",         title = "Max Amount of DCA Entries")
takeProfit   = input.float  (2.5,         group = "Risk",         title = "Take Profit %")
slSwitch     = input.bool   (true,        group = "Risk",         title = "Activate Stop Loss")
stopLoss     = input.float  (9,           group = "Risk",         title = "Stop Loss %")
sessionTime =  input("1800-1700", group = "DCA Settings", title = "DCA Order Timeframe", tooltip="Open order at the start/If ativated, close order at the end")
exitDCA     =  input.bool   (false,       group = "DCA Settings", title = "Exit DCA Entry at end of Timeframe")


// Order size based on max amount of pyramid orders
q = (strategy.equity  / posCount) / open


// Timeframe for opening and closing a DCA order
// example taken from https://stackoverflow.com/questions/69230164/pinescript-basic-question-open-a-trade-at-a-set-time-each-day
t       = time("D", sessionTime)
isStart = na(t[1]) and not na(t) or t[1] < t
isEnd   = na(t) and not na(t[1]) or t[1] < t
bgcolor(t ? color.new(color.blue,95) : na, title = " TimeFrame Color")


// Create DCA Entries
entry_price = 0.0
if isStart and window() 
    for i = 0 to strategy.opentrades
        if strategy.opentrades == i
            entry_price := close
            entry_id = "PE_" + str.tostring(i + 1) 
            strategy.entry(id = entry_id, direction=strategy.long, limit=entry_price, qty=q)
        if strategy.opentrades == posCount
            break
            
 
//Exit DCA Entries when take profit or stop loss is triggered
if strategy.opentrades > 0 and window() 
    for i = 0 to strategy.opentrades 
        exit_from = "PE_" + str.tostring(i + 1)
        exit_id = "Exit_" + str.tostring(i + 1)
        strategy.exit(id= exit_id, from_entry= exit_from, profit = close * takeProfit / 100 / syminfo.mintick, loss = slSwitch ? close * stopLoss /100 / syminfo.mintick :na)
        

//Exit DCA Entries at end of DCA Timeframe
if strategy.opentrades > 0 and exitDCA and isEnd and window() 
    for i = 0 to strategy.opentrades 
        exit_from = "PE_" + str.tostring(i + 1)
        exit_id = "Exit_" + str.tostring(i + 1)
        strategy.exit(id= exit_id, from_entry= exit_from, stop = close)