Home › Forums › Trading System Mentor Course Community › Trading System Brainstorming › Group Collaboration System Ideas
- This topic is empty.
-
AuthorPosts
-
May 17, 2016 at 5:55 am #103985TrentRothallParticipant
Mine are different again! haha
What are people/Nicks thoughts on testing systems pre 2000 in the US espically Mean reversion systems. The returns are so high compared to most years after that i feel it distorts the backtesting results. The way people operate in the market has changed a lot since then with internet/computer trading surely the market has changed a bit?
Is it better to focus on this century 2000-today?
May 17, 2016 at 6:39 am #103720Nick RadgeKeymasterPrior to 2000 there was no decimalization in US.
Always better to focus on more recent data in my opinion.
May 17, 2016 at 7:04 am #103721TrentRothallParticipantThis is my results from 2000 – 2016
i used for the exit Close > MA(c,5) – exit next open
No leverage
May 17, 2016 at 8:03 am #103722LeeDanelloParticipantTrent, These are my parameters
May 17, 2016 at 8:15 am #103989TrentRothallParticipantwhat’s lower & upper band limit?
What’s your stats from 2000-1/1/16
May 17, 2016 at 8:28 am #103990LeeDanelloParticipantJust bollinger stuff. Sometimes I like to plot percentb as an indicator
Code:UpperBand = BBandTop( C, Periods, stddev );
LowerBand = BBandBot( C, Periods, stddev );
percentb = (C – LowerBand)/(UpperBand – LowerBand);/*
%b = (Price – Lower Band)/(Upper Band – Lower Band)
%b equals 1 when price is at the upper band
%b equals 0 when price is at the lower band
%b is above 1 when price is above the upper band
%b is below 0 when price is below the lower band
%b is above .50 when price is above the middle band (5-day SMA)
%b is below .50 when price is below the middle band (5-day SMA)
*/
lowerbandlimit = Param(“Lower Band Limit”,0.0,-0.5,0.5,0.1);
upperbandlimit = Param(“Upper Band Limit”,0.5,0,1.5,0.1);
BBWidth = (UpperBand – LowerBand)/ LowerBand *100;Code:percentb < lowerbandlimit;is the same as
Code:C < LowerBand01/01/2000 to 31/12/2015
May 17, 2016 at 9:51 am #103723TrentRothallParticipantIs that with leverage?
How about we get on the same page with these rules. I believe they are the same as Said’s original ones.
no leverage for now 20 positions @ 5%
V > 500k
No index filter
Rus 1000 from 1.1.2000 – 1.1.2016
C > 100 day MA
5 period bollinger bands with a width of 1.5 std dev
width between band needs to be > 5%
C < bottom band Buy on limit at L – (ATR(10*0.5)
sell on next open when C > 5 day MAMay 17, 2016 at 11:01 am #103724ScottMcNabParticipantBased on those rules Trent:
May 17, 2016 at 11:29 am #103991LeeDanelloParticipantThese are my entry and exit conditions – no margin
Code://====================================================================
//Entry and Exit Rules
//====================================================================
MArange = Param(“MA Range”,100,1,1000,1);
Periods = Param(“Bollinger Period”,5,1,100,1);
stddev = Param(“Standard Deviation Bands”,1.5,0,3,0.1);UpperBand = BBandTop( C, Periods, stddev );
LowerBand = BBandBot( C, Periods, stddev );
BBWidth = (UpperBand – LowerBand)/ LowerBand *100;
//——————————————————————–
//Limit Entry using the stretch
//——————————————————————–
ATRp = Param(“Limit Price: ATR period”,10,1,20,1);
ATRmulti = Param(“Limit Price: ATR Multi”,0.5,0,1.5,.1);
ATRVal = ATR(ATRp)*ATRmulti;
BuyLimP = L – ATRval; //stretch
TickLo = IIf(MarketID(0) == 10 OR MarketID(0) == 14 ,IIf(L<0.10,0.001,IIf(L<2.00,0.005,0.01)),0.01);
BuyLimVal = round(BuyLimP/TickLo);
BuyLim = BuyLimVal * TickLo; //stretchCond1 = C < LowerBand; //close below lower band Cond2 = C > MA(C,MArange);
Cond3 = VolFilt AND IndexUp AND UniverseFilter;
Cond4 = BBWidth > 5;OnLastTwoBarsOfDelistedSecurity = BarIndex() >= (LastValue(BarIndex()) -1) AND !IsNull(GetFnData(“DelistingDate”));
OnSecondLastBarOfDelistedSecurity = BarIndex() == (LastValue(BarIndex()) -1) AND !IsNull(GetFnData(“DelistingDate”));BuySetUp = Cond1 AND Cond2 AND Cond3 AND Cond4;
LE = Ref(BuySetUp,-1) AND L <= Ref(BuyLim,-1) AND NOT OnLastTwoBarsOfDelistedSecurity; LEPrice = Min(O,ref(BuyLim,-1)); LExPrice = O; SellSetUp = C > MA(C,Periods); //sell at middle band
LEx = Ref(SellSetUp,-1);May 17, 2016 at 12:58 pm #103981SaidBitarMemberMaurice Petterlin wrote:sell – Close is above MA 5 days or crosses with MA 5 days?It is the same
May 17, 2016 at 1:05 pm #103993SaidBitarMember@Maurice I think the code is similar to mine but your results are way high for non leveraged
May 17, 2016 at 1:07 pm #103992AnonymousInactiveMaurice Petterlin wrote:Code:Cond1 = C < LowerBand; //close below lower band Cond2 = C > MA(C,MArange);
Cond3 = VolFilt AND IndexUp AND UniverseFilter;
Cond4 = BBWidth > 5;Hi Maurice. Do your need to add something like “AND HDBFilter” into your “Cond3” ?
May 17, 2016 at 1:20 pm #103994LeeDanelloParticipantSaid Bitar wrote:Maurice Petterlin wrote:sell – Close is above MA 5 days or crosses with MA 5 days?It is the same
I don’t think so. Cross is only true at the point it crosses, Close is above MA 5 is always true as long as the close is above the MA
May 17, 2016 at 1:23 pm #103995LeeDanelloParticipantDarryl Vink wrote:Maurice Petterlin wrote:Code:Cond1 = C < LowerBand; //close below lower band Cond2 = C > MA(C,MArange);
Cond3 = VolFilt AND IndexUp AND UniverseFilter;
Cond4 = BBWidth > 5;Hi Maurice. Do your need to add something like “AND HDBFilter” into your “Cond3” ?
Darryl, you could be right, but shouldn’t change the results.
Here’s the code I usedCode:/*For the sake of getting started here is a swing trading strategy using BB.the rules are as follows:
No index Filter
Min average Volume is 500K
Close is above MA 100 days
BB (5,1.5)
Close below the lower band
BB width is greater than 5% (BBWidth = (BBTop – BBBot)/ BBBot *100;)
Buy on limit order if the price drops a bit under the low (0.5ATR(10))
Sell cross with MA 5days*/_SECTION_BEGIN( “Historical Database Testing” );
//====================================================================
//Historical Database 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;//set to 1 to start
if( ASXList == “1: Off” ) HistDB = 1;
if( ASXList == “2: ASX 20” ) HistDB = IsIndexConstituent( “$XTL” );
if( ASXList == “3: ASX 50” ) HistDB = IsIndexConstituent( “$XFL” );
if( ASXList == “4: ASX 100” ) HistDB = IsIndexConstituent( “$XTO” );
if( ASXList == “5: ASX 200” ) HistDB = IsIndexConstituent( “$XJO” );
if( ASXList == “6: ASX 300” ) HistDB = IsIndexConstituent( “$XKO” );
if( ASXList == “7: ASX All Ordinaries” ) HistDB = IsIndexConstituent( “$XAO” );
if( ASXList == “8: ASX Small Ordinaries” ) HistDB = IsIndexConstituent( “$XKO” ) AND NOT IsIndexConstituent( “$XTO” );
if( ASXList == “9: ASX Emerging Companies” ) HistDB = IsIndexConstituent( “$XEC” );
if( ASXList == “10: Excluding ASX 300” ) HistDB = IsIndexConstituent( “$XKO” ) == 0;
if( ASXList == “11: In XAO but Exc ASX 100” ) HistDB = IsIndexConstituent( “$XAO” )AND NOT IsIndexConstituent( “$XTO” );
if( ASXList == “12: Exc XAO” ) HistDB = IsIndexConstituent( “$XAO” ) == 0;//———————————————————————————
USList = ParamList(“US Historical Watchlist:”,”1: Off|2: Russell 1000|3: Russell 2000|4: Russell 3000|5: NASDAQ 100|6: Dow Jones Industrial Average|7: S&P 500|8: S&P 100|9: S&P MidCap 400|10: S&P SmallCap 600|11: S&P 1500|12: Russell MicroCap|13: Russell MidCap”,0);
USHistDB = 1;//set to 1 to startif(USList == “1: Off”) USHistDB = 1;
if(USList == “2: Russell 1000”) USHistDB = IsIndexConstituent(“$RUI”);
if(USList == “3: Russell 2000”) USHistDB = IsIndexConstituent(“$RUT”);
if(USList == “4: Russell 3000”) USHistDB = IsIndexConstituent(“$RUA”);
if(USList == “5: NASDAQ 100”) USHistDB = IsIndexConstituent(“$NDX”);
if(USList == “6: Dow Jones Industrial Average”) USHistDB = IsIndexConstituent(“$DJI”);
if(USList == “7: S&P 500”) USHistDB = IsIndexConstituent(“$SPX”);
if(USList == “8: S&P 100”) USHistDB = IsIndexConstituent(“$OEX”);
if(USList == “9: S&P MidCap 400”) USHistDB = IsIndexConstituent(“$MID”);
if(USList == “10: S&P SmallCap 600”) USHistDB = IsIndexConstituent(“$SML”);
if(USList == “11: S&P 1500”) USHistDB = IsIndexConstituent(“$SP1500”);
if(USList == “12: Russell MicroCap”) USHistDB = IsIndexConstituent(“$RUMIC”);
if(USList == “13: Russell MidCap”) USHistDB = IsIndexConstituent(“$RMC”);//———————————————————————————
HDBFilter = HistDB AND USHistDB;
//====================================================================
_SECTION_END();_SECTION_BEGIN(“Optional Price Filter and TO Filter”);
//====================================================================
//Price and Volume Filters
//====================================================================
PriceTog = ParamToggle(“Price Filter”,”Off|On”,1);
PF = ParamField(“Price Field”,6);
MinSP = Param(“Minimum Share Price – $”,5,0.00,1000,0.01);
MaxSP = Param(“Maximum Share Price – $”,100,0.00,2000,0.01);
MinMaxSP = PF >= MinSP AND PF <= MaxSP; PriceFilt = IIf(PriceTog,MinMaxSP,1); //-------------------------------------------------------------------- VolTog = ParamToggle("Volume Filter","Off|On",1); MinVol = Param("Minimum Volume",500000,0,10000000,1000); VolMA = Param("Volume MA",10,1,200,1); AveVol = EMA(Volume,VolMA); VolFilter = AveVol > MinVol AND Volume > MinVol;
VolFilt = IIf(VolTog,VolFilter,1);
//——————————————————————–
OptFilt = PriceFilt AND VolFilt;
//====================================================================
_SECTION_END();_SECTION_BEGIN(“Index Filter”);
//====================================================================
//Index Filter
//====================================================================
IndexTog = ParamToggle(“Index Filter”,”On|Off”,1);
IndexCode = ParamStr(“Index Symbol”,”$SPX”);
Index = Foreign(IndexCode,”C”);
IndMA = Param(“Index Filter MA”,150,2,250,1);IndexFiltUp = Index > MA(Index,IndMA);
IndexUp = IIf(IndexTog,1,IndexFiltUp);
//====================================================================
_SECTION_END();//====================================================================
//Universe Filter
//====================================================================
List = Paramlist(“Universe Filter:”,”1:Off|2:Resources|3:Industrials”,0); //– this sets the drop down list
UniverseFilter = 1; //– set the filter to 1 to start
If (List == “1:Off”) UniverseFilter = 1;
If (List == “2:Resources”) UniverseFilter = InGics(“10”) OR InGics(“151040”);
If (List == “3:Industrials”) UniverseFilter = InGics(“10”)==0 OR InGics(“151040”)==0;
//====================================================================
_SECTION_END();//====================================================================
//Entry and Exit Rules
//====================================================================
MArange = Param(“MA Range”,100,1,1000,1);
Periods = Param(“Bollinger Period”,5,1,100,1);
stddev = Param(“Standard Deviation Bands”,1.5,0,3,0.1);UpperBand = BBandTop( C, Periods, stddev );
LowerBand = BBandBot( C, Periods, stddev );
percentb = (C – LowerBand)/(UpperBand – LowerBand);
BBWidth = (UpperBand – LowerBand)/ LowerBand *100;
/*
%b = (Price – Lower Band)/(Upper Band – Lower Band)
%b equals 1 when price is at the upper band
%b equals 0 when price is at the lower band
%b is above 1 when price is above the upper band
%b is below 0 when price is below the lower band
%b is above .50 when price is above the middle band (5-day SMA)
%b is below .50 when price is below the middle band (5-day SMA)
*/
lowerbandlimit = Param(“Lower Band Limit”,0.0,-0.5,0.5,0.1);
upperbandlimit = Param(“Upper Band Limit”,0.5,0,1.5,0.1);function ParamOptimize(pname,defaultval,minv,maxv,step)
{
return Optimize(pname,Param(pname,defaultval,minv,maxv,step),minv,maxv,step);
}
//——————————————————————–
//Limit Entry using the stretch
//——————————————————————–
ATRp = Param(“Limit Price: ATR period”,10,1,20,1);
ATRmulti = Param(“Limit Price: ATR Multi”,0.5,0,1.5,.1);
ATRVal = ATR(ATRp)*ATRmulti;
BuyLimP = L – ATRval; //stretch
TickLo = IIf(MarketID(0) == 10 OR MarketID(0) == 14 ,IIf(L<0.10,0.001,IIf(L<2.00,0.005,0.01)),0.01);
BuyLimVal = round(BuyLimP/TickLo);
BuyLim = BuyLimVal * TickLo; //stretchCond1 = percentb < lowerbandlimit; //close below lower band Cond2 = C > MA(C,MArange);
Cond3 = VolFilt AND IndexUp AND UniverseFilter;
Cond4 = BBWidth > 5;OnLastTwoBarsOfDelistedSecurity = BarIndex() >= (LastValue(BarIndex()) -1) AND !IsNull(GetFnData(“DelistingDate”));
OnSecondLastBarOfDelistedSecurity = BarIndex() == (LastValue(BarIndex()) -1) AND !IsNull(GetFnData(“DelistingDate”));BuySetUp = Cond1 AND Cond2 AND Cond3 AND Cond4;
LE = Ref(BuySetUp,-1) AND L <= Ref(BuyLim,-1) AND NOT OnLastTwoBarsOfDelistedSecurity; LEPrice = Min(O,ref(BuyLim,-1)); LExPrice = O; SellSetUp = percentb > upperbandlimit; //sell at middle band
LEx = Ref(SellSetUp,-1);
//——————————————————————–
//Stops
//——————————————————————–
Short = Cover = False;
//====================================================================
//Looping
//====================================================================
Buy = 0;
Sell = 0;
LPriceAtBuy = 0;
LBIT = 0;
//====================================================================
for( j = 1; j < BarCount; j++ ) { if( LPriceAtBuy == 0 AND LE[j] ) { Buy[j] = True; LPriceAtBuy = LEPrice[j]; BuyPrice[j] = LEPrice[j]; LBIT[j] = 1; if( LBIT[j] > 1 AND LEx[j] OR OnSecondLastBarOfDelistedSecurity[j] )
{
Sell[j] = True;
SellPrice[j] = LExPrice[j];
LPriceAtBuy = 0;
}
}else
if( LPriceAtBuy > 0 )
{
LBIT[j] = LBIT[j – 1] + 1;if( LBIT[j] > 1 AND LEx[j] OR OnSecondLastBarOfDelistedSecurity[j] )
{
Sell[j] = True;
SellPrice[j] = LExPrice[j];
LPriceAtBuy = 0;
}
}
}//====================================================================
LESetup = IIf(LBIT==0 OR Sell==1,BuySetUp,0); //Long Entry Set Up
LExSetup = IIf(LBIT>0 AND Sell==0,SellSetup,0); //Long Exit Set Up//——————————————————————–
Filter = Buy OR Sell OR LESetUp OR LExSetUp OR LBIT>0;
AddTextColumn(WriteIf(LESetup,”Buy Setup”,””),”Entry Signal”,1.2,colorDefault,IIf(LESetup,colorBrightGreen,colorDefault),130);
AddTextColumn(WriteIf(LExSetup,”Exit”,””),”Exit Signal”,1.2,colorDefault,IIf(LExSetup,colorRed,colorDefault),100);
AddTextColumn(WriteIf(Buy,”Buy”,””),”Today’s Entries”,1.2,colorDefault,IIf(Buy,colorGreen,colorDefault),130);
AddTextColumn(WriteIf(Sell,”Sell”,””),”Today’s Exits”,1.2,colorDefault,IIf(Sell,colorRed,colorDefault),130);
AddColumn(LBIT,”LBIT”,1.0);
SetSortColumns(-3,-4,-5,-6,1);/*Filter = 1;
AddColumn(BuySetUp,”Buy Setup”,1);
AddColumn(Buy,”Buy”,1);
AddColumn(SellSetUp, “Sell Setup”,1);
AddColumn(Sell,”Sell”,1);
*/
//====================================================================
//Interpretation Window
//====================================================================
//”Stop Level: “+NumToStr(StopLossExit,1.3);
“3 Lower Closes and below lower band: “+WriteIf(Cond1,”Yes”,”No”);
“Above long term MA: “+WriteIf(Cond2,”Yes”,”No”);
“Index Filer On: “+WriteIf(IndexTog,”No”,”Yes”);
“”;
“Bars In Trade: “+NumToStr(LBIT,1);
“Close above mid band: “+WriteIf(SellSetUp,”Yes”,”No”);
//====================================================================
_SECTION_BEGIN(“Chart Plotting”);
//====================================================================
SetChartOptions(0,chartShowArrows|chartShowDates);
_N(Title = StrFormat(“{{NAME}} – {{INTERVAL}} {{DATE}} Open %g, Hi %g, Lo %g, Close %g (%.1f%%) {{VALUES}}”, O, H, L, C, SelectedValue( ROC( C, 1 ) ) ));
ChartType = ParamList(“Chart Type”,”OHLC Bar|Candle|Line”,0);
SetChartBkColor(ParamColor(“Background Colour”,colorWhite));UpColour = ParamColor(“Bar/Candle Up Colour”,colorGreen);
DownColour = ParamColor(“Bar/Candle Down Colour”,colorRed);Colour1 = IIf(C > Ref(C,-1),UpColour,DownColour);
Colour2 = IIf(C > O,UpColour,DownColour);
Colour3 = ParamColor(“Line Chart Colour”,colorRed);
TextColour = ParamColor(“Text Colour”,colorBlack);if(ChartType == “OHLC Bar”) ChartOption = styleBar;
if(ChartType == “Candle”) ChartOption = styleCandle;
if(ChartType == “Line”) ChartOption = styleLine;if(ChartType == “OHLC Bar”) ColourOption = Colour1;
if(ChartType == “Candle”) ColourOption = Colour2;
if(ChartType == “Line”) ColourOption = Colour3;
//——————————————————————–
Plot(Close,”Close”,ColourOption,styleNoTitle|ChartOption|ParamStyle(“Chart Style”));
GraphXSpace = 10;PlotShapes(shapehollowUpArrow*LESetup,colorGreen,0,L,-40); //plots an arrow for a setup bar
PlotShapes(shapehollowdownArrow*LExSetup,colorRed,0,H,-40); //plots an arrow for an exit bar
PlotShapes(shapeHollowSmallSquare*Buy,TextColour,0,BuyPrice,0); //plots a small hollow square right at the buy price
PlotShapes(shapeHollowSmallSquare*Sell,TextColour,0,SellPrice,0); //plots a small hollow square right at the sell price
//——————————————————————–
FirstVisibleBar = Status(“FirstVisibleBar”);
LastVisibleBar = Status(“LastVisibleBar”);for( b = Firstvisiblebar; b <= Lastvisiblebar AND b < BarCount; b++) { if(Buy[b]) PlotText("n Buyn "+NumToStr(BuyPrice[b],1.3),b,BuyPrice[b]*0.9985,TextColour); else if(Sell[b]) PlotText("n Selln "+NumToStr(SellPrice[b],1.3),b,SellPrice[b]*0.9985, TextColour); } //==================================================================== _SECTION_END(); _SECTION_BEGIN("Backtesting"); //===================================================================== //options in automatic analysis settings //===================================================================== SetTradeDelays(0,0,0,0); SetOption("UsePrevBarEquityForPosSizing",True); Capital = Param("Initial Equity $",25000,1000,1000000,100); SetOption("InitialEquity",Capital); MaxPos = Param("Maximum Open Positions",10,1,100,1); SetOption("MaxOpenPositions",MaxPos); SetOption("AllowSameBarExit",False); SetOption("AllowPositionShrinking", False ); SetOption("InterestRate",0); SetOption("Minshares",1); //SetOption("CommissionMode",2); //Fixed Dollar Amount //SetOption("CommissionAmount",6); //Use IB commision rates Margin = Param("Margin",100,1,100,1); SetOption("AccountMargin",Margin); PositionScore = mtRandom(); //--------------------------------------------------------------------- ""; "Position Sizing Method:"; PosSizeMethod = ParamList("Position Sizing Method:","Fixed Fractional Risk %|Fixed $ Risk Amount|Fixed $ Total Position Size|Fixed % of Portfolio Equity",3); //Risk Calculation FDAmount = Param("Fixed $ Total Position Size",5000,100,100000,100); //Fixed % of Portfolio Equity FPAmount = Param("Fixed % of Portfolio Equity",10,1,100,1); if(PosSizeMethod == "Fixed Fractional Risk %") SetPositionSize(Risk1,spsPercentOfEquity); if(PosSizeMethod == "Fixed $ Risk Amount") SetPositionSize(Risk2,spsShares); if(PosSizeMethod == "Fixed $ Total Position Size") SetPositionSize(FDAmount,spsValue); if(PosSizeMethod == "Fixed % of Portfolio Equity") SetPositionSize(FPAmount,spsPercentOfEquity); //==================================================================== _SECTION_END();
May 17, 2016 at 1:29 pm #103996LeeDanelloParticipantDarryl Vink wrote:Maurice Petterlin wrote:Code:Cond1 = C < LowerBand; //close below lower band Cond2 = C > MA(C,MArange);
Cond3 = VolFilt AND IndexUp AND UniverseFilter;
Cond4 = BBWidth > 5;Hi Maurice. Do your need to add something like “AND HDBFilter” into your “Cond3” ?
Correct, It did change the results
I’m wondering why the results should be different if I turn HDBFilter off and use the inbuilt filter set to Russel 1000 historical constituents?
-
AuthorPosts
- You must be logged in to reply to this topic.