이동평균 교차 전략


생성 날짜: 2023-10-24 16:39:40 마지막으로 수정됨: 2023-10-24 16:39:40
복사: 0 클릭수: 671
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

이동평균 교차 전략

개요

이 전략은 이동 평균의 교차 원리에 기초하여, 단기 평균이 아래에서 장기 평균을 통과할 때 더하고, 단기 평균이 위쪽에서 아래에서 장기 평균을 통과할 때 공백을 씁니다.

전략 원칙

이 전략은 주로 단기 및 장기 두 개의 간단한 이동 평균을 계산하여, 그들의 교차 상황에 따라 트렌드 방향을 판단한다.

구체적으로, 전략은 먼저 단기 평균 xMA와 장기 평균 xMA를 계산합니다. 단기 평균 길이는 Len이고 장기 평균 길이는 2입니다.*Len。

그 다음 전략은 단기 평균선이 장기 평균선을 뚫고 올라가는지 여부를 판단하고, 뚫고 올라가면 더 많은 신호를 생성한다. 단기 평균선이 장기 평균선을 뚫고 내려가는지 여부를 판단하고, 뚫고 내려가면 공백 신호를 생성한다.

더 많이 할 수 있는 신호를 받은 후, 현재 포지션이 없다면, 시장 가격으로 포지션을 더 많이 한다. 더 적은 가격의 신호를 받은 후, 현재 포지션이 없다면, 시장 가격으로 포지션을 더 많이 한다.

또한, 전략은 또한 중지 중지 지점을 설정합니다. 추가로 중지 가격을 설정합니다. 출입 가격 - 중지 손실 비율*입점 가격, 매각 가격 = 입점 가격 + 매각 가격 %*입시 가격; 코카이즈 후의 스톱 로스 값은 입시 가격 + 스톱 로스 비율로 설정*입점 가격, 입점 가격으로 정지 가격 - 정지 가격 비율*입장료

마지막으로, 전략은 동선 시각화 곡선을 출력하여 추세를 판단하는 데 도움을 줍니다.

전략적 이점

  • 이 아이디어는 간단하고 명확하며, 이해하기 쉽고, 새로운 학습자에게 적합합니다.

  • 이동 평균을 기반으로 추세 방향을 판단하여 시장 추세를 효과적으로 추적할 수 있습니다.

  • 위험성을 조절할 수 있는 손해 중지 지점을 설정합니다.

  • 동선 곡선을 시각적으로 보여주고, 트렌드 변화를 직관적으로 반영한다.

전략적 위험

  • 평균선에는 지연성이 있어 최고의 출전 시점을 놓칠 위험이 있다.

  • 불합리한 스톱포인트 설정으로 인해 스톱포인트가 지나치게 완만하거나 지나치게 엄격할 수 있습니다.

  • 주가가 급격하게 변동할 때, 평행선이 잘못된 신호를 일으킬 수 있다.

  • 평균선 주기 변수만 기반으로 변수를 최적화하면 과일접합을 초래할 수 있다.

이러한 위험을 줄이는 데는 적절한 완화 스톱 손실, 평형 주기 파라미터 조합의 최적화, 다른 지표 필터링을 추가하는 것이 필요합니다.

전략 최적화 방향

  • MACD, KDJ 등과 같은 다른 지표들을 필터링하기 위해 추가하여, 일률적 오차가 잘못된 신호를 발생하지 않도록 한다.

  • 단기 평균선과 장기 평균선 길이를 다중 조합으로 최적화하여 최적의 변수 조합을 찾습니다.

  • 말이나 움직임으로 막는 것과 같은 다양한 상쇄 전략을 테스트하는 것

  • 포지션 관리 모듈을 추가하여 자금 사용 효율을 최적화합니다.

요약하다

이 전략의 전체적인 아이디어는 명확하고 간결하며, 평평선 교차 판단 트렌드 방향에 기초하여, 트렌드를 효과적으로 추적할 수 있으며, 위험도 조절할 수 있으며, 초보자 학습 참고에 적합하다. 그러나 평평선에만 의존하면 잘못된 신호가 발생할 수 있으며, 최적화 공간은 여전히 넓으며, 여러 측면에서 최적화 개선이 가능하며, 전략을 더 안정적이고 신뢰할 수 있게 한다.

