이 전략은 주식에 대한 긴 및 짧은 포지션을 구현하기 위해 간단한 이동 평균의 황금 십자 및 죽음의 십자 원리를 사용합니다. 빠른 MA가 느린 MA를 넘을 때 길게, 빠른 MA가 느린 MA를 넘을 때 짧게됩니다.
이 전략은 먼저 백트테스팅 기간을 정의하고, 두 이동 평균에 대한 계산 매개 변수를 설정합니다.
getMAType (() 함수는 두 MAs의 값을 계산합니다. fastMA는 짧은 기간 MA이고 slowMA는 긴 기간 MA입니다.
핵심 논리:
fastMA가 slowMA를 넘으면 긴 신호가 발사됩니다.
fastMA가 slowMA를 넘으면 짧은 신호가 발사됩니다.
마지막으로, 백테스팅 중에, 긴 신호를 볼 때 긴 위치를 취하고, 짧은 신호를 볼 때 짧은 위치를 취하십시오.
위험에 대한 최적화 가능:
트렌드 식별을 위한 다른 기술적 지표들을 추가합니다.
거래당 손실 금액에 대한 제어값에 스톱 로스를 추가합니다.
부피 지표를 추가해서 윙사 시장을 피하세요.
최적의 파라미터 세트를 자동으로 찾기 위해 파라미터 최적화 메커니즘을 구축합니다.
이 전략은 다음 측면에서 더 이상 최적화 될 수 있습니다.
손실을 제어하기 위해 고정된 스톱 손실 포인트 또는 후속 스톱 손실과 같은 스톱 손실 전략을 추가하십시오.
거래 위험을 제어하기 위해 고정 또는 동적 위치 사이징과 같은 포지션 사이징 전략을 추가하십시오.
다른 기술 지표와 결합하여 필터를 추가하여 트렌드를 식별하고 승률을 향상시킵니다.
최적의 값을 찾기 위해 그리드 검색과 선형 회귀와 같은 방법을 통해 매개 변수를 최적화합니다.
브레이크아웃 철수와 같은 진입 전략을 확장하고, 거래 전술을 풍요롭게 하기 위해 주문을 확장합니다.
부피 지표를 추가해서 윙사 시장을 피하세요.
주식 지수, 외환, 암호화폐 등으로 제품을 확장합니다.
이 전략은 MA 크로스오버 원리에 기반한 긴/단 주식 선택을 구현한다. 전략 아이디어는 간단하고 명확하고 널리 사용되고, 매우 적응 가능하며, 실질적으로 가치있다. 그러나 그것은 또한 일부 후퇴 및 윙사 필터링 문제를 가지고 있다. 미래 최적화는 더 유리하게 만들기 위해 스톱 손실, 매개 변수 최적화, 필터 등을 추가하는 것을 개선하는 데 초점을 맞출 수 있다.
/*backtest start: 2023-09-10 00:00:00 end: 2023-10-10 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 //strategy("Golden X BF Strategy", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.0) /////////////// Time Frame /////////////// testStartYear = input(2010, "Backtest Start Year") testStartMonth = input(1, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0) testStopYear = input(2019, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(31, "Backtest Stop Day") testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0) testPeriod() => true ///////////// MA Params ///////////// source1 = input(title="MA Source 1", defval=close) maType1 = input(title="MA Type 1", defval="sma", options=["sma", "ema", "swma", "wma"]) length1 = input(title="MA Length 1", defval=50) source2 = input(title="MA Source 2", defval=close) maType2 = input(title="MA Type 2", defval="sma", options=["sma", "ema", "swma", "wma"]) length2 = input(title="MA Length 2", defval=200) ///////////// Get MA Function ///////////// getMAType(maType, sourceType, maLen) => res = sma(close, 1) if maType == "ema" res := ema(sourceType, maLen) if maType == "sma" res := sma(sourceType, maLen) if maType == "swma" res := swma(sourceType) if maType == "wma" res := wma(sourceType, maLen) res ///////////// MA ///////////// fastMA = getMAType(maType1, source1, length1) slowMA = getMAType(maType2, source2, length2) long = crossover(fastMA, slowMA) short = crossunder(fastMA, slowMA) /////////////// Plotting /////////////// checkColor() => fastMA > slowMA colCheck = checkColor() ? color.lime : color.red p1 = plot(fastMA, color = colCheck, linewidth=1) p2 = plot(slowMA, color = colCheck, linewidth=1) fill(p1, p2, color = checkColor() ? color.lime : color.red) bgcolor(long ? color.lime : short ? color.red : na, transp=20) /////////////// Execution /////////////// if testPeriod() strategy.entry("Long", strategy.long, when=long) strategy.entry("Short", strategy.short, when=short)