추진력 파열은 전략을 결정합니다.

저자:차오장, 날짜: 2023-11-02 14:39:22
태그:

img

전반적인 설명

이 전략은 급격히 상승하는 주식을 식별하고 가격이 새로운 최고치를 돌파할 때 긴 포지션을 취합니다. 이윤을 잠금하기 위해 고정 비율의 이익을 사용합니다. 전략은 트렌드 다음 전략에 속합니다.

원칙

이 전략은 주로 두 가지 지표에 기반합니다.

  1. 빠른 RSI: 최근 3 바의 상승과 하락을 계산하여 가격 동력을 판단합니다. 빠른 RSI가 10 이하이면 과판 상태로 간주됩니다.

  2. 몸 필터: 최근 20 바의 평균 몸 크기를 계산합니다. 몸 크기가 평균 몸 크기의 2.5 배 이상이면 유효한 파업으로 간주됩니다.

빠른 RSI가 10보다 낮고 보디 필터가 유효하면 긴 포지션이 열립니다. 그 후 20%의 고정 취득이 설정됩니다. 가격이 오픈 가격을 초과하면 * (1 + 취득 비율) 포지션은 종료됩니다.

이 전략의 장점은 트렌드의 시작에서 브레이크아웃 기회를 잡을 수 있다는 것입니다. 빠른 RSI는 과잉 판매 수준을 판단하고 신체 필터는 가짜 브레이크아웃을 피합니다. 고정 비율은 각 거래의 이익에 수익을 잠그고 트렌드를 계속 잡습니다.

이점 분석

이 전략의 장점:

  1. 빠른 RSI는 과잉 판매 수준을 파악하고 진입 정확도를 높입니다.

  2. 몸 필터는 변동으로 인한 가짜 파장을 피합니다.

  3. 고정된 수익률은 안정적인 수익을 창출하고 트렌드를 잡습니다.

  4. 논리는 간단하고 명확하고 이해하기 쉽고 실행하기 쉽습니다.

  5. 우아한 코드 구조와 확장성, 최적화 용이성

  6. 안정적인 긍정적인 수익률과 높은 승률

위험 분석

주의해야 할 몇 가지 위험 요소:

  1. 손해를 막는 메커니즘이 없어 손실이 늘어날 위험이 있습니다.

  2. 부적절한 취득 수준은 조기 또는 너무 깊은 탈퇴로 이어질 수 있습니다.

  3. 불안한 시장에서 작은 손실이 발생할 수 있습니다.

  4. 금융 비용은 고려되지 않습니다. 실제 수익률은 낮을 수 있습니다.

  5. 다른 제품에서 파라미터 최적화가 충분하지 않습니다.

최적화 방향

몇 가지 측면은 최적화 될 수 있습니다:

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

  2. 동력을 최적화하고 트렌드를 따라 수익을 얻습니다.

  3. 출입 정확도를 높이기 위해 탈출 논리를 강화해

  4. 자본 사용량을 최적화하기 위해 위치 사이즈 모듈을 추가합니다.

  5. 다른 제품들에 대한 파라미터 최적화 모듈을 추가합니다.

  6. 필터를 추가해서 불안한 시장에서 손실을 피합니다.

  7. 평균 비용 관리를 추가하는 것도 고려해야 합니다.

결론

요약하자면, 이것은 우아하고 간단한 트렌드 다음 전략입니다. 과잉 판매 수준을 식별하기 위해 빠른 RSI, 유효한 브레이크아웃을 확인하기 위해 신체 필터를 사용하고, 안정적인 수익을 창출하기 위해 고정 비율로 이익을 취합니다. 최적화 할 여지가 있지만 전략은 반응적이며 빠르게 변화하는 시장에 적합하며 매우 실용적인 거래 전략입니다. 지속적인 최적화로 강력한 장기 전략이 될 수 있습니다.


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

//@version=4
// this is based on https://www.tradingview.com/v/PbQW4mRn/
strategy(title = "ONLY LONG V4 v1", overlay = true, initial_capital = 1000, pyramiding = 1000,
   calc_on_order_fills = false, calc_on_every_tick = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 50, commission_value = 0.075)

//study(title = "ONLY LONG V4 v1", overlay = true)

//Fast RSI
src = close
fastup = rma(max(change(src), 0), 3)
fastdown = rma(-min(change(src), 0), 3)
fastrsi = fastdown == 0 ? 100 : fastup == 0 ? 0 : 100 - (100 / (1 + fastup / fastdown))

//Body Filter
body = abs(close - open)
abody = sma(body, 20)

mac = sma(close, 20)
len = abs(close - mac)
sma = sma(len, 100)
max = max(open, close)
min = min(open, close)
up = close < open and len > sma * 2 and min < min[1] and fastrsi < 10 and body > abody * 2.5

// Strategy
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

var bool longCondition = na

longCondition := up == 1 ? 1 : na

// Get the price of the last opened long

var float last_open_longCondition = na

last_open_longCondition := longCondition ? close : nz(last_open_longCondition[1])

// Get the bar time of the last opened long

var int last_longCondition = 0

last_longCondition := longCondition ? time : nz(last_longCondition[1])

// Take profit
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

tp = input(20, "TAKE PROFIT %", type = input.float, minval = 0, step = 0.5)

long_tp = crossover(high, (1+(tp/100))*last_open_longCondition) and not longCondition

// Get the time of the last tp close

var int last_long_tp = na

last_long_tp := long_tp ? time : nz(last_long_tp[1])

Final_Long_tp = long_tp and last_longCondition > nz(last_long_tp[1])

// Count your long conditions

var int sectionLongs = 0

sectionLongs := nz(sectionLongs[1])

var int sectionTPs = 0

sectionTPs := nz(sectionTPs[1])

// Longs Counter

if longCondition
    sectionLongs := sectionLongs + 1
    sectionTPs := 0

if Final_Long_tp
    sectionLongs := 0
    sectionTPs := sectionTPs + 1
    
// Signals
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

// Long

// label.new(
//    x = longCondition[1] ? time : na, 
//    y = na, 
//    text = 'LONG'+tostring(sectionLongs), 
//    color=color.lime, 
//    textcolor=color.black,  
//    style = label.style_labelup, 
//    xloc = xloc.bar_time, 
//    yloc = yloc.belowbar,
//    size = size.tiny)
   
// Tp

// label.new(
//    x = Final_Long_tp ? time : na, 
//    y = na, 
//    text = 'PROFIT '+tostring(tp)+'%', 
//    color=color.orange, 
//    textcolor=color.black,  
//    style = label.style_labeldown, 
//    xloc = xloc.bar_time, 
//    yloc = yloc.abovebar,
//    size = size.tiny) 

ltp = iff(Final_Long_tp, (last_open_longCondition*(1+(tp/100))), na), plot(ltp, style=plot.style_cross, linewidth=3, color = color.white, editable = false)

// Backtesting
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

testStartYear = input(2019, "BACKTEST START YEAR", minval = 1, maxval = 2222) 
testStartMonth = input(01, "BACKTEST START MONTH", minval = 1, maxval = 12)
testStartDay = input(01, "BACKTEST START DAY", minval = 1, maxval = 31)
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

strategy.entry("long", strategy.long, when = longCondition and (time >= testPeriodStart))
strategy.exit("TP", "long", limit = (last_open_longCondition*(1+(tp/100))))

// Alerts
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

alertcondition(longCondition[1], title="Long Alert", message = "LONG")
alertcondition(Final_Long_tp, title="Long TP Alert", message = "LONG TP")


더 많은