
이것은 이동 평균과 MACD 지표를 사용하여 양방향의 돌파구 작업을 수행하는 양자 거래 전략입니다. 그것은 시간 축을 가로질러 작동하는 특징을 가지고 있습니다. 즉, 더 긴 시간 주기에 트렌드 방향을 판단하고, 더 짧은 시간 주기에 진입 기회를 찾는 장점이 있습니다.
이 전략은 3개의 다른 길이의 SMMA 평균선과 EMA 평균선으로 트렌드 방향을 판단한다. 동시에, 이 전략은 MACD 지표와 결합하여 단기 트렌드 및 입시 시기를 판단한다. 구체적으로, 이 전략의 구매 조건은: 가격이 상위 모든 평균선을 통과하고, 짧은 평균선은 모두 긴 평균선 위에 있을 때 촉발된다. 그리고 판매 조건은 반대로, 가격이 아래의 모든 평균선을 통과하고, 짧은 평균선은 긴 평균선 아래에 있을 때 촉발된다.
볼 수 있듯이, 이 전략은 동시에 이동 평균을 사용하여 중장기 트렌드 방향을 판단하고, MACD는 단기 반전을 판단하여 우수한 입문 시점을 포착합니다. 이러한 다중 시간 축 결합 작업은 이 전략의 중요한 특징입니다.
이러한 시간축을 가로질러의 운영의 장점은 높은 확률의 추세 방향에서 적절한 단기 반전점을 선택하여 더 나은 리스크 수익을 얻을 수 있다는 것입니다. 구체적으로 다음과 같은 3 가지 장점이 있습니다.
3개의 SMMA 평균선과 1개의 EMA 평균선 다단계 필러브를 통해 중장기 트렌드 방향을 효과적으로 판단할 수 있으며, 역동작업을 피할 수 있다.
MACD 지표는 단기 역점 입시를 판단하여 우수한 입시 가격을 얻을 수 있다.
엄격한 이동 평균 순서 관계는 필터링 조건으로 오작동의 확률을 줄일 수 있다.
이 전략의 주요 위험은 다음과 같습니다.
이동 평균은 그 자체로 지연성이 강하며, 단기 트렌드 반전의 기회를 놓칠 수 있다.
MACD 지표는 가짜 신호를 생성하기 쉽다. 가격 필터링과 결합해야 한다.
다중 시간 축 판단은 전략의 복잡성을 증가시키고, 실패를 초래할 수 있습니다.
리스크 1과 리스크 2의 경우, 평균선 주기 및 신호 주기를 적절히 단축하여 최적화 할 수 있으며, 단기 트렌드 반향에 신속하게 대응할 수 있습니다. 리스크 3의 경우, 다양한 품종과 주기에 대한 최적화 테스트가 필요하며, 전략 매개 변수가 그 품종의 특성에 엄격하게 적합하도록합니다.
이 전략은 다음의 몇 가지 측면에서 최적화될 수 있습니다.
이동 평균과 MACD의 파라미터를 최적화하여 다른 주기 및 품종 특성에 최적화한다. 예를 들어 평균 선 길이를 줄이고, 신호 파라미터를 증가시킨다.
손해 방지 전략을 추가하고 ATR 또는 다른 지표를 사용하여 합리적인 이동 손해를 설정하십시오. 이것은 전략의 위험 관리를 크게 향상시킬 수 있습니다.
대체 MACD 신호에 대한 더 나은 지표 또는 필터링 방법을 찾습니다. 예를 들어, 변동률 지표를 도입하고, 신호를 필터링합니다.
다양한 스톱, 스톱 로즈 비율 관계를 테스트하여 위험과 수익보다 우수한 파라미터 조합을 얻습니다.
전체적으로, 이것은 독특한 시간 축을 가로질러 생각하는 획기적인 시스템입니다. 그것은 이동 평균과 MACD의 장점을 동시에 활용하여 여러 시간 동안의 합동 판단 작동 전략을 구현합니다. 매개 변수와 필터 조건에 대한 최적화된 조정을 통해, 이 전략은 매우 실용적인 양적 거래 프로그램으로 될 수 있습니다.
/*backtest
start: 2023-10-22 00:00:00
end: 2023-11-21 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © SoftKill21
//@version=4
strategy("Koala Script",initial_capital=1000,
commission_type=strategy.commission.cash_per_contract,
commission_value=0.000065,
slippage=3)
fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
fromYear = input(defval = 2000, title = "From Year", minval = 1970)
// To Date Inputs
toDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 8, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2031, title = "To Year", minval = 1970)
startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
len = input(3, minval=1, title="Length")
src = input(hl2, title="Source")
smma = 0.0
sma1 = sma(src, len)
smma := na(smma[1]) ? sma1 : (smma[1] * (len - 1) + src) / len
len2 = input(6, minval=1, title="Length")
src2 = input(hl2, title="Source")
smma2 = 0.0
sma2 = sma(src2, len2)
smma2 := na(smma2[1]) ? sma2 : (smma2[1] * (len2 - 1) + src2) / len2
len3 = input(9, minval=1, title="Length")
src3 = input(hl2, title="Source")
smma3 = 0.0
sma3 = sma(src3, len3)
smma3 := na(smma3[1]) ? sma3 : (smma3[1] * (len3 - 1) + src3) / len3
len4 = input(50, minval=1, title="Length")
src4 = input(close, title="Source")
smma4 = 0.0
sma4 = sma(src4, len4)
smma4 := na(smma4[1]) ? sma4 : (smma4[1] * (len4 - 1) + src4) / len4
len5 = input(200, minval=1, title="Length")
src5 = input(close, title="Source")
out5 = ema(src5, len5)
timeinrange(res, sess) => time(res, sess) != 0
london=timeinrange(timeframe.period, "0300-1045")
londonEntry=timeinrange(timeframe.period, "0300-0845")
time_cond = time >= startDate and time <= finishDate and londonEntry
fast_length = input(title="Fast Length", type=input.integer, defval=12)
slow_length = input(title="Slow Length", type=input.integer, defval=26)
srcc = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=false)
// Calculating
fast_ma = sma_source ? sma(srcc, fast_length) : ema(srcc, fast_length)
slow_ma = sma_source ? sma(srcc, slow_length) : ema(srcc, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal
longCond = close > out5 and close > smma4 and close > smma3 and close > smma2 and close > smma and londonEntry and smma > smma2 and smma2>smma3 and smma3>smma4 and smma4>out5
shortCond = close < out5 and close < smma4 and close < smma3 and close < smma2 and close < smma and londonEntry and smma < smma2 and smma2<smma3 and smma3<smma4 and smma4<out5
//longCond2 = crossover(close,out5) and crossover(close,smma4) and crossover(close,smma3) and crossover(close,smma2) and crossover(close,smma) and time_cond
//shortCond2 = crossunder(close,out5) and crossunder(close,smma4) and crossunder(close,smma3) and crossunder(close,smma2) and crossunder(close,smma) and time_cond
length=input(14, title="ATR Length")
mult=input(1.0, title="Percentage Multiplier (for ex., 0.7 = 70%)", step=0.1, minval=0.1, maxval=5.0)
oa=input(false, title="Show actual ATR")
ii=syminfo.pointvalue==0
s=ii?na:oa?atr(length):(syminfo.pointvalue * mult * atr(length))
tp=input(300,title="tp")
sl=input(300,title="sl")
//tp = s*10000
//sl= s*10000
//if(tp>300)
// tp:=300
//if(sl>300)
// sl:=300
//if(sl<150)
// sl:=150
//if(tp<150)
// tp:=150
strategy.initial_capital = 50000
//MONEY MANAGEMENT--------------------------------------------------------------''
balance = strategy.netprofit + strategy.initial_capital //current balance
floating = strategy.openprofit //floating profit/loss
risk = input(3,type=input.float,title="Risk %")/100 //risk % per trade
//Calculate the size of the next 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 < 10000)
size := 10000 //Set min. lot size
strategy.entry("long",1,when=longCond )
strategy.exit("closelong","long", profit=tp,loss=sl)
//strategy.close("long",when= crossunder(close[4],smma4) and close[4] > close[3] and close[3]>close[2] and close[2] > close[1] and close[1] > close)
strategy.entry("short",0,when=shortCond )
strategy.exit("closeshort","short", profit=tp,loss=sl)
//strategy.close("short",when= crossover(close[4],smma4) and close[4] < close[3] and close[3]< close[2] and close[2] < close[1] and close[1] < close)
strategy.close_all(when = not london)
maxEntry=input(2,title="max entries")
// strategy.risk.max_intraday_filled_orders(maxEntry)