Thank you. On my charting artist I can only have a history of 1 year. If anyone could prove it for many more years, I’d appreciate it if you’d pass the statistics. Greetings.
Excellent bit of code. I’m not getting the same results as you so I guess I need to understand it now and work out what changes are required to make it work today.
Thanks for sharing.
Hi,
I apply this strategy on daily SPY but I got error. Is this startegy suitable for daily SPY?
What error are you getting / seeing … post a screenshot?
Interesting code. I made some adjustments to adapt it to the DAX index on the 5 minute timeframe. I would say it’s a high risk it’s overly optimized though.
Here’s the code
DEFPARAM CumulateOrders = false
DEFPARAM PRELOADBARS = 5000
atrperiod = 18
bolltrendperiod = 24
bolltrendperiod2 = 80
SL = 100
stepfactor1 = 1
stepfactor2 = 0.25
RR = 4
longbar = 0
shortbar = 0
longbarmultiplier = 1
shortbarmultipler = 1.5
strend = 2
strend2 = 2
bollBullLevel = 50
bollBearLevel = 50
bolltrendMAType = 5
bolltrendMAType2 = 5
//// --------- UK DAY LIGHT SAVINGS MONTHS ---------------- //
mar = month = 3 // MONTH START
oct = month = 10 // MONTH END
IF ( dayofweek >= 0 and mar AND 31-day<7 ) OR ( month > 3 AND month < 10 ) OR ( oct AND 31-day > 6 ) OR (dayofweek = 4 AND oct AND day<31) OR (dayofweek = 3 AND oct AND day+1<31) OR (dayofweek = 2 AND oct AND day+2<31) OR (dayofweek = 1 AND oct AND day+3<31) OR (dayofweek = 0 AND oct AND day+4<31) OR (dayofweek = 5 AND oct AND 31-day<7) THEN
UKDLS=1
ELSE
UKDLS=0
ENDIF
//GRAPH UKDLS as "UKDLS"
// --------- US DAY LIGHT SAVINGS MONTHS ---------------- //
mar = month = 3 // MONTH START
nov = month = 11 // MONTH END
IF (month > 3 AND month < 11) OR (mar AND day>14) OR (mar AND day-dayofweek>7) OR (nov AND day<=dayofweek AND day<7) THEN
USDLS=010000
ELSE
USDLS=0
ENDIF
//GRAPH USDLS as "USDLS"
// --------- AU DAY LIGHT SAVINGS MONTHS ---------------- //
oct = month = 10 // MONTH START
apr = month = 4 // MONTH END
IF (month > 10 OR month < 4) OR (apr AND day <=7 AND day<=dayofweek) OR (oct AND day > 7) OR (oct AND day <= 7 AND day>dayofweek) THEN
AUDLS=010000
ELSE
AUDLS=0
ENDIF
//GRAPH AUDLS as "AUDLS"
//GRAPH dayofweek
//GRAPH day
//Time in UTC+8
Rest0Minutes = 000000
Rest15Minutes = 001500
HighSpread1Start = 051500- USDLS
HighSpread1End = 053000 - USDLS
HighSpread2Start = 060000 - USDLS
HighSpread2End = 070000 - USDLS
IGAlmostClose = 054500 - USDLS
IGOpen = 070000 - USDLS
ASXOpen = 080000 - AUDLS
TSEOpen = 080000
SSEOpen = 091500
HKEOpen = 093000
FWBOpen = 150000 - UKDLS
LSEOpen = 160000 - UKDLS
NYSEOpen = 223000 - USDLS
//Skip high spread
timeok = NOT(time >=HighSpread1Start AND time <=HighSpread1End) AND NOT(time >=HighSpread2Start AND time <=HighSpread2End)
//Skip 15 mins when IG almost close
timeok = timeok AND NOT (time >=IGAlmostClose AND time <= IGAlmostClose + Rest15Minutes)
//Skip when IG just open the market
timeok = timeok AND NOT (time >=IGOpen AND time <=IGOpen + Rest0Minutes)
//Skip when ASX (first market) just open the market
timeok = timeok AND NOT (time >=ASXOpen AND time <=ASXOpen + Rest0Minutes)
//Skip when TSE (first major) just open the market
timeok = timeok AND NOT (time >=TSEOpen AND time <=TSEOpen + Rest0Minutes)
//Skip when SSE just open the market
timeok = timeok AND NOT (time >=SSEOpen AND time <=SSEOpen + Rest0Minutes)
//Skip when HKE just open the market
timeok = timeok AND NOT (time >=HKEOpen AND time <=HKEOpen + Rest0Minutes)
//Skip when FWB just open the market
timeok = timeok AND NOT (time >=FWBOpen AND time <=FWBOpen + Rest0Minutes)
//Skip when LSE just open the market
timeok = timeok AND NOT (time >=LSEOpen AND time <=LSEOpen + Rest0Minutes)
//Skip when NYSEjust open the market
timeok = timeok AND NOT (time >=NYSEOpen AND time <=NYSEOpen + Rest0Minutes)
once bolltrendBull = 1
once bolltrendBear = 1
//bolltrendperiod = 50
//strend = 2
bolltrendMA = average[bolltrendperiod, bolltrendMAType](close)//50,1
STDDEVtrend = STD[bolltrendperiod]
bolltrendUP = bolltrendMA + strend * STDDEVtrend
bolltrendDOWN = bolltrendMA - strend * STDDEVtrend
IF bolltrendUP = bolltrendDOWN THEN
bolltrendPercent = 50
ELSE
bolltrendPercent = 100 * (close - bolltrendDOWN) / (bolltrendUP - bolltrendDOWN)
ENDIF
//bolltrendperiod = 50
//strend = 2
bolltrendMA2 = average[bolltrendperiod2, bolltrendMAType2](close)//50,1
STDDEVtrend2 = STD[bolltrendperiod2]
bolltrendUP2 = bolltrendMA2 + strend2 * STDDEVtrend2
bolltrendDOWN2 = bolltrendMA2 - strend2 * STDDEVtrend2
IF bolltrendUP2 = bolltrendDOWN2 THEN
bolltrendPercent2 = 50
ELSE
bolltrendPercent2 = 100 * (close - bolltrendDOWN2) / (bolltrendUP2 - bolltrendDOWN2)
ENDIF
bolltrendBull = bolltrendPercent > bollBullLevel OR bolltrendPercent2 > bollBullLevel
bolltrendBear = bolltrendPercent < bollBearLevel OR bolltrendPercent2 < bollBearLevel
//====== Enter market - start =====
timeframe(30 minutes, updateonclose)
ma1 = Average[45](typicalPrice)
ma2 = Average[15](typicalPrice)
c4b = (ma1 >= ma2)
ma3 = Average[15](typicalPrice)
ma4 = Average[55](typicalPrice)
c4s = (ma3 <= ma4)
timeframe(5 minutes, updateonclose)
atr14 = AverageTrueRange[atrperiod](close)
C1 = bolltrendBull AND close[1] < open[1] AND close > open AND close > open[1] AND close - open > longbarmultiplier * atr14 + longbar
C2 = bolltrendBear AND close[1] > open[1] AND close < open AND close < open[1] AND open - close > shortbarmultipler * atr14 + shortbar
timeframe(default)
samebarsignal = 0
buyday = (dlow(0) < dlow(1) or dhigh(0) < dhigh(1)) and (dhigh(0) < dhigh(1)) and (dlow(0) < dlow(1)) and (dlow(0) > dlow(1) xor dhigh(0) < dhigh(1)) and c4b
shortday = (dlow(0) < dlow(1)) and (dlow(0) < dlow(1) or dhigh(0) < dhigh(1)) and c4s
IF C1 THEN //when a pullback occurs...
IF timeok AND Not OnMarket AND samebarsignal = 0 and buyday THEN
BUY 1 CONTRACT AT MARKET
SET STOP pLOSS SL //50
TP = RR * SL
SET TARGET pPROFIT TP //300
ENDIF
samebarsignal = 1
ENDIF
// SHORT side
IF C2 THEN //when a pullback occurs...
IF timeok AND Not OnMarket AND samebarsignal = 0 and shortday THEN
SELLSHORT 1 CONTRACT AT MARKET
SET STOP pLOSS SL //50
TP = RR * SL
SET TARGET pPROFIT TP //300
ENDIF
samebarsignal = 1
ENDIF
//====== Enter market - end =====
//====== Exit market - start =====
IF NOT ONMARKET THEN
ENDIF
//====== Exit market - end =====
//====== Trailing Stop mechanism - start =====
trailingstart = (stepfactor1 * SL ) / pointsize
trailingstep = (stepfactor2 * SL ) / pointsize
//resetting variables when no trades are on market
if not onmarket then
priceexit = 0
endif
//case LONG order
if longonmarket then
//first move (breakeven)
IF priceexit=0 AND close-tradeprice(1) >= trailingstart*pointsize THEN
priceexit = tradeprice(1) + trailingstep*pointsize
ENDIF
//next moves
IF priceexit>0 THEN
P2 = close-priceexit >= trailingstart*pointsize
IF P2 THEN
priceexit = priceexit + trailingstep*pointsize
ENDIF
ENDIF
endif
//case SHORT order
if shortonmarket then
//first move (breakeven)
IF priceexit=0 AND tradeprice(1)-close >= trailingstart*pointsize THEN
priceexit = tradeprice(1) - trailingstep*pointsize
ENDIF
//next moves
IF priceexit>0 THEN
P2 = priceexit-close >= trailingstart*pointsize
IF P2 THEN
priceexit = priceexit - trailingstep*pointsize
ENDIF
ENDIF
endif
//exit on trailing stop price levels
if onmarket and priceexit>0 then
EXITSHORT AT priceexit STOP
SELL AT priceexit STOP
endif
//====== Trailing Stop mechanism - end =====