양평선 교차 거래 전략은 두 개의 다른 파라미터 설치를 계산한 평균선을 계산하고 평균선의 교차를 통해 구매 및 판매 작업을 수행한다. 이 전략은 간단하고 직접적이며 중장기 거래에 적합하다.
이 전략은 주로 빠른 평균선 주기, 느린 평균선 주기, 평균선 유형과 같은 파라미터를 입력하여 빠른 평균선과 느린 평균선을 계산한다. 빠른 평균선 상에서 느린 평균선을 통과할 때 구매를 하고, 빠른 평균선 아래에서 느린 평균선을 통과할 때 판매를 한다.
이 전략의 핵심 논리는 다음과 같습니다.
입력 매개 변수: 빠른 평균 선주기 maLen1, 느린 평균 선주기 maLen2, 평균 선형 maTypeChoice
입력 변수에 따라 계산된 빠른 평균선 maValue1과 느린 평균선 maValue2
두 개의 평선 크기의 관계를 비교하여 구매 및 판매 조건을 정의합니다:
구매 조건: maValue1 위에 maValue2를 착용
판매 조건: maValue1 아래 maValue2를 입는
구매 및 판매 조건이 수립되면 해당 거래 작업을 수행합니다.
시각적으로 평균선을 표시하고, 다른 색으로 구분하여 평균선의 크기의 관계를 나타냅니다.
구매 및 판매 신호를 보내기
쌍평선 교차 원리를 사용하여 단일평선 진동으로 오해하지 마십시오.
평균선 파라미터는 조정 가능하며, 다른 주기적 연산에 적응할 수 있다
거래 논리는 간단하고 직설적이며 이해하기 쉬운 구현입니다.
사용자 정의 구매/판매 신호 힌트, 실시간 거래 시점 파악
가시화 된 평행선 움직임, 직관 거래 지표
매개 변수 최적화를 통해 최적의 매개 변수 조합을 찾을 수 있습니다.
최적의 변수를 찾기 위한 리테크 또는 실 디스크 거래에 사용할 수 있다.
평행선 교차는 잘못된 신호를 유발할 수 있으며, 추세와 형태를 결합하여 판단해야 합니다.
쌍평준이 흔들릴 때, 자주 포지션을 열면 거래비용 손실이 발생할 수 있습니다.
잘못된 매개 변수는 너무 자주 또는 덜 자주 거래 할 수 있습니다.
갑자기 일어난 사건으로 인해 극심한 상황이 발생할 수 있으며, 피해를 줄일 수 없습니다.
대주기 돌파할 때, 단기주기 지표가 작동하지 않을 수 있다
이 모든 것은 자주 모니터링이 필요하고, 완전히 자동화될 수 없습니다.
위험 해결 방법:
트렌드 지표와 결합하여 불안정한 거래를 피하십시오.
형태 지표와 결합하여 신호의 유효성을 확인합니다.
최적화 매개 변수, 거래 빈도 합리적인 수준
단기 손실을 제어하기 위해 단기 손실을 차단하는 지점을 설정합니다.
다중 시간 동안 변수의 안정성을 검증
시간 또는 신호 필터를 사용하여 가짜 침입을 피하십시오.
다양한 평균선 변수를 테스트하여 최적 변수를 찾습니다.
다른 평균선 유형을 테스트하고 신호를 생성하는 가장 정확한 평균선을 선택합니다.
트렌드 지표와 결합하여 트렌드 상반된 거래를 피하십시오.
융통성 지표와 함께 적절한 출전 시기를 판단하는 방법
시간 또는 신호 필터를 추가하여 잘못된 신호를 줄이십시오.
슬라이드 포인트 제어를 설정하여 실 디스크 거래 효과를 최적화합니다.
다종 다주기 검증 안정성
자동으로 중지하는 전략에 참여
기계학습과 같은 기술을 탐구하여 재검토 효과를 향상시킵니다.
쌍평선 교차 전략은 매우 전형적인 기술 지표 전략이다. 그것은 빠르고 느린 평선 교차 원칙을 이용하여 거래 신호를 생성하고, 변수 최적화를 통해 좋은 반측 결과를 얻을 수 있다. 그러나 이 전략은 또한 약간의 위험이 있으며, 트렌드, 형태와 같은 다른 기술 지표와 함께 검증하여 오류 신호율을 줄여야 한다. 또한, 실장 거래에서는 슬라이드 컨트롤과 같은 거래 세부 사항을 고려해야 한다.
/*backtest
start: 2023-10-05 00:00:00
end: 2023-10-05 22:00:00
period: 15m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
// © sehweijun
//study( title="Arch1tect's New Toy", shorttitle="Arch1tect's New Toy", overlay=true, resolution="")
// strategy( title="Arch1tect's New Toy (Strategy Tester Version)", shorttitle="Arch1tect's New Toy (Strategy Tester Version)", overlay=true, initial_capital = 100000, commission_value=0.07, commission_type=strategy.commission.cash_per_contract)
maTypeChoice = input( "EMA", title="MA Type", options=["EMA", "WMA", "SMA"] )
maSrc = input( close, title="MA Source" )
maLen1 = input( 15, minval=1, title="MA Length" )
maLen2 = input( 95, minval=1, title="MA Length" )
maValue1 = if ( maTypeChoice == "EMA" )
ema( maSrc, maLen1 )
else if ( maTypeChoice == "WMA" )
wma( maSrc, maLen1 )
else if ( maTypeChoice == "SMA" )
sma( maSrc, maLen1 )
else
0
maValue2 = if ( maTypeChoice == "EMA" )
ema( maSrc, maLen2 )
else if ( maTypeChoice == "WMA" )
wma( maSrc, maLen2 )
else if ( maTypeChoice == "SMA" )
sma( maSrc, maLen2 )
else
0
buySignal = crossover( maValue1, maValue2 )
sellSignal = crossunder( maValue1, maValue2 )
mainMAColour = ( maValue1 > maValue2 ) ? color.green : color.red
plot( maValue1, title="Arch1tect's New Toy", color=mainMAColour, offset=0, linewidth=4 )
//plot( maValue2, title="Arch1tect's Filter", color=color.black, offset=0, linewidth=2 )
var color buyCandleColour = #00ff0a
var color sellCandleColour = #ff1100
barcolor( buySignal ? buyCandleColour : sellSignal ? sellCandleColour : na, title="Signal Bar Colour" )
bgcolor( color=buySignal ? buyCandleColour : sellSignal ? sellCandleColour : na, transp=85, title="Signal Background Colour")
alertcondition( buySignal or sellSignal, title="Signal change!", message="Signal change!")
alertcondition( buySignal, title="Buy signal!", message="Buy signal!")
alertcondition( sellSignal, title="Sell signal!", message="Sell signal!")
// Strategy Tester
stratTesterOn = input( title="Strategy Tester [ON/OFF]", group="Strategy Tester", type=input.bool, defval=true)
entryTime = input( "2200-1200", title = "Daily trading time session (in Exchange GMT)", group="Strategy Tester", type = input.session )
startTime = input( "2200-2201", title = "Start Time", group="Strategy Tester", type = input.session )
maxDailyLoss = input( 2500, title = "Max daily loss", group="Strategy Tester", type = input.integer )
maxTotalDrawdown = input( 12000, title = "Max daily loss", group="Strategy Tester", type = input.integer )
contractSize = input( 1, title = "Contract size", group="Strategy Tester", type = input.integer )
tradeOnStartSess = input( title="First trade on session start [ON/OFF]", group="Strategy Tester", type=input.bool, defval=true)
fixedTPSL = input( title="Fixed TP/SL PIPS [ON/OFF]", group="Strategy Tester", type=input.bool, defval=false)
fixedTPValue = input ( 10.00, minval=0.01, type=input.float, title="TP", group="Strategy Tester" )
fixedSLValue = input ( 10.00, minval=0.01, type=input.float, title="SL", group="Strategy Tester" )
fromDay = input(defval = 1, title = "From Day", group="Date Range", type = input.integer, minval = 1, maxval = 31)
fromMonth = input(defval = 1, title = "From Month", group="Date Range", type = input.integer, minval = 1, maxval = 12)
fromYear = input(defval = 2020, title = "From Year", group="Date Range", type = input.integer, minval = 1970)
thruDay = input(defval = 1, title = "Thru Day", group="Date Range", type = input.integer, minval = 1, maxval = 31)
thruMonth = input(defval = 1, title = "Thru Month", group="Date Range", type = input.integer, minval = 1, maxval = 12)
thruYear = input(defval = 2112, title = "Thru Year", group="Date Range", type = input.integer, minval = 1970)
start = timestamp(fromYear, fromMonth, fromDay, 00, 00) // backtest start window
finish = timestamp(thruYear, thruMonth, thruDay, 23, 59) // backtest finish window
window() => time >= start and time <= finish ? true : false // create function "within window of time"
// strategy.risk.max_intraday_loss( maxDailyLoss, strategy.cash )
// strategy.risk.max_drawdown( maxTotalDrawdown, strategy.cash )
isTime(_position) =>
range = time( timeframe.period, _position + ':1234567' )
bgcolor( color=isTime( entryTime ) and stratTesterOn and window() ? color.yellow : na, title="Daily trading time session (in Exchange GMT)", transp=75 )
if ( stratTesterOn and window() )
if ( buySignal and isTime( entryTime ) )
if ( not fixedTPSL )
strategy.close_all()
strategy.entry( "Buy", strategy.long, contractSize )
if ( fixedTPSL and strategy.position_size == 0 )
strategy.entry( "Buy", strategy.long, contractSize )
strategy.exit( "TP/SL", "Buy", stop=close[0]-fixedSLValue, limit=close[0]+fixedTPValue )
if ( sellSignal and isTime( entryTime ))
if ( not fixedTPSL )
strategy.close_all()
strategy.entry( "Sell", strategy.short, contractSize )
if ( fixedTPSL and strategy.position_size == 0 )
strategy.entry( "Sell", strategy.short, contractSize )
strategy.exit( "TP/SL", "Sell", stop=close[0]+fixedSLValue, limit=close[0]-fixedTPValue )
if ( isTime( startTime ) and tradeOnStartSess and strategy.position_size == 0 )
if ( maValue1 > maValue2 )
strategy.entry( "Buy", strategy.long, contractSize )
if ( fixedTPSL )
strategy.exit( "TP/SL", "Buy", stop=close[0]-fixedSLValue, limit=close[0]+fixedTPValue )
else
strategy.entry( "Sell", strategy.short, contractSize )
if ( fixedTPSL )
strategy.exit( "TP/SL", "Sell", stop=close[0]+fixedSLValue, limit=close[0]-fixedTPValue )
strategy.close_all( when=not isTime( entryTime ) )
plot( strategy.equity )