Forum Replies Created
-
AuthorPosts
-
LeeDanelloParticipant
Something doesn’t add up for me.
I think there should be no difference in results between scenario1 and 2Scenario 1.
+
or
Scenario 2.
+
LeeDanelloParticipantDarryl 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?
LeeDanelloParticipantDarryl 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();
LeeDanelloParticipantSaid 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
LeeDanelloParticipantThese 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);LeeDanelloParticipantJust 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
LeeDanelloParticipantTrent, These are my parameters
LeeDanelloParticipantInteresting results:
Here are mine – 20 positions 5% per position Russell 1000 Historical constituents, IB commissions
No leverage, no index filterCode:Cond1 = C < LowerBand; Cond2 = C > MA(C,MArange);
Cond3 = VolFilt AND IndexUp AND UniverseFilter;
BuySetUp = Cond1 AND Cond2 AND Cond3;Code:SellSetUp = C > MA(C,Periods)
LeeDanelloParticipanthow to change a cell value in Excel on an iPad
Follow these steps to enter data in a cell:
1. Double‐tap the cell where you want to enter data. Excel activates the Formula bar. …
2. Enter the data. To enter numbers, tap the Numbers button to display the numbered keyboard. …
3. Tap the Return key to enter your data in the cell. …
4. Tap the Keyboard key to close the keyboard.LeeDanelloParticipantJust to clarify
buy – Close is above MA 100 days and below the lower band
sell – Close is above MA 5 days or crosses with MA 5 days?If we code it ourselves and get enough results that could be our Monte Carlo
Lets post some results and wait until we have 10 back tests before we compare code.
LeeDanelloParticipantAs a start I like the idea of coming up with a medium term swing trade system using Bollinger Bands.
LeeDanelloParticipantThanks, Went off at a tangent.
LeeDanelloParticipantOk thanks for that. Getting confused between actual trades and potential trades.
You’d need to run an exploration to find the “rejected” trades or setup trades and then compare these to trades taken. Would be interesting to see if these tally up with the real time results.LeeDanelloParticipanttotal orders placed: 1329
total orders filled: 81
total orders rejected: 1248
% orders filled: 6.1%
% orders rejected: 93.9%When you look at it like that then I would question the limits placed on the orders.
Seems like something is not working as planned?
LeeDanelloParticipantAm i correct in saying that the problem with having limit order entries is that a lot of orders won’t get filled in real time trading. So if that’s the case then shouldn’t you allow this in the back testing.
-
AuthorPosts