루다 모멘텀 트렌드 트레이딩 전략

EMA OBV
생성 날짜: 2024-04-03 15:16:47 마지막으로 수정됨: 2024-04-03 15:16:47
복사: 0 클릭수: 700
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

루다 모멘텀 트렌드 트레이딩 전략

개요

Ruda의 동력 트렌드 거래 전략은 동력과 트렌드 지표에 기반한 양적 거래 전략이다. 이 전략은 OBV (On Balance Volume), EMA (Exponential Moving Average) 및 K선 엔티티 비율과 같은 지표를 사용하여 구매와 판매의 시간을 판단한다. 단기 EMA에서 장기 EMA, OBV 혁신이 높으며 K선 엔티티 비율이 설정된 경량보다 클 때, 전략은 다음 날 개시 가격에 구매한다. 가격 하락이 상한 가격 또는 종결 가격 하락이 단기 EMA 때, 전략은 평형한다.

전략 원칙

  1. 두 개의 EMA선을 계산하여, 단기 EMA의 변수는 5이고, 장기 EMA의 변수는 21이다. 단기 EMA에 장기 EMA를 착용할 때, 추세는 상향으로 간주되고, 반대로 추세는 하향으로 간주된다.
  2. OBV 지수를 계산할 때 OBV가 10일만에 최고치를 기록했을 때, 다중동력 에너지가 강하다고 본다.
  3. K선 엔터티 비율을 계산합니다. 엔터티 비율이 설정된 스레드값 (기본 50%) 보다 크면 트렌드가 확립되었다고 간주합니다.
  4. 상승 추세와 다중 동력이 강하고 추세가 확립되면, 전략은 다음 날 개시 가격에 구매하고, 스톱 로스는 당일 최저 가격과 개시 가격의 -1%의 최소 값이다.
  5. 가격이 스톱로스 가격 또는 클로즈오프 가격이 단기 EMA를 넘어갈 때, 전략 평지.

우위 분석

  1. 트렌드와 동력 지표가 결합되어 강력한 품종을 잡을 수 있습니다.
  2. 다음 날 개시 가격의 구매와 동적 정지를 사용하여 일부 가짜 브레이크를 피할 수 있습니다.
  3. 스탠드 및 스탠드 조건이 명확하고, 위험도 조절할 수 있습니다.

위험 분석

  1. 추세와 동력 지표의 지연, 과대 구매 및 조기 상쇄가 발생할 수 있습니다.
  2. 매개 변수는 고정되어 있고, 자기 적응력이 부족하며, 시장의 상황에 따라 성능이 크게 달라질 수 있다.
  3. 단일 시장과 품종 재검토, 전략의 안정성 및 적용성은 추가 검증되어야 합니다.

최적화 방향

  1. 트렌드 및 동력 지표의 매개 변수를 최적화하여 지표의 민감도 및 효과를 높인다.
  2. 시장 상태 판단을 도입하고, 현재 시장 특성에 따라 동적 조정 파라미터를 도입한다.
  3. 재검토 범위를 넓히고, 다양한 시장과 품종에 대한 테스트를 늘리고, 전략의 안정성을 높여라.
  4. 포지션 관리 및 위험 제어 모듈을 도입하여 수익 위험 비율을 높이는 것을 고려하십시오.

요약하다

Ruda 동량 트렌드 거래 전략은 트렌드와 동력 지표의 결합을 통해 강력한 품종과 트렌드 기회를 잡을 수 있는 간단한 사용 가능한 양적 거래 전략이다. 그러나 이 전략에는 지표 지연, 변수 고정 등의 문제가 있습니다. 미래에는 지표 변수를 최적화하고, 적응 장치를 도입하고, 측정 범위를 확장하고, 위험 관리를 강화하는 등 측면에서 전략에 대한 최적화 및 개선이 가능하며, 전략의 안정성과 수익성을 높일 수 있습니다.

전략 소스 코드
/*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)