전략 소스 코드
/*backtest
start: 2023-09-23 00:00:00
end: 2023-10-23 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
//@strategy_alert_message {{strategy.order.alert_message}} 
////////////////////////////////////////////////////////////
//  Copyright by HPotter v2.0 19/09/2023
// MA Crossover Bot for OKX Exchange
////////////////////////////////////////////////////////////
var ALERTGRP_CRED = "entry"
signalToken = input("", "Signal Token", inline = "11", group = ALERTGRP_CRED)
OrderType = input.string("market", "Order Type", options = ["market", "limit"], inline = "21", group = ALERTGRP_CRED)
OrderPriceOffset = input.float(0, "Order Price Offset", minval = 0, maxval = 100, step = 0.01, inline = "21", group = ALERTGRP_CRED)
InvestmentType = input.string("percentage_balance", "Investment Type", options = ["margin", "contract", "percentage_balance", "percentage_investment"], inline = "31", group = ALERTGRP_CRED)
Amount = input.float(100, "Amount", minval = 0.01, inline = "31", group = ALERTGRP_CRED)

getAlertMsg(action, instrument, signalToken, orderType, orderPriceOffset, investmentType, amount) =>
    str = '{'
    str := str + '"action": "' + action + '", '
    str := str + '"instrument": "' + instrument + '", '
    str := str + '"signalToken": "' + signalToken + '", '
    //str := str + '"timestamp": "' + str.format_time(timenow, "yyyy-MM-dd'T'HH:mm:ssZ", "UTC+0") + '", '
    str := str + '"timestamp": "' + '{{timenow}}' + '", '
    str := str + '"orderType": "' + orderType + '", '
    str := str + '"orderPriceOffset": "' + str.tostring(orderPriceOffset) + '", '
    str := str + '"investmentType": "' + investmentType + '", '
    str := str + '"amount": "' + str.tostring(amount) + '"'
    str := str + '}'
    str

getOrderAlertMsgExit(action, instrument, signalToken) =>
    str = '{'
    str := str + '"action": "' + action + '", '
    str := str + '"instrument": "' + instrument + '", '
    str := str + '"signalToken": "' + signalToken + '", '
    str := str + '"timestamp": "' + '{{timenow}}' + '", '
    str := str + '}'
    str

strategy(title='OKX: MA Crossover', overlay=true)
Len = input(13)
Profit = input.float(7, title='Take Profit %', minval=0.01) / 100
Stop =  input.float(7, title='Stop Loss %', minval=0.01) / 100
xMA = ta.sma(close, Len)
//Robot State
isLong = strategy.position_size > 0 
isShort = strategy.position_size < 0 
isFlat = strategy.position_size == 0 
//Current Signal
doLong = low < xMA[1] ? true : false
doShort =   high > xMA[1] ? true:  false
//Backtest Start Date
tm =  timestamp(2022, 01, 01, 09, 30)
//Entry and exit orders
if  doLong[2] == false and isLong == false and doLong and time > tm
    strategy.cancel_all()
    buyAlertMsgExit = getOrderAlertMsgExit(action = 'EXIT_LONG', instrument = syminfo.ticker, signalToken = signalToken)
    buyAlertMsg = getAlertMsg(action = 'ENTER_LONG', instrument = syminfo.ticker, signalToken = signalToken, orderType =  OrderType, orderPriceOffset =  OrderPriceOffset, investmentType =  InvestmentType, amount = Amount)
    strategy.entry('Long', strategy.long, limit = close, comment='Long', alert_message =buyAlertMsg)
    strategy.exit("ExitLong", 'Long', stop=close - close * Stop  , limit = close + close * Profit , qty_percent = 100, alert_message = buyAlertMsgExit)  
if doShort[2] == false and isShort == false and doShort and time > tm
    strategy.cancel_all()
    sellAlertMsgExit = getOrderAlertMsgExit(action = 'EXIT_SHORT', instrument = syminfo.ticker, signalToken = signalToken)
    sellAlertMsg = getAlertMsg(action = 'ENTER_SHORT', instrument = syminfo.ticker, signalToken = signalToken, orderType =  OrderType, orderPriceOffset =  OrderPriceOffset, investmentType =  InvestmentType, amount = Amount)
    strategy.entry('Short', strategy.short, limit=close, comment='Short', alert_message = sellAlertMsg)
    strategy.exit("ExitShort", 'Short', stop=close + close * Stop  , limit = close - close * Profit  , qty_percent = 100, alert_message = sellAlertMsgExit)  
//Visual
barcolor(isShort  ? color.red : isLong ? color.green : color.blue)
plot(xMA, color=color.new(color.red, 0), title='MA')