구성 가능한 다중 이동 평균 투표 거래 전략


생성 날짜: 2023-09-23 15:52:06 마지막으로 수정됨: 2023-09-23 15:52:06
복사: 2 클릭수: 646
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

개요

이 전략은 구성하여 여러 개의 급속도 평행선 조합을 설정하여, 모든 급속도로 느린 선을 통과 할 때 더 많은 것을 수행합니다. 적어도 한 개의 급속도로 느린 선을 통과 할 때 평평합니다. 이 전략은 여러 개의 평행선의 장점을 최대한 활용하여 강력한 포지션 결정 시스템을 형성합니다.

전략 원칙

이 전략의 주요 구성 요소와 규칙은 다음과 같습니다.

  1. 다중 그룹 급속도 평균: SMA, WMA, VWMA 등 다양한 평균 지표를 사용한다.

  2. 신호를 더하는 것: 모든 빠른 선에서 느린 선을 통과할 때 더하는 것.

  3. 평지 신호: 어떤 빠른 선 아래 느린 선을 통과할 때 평지.

  4. 정지 손실: ATR 값으로 고정 정지 손실을 설정한다.

  5. 구성: 여러 그룹 평균선 변수를 유연하게 구성할 수 있다.

다중평균선 조합 입지 투표 방식으로 진출하여 신호의 신뢰성을 효과적으로 강화할 수 있다. 여러평균선 파라미터를 사용자 정의할 수 있으며, 유연성을 갖는다.

우위 분석

단일 평행 전략에 비해 이 전략은 다음과 같은 장점이 있다:

  1. 다중평균선 조합은 좀 더 포괄적인 추세 판단을 제공합니다.

  2. 투표 방식은 잡음 거래에 대한 오해를 방지하기 위한 것이다.

  3. 자유로이 구성할 수 있는 각 평균선 변수, 최적화 공간은 넓다.

  4. 다양한 평균선 지표를 지원하고, 사용의 융통성.

  5. 단편적 손실을 제어할 수 있는 스톱 스톱 손실 지점을 설정한다.

  6. 더 긴 주기 사용은 효과가 더 좋으며, 곡선 흔들림을 줄일 수 있다.

  7. 계산은 간단하고 직관적이며, 구현과 조작이 쉽습니다.

  8. 전체적으로, 단일 평균선보다 안정성과 지속성이 더 좋다.

위험 분석

그러나 이 전략에는 위험도 있습니다.

  1. 다중평균선은 전략의 복잡성을 높여줍니다.

  2. 너무 최적화 될 위험이 있습니다.

  3. 평균선은 본질적으로 트렌드 변화에 대한 지연 인식이 있다.

  4. 거래량이 고려되지 않은 채로, 매매가 이루어질 수 있습니다.

  5. 스톱 스톱 손실 설정은 임의로 설정되어 불필요한 평점을 초래할 수 있습니다.

  6. 시장 환경의 변화에 따라 그 효과는 변동합니다.

  7. 수익 회수율에 주의를 기울여 곡선이 너무 커지지 않도록 해야 합니다.

  8. 여러 품종에서 안정성을 검사해야 합니다.

최적화 방향

위와 같은 분석을 바탕으로, 이 전략은 다음과 같은 측면에서 강화될 수 있습니다.

  1. 테스트 평균선 파라미터는 다양한 품종에서 체력성을 테스트한다.

  2. 거래량이나 변동률을 확인하는 것

  3. 스티드 스탠드 로즈 파라미터를 최적화한다.

  4. 최대 철수 허용을 설정합니다.

  5. 동적 포지션 관리 메커니즘을 구축한다.

  6. 머신러닝을 도입하는 효과에 대한 평가

  7. 최대 인출과 수익 곡선의 집중에 주의하십시오.

  8. 반복적인 전략으로 과잉 최적화를 방지합니다.

요약하다

이 전략은 구성으로 다중평균선 포트폴리오를 설정하여 보다 안정적인 포지션 보유 의사결정 메커니즘을 형성한다. 그러나 모든 전략은 과도한 적합성을 방지하고 시장 환경에 따라 동적으로 조정해야 한다. 지속적인 최적화 테스트, 정량화 전략만이 장기적으로 시장에 적합할 수 있다.

전략 소스 코드
/*backtest
start: 2022-09-16 00:00:00
end: 2023-09-22 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/
// © levieux

//@version=5
strategy(title='Configurable Multi MA Crossover Voting System', shorttitle='Configurable Multi MA Crossover Voting System', initial_capital=1000, overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.1)
crossoverConfig= input.string(defval="2x4,3x5,4x6", title="Crossover Config")
source= input.source(high)
maType= input.string("WMA", title="Moving Average Type", options=["WMA","SMA","VWMA"])
atrPeriod= input(14, title="ATR Period")
profitAtr = input(10, title="Profit ATR x")
lossAtr = input(5, title="Loss ATR x")


ma(src,length,type) => 
    float ma = switch type
	    "SMA" => ta.sma(src, length)
	    "WMA" => ta.wma(src, length)
	    "VWMA" => ta.vwma(src, length)

crossoverGroups= str.split(crossoverConfig, ",")
crossoverCount= array.size(crossoverGroups)
crossovers= array.new_string(crossoverCount)
positions= array.new_int(crossoverCount, 0)
longVotes= 0
for i= 0 to crossoverCount-1
    crossover= str.tostring(array.get(crossoverGroups, i))
    crossoverBoundaries= str.split(crossover, "x")
    int fastLength= math.round(str.tonumber(array.get(crossoverBoundaries, 0)))
    int slowLength= math.round(str.tonumber(array.get(crossoverBoundaries, 1)))
    wmaFast= ma(source,fastLength,maType)
    wmaSlow= ma(source,slowLength,maType)
    if wmaFast>wmaSlow
        longVotes:= longVotes + 1
        array.set(positions, i, 1)

longCondition= longVotes==crossoverCount and strategy.position_size==0


//profitTicks = profitAtr*ta.atr(atrPeriod)/syminfo.mintick
//lossTicks = lossAtr*ta.atr(atrPeriod)/syminfo.mintick
profitPrice= close+profitAtr*ta.atr(atrPeriod)
lossPrice= close-lossAtr*ta.atr(atrPeriod)

if strategy.position_size>0
    profitPrice:= profitPrice[1]
    lossPrice:= lossPrice[1]

plot(profitPrice, color=color.green)
plot(lossPrice, color=color.red)

if longCondition and profitPrice>0
    strategy.entry("Long", strategy.long)

if longVotes<crossoverCount and strategy.position_size>0 and (high>profitPrice or low<lossPrice)
    strategy.close("Long")
    
longVotes:= 0