이 전략은 장기적인 트렌드를 따르는 양적 전략을 위해 이동 평균 및 거래량 기술 지표에 기초하여 설계되었습니다. 종료 가격이 20 일 이동 평균 라인 이상이며 하루의 구매 부피가 지난 n 일 동안 판매 부피와 평균 거래 부피보다 크면 시장은 상승 상태에 있다고 간주되며 구매 할 때입니다. 종료 가격이 하부 레일 아래로 넘어가고 하루의 판매 부피가 지난 n 일 동안 구매 부피와 평균 거래 부피보다 크면 시장은 하향 상태에 있다고 간주되며 판매 할 때입니다.
이 전략은 주로 판단을 위한 두 가지 지표에 기초합니다.
이중 이동 평균 라인: 20일 라인과 60일 라인을 계산합니다. 20일 라인이 60일 라인의 위를 넘으면 시장이 상승 추세로 간주됩니다. 20일 라인이 60일 라인의 아래를 넘으면 시장이 하락 추세로 간주됩니다.
거래 부피: 일일 구매 부피와 판매 부피를 계산합니다. 구매 부피가 판매 부피보다 크고 지난 n 일 동안 평균 거래 부피보다 크면 시장이 상승세를 보이는 것으로 결정됩니다. 판매 부피가 구매 부피보다 크고 지난 n 일 동안 평균 거래 부피보다 크면 시장이 하락세를 보이는 것으로 결정됩니다.
구체적인 거래 전략과 논리는 다음과 같습니다.
장기간 거래: 폐쇄 가격이 20 일 이동 평균 라인 이상이며 하루 구매 부피가 판매 부피와 지난 n 일 동안 평균 거래 부피보다 크면 시장은 상승세를 보이는 것으로 간주됩니다. 변동성을 기반으로 볼링거 밴드를 계산하십시오. 폐쇄 가격이 볼링거 밴드의 중간선과 하부 레일 사이에있는 경우 장기간 거래하십시오.
쇼트: 닫기 가격이 하부 레일 아래로 넘어가고 하루의 판매 부피가 구매 부피와 지난 n 일 동안의 평균 거래 부피보다 크면 시장은 하향적이라고 간주됩니다. 변동성에 따라 볼링거 밴드를 계산하십시오. 닫기 가격이 볼링거 밴드의 하부 레일 아래로 떨어지면 쇼트하십시오.
이윤 취득 및 스톱 로스: 이윤을 확보하거나 손실을 줄이기 위해 합리적인 이윤 취득 및 스톱 로스 수준을 설정하십시오. 예를 들어, 가격이 입시 가격보다 5% 상승하면 이익을 취득하십시오. 손실이 10%에 도달하면 손실을 중지하십시오. 또는 가격이 최근에 새로운 최고치를 달성하고 어느 정도 물러나면 이익을 취득하십시오.
이 전략은 다음과 같은 장점을 가지고 있습니다.
이중 이동평균선과 거래량 지표의 조합은 단일 기술 지표 판단의 맹점을 피합니다.
다른 매개 변수를 가진 볼링거 밴드를 사용하면 보다 정확한 입시 가격을 결정합니다.
이윤을 취하고 손해를 막는 전략은 합리적이어서 이윤을 확보하고 위험을 통제할 수 있습니다.
좋은 백테스팅 결과로 안정적인 수익이 나오고, 실제로 양적 거래에 적용될 수 있습니다.
이 전략은 또한 몇 가지 위험을 안고 있습니다.
이중 이동 평균 전략은 잘못된 신호를 생성하는 경향이 있으며 볼륨 지표에 의해 필터링되어야합니다.
부적절한 볼링거 밴드 매개 변수 설정은 너무 빈번하거나 희박한 항목으로 이어질 수 있습니다.
부적절한 고정 수익 취득 및 중단 손실 포인트는 전략 수익에 영향을 줄 수 있습니다.
백테스팅을 위해서는 많은 양의 역사 데이터가 필요하고 실시간 거래에서 예상치 못한 손실이 발생할 수 있습니다.
이 전략은 다음과 같은 측면에서 최적화 될 수 있습니다.
최적의 이동 평균 조합을 찾기 위해 이동 평균 시스템의 매개 변수를 최적화합니다.
더 정확한 입력을 위해 볼링거 밴드 매개 변수를 최적화하십시오.
시장 조건에 따라 수익을 취하고 손실을 멈추는 지점을 동적으로 조정하여 합리적인 위험/이익 비율을 설정합니다.
전략의 정확성을 향상시키기 위해 MACD, KD 등과 같은 다른 기술 지표에 대한 판단을 높일 수 있습니다.
기계 학습 방법을 사용하여 자동으로 최적의 매개 변수를 찾아 전략을 더 견고하게 만듭니다.
전체적으로, 이것은 좋은 백테스팅 성능을 가진 매우 실용적인 양적 거래 전략입니다. 그것은 실행하기 쉽고 통제 가능한 위험과 함께 실시간 거래에 적합한 안정적인 전략입니다. 양적 거래자에게는 배울 가치가 있습니다. 물론, 여전히 전략 최적화에 많은 공간이 있으며, 더 많은 양적 거래 전문가들이 개선하기를 기대합니다.
/*backtest start: 2023-12-21 00:00:00 end: 2023-12-28 00:00:00 period: 1m basePeriod: 1m 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/ // © KAIST291 //@version=4 strategy("prototype",initial_capital=0.01,commission_type=strategy.commission.percent,commission_value=0.1, format=format.volume, precision=0,overlay=true) // SETTING // length1=input(1) length3=input(3) length7=input(7) length14=input(14) length20=input(20) length60=input(60) length120=input(120) ma1= sma(close,length1) ma3= sma(close,length3) ma7= sma(close,length7) ma14=sma(close,length14) ma20=sma(close,length20) ma60=sma(close,length60) ma120=sma(close,length120) rsi=rsi(close,14) // BUYING VOLUME AND SELLING VOLUME // BV = iff( (high==low), 0, volume*(close-low)/(high-low)) SV = iff( (high==low), 0, volume*(high-close)/(high-low)) vol = iff(volume > 0, volume, 1) dailyLength = input(title = "Daily MA length", type = input.integer, defval = 50, minval = 1, maxval = 100) weeklyLength = input(title = "Weekly MA length", type = input.integer, defval = 10, minval = 1, maxval = 100) //----------------------------------------------------------- Davgvol = sma(volume, dailyLength) Wavgvol = sma(volume, weeklyLength) //----------------------------------------------------------- length = input(20, minval=1) src = input(close, title="Source") mult = input(2.0, minval=0.001, maxval=50, title="StdDev") mult2= input(1.5, minval=0.001, maxval=50, title="exp") mult3= input(1.0, minval=0.001, maxval=50, title="exp1") basis = sma(src, length) dev = mult * stdev(src, length) upper = basis + dev lower = basis - dev dev2= mult2 * stdev(src, length) Supper= basis + dev2 Slower= basis - dev2 dev3= mult3 * stdev(src, length) upper1= basis + dev3 lower1= basis - dev3 offset = input(0, "Offset", type = input.integer, minval = -500, maxval = 500) plot(basis, "Basis", color=#FF6D00, offset = offset) p1 = plot(upper, "Upper", color=#2962FF, offset = offset) p2 = plot(lower, "Lower", color=#2962FF, offset = offset) fill(p1, p2, title = "Background", color=color.rgb(33, 150, 243, 95)) //---------------------------------------------------- exit=(close-strategy.position_avg_price / strategy.position_avg_price*100) bull=(close>Supper and BV>SV and BV>Davgvol) bull2=(close>ma20 and BV>SV and BV>Davgvol) bux =(close<Supper and close>Slower and volume<Wavgvol) bear=(close<Slower and close<lower and SV>BV and SV>Wavgvol) hi=highest(exit,10) imInATrade = strategy.position_size != 0 highestPriceAfterEntry = valuewhen(imInATrade, high, 0) // STRATEGY LONG // if (bull and close>ma3 and ma20>ma60 and rsi<70) strategy.entry("Long",strategy.long,0.1) if (strategy.position_avg_price*1.05<close) strategy.close("Long",0.1) else if (highestPriceAfterEntry*0.999<close and close>strategy.position_avg_price*1.002) strategy.close("Long",0.1) else if (highestPriceAfterEntry*0.997<close and close>strategy.position_avg_price*1.002) strategy.close("Long",0.1) else if (highestPriceAfterEntry*0.995<close and close>strategy.position_avg_price*1.002) strategy.close("Long",0.1) else if (strategy.openprofit < strategy.position_avg_price*0.9-close) strategy.close("Long",0.1) ////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////