이동 평균 크로스오버 전략

저자:차오장, 날짜: 2023-10-24 16:39:40
태그:

img

전반적인 설명

이 전략은 이동평균 교차 원칙에 기반합니다. 단기 이동평균이 아래에서 장기 이동평균을 넘을 때 길게 가고, 단기 이동평균이 위에서 장기 이동평균을 넘을 때 짧게됩니다. 전략에 따른 전형적인 추세입니다.

전략 논리

이 전략은 주로 단기 및 장기 간 간단한 이동 평균을 계산하고, 그 교차에 기초하여 트렌드 방향을 결정합니다.

구체적으로, 먼저 단기 이동 평균 xMA와 단기 기간이 Len이고, 장기 기간은 2*Len인 장기 이동 평균을 계산합니다.

그 다음 단기 MA가 장기 MA를 넘어서고 크로스오버가 발생하면 긴 신호를 생성하는지 확인합니다. 또한 단기 MA가 장기 MA를 넘어서고 크로스오버가 발생하면 짧은 신호를 생성하는지 확인합니다.

긴 신호를 받으면, 지점이 없다면 시장 가격으로 긴 지위를 개척합니다. 짧은 신호를 받으면, 지점이 없다면 시장 가격으로 짧은 지위를 개척합니다.

또한, 스톱 로스 및 영업점도 구성되어 있습니다. 긴 트레이드를 위해, 스톱 로스는 엔트리 가격 - 스톱 로스 비율 * 엔트리 가격, 그리고 엔트리 가격 + 영업 비율 * 엔트리 가격에서 영업이 설정됩니다. 짧은 트레이드를 위해, 스톱 로스는 엔트리 가격 + 스톱 로스 비율 * 엔트리 가격, 그리고 엔트리 가격 - 영업 비율 * 엔트리 가격에서 영업이 설정됩니다.

마지막으로, 이동 평균은 트렌드 결정에 도움이되는 시각화를 위해 그래프화됩니다.

장점

  • 간단하고 이해하기 쉬운, 초보자에게 적합합니다.

  • 이동 평균 크로스오버를 기반으로 시장 동향을 효과적으로 추적 할 수 있습니다.

  • 위험은 스톱 로스를 설정하고 이윤을 취함으로써 통제됩니다.

  • 이동 평균의 시각화는 직관적으로 트렌드 변화를 반영합니다.

위험성

  • 이동 평균은 지연 효과를 가지고 있으며, 이는 최고의 입점점을 놓칠 수 있습니다.

  • 부적절한 스톱 손실 구성으로 인해 스톱이 너무 넓거나 너무 좁을 수 있습니다.

  • 가격 변동은 잘못된 신호를 유발할 수 있습니다.

  • 이동 평균 기간에만 기반을 둔 최적화는 과도한 적합성으로 이어질 수 있습니다.

이러한 위험은 느슨한 중지, 이동 평균 기간 조합을 최적화, 필터 지표 등을 사용하여 줄일 수 있습니다.

최적화 방향

  • 잘못된 신호를 피하기 위해 필터링을 위해 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')

더 많은