이동평균 크로스오버 전략은 매우 일반적인 수치적 거래 전략이다. 이동평균의 황금 십자가와 죽음의 십자가를 사용하여 트렌드와 수익을 결정한다. 단기 이동평균이 장기 이동평균을 넘을 때 상승세를 알리고 긴 포지션을 취할 수 있다. 단기 이동평균이 장기 이동평균을 넘을 때 하락세를 알리고 짧은 포지션을 취할 수 있다.
이 전략은 입력 및 출구 지점을 결정하기 위해 이동 평균의 황금 십자 및 죽음의 십자에 기반합니다. 코드는 두 개의 부울 입력 매개 변수를 사용합니다.upOrDown
그리고longOrShort
장기 또는 단기 결정percentInput
가격 변화의 기준 비율을 정하는 것closePositionDays
포지션을 보유할 수 있는 날 수를 설정합니다.
핵심 논리는: 어제와 비교하여 오늘의 증가/감소를 계산합니다. 입력 임계 비율에 도달하면 거래 신호가 활성화됩니다. 긴 신호라면, 어제와 비교하여 오늘의 가격이 임계보다 증가하면, 긴 신호입니다. 짧은 신호라면, 어제와 비교하여 오늘의 가격이 임계보다 감소하면, 짧은 신호입니다.
긴 / 짧은 후에, 입점 날과 다음 4 일 차트에서 색으로 표시됩니다. 포지션은 4 일 후에 자동으로 닫을 것입니다.
위험 관리
이동평균 크로스오버 전략은 매우 간단하고 실용적인 양적 거래 전략이다. 단기 및 장기적인 트렌드 사이의 관계를 판단함으로써 자산 가격의 트렌딩 성격으로부터 이익을 얻는다. 이 전략은 명확한 논리로 구현하기 쉽고 많은 양적 거래 전략의 기초를 형성한다. 우리는 매개 변수 조정 및 최적화를 통해 더 나은 성능을 얻을 수 있다. 그러나 우리는 또한 위험을 관리하고 오용을 피해야 한다.
/*backtest start: 2023-01-01 00:00:00 end: 2023-10-11 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 // Created by Leon Ross strategy(title = "DaysAfterCertainPercentChangev1", shorttitle = "DACPCv1", overlay = true, pyramiding = 0, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, calc_on_every_tick=true, initial_capital=100000) //Inputs longOrShort = input(title="Long=Checked Short=Unchecked", type=bool, defval=true) //long=true, down=false upOrDown = input(title="Direction of Today vs. Previous day: Up=Checked Down=Unchecked", type=bool, defval=true) //up=true, down=false: this is the direction of days vs previous day percentInput = input(title="Percent", type=float, defval=4.5) closePositionDays = input(title="How Many Days to Close Position", defval=4) //Conditions //percentUpValue = (close / close[1]) - 1 //percentUp = percentUpValue >= (percentInput/100.0) //upConditions = percentUp //percentDownValue = 1- (close / close[1]) //percentDown = percentDownValue >= (percentInput/100.0) //downConditions = percentDown upValue = (close / close[1]) - 1 downValue = 1 - (close / close[1]) allConditions = if(upOrDown) upValue >= (percentInput/100.0) else downValue >= (percentInput/100.0) //Plots bgcolor(allConditions ? (upOrDown ? green : red) : na, transp=70) bgcolor(allConditions ? silver : na, transp=70, offset=1) bgcolor(allConditions ? silver : na, transp=70, offset=2) bgcolor(allConditions ? silver : na, transp=70, offset=3) bgcolor(allConditions ? silver : na, transp=70, offset=4) //bgcolor(downConditions == 1 ? red : na, transp=70) //bgcolor(downConditions == 1 ? silver : na, transp=70, offset=1) //bgcolor(downConditions == 1 ? silver : na, transp=70, offset=2) //bgcolor(downConditions == 1 ? silver : na, transp=70, offset=3) //bgcolor(downConditions == 1 ? silver : na, transp=70, offset=4) //Entires if(longOrShort) strategy.entry(id = "Long", long = true, when = allConditions) else strategy.entry(id = "Short", long = false, when = allConditions) //Exits if (barssince(allConditions) == closePositionDays) if(longOrShort) strategy.close("Long") else strategy.close("Short")