이중 이동 평균 교차 거래 전략을 기반으로


생성 날짜: 2023-11-27 15:32:57 마지막으로 수정됨: 2023-11-27 15:32:57
복사: 1 클릭수: 613
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

이중 이동 평균 교차 거래 전략을 기반으로

개요

이 전략은 두 개의 다른 변수 세트의 이동 평균의 교차에 기초하여 구매 및 판매 신호를 발송합니다. 더 짧은 주기 이동 평균이 아래쪽에서 더 긴 주기 이동 평균을 돌파 할 때 구매 신호를 발송합니다. 더 짧은 주기 이동 평균이 위쪽에서 더 긴 주기 이동 평균을 돌파 할 때 판매 신호를 발송합니다.

전략 원칙

이 전략은 파인 스크립트 언어를 사용하여 작성되었다. 우선, 입력으로 두 개의 이동 평균의 유형, 길이 및 가격 출처를 정의하고, 각각 p1 및 p2로 명명했다. 이 중 p1은 짧은 기간의 평균을 나타내고, p2는 더 긴 기간의 평균을 나타냅니다.

크로스 오버와 크로스 언더 함수를 통해 두 평행선의 교차 상황을 판단한다. p1이 아래쪽에서 p2를 돌파하면 구매 신호를 발신한다. p1이 위쪽에서 p2를 돌파하면 판매 신호를 발신한다.

거래를 수행하기 위해, 전략은 strategy.entry 함수를 통해 신호를 발송할 때 다단계 또는 빈단계 포지션을 구축한다. shortOnly 파라미터가 활성화되면 거래만 신호를 판매한다.

우위 분석

이 전략은 다음과 같은 장점을 가지고 있습니다.

  1. 규칙은 명확하고 이해하기 쉽고 실행이 가능합니다.
  2. 평행선 교차는 고전적이고 널리 알려진 거래 신호입니다.
  3. 고도로 사용자 정의 할 수 있는 평균선 유형, 길이 및 가격 소스
  4. 거래는 신호를 팔고 거래의 빈도를 낮출 수 있습니다.

위험 분석

이 전략에는 몇 가지 위험도 있습니다.

  1. 불안정한 상황에서는 평행선이 여러 번 무효적으로 교차하여 과도한 거래로 이어질 수 있습니다.
  2. 다양한 품종과 거래 주기에 맞게 최적화해야 하는 매개 변수
  3. 트렌드 방향은 알 수 없고, 역동성이 발생할 수 있습니다.

평균선 길이를 조정하고 필터 조건을 도입하는 등의 방법으로 무효 신호를 줄일 수 있다. 또한 트렌드 지표와 결합하여 대장 움직임을 판단할 수 있다.

최적화 방향

이 전략은 다음과 같은 부분에서 최적화될 수 있습니다.

  1. 크로스 신호의 신뢰성을 높이기 위해 가격 원천으로 볼륨 가중 평균 또는 전형적인 가격을 도입

  2. 검증 기간을 늘려서 짧은 기간의 오류를 방지할 수 있습니다.

  3. ATR을 포함해서 시장의 변동에 따라 최대 손실을 설정합니다.

  4. 곡선 적합 최적화 변수를 사용하여 최적의 변수 조합을 찾습니다.

  5. 대주기 트렌드가 일치할 때 거래 신호를 고려하십시오.

요약하다

이 쌍평선 교차 전략은 전체적으로 이해하기 쉽고 구현할 수 있으며, 두 평선의 교차로 거래 신호를 형성하여 고도로 사용자 정의할 수 있다. 그러나 또한 충격적인 상황에서 더 많은 무효 신호를 생성할 수도 있다. 매개 변수 최적화와 규칙 최적화를 통해 위험을 줄일 수 있으며, 그 최적화 공간은 더 많은 연구 가치가 있다.

전략 소스 코드
/*backtest
start: 2022-11-20 00:00:00
end: 2023-11-26 00:00:00
period: 1d
basePeriod: 1h
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/
// © RafaelPiccolo

//@version=4
strategy("Double MA Cross", overlay=true)

type1 = input("SMA", "MA Type 1", options=["SMA", "EMA", "WMA", "HMA", "VWMA", "RMA", "TEMA"])
len1 = input(10, minval=1, title="Length 1")
src1 = input(close, "Source 1", type=input.source)

type2 = input("SMA", "MA Type 2", options=["SMA", "EMA", "WMA", "HMA", "VWMA", "RMA", "TEMA"])
len2 = input(50, minval=2, title="Length 2")
src2 = input(close, "Source 2", type=input.source)

shortOnly = input(false, "Short only")

tema(src, len)=>
    ema1 = ema(src, len)
    ema2 = ema(ema1, len)
    ema3 = ema(ema2, len)
    return = 3 * (ema1 - ema2) + ema3

getPoint(type, len, src)=>
    return = type == "SMA" ? sma(src, len) : type == "EMA" ? ema(src, len) : type == "WMA" ? wma(src, len) : type == "HMA" ? hma(src, len) : type == "VWMA" ? vwma(src, len) : type == "RMA" ? rma(src, len) : tema(src, len)

p1 = getPoint(type1, len1, src1)
p2 = getPoint(type2, len2, src2)

shortCondition = crossunder(p1, p2)
longCondition = crossover(p1, p2)

if (shortCondition)
    strategy.entry("Short", strategy.short)

if (longCondition)
    if (shortOnly)
        strategy.close("Short")
    else
        strategy.entry("Long", strategy.long)

plot(p1, "MA 1", p1 < p2 ? color.red : color.green)
plot(p2, "MA 2", color.blue)