스토캐스틱 오실레이터와 이동 평균 교차 전략, 손절매 및 스토캐스틱 오실레이터 필터 결합

MA SMA
생성 날짜: 2024-04-26 16:10:11 마지막으로 수정됨: 2024-04-26 16:10:11
복사: 0 클릭수: 847
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

스토캐스틱 오실레이터와 이동 평균 교차 전략, 손절매 및 스토캐스틱 오실레이터 필터 결합

개요

이 전략은 무작위적인 흔들림 지표 (Stochastic Oscillator) 와 이동 평균 (Moving Average) 을 결합하여 무작위적인 지표의 과매매와 이동 평균의 추세를 관찰하여 거래 신호를 생성한다. 무작위적인 지표가 과매 지역과 이동 평균 선 아래에서 공백 신호를 생성하고, 과매 지역과 이동 평균 선 위쪽에서 더 많은 신호를 생성한다. 이 전략은 또한 무작위적인 지표 필터를 도입하고, 무작위적인 지표 K 선이 50 이하의 일정 수의 K 선을 유지하면 D 선과 교차하면 그에 따른 거래 신호를 생성할 수 있다. 이 전략은 또한 위험을 제어하기 위해 스톱 로스를 설정한다.

전략 원칙

  1. 무작위적인 진동 지표를 계산하여 K선과 D선을 얻는다. K선과 D선의 변수들은 무작위적인 지표 주기, K값 평형, D값 평형, 과매구역과 과판구역 등으로 조정할 수 있다.

  2. 이동 평균을 계산합니다.

  3. 계산 무작위 지표 필터. K 라인이 50 이하의 일정 K 라인을 유지하면 필터 신호가 발생한다. 주기 조정할 수 있다.

  4. 다중 헤드 신호를 생성하는 조건: 무작위 지표가 오버 셀드 영역에서 상향으로 교차하거나 무작위 지표 필터 신호와 이동 평균 상향.

  5. 공백 신호를 생성하는 조건: 무작위 지표가 초상권에서 가로 아래로 또는 무작위 지표 필터 신호와 이동 평균이 아래로.

  6. 다중 평점 조건: 무작위 K 선에서 이동 평균을 가로질러 평균이 아래로 이동한다.

  7. 공평한 조건: 무작위 K 선 아래의 이동 평균을 가로질러 평균이 상향으로 이동한다.

  8. 포지션 관리는 고정자금 비율을 사용하며, 기본은 10%이며, 동시에 스톱로스를 설정하여, 기본은 2%입니다.

우위 분석

  1. 오버 바이 오버 세일과 트렌드 특성을 결합하면, 트렌드 속의 하락을 막아낼 수 있다.

  2. 무작위 지표 필터는 변동 시 자주 거래되는 것을 방지한다.

  3. 손해 방지 설정은 회수 제어에 도움이 됩니다.

  4. 코드 구조는 명확하고, 변수는 조정할 수 있으며, 추가적인 최적화에 적합하다.

위험 분석

  1. 무작위 지표는 다소 지연되어 가장 좋은 시가점을 놓칠 수 있습니다.

  2. 트렌드 전환점에서의 스크래치 정확도가 떨어지고, 스톱 로즈 빈도가 높을 수 있다.

  3. 고정 비율 자금 관리는 연속적인 손실의 경우 철회가 크다.

최적화 방향

  1. 더 많은 필터링 조건, 예를 들어 가격 행동, 다른 보조 지표와 같은 것을 도입하여 신호의 정확성을 향상시킵니다.

  2. 신호를 강하고 약하게 나누고, 강한 신호가 발생했을 때 포지션을 증가시킨다.

  3. 트렌드 전환점 판단을 최적화하여 더 많은 상황을 파악할 수 있습니다.

  4. 포지션 관리를 최적화하기 위해, 부동의 적자 대비 포지션 조정 등을 고려할 수 있다.

  5. 다양한 변수 조합을 시도해 최적의 변수를 찾아보세요.

요약하다

이 전략은 무작위 변동 지표의 기초에 따라 이동 평균과 결합하여 트렌드를 판단하고, 동시에 무작위 지표 자체의 필터 기능을 사용하며, 비교적 신뢰할 수 있는 거래 신호를 생성한다. 전략의 전체적인 생각은 명확하고, 트렌드 상황에서 사용하기에 적합하다. 그러나 무작위 지표의 지연성이 존재하기 때문에, 흐름의 전환점에서의 성능은 좋지 않을 수 있으며, 전체적인 적응성과 거친성은 추가 검토 후에 이루어질 것이다. 필터링 조건, 포지션 관리 파라미터, 수적 최적화 등의 측면에서 전략에 대한 개선을 계속할 수 있다.

전략 소스 코드
/*backtest
start: 2024-03-01 00:00:00
end: 2024-03-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Pablo_2uc

//@version=5
strategy("Estrategia Estocástico + MA con Stop Loss y Filtro Estocástico", overlay=true)

// Parámetros del Estocástico
length = input.int(14, title="Longitud Estocástico")
smoothK = input.int(3, title="Suavizado K")
smoothD = input.int(3, title="Suavizado D")
oversold = input.int(20, title="Sobreventa")
overbought = input.int(80, title="Sobrecompra")

// Parámetros de la Media Móvil
maLength = input.int(9, title="Longitud MA")
maSource = input(close, title="Fuente MA")

// Capital inicial
capital = 5000

// Tamaño de posición (10% del capital)
positionSize = capital * 0.10

// Stop Loss (2% del precio de entrada)
stopLossPercent = input.int(2, title="Stop Loss (%)") / 100

// Número de ruedas para el filtro estocástico
filterPeriods = input.int(12, title="Ruedas de Filtro Estocástico")

// Cálculo del Estocástico
k = ta.sma(ta.stoch(close, high, low, length), smoothK)
d = ta.sma(k, smoothD)

// Cálculo de la Media Móvil
ma = ta.sma(maSource, maLength)

// Filtro estocástico
stochasticFilter = ta.sma(k > 50 ? 1 : 0, filterPeriods)

// Condiciones de entrada en largo y corto
longCondition = (ta.crossunder(k, oversold) or ta.crossover(stochasticFilter, 1)) and ma > ma[1]
shortCondition = (ta.crossover(k, overbought) or ta.crossover(stochasticFilter, 1)) and ma < ma[1]

// Condiciones de salida
exitLongCondition = ta.crossover(k, ma) and ma < ma[1]
exitShortCondition = ta.crossunder(k, ma) and ma > ma[1]

// Estrategia
if (longCondition)
    strategy.entry("Long", strategy.long, qty=positionSize)
    strategy.exit("Exit Long", "Long", stop=close * (1 - stopLossPercent))
if (shortCondition)
    strategy.entry("Short", strategy.short, qty=positionSize)
    strategy.exit("Exit Short", "Short", stop=close * (1 + stopLossPercent))

// Cierre de posiciones
if (exitLongCondition)
    strategy.close("Long")
if (exitShortCondition)
    strategy.close("Short")