
이 전략은 이동 평균의 교차 원리에 기초하여, 단기 평균이 아래에서 장기 평균을 통과할 때 더하고, 단기 평균이 위쪽에서 아래에서 장기 평균을 통과할 때 공백을 씁니다.
이 전략은 주로 단기 및 장기 두 개의 간단한 이동 평균을 계산하여, 그들의 교차 상황에 따라 트렌드 방향을 판단한다.
구체적으로, 전략은 먼저 단기 평균 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')