모멘텀 브레이크 오버 트레이딩 전략

저자:차오장, 날짜: 2023-10-27 17:04:48
태그:

img

전반적인 설명

이 전략은 트렌드 방향을 결정하기 위해 간단한 이동 평균을 사용하며 상승 추세에서 길고 하락 추세에서 짧게 전환 거래를 구현합니다.

전략 논리

이 전략은 시장 트렌드 방향을 결정하기 위해 가중 이동 평균 (VWMA) 을 사용합니다. VWMA가 상승할 때 길고 VWMA가 떨어질 때 짧습니다.

특히, 먼저 특정 기간의 VWMA를 계산하고, 그 다음 VWMA가 5일 이상 상승했는지 판단합니다. 그렇다면, 긴 포지션을 개척합니다. VWMA가 5일 이상 하락한 경우, 짧은 포지션을 개척합니다. 폐쇄 조건은 VWMA 방향이 5일 이상 역전되는 경우입니다.

월별 및 연간 수익을 계산하기 위해 전략은 각 달 및 년의 이익/손실을 기록합니다. 이 전략의 수익을 시장 벤치마크와 비교함으로써 상대적 성과를 시각적으로 볼 수 있습니다.

이점 분석

이 전략의 장점은 다음과 같습니다.

  1. 트렌드를 결정하기 위해 VWMA를 사용하면 시장 소음을 효과적으로 필터링하고 주요 트렌드를 포착 할 수 있습니다.

  2. 트렌드가 확인된 후에만 포지션을 개설하면 트렌드 역전과 관련된 위험을 피할 수 있습니다.

  3. 리버스 트레이딩은 상승 추세와 하락 추세에서 모두 이익을 얻을 수 있습니다.

  4. 월별 및 연간 수익을 기록하는 것은 전략 성과를 평가하는 것을 용이하게 합니다.

  5. 시장 기준 수익을 추가하면 전략과 시장의 직접적인 비교가 가능합니다.

위험 분석

이 전략의 몇 가지 위험:

  1. 트렌드를 결정하기 위해 VWMA를 사용하는 것은 트렌드의 시작에서 후퇴하고 기회를 놓칠 수 있습니다.

  2. 확인 후만 포지션을 열면 움직임을 놓칠 수 있습니다.

  3. 리버스 트레이딩은 스톱 로스를 설정해야 합니다. 그렇지 않으면 손실이 커질 수 있습니다.

  4. 중요한 시장 변동이 스톱 로스를 유발하고 전체 트렌드를 유지할 수 없습니다.

  5. 트렌드 역전 판단은 부정확할 수 있고 손실을 증가시킬 수 있습니다.

최적화 방향

전략을 최적화 할 수있는 몇 가지 측면:

  1. 트렌드 결정을 개선하기 위해 VWMA 기간 매개 변수를 최적화합니다.

  2. 트렌드를 확인하기 위해 하루 수를 조정하고 출입 및 출출 시기를 개선합니다.

  3. 단일 트레이드 손실을 제어하기 위해 스톱 로스 전략을 추가합니다.

  4. 다른 지표를 포함해서 반전을 결정해 확실성을 높여줍니다.

  5. 시장 조건에 따라 포지션 크기를 최적화합니다.

  6. 거래 비용을 고려하고 최소 수익 목표를 설정합니다.

요약

이 전략의 전반적인 논리는 간단하고 명확하며, 확인 후 트렌드 방향과 역전 거래를 결정하기 위해 VWMA를 사용하여 시장 움직임을 효과적으로 추적 할 수 있습니다. 그러나 추가 테스트와 매개 변수 조정, 입출 논리 조정 및 적절한 위치 사이징을 필요로하는 일부 위험도 있습니다. 이 기본 역전 거래 전략은 양적 거래의 기초를 마련하고 추가 연구와 개선 가치가 있습니다.


