루다 모멘텀 트렌드 거래 전략

저자:차오장, 날짜: 2024-04-03 15:16:47
태그:EMAOBV

img

전반적인 설명

루다 모멘텀 트렌드 트레이딩 전략 (Ruda Momentum Trend Trading Strategy) 은 모멘텀 및 트렌드 지표에 기반한 양적 거래 전략이다. 이 전략은 OBV (On Balance Volume), EMA (Exponential Moving Average), 촛불 몸 비율과 같은 지표를 사용하여 구매 및 판매 신호를 결정한다. 단기 EMA가 장기 EMA를 넘어서면 OBV가 새로운 최고치를 달성하고 촛불 몸 비율이 설정된 임계보다 크면 전략은 다음 날의 개장 가격으로 구매한다. 가격이 스톱 로스 가격 이하로 떨어지거나 종료 가격이 단기 EMA 이하로 떨어지면 전략은 포지션을 닫는다.

전략 원칙

  1. 단기 EMA를 위해 5의 매개 변수와 장기 EMA를 위해 21의 매개 변수를 가진 두 EMA 라인을 계산합니다. 단기 EMA가 장기 EMA를 넘으면 상승 추세로 간주되며 그 반대의 경우입니다.
  2. OBV 지표를 계산해 보세요. OBV가 10일 최고치를 달성하면 상승 동력이 강하다고 여겨집니다.
  3. 촛불체 비율을 계산합니다. 촛불체 비율이 설정된 임계치 (예정 50%) 보다 크면 트렌드가 설정된 것으로 간주됩니다.
  4. 트렌드가 상승하고, 상승 동력이 강해지고, 트렌드가 확립되면, 전략은 다음 날의 개장 가격으로 구매하고, 현재 날의 최소값과 개장 가격 마이너스 1%로 정한 스톱 로스 가격으로 구매합니다.
  5. 가격이 스톱 로스 가격 이하로 떨어지거나 닫기 가격이 단기 EMA 이하로 떨어지면 전략은 포지션을 닫습니다.

이점 분석

  1. 추세와 동력 지표를 결합함으로써 전략은 강력한 도구를 포착 할 수 있습니다.
  2. 다음 날의 오픈 가격과 동적 스톱 로스를 사용하여 구매하면 일부 가짜 브레이크를 피할 수 있습니다.
  3. 스톱 로즈와 취리 조건은 명확하고 위험도 조절할 수 있습니다.

위험 분석

  1. 트렌드 및 모멘텀 지표는 지연을 가지고 있으며, 이는 높은 가격으로 구매하고 조기 스톱 로스로 이어질 수 있습니다.
  2. 고정된 매개 변수는 적응력이 부족하고, 성능은 다른 시장 조건에서 크게 다를 수 있습니다.
  3. 단일 시장과 도구에서의 역 테스트는 전략의 안정성과 적용 가능성에 대한 추가 검증이 필요합니다.

최적화 방향

  1. 트렌드 및 모멘텀 지표의 매개 변수를 최적화하여 지표의 민감성과 효과를 향상시킵니다.
  2. 시장 상태 판단을 도입하고 현재 시장 특성에 따라 매개 변수를 동적으로 조정합니다.
  3. 백테스팅의 범위를 확대하고, 전략의 안정성을 높이기 위해 다른 시장과 도구에 대한 테스트를 늘립니다.
  4. 리스크/이익 비율을 향상시키기 위해 포지션 관리 및 리스크 제어 모듈을 도입하는 것을 고려하십시오.

요약

루다 모멘텀 트렌드 트레이딩 전략 (Ruda Momentum Trend Trading Strategy) 은 트렌드와 모멘텀 지표를 결합하여 강력한 도구와 트렌드 기회를 포착하는 간단하고 사용하기 쉬운 양적 거래 전략이다. 그러나 전략에는 지표 지연 및 고정 매개 변수와 같은 특정 한계도 있습니다. 미래에 전략의 안정성과 수익성을 높이기 위해 지표 매개 변수를 최적화하고 적응 메커니즘을 도입하고 백테스팅 범위를 확장하고 리스크 관리를 강화하여 전략을 최적화하고 향상시킬 수 있습니다.


/*backtest
start: 2024-03-01 00:00:00
end: 2024-03-31 23:59:59
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/
// © lhcbenac

//@version=5
strategy('Ruda_Strategy', overlay=true , initial_capital=5000 , pyramiding = 3, commission_type =  strategy.commission.cash_per_contract , commission_value =  1 )

//
// 
////////////////////////////////////////////////////////
//                                                    //
//                                                    //
//                    Otimizações                     //
//                                                    //
//                                                    //
////////////////////////////////////////////////////////
//
// 

////////////////////////////////////////////////////////
//                                                    //
//                                                    //
//                 Codigo Operacional                 //
//                                                    //
//                                                    //
////////////////////////////////////////////////////////
//
//
// Indica situação de Compra ou Venda

// Condição True or False 
YEAR_BT= input.int(1,title="Nº Anos ", group = "Backtest")

INPUT_ME1 = input.int(5,title="Momentum ", group = "RUDA")
INPUT_ME2 = input.int(21,title="Trend ", group = "RUDA")
INPUT_CORPO = input.int(50,title="CORPO ", group = "RUDA")/100



v_obv = ta.obv
v_med1 = ta.ema(close , INPUT_ME1)
v_med2 = ta.ema(close , INPUT_ME2)
valid_1 = v_med1 > v_med2 
valid_2 = v_obv >= ta.highest(v_obv[1], 10)
valid_3 = math.abs(close - open) / (high-low) > INPUT_CORPO
plot(v_med1)
plot(v_med2)

compra = valid_1 and valid_2 and  strategy.position_size == 0 and valid_3


var float v_minima_ref = na

dataInicio = timestamp(year(timenow) - YEAR_BT, month(timenow), dayofmonth(timenow), 00, 00)

// Variáveis globais
var float preco_entrada = na
var float preco_stop = na

if compra and time >= dataInicio and ta.change(time("D")) != 0 and ta.change(compra)  
    v_minima_ref := low
    preco_entrada := open
    preco_stop := math.min(low, open - 0.01 * open)
    strategy.entry("Compra", strategy.long , stop = preco_stop )
    if (not na(preco_entrada) and not na(preco_stop))
        label.new(x=bar_index, y= low * 0.9, text= "Dia: " + str.tostring(dayofmonth) + "\nPreço de Entrada: " + str.tostring(preco_entrada) + "\nPreço de Stop Loss: " + str.tostring(preco_stop), style=label.style_label_up, color=color.green)

    
    
// Lógica de saída
// Saída no stop loss
if (not na(preco_stop) and low < preco_stop and ta.change(low) < 0)
    strategy.close("Compra", comment="Saída no Stop")

// Saída no lucro
if (close < v_med1 and ta.change(close) < 0)
    strategy.close("Compra", comment="Saída na Media")

venda =( (not na(preco_stop) and low < preco_stop and ta.change(low) < 0) or (close < v_med1 and ta.change(close) < 0) ) and strategy.position_size > 0
codiff = compra ? 1 : venda ? -1 : na 
plotarrow(codiff, colorup=#00c3ff, colordown=#ff0062,title="Compra", maxheight=20, offset=0)






관련

더 많은