이 전략은 SoftKill21의 Amazing scalper for majors with risk management 전략에 기반하여, 트리플 지수 이동 평균을 사용하여 원래의 간단한 이동 평균을 대체하여 지연을 줄입니다. 이 전략은 주요 통화 쌍의 1 분 주기에 적용되며, 트렌드 추적 방법을 사용하여, 빠른 EMA, 표준 EMA 및 느린 EMA의 금 크로스 및 데드 크로스에 따라 구매 및 판매 작업을 수행합니다. 동시에 런던 및 뉴욕 거래 시간, 그리고 위험 관리 원칙을 결합하여 포지션 크기를 결정합니다.
이 전략은 3개의 다른 주기의 지수 이동 평균을 사용한다: 25주기 빠른 EMA, 50주기 표준 EMA 및 100주기 느린 EMA. 빠른 EMA 위를 스탠더드 EMA와 느린 EMA를 통과하면 구매 신호를 생성한다. 빠른 EMA 아래를 스탠더드 EMA와 느린 EMA를 통과하면 판매 신호를 생성한다. 지연을 줄이기 위해 2차 지수 평행 기술을 사용하여 EMA를 계산한다.
구체적으로, 전략은 먼저 세 개의 EMA 라인을 계산한 다음, 빠른 EMA가 표준 EMA와 느린 EMA와 골드 크로스 또는 사각지대를 형성하는지 판단하고, 동시에 런던 또는 뉴욕 시간대 개시 시간에 매진하는 조건을 충족하면, 구매 또는 판매 신호를 발생시킨다. 포지션 크기를 결정하는 데, 전략은 먼저 계좌의 적당량의 고정된 비율을 위험 렛대로 계산하고, 그 다음에는 계약 수와 표준 수로 변환하여 각 주문의 포지션을 동적으로 조정한다.
이 전략은 다음과 같은 장점을 가지고 있습니다.
트리플 EMA를 사용하여 가격 데이터를 효과적으로 평형화하여 트렌드 방향을 식별할 수 있습니다. 빠른 EMA는 가격 변화에 민감하고, 표준 EMA는 안정적으로 추적되며, 느린 EMA는 잡음을 필터링합니다. 세 가지가 함께 사용되어 가짜 돌파구를 필터링하여 트렌드 방향을 결정할 수 있습니다.
2차 지수 평준화 기술을 적용하여 EMA를 계산하여 지연을 줄이고 신호를 더 민감하게 만든다.
주요 거래 시간대에 결합하여 비 주요 거래 시간에 잘못된 신호가 발생하지 않도록하십시오.
리스크 관리 원칙을 적용하여 계좌의 권익에 따라 포지션을 조정하십시오. 단일 손실이 너무 큰 계좌에 충격을 주지 않도록하십시오.
전략 논리는 간단하고 명확하며, 이해하기 쉬운 구현, 초보자 학습에 적합하다.
다양한 통화 쌍, 시간 주기에 대해 최적화 조정할 수 있으며, 광범위하게 적용된다.
이 전략에는 몇 가지 위험도 있습니다.
EMA는 갑작스러운 사건으로 인한 단기 허위 돌파구를 효과적으로 필터링 할 수 없으며 잘못된 신호를 생성 할 수 있습니다. 필터링을 다른 지표와 함께 분석하는 것이 좋습니다.
고정 비율 포지션은 시장 변동에 동적으로 조정할 수 없으며, 포지션이 너무 크거나 너무 작다는 문제가 있습니다. 변동률과 같은 지표의 동적으로 조정 포지션을 도입하는 것이 고려 될 수 있습니다.
두 개의 주요 거래 시간만을 고려하여 다른 시간대의 거래 기회를 놓칠 수 있습니다. 다른 시간대의 효과를 테스트 할 수 있습니다.
손해 중지 메커니즘이 없기 때문에 일방적인 손실을 효과적으로 제어할 수 없습니다. 이동 손해 중지 또는 시간 손해 중지 설정할 수 있습니다.
EMA 크로스에는 다소 지연성이 있으며, 최적의 진입 시기를 놓칠 수 있다. EMA 주기를 줄이거나 다른 선행 지표와 결합하는 것을 고려할 수 있다.
효과는 거래 비용에 영향을 받을 수 있다. 적절한 조정으로 중지 손실 및 중지 위치가 권장된다.
이 전략은 다음과 같은 부분에서 최적화될 수 있습니다.
다양한 EMA 주기 변수를 테스트하여 최적의 변수 조합을 찾는다. 자기 적응 EMA와 같은 기술을 도입하여 동적으로 최적화 EMA 주기이다.
RSI, 브린 띠 등과 같은 다른 필터 지표를 추가하여 신호의 질을 향상시킵니다.
동적 포지션 관리 메커니즘을 도입하여 시장의 변동성과 수익성에 따라 포지션을 조정하십시오.
이동 상쇄, 시간 상쇄를 추가하여 상쇄를 제한한다. 상쇄 지점을 적절히 조정한다.
다양한 거래 시기를 테스트하여 최적의 거래 시간을 찾습니다. 변동률과 같은 지표 필터링 시기를 결합 할 수 있습니다.
정지 및 손실 수준을 최적화하고, 이윤 크기와 승률을 균형 둡니다. 패러블 라인 중단과 같은 지능형 중단을 도입합니다.
EMA를 계산하는 방법을 수정하여, 예를 들어, 선형적 중화 EMA를 시도하여, 지연을 줄이십시오.
자동화 된 기계 학습 방법과 결합하여 최적의 변수를 찾습니다.
거래 비용을 모델링하고 순이익을 극대화하기 위해 시스템을 조정합니다.
이러한 최적화를 통해 시스템의 수익성을 높이고, 회수 제어, 적용 범위를 확장하여 더 강력하고 안정적인 거래 전략을 얻을 수 있습니다.
이 전략의 전체적인 아이디어는 명확하고, 트리플 EMA를 사용하여 트렌드를 식별하고, 주요 거래 시간에 따라 작업을 수행하고, 계정 비율을 사용하여 포지션을 결정하는 것이 전형적인 트렌드 추적 유형의 전략에 속한다. 전략의 최적화 공간은 넓으며, 매개 변수 최적화, 메커니즘 개선, 기술 도입 등의 수단으로 전략의 적용성을 더 확장 할 수 있습니다.
/*backtest
start: 2023-09-19 00:00:00
end: 2023-09-26 00:00:00
period: 15m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// original author SoftKill21
//@version=4
//@capam
strategy(title="Triple EMA Scalper low lag strat", shorttitle="3EMA scalper", overlay=true)
strategy.initial_capital = 50000
len1 = input(25, minval=1, title="Length")
len2 = input(50, minval=1, title="Length")
len3 = input(100, minval=1, title="Length")
src = input(close, title="Source")
tmp1 = ema(src, len1)
tmp2 = ema(src, len2)
tmp3 = ema(src, len3)
fastemaOut = 2*tmp1 - ema(tmp1, len1)
standardemaOut = 2*tmp2 - ema(tmp2, len2)
slowemaOut = 2*tmp3 - ema(tmp3, len3)
//fastemaOut = sma(src, len1)
//standardemaOut = sma(src, len2)
//slowemaOut = sma(src, len3)
plot(fastemaOut, color=color.black, title="First EMA")
plot(standardemaOut, color=color.yellow, title="Second EMA")
plot(slowemaOut, color=color.blue, title="Third EMA")
timeinrange(res, sess) => time(res, sess) != 0
londopen = timeinrange(timeframe.period, "0300-1100")
nyopen = timeinrange(timeframe.period, "0800-1600")
longCondition = crossover(fastemaOut,standardemaOut) and crossover(fastemaOut,slowemaOut) and londopen //or nyopen)
shortCondition = crossunder(fastemaOut,standardemaOut) and crossunder(fastemaOut,slowemaOut) and londopen// or nyopen)
longCondition2 = crossover(fastemaOut,standardemaOut) and crossover(fastemaOut,slowemaOut) and nyopen
shortCondition2 = crossunder(fastemaOut,standardemaOut) and crossunder(fastemaOut,slowemaOut) and nyopen
tp = input(50,title="TP")
sl = input(100, title="SL")
tradeLondon = input(title="Trade london session?", type=input.bool, defval=true)
tradeNewyork = input(title="Trade new york session?", type=input.bool, defval=true)
//MONEY MANAGEMENT--------------------------------------------------------------
balance = strategy.netprofit + strategy.initial_capital //current balance
floating = strategy.openprofit //floating profit/loss
risk = input(1,type=input.float,title="Risk % of equity ")/100 //risk % per trade
temp01 = balance * risk //Risk in USD
temp02 = temp01/sl //Risk in lots
temp03 = temp02*100000 //Convert to contracts
size = temp03 - temp03%1000 //Normalize to 1000s (Trade size)
if(size < 1000)
size := 1000
if(tradeLondon==true)
strategy.entry("long",1,when=longCondition)
strategy.exit("tp/sl","long",profit=tp,loss=sl)
strategy.entry("short",0,when=shortCondition)
strategy.exit("tp/sl","short",profit=tp,loss=sl)
if(tradeNewyork==true)
strategy.entry("long",1,when=longCondition2)
strategy.exit("tp/sl","long",profit=tp,loss=sl)
strategy.entry("short",0,when=shortCondition2)
strategy.exit("tp/sl","short",profit=tp,loss=sl)
// strategy.risk.max_intraday_filled_orders(2)