Home › Forums › Trading System Mentor Course Community › Progress Journal › Glen’s Journal
- This topic is empty.
-
AuthorPosts
-
September 29, 2021 at 9:57 am #113901TrentRothallParticipant
Yes EOM is definitely the best option. But is this just luck or is it a valid concept? The fact that everyone is doing well with it probably answers that question.
I like your solution much cleaner.
Good too see.
September 30, 2021 at 11:02 pm #113903GlenPeakeParticipantSEPTEMBER 2021
ASX
WTT -4.44% (Since Go Live in JAN 2019: +40.92%)
ASX100 RTN -11.12% (Index Filter is OFF for OCT)XSO RTN -2.87 (Paper traded in SEPT… )
US
MR#1 +3.22%
MR#2 -0.59%
MR#3 +0.74%
MR#4 +5.38%
MR#5 -8.20%NDX100 RTN -4.74%
R1000 RTN +12.68%
Total Account: -2.60%Closed out the $FMG.au position within the WTT portfolio during SEPT for a tidy % profit.
The XSO Rotational build is done, I thought I’d be placing some trades for the start of OCT, but the Index Filter is OFF for OCT, so (at least) another month before LIVE trading begins.
The R1000 RTN system is +29% since launch in June, just 4 months ago…. a little surprised at the out performance here, but I’ll take it.
October 1, 2021 at 1:13 am #113907Nick RadgeKeymasterIf you’re not happy with the outperformance, just send it across to me…I’ll take anything this month
October 30, 2021 at 2:33 am #113916GlenPeakeParticipantOCTOBER 2021
ASX
WTT +2.08% (Since Go Live in JAN 2019: +43.85%)
ASX100 RTN -3.3% (Index Filter Down for OCT)XSO RTN 0.00% (Index Filter Down for OCT…. Up for NOV)
US
MR#1 +0.41%
MR#2 +1.51%
MR#3 +5.00%
MR#4 -0.68%
MR#5 +3.97%NDX100 RTN +8.5%
R1000 RTN +5.43%Total Account: +0.84%
The XSO Monthly Rotational system will place its first trades on Monday. (Which generally means additional market Volatility is on the way whenever one of us launches a new system into the markets 👿 …so just giving everyone fair warning… )
Rebalancing some funds away from the WTT portfolio, which is currently holding 57% allocation of funds and will channel them into the XSO RTN and ASX100 RTN systems.
November 29, 2021 at 3:56 am #113881DeanWaltonMemberHi Glen – I am presuming you are LeTour Trader from Twitter. I’m very new to Twitter – thought i better see what Nick posts if different to fb). I have loads of questions in relation to your Small Ords system. As I said on twitter – I am very curious about it, frustrated that i cant produce the same returns and envious that you have some super results here.
I’m a little confused with your posts around Norgate and Small Ords. As this is what I am using when I do my backtesting. Are you saying that the ASX Small Ords provided by Norgate is not accurate??I ran some backtests on Small Ords and have a system that produces 29% return with 22.5% DD from 2005-2021. But it does super well in 2005-2007. If I run it from 2008-2021 returns are only 18% with DD of >30%. But now I am wondering if this is accurate at all if Norgate data is not right for Small Ords.
I can replicate results from 2/1/20-16/9/21 from your results but that is the only one. All the rest I am miles under. Wondering if this is because of the data???
I’m not really following what you are coding with respect to XKO and XTO but if I use the ASX300 in my scan and in Filter inc ASX300 current and past and exclude ASX100 current and past for backtesting (which is what i think you are doing but not sure) – my results from 2005-2021 drop to CAGR 19.6% and 30.7% MaxDD.
So I’m very confused as these should all be the same as using the Small Ords current and past – as i understand the index.
I must be missing something.
Reading parts of your journal and couple of others – I’m a long way behind and i started the course in Feb 2021. I’m yet to start trading my systems and still confused with using Amibroker and coding and lots of anxiety and self doubt. Trying not to compare myself to others but hard not too. Not good for my self doubt and anxiety. However, I need to learn so need to try and push myself to become more uncomfortable – this post has taken me 2 hours to type and edited about 100 times!!
November 29, 2021 at 7:55 am #114077GlenPeakeParticipantHi Dean,
Quote:I am presuming you are LeTour Trader from Twitter.Yep! Ah, so that was you asking the question…. cool.. I couldn’t figure out who you were and needed to ‘filter’ out ‘who’s who in the zoo’…. (I get a few questions around my systems on twitter etc and wanted to confirm that you were in fact from the course etc…. all good!!!)
In terms of the Small Ords universe….
By definition
“The S&P/ASX Small Ordinaries index is used as an institutional benchmark for small-cap Australian equity portfolios.
The index is designed to measure companies included in the S&P/ASX 300, but not in the S&P/ASX 100.”So for the coding….. refer to the Chartist Template Code
e.g.
if(ASXList == “8: ASX Small Ordinaries”) HistDB = NorgateIndexConstituentTimeSeries(“$XKO”) AND NOT NorgateIndexConstituentTimeSeries(“$XTO”);So the $XKO is the ASX300 and the $XTO is the ASX100…. so we include the ‘ASX300’ stocks and exclude the ASX100 stocks from the group, which gives us the XSO universe…. From what you’ve written, it sounds like you’re using the correct approach….. but for clarity…. below is a screen shot(s) for confirmation
e.g.
ASX300 Watchlist Selected
and Historical DB (Small Ords selected, with the above Template code used)
(I ‘think’ there is a bit of a ‘glitch’ with using the specific XSO universe/watchlist in Norgate….which is why we select ASX300 and then filter out ASX100 stocks etc….. which is why the template uses the same approach…..etc…. Yeah I agree, a bit confusing… but it works via the ASX300 method).
So just double check that we are using the same approach…. and get that ‘aligned’ and then we are comparing ‘apples with apples’.
If you like, just post up a couple of backtest results/graphs here for further insight.
My system is very simple:
– Dual ROC for the ranking (1x short term ROC plus 1x long term ROC)
– Index Filter is on the $XSO (Dual MA)
– And a couple of stock filters for the entry. (A little bit of ‘secret sauce’ here… but nothing too fancy….. just trying to identify positive momentum vs negative momentum).FYI:
For the 2008-2021 period, my return(s) are 31% and DD -21%.It sounds like your stats/system is coming together, maybe just a tweak or 2 away from being a polished up tradeable system etc.
For robustness testing… my XSO system when tested against the NDX100 returns around 20% with DD of -20%…which is a pass mark for me… It also performs solidly for the mid 1990’s -2005 period…… (which was not part of the ‘in sample’ data….)….
Curious to see how it turns out for you Dean…. keep plugging away…. if you want to share a few more ‘details’ about how you’ve approached the XSO build, it might shed more light on what you’ve tried and what seems to work for you, or what hasn’t work so far etc….
For me it’s a great system….. and a bit of an ‘untapped Opal mine’ in its approach and robustness…. and complements my other 2 ASX systems very nicely…..
Oh…. as another option…..(and this would address some of the ASX300/XSO/ASX100 coding confusion) if you were to change it to a ASX300 rotational system…. the results should be similar (or pretty close) to an “XSO” only approach…. at least that’s what I saw when testing the system against the ASX300 universe only…. so you get a few of the ASX100 stocks being rotated in (ie BUY signals) from time to time, which is ideal if you wanted to get exposure to both XSO & ASX100 via the one system.
I appreciate the time it took for you to ‘author’ one of these replies ….. I took about an hour…. lolz :cheer:
November 30, 2021 at 12:22 am #114080DeanWaltonMemberThanks Glen. I was doing it the same as you had posted so if i use 8:ASX Small Ordinaries in ASX Historical Watchlist and use S&P ASX Small Ordinaries Current and PAst in Filter box my results are CAGR 29% and MaxDD 22.7%. If I change the Filter box to include ASX300 Current & Past and Exclude ASX100 Current & Past I get CAGR 19.65% and MAxDD 30.7%. I just don’t understand the reason for the difference unless data is wrong.
System uses SuperTrend MAcro Filter (something i have used for a long time)
Dual ROC
Stock Price filter
Volume Filter
Dual ROC > 50
Mind you all of this was created using the Small Ords Current and PAst as Filter not ASX300 exc ASX100.I have no problem sharing my code (it maybe messy as i like to have the original lines to help me as coding is not my strong point) – here it is:
#include_once “FormulasNorgate DataNorgate Data Functions.afl”
SetBarsRequired(sbrAll,0);
_SECTION_BEGIN (“Index Filter”);
//=================================================================================
//Index Filter
//=================================================================================
IndexSwitch = ParamToggle(“Index Filter”,”On|Off”,0);SetForeign(“$XsO.au”);//(“$XAO.au”)
//Super trend
IndATR_Multiplier= Param(“ATR Multiplier”,3.5,3.5,5,0.25);
IndATR_Period= Param(“ATR Period”,30,10,30,5);getATR=ATR(IndATR_Period);
basic_UpperBand=0;
basic_LowerBand=0;
final_UpperBand=0;
final_LowerBand=0;
superTrend=0;//Super Trend Calculations
for( i = IndATR_Period; i < BarCount; i++ )
{
basic_UpperBand(High + Low)/2) + IndATR_Multiplier*getATR;
basic_LowerBand(High + Low)/2) – IndATR_Multiplier*getATR;
final_UpperBand = Iif( ((basic_UpperBandfinal_UpperBand[i-1])), (basic_UpperBand ), final_UpperBand[i-1] );
final_LowerBand = Iif( ((basic_LowerBand>final_LowerBand[i-1]) OR (Close[i-1]), final_LowerBand[i-1] ); superTrend = superTrend = Iif((((superTrend[i-1])==(final_UpperBand[i-1])) AND ((Close)<=(final_UpperBand))),(final_UpperBand),Iif((((superTrend[i-1])==(final_UpperBand[i-1])) AND ((Close)>=(final_UpperBand))),(final_LowerBand),Iif((((superTrend[i-1])==(final_LowerBand[i-1])) AND ((Close)>=(final_LowerBand))),(final_LowerBand),Iif((((superTrend[i-1])==(final_LowerBand[i-1])) AND ((Close)<=(final_LowerBand))),(final_UpperBand),0))));
}
IndexFilterUp = C > SuperTrend;
IndexFilterDn = C < SuperTrend;
IndexFilter = IIf(IndexSwitch,1,IndexFilterUp);
RestorePriceArrays();/*
“Foreign Ticker Symbol”;
IndexCode = ParamStr(“Index Code”,”$XAO.au”);//$XAO.au for ASXIndex = Foreign(IndexCode,”C”);
MAPeriod = Optimize(“Index Filter MA Period”,55,40,200,10);
IndexFilterUp = Index > EMA(Index,MAPeriod);
IndexFilterDn = Index < EMA(Index,MAPeriod);
IndexFilter = IIf(IndexSwitch,1,IndexFilterUp);
*/
//=================================================================================
_SECTION_END();_SECTION_BEGIN(“Historical Data Base Testing”);
//=================================================================================
//Historical Data Base Testing
//=================================================================================
ASXList = ParamList(“ASX Historical Watchlist:”,”1: Off|2: ASX 20|3: ASX 50|4: ASX 100|5: ASX 200|6: ASX 300|7: ASX All Ordinaries|8: ASX Small Ordinaries|9: ASX Emerging Companies|10: Excluding ASX 300|11: In XAO but Exc ASX 100|12: Exc XAO”,0);HistDB = 1;
if(ASXList == “1: Off”) HistDB = 1;
if(ASXList == “2: ASX 20”) HistDB = NorgateIndexConstituentTimeSeries(“$XTL”);
if(ASXList == “3: ASX 50”) HistDB = NorgateIndexConstituentTimeSeries(“$XFL”);
if(ASXList == “4: ASX 100”) HistDB = NorgateIndexConstituentTimeSeries(“$XTO”);
if(ASXList == “5: ASX 200”) HistDB = NorgateIndexConstituentTimeSeries(“$XJO”);
if(ASXList == “6: ASX 300”) HistDB = NorgateIndexConstituentTimeSeries(“$XKO”);
if(ASXList == “7: ASX All Ordinaries”) HistDB = NorgateIndexConstituentTimeSeries(“$XAO”);
if(ASXList == “8: ASX Small Ordinaries”) HistDB = NorgateIndexConstituentTimeSeries(“$XKO”) AND NOT NorgateIndexConstituentTimeSeries(“$XTO”);
if(ASXList == “9: ASX Emerging Companies”) HistDB = NorgateIndexConstituentTimeSeries(“$XEC”);
if(ASXList == “10: Excluding ASX 300”) HistDB = NorgateIndexConstituentTimeSeries(“$XKO”)==0;
if(ASXList == “11: In XAO but Exc ASX 100”) HistDB = NorgateIndexConstituentTimeSeries(“$XAO”) AND NOT NorgateIndexConstituentTimeSeries(“$XTO”);
if(ASXList == “12: Exc XAO”) HistDB = NorgateIndexConstituentTimeSeries(“$XAO”)==0;//=================================================================================
_SECTION_END();_SECTION_BEGIN (“Optional Price & Volume Filters”);
//=================================================================================
//Optional Price & Volume Filters
//=================================================================================
CloseToggle = ParamToggle(“Close Price”,”Adjusted|Unadjusted”,1);
CloseArray = IIf(CloseToggle,NorgateOriginalCloseTimeSeries(),Close);VolumeToggle = ParamToggle(“Volume”,”Adjusted|Unadjusted”,1);
VolumeArray = IIf(VolumeToggle,NorgateOriginalVolumeTimeSeries(),Volume);
//
PriceTog = ParamToggle(“Price Filter”,”Off|On”,1);
MinSP = Param(“Minimum Share Price – $”,0.50,0,1,.1);
MaxSP = Param(“Maximum Share Price – $”,5,5,20,1);
MinMaxSP = CloseArray >= MinSP AND CloseArray <= MaxSP;
PriceFilt = IIf(PriceTog,MinMaxSP,1);
//
TOTog = ParamToggle(“Turnover Filter”,”Off|On”,1);
MinTO = Param(“Minimum Turnover – $”,400000,150000,1000000,50000);
AverageVolume = EMA(VolumeArray,Param(“VolMA”,20,5,30,5));
TOFilter = (CloseArray * AverageVolume) > MinTO;
TOFilt = IIf(TOTog,TOFilter,1);//
VolTog = ParamToggle(“Volume Filter”,”Off|On”,0);
MinVol = Param(“Minimum Volume”,300000,0,10000000,1000);
VolFilter = VolumeArray > MinVol;
VolFilt = IIf(VolTog,VolFilter,1);
//
AveVolTog = ParamToggle(“Average Volume Filter”,”Off|On”,0);
MinAveVol = Param(“Minimum Average Volume”,500000,0,10000000,1000);
AVPer = Param(“Volume EMA”,10,1,200,1);
AveVol = EMA(VolumeArray,AVPer) > MinAveVol;
AveVolFilt = IIf(AveVolTog,AveVol,1);
//
OptFilt = PriceFilt AND TOFilt AND VolFilt AND AveVolFilt;
//=================================================================================
_SECTION_END();_SECTION_BEGIN (“System Parameters”);
//=================================================================================
//Parameters
//=================================================================================
MAPeriod = Param(“MA Period”,250,10,300,5);
MyMAPer = EMA(Close,MAPeriod);
MAFilt = C > MyMAPer;//ROC Lookback x 1
ROCLookBack = Optimize(“ROCLookBack”,125,50,300,5);
MyROC = ROC(Close,ROCLookBack);
ROCATR = MyROC;//MyROC/ATR(15);//ROC Lookback x 2
ROCLB1 = Param(“ROCLookBack1”,60,50,100,5);
MyROCLB1 = ROC(Close,ROCLB1);
ROCLB2 = Param(“ROCLookBack2”,110,100,200,10);
MyROCLB2 = ROC(Close,ROCLB2);
ROCFinal1 = MyROCLB1 + MyROCLB2;
//ROCFinal2 = ROC(C,63)*.4+ROC(C,126)*.2+ROC(C,189)*.2+ROC(C,252)*.2;//RSI
//RSIPer = Param(“Periods”, 20, 10, 30, 1 );
//MyRSI = RSI(RSIPer);//=================================================================================
//Entry & Exit
//=================================================================================
Rank = ROCFinal1; //Criteria for rotation
Cond1 = Rank > Param(“RankVal”,50,0,150,5); //prevents short tradesOnLastTwoBarsOfDelistedSecurity = BarIndex() >= (LastValue(BarIndex()) -1) AND !IsNull(GetFnData(“DelistingDate”));
LESetup = Cond1 AND IndexFilter AND HistDB AND OptFilt; //Any additional buy rules apart from the rotational criteria – e.g index, price filters etc
LE = Ref(LESetUp,-1) AND NOT OnLastTwoBarsOfDelistedSecurity;//=================================================================================
_SECTION_END();_SECTION_BEGIN (“Backtesting Options”);
//=================================================================================
//Backtesting Parameters
//=================================================================================
posqty = Param(“# Positions”,5,10,10,5);
Eq = Param(“Initial Equity”,100000,1,10000000,1);
SetOption(“InitialEquity”,Eq);
SetOption(“MaxOpenPositions”,posqty);
SetOption(“UsePrevBarEquityForPosSizing”,True);
SetOption(“AccountMargin”,100);
SetTradeDelays(0,0,0,0);SetBacktestMode(backtestRotational);
EOM = Month() != Ref(Month(),-1);//First trading day of the month
score = Ref(Rank,-1);//score is the rotational criteria
Score = IIf(LE,score,0);
PositionScore = IIf(Year()>=1985 AND EOM,Score,scoreNoRotate);MinRank = Param(“Min Rank”,10,11,30,1);
SetOption(“WorstRankHeld”,MinRank);
//
SetPositionSize(100/posqty,spsPercentOfEquity);//=================================================================================
_SECTION_END();_SECTION_BEGIN (“Exploration”);
//=================================================================================
//Exploration
//=================================================================================
Filter = LESetup;AddColumn(Rank,”Rank”,1.4);
//=================================================================================
_SECTION_END();November 30, 2021 at 2:47 am #114088Nick RadgeKeymasterQuote:If I change the Filter box to include ASX300 Current & Past and Exclude ASX100 Current & Past I get CAGR 19.65% and MAxDD 30.7%. I just don’t understand the reason for the difference unless data is wrong.The data is not wrong.
What is wrong is excluding the ASX-100 Current and Past.
Take a think about it for a moment…
November 30, 2021 at 5:28 am #114091GlenPeakeParticipantHi Dean,
The code above had some errors and didn’t work for me….so I couldn’t see your actual backtest(s) etc.. but just glancing at the code…. a few suggestions to play around with:
– Disable: Stock Price filter… your code above appears to have a MAX price filter of $5…
– Disable: Turnover Filter
– Modify Rank >50 to Rank >0
– Play around with increasing the MAX Positions from 5 to something higher… this might smooth out the DD a little.
– Play around with another bull/bear momentum stock filter…. a single stock MA is possibly keeping you in trades where recent price action is falling…. this might also smooth out the DD a little
– Play around with the Dual ROC parameters…. this kind of ties in with the previous point….i.e. flagging stocks with recent positive/negative price movementIf you’re still unsure about the ASX300 / XSO code…. then just set it to ASX300 all around for the time being… and revisit it later……
If you can obtain stats in the ballpark of CAR around 26% and DD -25% or better consistently over any time period from 1998-2021… then you’re probably on the right track.
November 30, 2021 at 10:10 am #114092DeanWaltonMemberYes once you take out the asx100 current and past it will take out any stock that was in any other index prior to being in asx100. Think I am misunderstanding what Glen was doing. Thanks Nick.
November 30, 2021 at 10:35 am #114095DeanWaltonMemberThanks Glen. Will have a play tomorrow. Not sure what errors you are getting as it backtests ok for me but will double check as best I can. I’ve done most of those things already but will try again. Increasing the max positions really diminished the returns.
So my process was as follows:
1. Run optimisation using ST with single ROC to see where the sweet spot is in combo. Default positions was 5 (same for asx100 system). This produced a ROC from 100-120 as good results so took middle 110.
2. Then using single ROC add a second ROC to see if adding a second ROC adds anything – find sweet spot – range from memory was 50-80 was ok so took 60.
3. Then look at dual ROC combined value to see if higher value makes a difference – 0-50 were similar but maxDD was better at 50.
4. Price filter and volume filters helped reduce MaxDD with minor changes to CAGR.I’m very conscious of not over optimising but I’m watching for numbers falling off cliffs as Nick suggested to me. Maybe my process is flawed.
November 30, 2021 at 11:44 pm #114099GlenPeakeParticipantNOVEMBER 2021
ASX
WTT -0.56% (Since Go Live in JAN 2019: +43.05%)
ASX100 RTN 0.0% (Index Filter Down for NOV)XSO RTN +8.10% (First month of LIVE trades)
US
MR#1 -4.17%
MR#2 -3.28%
MR#3 -0.66%
MR#4 -8.75%
MR#5 -2.98%NDX100 RTN +2.77%
R1000 RTN -1.67%Total Account: +2.03%
The XSO RTN system got off to a solid start…. the system was positive for the entire month, super happy with this system.
$NVX.au did most of the heavy lifting… A lot of bearish bias comments from the ‘experts/FinFluencers’ on ‘FinTwit’ saying how $NVX.au shouldn’t be up so much…. I just follow the price action/system signals.
The Mean Reversion systems were positive in the first 2 weeks of NOVEMBER and on track for their best Monthly return all year, but then fizzled out into the end of month.
The NDX100 system reversed a negative start to the month and ‘stonked’ into the end of month.
December 1, 2021 at 12:14 am #114108SteveWallbrinkMemberHi Glen,
Congrats on the stats for your ASX Momo systems.
Your drawdowns seem incredibly low.
You obviously have a very tight regime filter. My regime filter is very open – so something for me to look at!
Can I ask how you deal with liquidity on the ASX when using XSO or even XKO?December 1, 2021 at 12:23 am #114111GlenPeakeParticipantThanks Steve…. There’s enough liquidity on the OPEN auction to get my fills on XSO & ASX100…..
If a stock has low liquidity, then as it is a monthly system you could space out your orders over the day etc…. but I haven’t had an issue as yet.
December 1, 2021 at 4:54 am #114096DeanWaltonMemberHi Glen,
I have tried many things and i’m getting the same results which means my logic is flawed and/or I’m missing something and/or i’m stuck in a cycle or all of the above.
I have attached some results (finally worked out how to add attachment!!) from what i have done today but they aren’t very different to before. Period thru 2011-2015 would be tough to go thru. I’ll try and send my code again in an attachment to see if that helps as i have lots of stuff in the code which I have for learning purposes and i think that might not have transferred when i posted it in the forum properly which is why you might have got errors. At least i may have worked that bit out! I’ll try to resend it without all the fluff i keep in it for learning purposes.
-
AuthorPosts
- You must be logged in to reply to this topic.