/*backtest
start: 2023-01-01 00:00:00
end: 2023-10-26 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="Monthly Returns in Strategies with Market Benchmark", shorttitle="Monthly P&L With Market", initial_capital= 1000, overlay=true,default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, commission_value = 0.1)
maLength= input(400)

wma= vwma(hl2,maLength)
uptrend= rising(wma, 5)
downtrend= falling(wma,5)

plot(wma)

if uptrend
    strategy.entry("Buy", strategy.long)
else
    strategy.close("Buy")//

///////////////////
// MONTHLY TABLE //

new_month = month(time) != month(time[1])
new_year  = year(time)  != year(time[1])

eq = strategy.equity

bar_pnl = eq / eq[1] - 1
bar_bh = (close-close[1])/close[1]

cur_month_pnl = 0.0
cur_year_pnl  = 0.0
cur_month_bh = 0.0
cur_year_bh  = 0.0

// Current Monthly P&L
cur_month_pnl := new_month ? 0.0 : 
                 (1 + cur_month_pnl[1]) * (1 + bar_pnl) - 1 
cur_month_bh := new_month ? 0.0 : 
                 (1 + cur_month_bh[1]) * (1 + bar_bh) - 1

// Current Yearly P&L
cur_year_pnl := new_year ? 0.0 : 
                 (1 + cur_year_pnl[1]) * (1 + bar_pnl) - 1
cur_year_bh := new_year ? 0.0 : 
                 (1 + cur_year_bh[1]) * (1 + bar_bh) - 1

// Arrays to store Yearly and Monthly P&Ls
var month_pnl  = array.new_float(0)
var month_time = array.new_int(0)
var month_bh  = array.new_float(0)

var year_pnl  = array.new_float(0)
var year_time = array.new_int(0)
var year_bh  = array.new_float(0)

last_computed = false

if (not na(cur_month_pnl[1]) and (new_month or time_close + (time_close - time_close[1]) > timenow or barstate.islastconfirmedhistory))
    if (last_computed[1])
        array.pop(month_pnl)
        array.pop(month_time)
        
    array.push(month_pnl , cur_month_pnl[1])
    array.push(month_time, time[1])
    array.push(month_bh , cur_month_bh[1])

if (not na(cur_year_pnl[1]) and (new_year or time_close + (time_close - time_close[1]) > timenow or barstate.islastconfirmedhistory))
    if (last_computed[1])
        array.pop(year_pnl)
        array.pop(year_time)
        
    array.push(year_pnl , cur_year_pnl[1])
    array.push(year_time, time[1])
    array.push(year_bh , cur_year_bh[1])

last_computed := (time_close + (time_close - time_close[1]) > timenow or barstate.islastconfirmedhistory) ? true : nz(last_computed[1])

// Monthly P&L Table    
var monthly_table = table(na)

getCellColor(pnl, bh)  => 
    if pnl > 0
        if bh < 0 or pnl > 2 * bh
            color.new(color.green, transp = 20)
        else if pnl > bh
            color.new(color.green, transp = 50)
        else
            color.new(color.green, transp = 80)
    else
        if bh > 0
            color.new(color.red, transp = 20)
        else if pnl < bh
            color.new(color.red, transp = 50)
        else
            color.new(color.red, transp = 80)

if last_computed
    monthly_table := table.new(position.bottom_right, columns = 14, rows = array.size(year_pnl) + 1, border_width = 1)

    table.cell(monthly_table, 0,  0, "",     bgcolor = #cccccc)
    table.cell(monthly_table, 1,  0, "Jan",  bgcolor = #cccccc)
    table.cell(monthly_table, 2,  0, "Feb",  bgcolor = #cccccc)
    table.cell(monthly_table, 3,  0, "Mar",  bgcolor = #cccccc)
    table.cell(monthly_table, 4,  0, "Apr",  bgcolor = #cccccc)
    table.cell(monthly_table, 5,  0, "May",  bgcolor = #cccccc)
    table.cell(monthly_table, 6,  0, "Jun",  bgcolor = #cccccc)
    table.cell(monthly_table, 7,  0, "Jul",  bgcolor = #cccccc)
    table.cell(monthly_table, 8,  0, "Aug",  bgcolor = #cccccc)
    table.cell(monthly_table, 9,  0, "Sep",  bgcolor = #cccccc)
    table.cell(monthly_table, 10, 0, "Oct",  bgcolor = #cccccc)
    table.cell(monthly_table, 11, 0, "Nov",  bgcolor = #cccccc)
    table.cell(monthly_table, 12, 0, "Dec",  bgcolor = #cccccc)
    table.cell(monthly_table, 13, 0, "Year", bgcolor = #999999)


    for yi = 0 to array.size(year_pnl) - 1
        table.cell(monthly_table, 0,  yi + 1, tostring(year(array.get(year_time, yi))), bgcolor = #cccccc)
        
        y_color = getCellColor(array.get(year_pnl, yi), array.get(year_bh, yi))
        table.cell(monthly_table, 13, yi + 1, tostring(round(array.get(year_pnl, yi) * 100)) + " (" + tostring(round(array.get(year_bh, yi) * 100)) + ")", bgcolor = y_color)
        
    for mi = 0 to array.size(month_time) - 1
        m_row   = year(array.get(month_time, mi))  - year(array.get(year_time, 0)) + 1
        m_col   = month(array.get(month_time, mi)) 
        m_color = getCellColor(array.get(month_pnl, mi), array.get(month_bh, mi))
        
        table.cell(monthly_table, m_col, m_row, tostring(round(array.get(month_pnl, mi) * 100)) + " (" + tostring(round(array.get(month_bh, mi) * 100)) +")", bgcolor = m_color)

더 많은