Forum Replies Created
-
AuthorPosts
-
LeeDanelloParticipant
.short term pullback to get into a longer term trend ?
Not sure what you mean Scott, but stops impact the performance so I don’t use them. I use the stale stop instead
LeeDanelloParticipantA group collaboration idea that got me started.
Too many variables for my liking and trade frequency too low for ASX. Code is attached as a txt file.Code:/*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*/
#include_once “FormulasNorgate DataNorgate Data Functions.afl”
_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 = 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;//———————————————————————————
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 = NorgateIndexConstituentTimeSeries (“$RUI”);
if(USList == “3: Russell 2000”) USHistDB = NorgateIndexConstituentTimeSeries (“$RUT”);
if(USList == “4: Russell 3000”) USHistDB = NorgateIndexConstituentTimeSeries (“$RUA”);
if(USList == “5: NASDAQ 100”) USHistDB = NorgateIndexConstituentTimeSeries (“$NDX”);
if(USList == “6: Dow Jones Industrial Average”) USHistDB = NorgateIndexConstituentTimeSeries (“$DJI”);
if(USList == “7: S&P 500”) USHistDB = NorgateIndexConstituentTimeSeries (“$SPX”);
if(USList == “8: S&P 100”) USHistDB = NorgateIndexConstituentTimeSeries (“$OEX”);
if(USList == “9: S&P MidCap 400”) USHistDB = NorgateIndexConstituentTimeSeries (“$MID”);
if(USList == “10: S&P SmallCap 600”) USHistDB = NorgateIndexConstituentTimeSeries (“$SML”);
if(USList == “11: S&P 1500”) USHistDB = NorgateIndexConstituentTimeSeries (“$SP1500”);
if(USList == “12: Russell MicroCap”) USHistDB = NorgateIndexConstituentTimeSeries (“$RUMIC”);
if(USList == “13: Russell MidCap”) USHistDB = NorgateIndexConstituentTimeSeries (“$RMC”);//———————————————————————————
HDBFilter = HistDB AND USHistDB;
//====================================================================
_SECTION_END();_SECTION_BEGIN (“Optional Price & Volume Filters”);
//=================================================================================
//Optional Price & Volume Filters
//=================================================================================
CloseToggle = ParamToggle(“Close Price”,”Adjusted|Unadjusted”,0);
CloseArray = IIf(CloseToggle,NorgateOriginalCloseTimeSeries(),Close);VolumeToggle = ParamToggle(“Volume”,”Adjusted|Unadjusted”,0);
VolumeArray = IIf(VolumeToggle,NorgateOriginalVolumeTimeSeries(),Volume);
//———————————————————————————
PriceTog = ParamToggle(“Price Filter”,”Off|On”,1);
MinSP = Param(“Minimum Share Price – $”,0.25,0.00,1000,0.01);
MaxSP = Param(“Maximum Share Price – $”,25,0.00,2000,0.01);
MinMaxSP = CloseArray >= MinSP AND CloseArray <= MaxSP; PriceFilt = IIf(PriceTog,MinMaxSP,1); //--------------------------------------------------------------------------------- TOTog = ParamToggle("Turnover Filter","Off|On",0); Turnover = CloseArray*VolumeArray; MinTO = Param("Minimum Turnover - $",500000,0,10000000,1000); currentYr = Year(); //http://www.rateinflation.com/inflation-rate/australia-historical-inflation-rate?start-year=1999&end-year=2017 //Year ann inflation //2016 1.30% //2015 1.50% //2014 2.50% //2013 2.50% //2012 1.70% //2011 3.30% //2010 2.90% //2009 1.70% //2008 4.40% //2007 2.30% //2006 3.50% //2005 2.70% //2004 2.30% //2003 2.70% //2002 3.10% //2001 4.30% //2000 4.50% Factor2016 = 1.013; Factor2015 = 1.028195; Factor2014 = 1.053899875; Factor2013 = 1.080247371875; Factor2012 = 1.09861157719687; Factor2011 = 1.13486575924437; Factor2010 = 1.16777686626246; Factor2009 = 1.18762907298892; Factor2008 = 1.23988475220043; Factor2007 = 1.26840210150104; Factor2006 = 1.31279617505358; Factor2005 = 1.34824167178003; Factor2004 = 1.37925123023097; Factor2003 = 1.4164910134472; Factor2002 = 1.46040223486406; Factor2001 = 1.52319953096322; Factor2000 = 1.59174350985656; MinTO=IIf(currentYr==2017,MinTO, IIf(currentYr==2016,MinTO/Factor2016, IIf(currentYr==2015,MinTO/Factor2015, IIf(currentYr==2014,MinTO/Factor2014, IIf(currentYr==2013,MinTO/Factor2013, IIf(currentYr==2012,MinTO/Factor2012, IIf(currentYr==2011,MinTO/Factor2011, IIf(currentYr==2010,MinTO/Factor2010, IIf(currentYr==2009,MinTO/Factor2009, IIf(currentYr==2008,MinTO/Factor2008, IIf(currentYr==2007,MinTO/Factor2007, IIf(currentYr==2006,MinTO/Factor2006, IIf(currentYr==2005,MinTO/Factor2005, IIf(currentYr==2004,MinTO/Factor2004, IIf(currentYr==2003,MinTO/Factor2003, IIf(currentYr==2002,MinTO/Factor2002, IIf(currentYr==2001,MinTO/Factor2001, IIf(currentYr==2000,MinTO/Factor2000,0)))))))))))))))))); TOMA = Param("Turnover MA",10,1,200,1); AveTO = MA(Turnover,TOMA); TOFilter = AveTO > MinTO AND Turnover > MinTO;
TOFilt = IIf(TOTog,TOFilter,1);
//———————————————————————————
VolTog = ParamToggle(“Volume Filter”,”Off|On”,1);
MinVol = Param(“Minimum Volume”,250000,0,10000000,1000);
VolFilter = VolumeArray > MinVol;
VolFilt = IIf(VolTog,VolFilter,1);
//———————————————————————————
AveVolTog = ParamToggle(“Average Volume Filter”,”Off|On”,1);
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(“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();_SECTION_BEGIN(“Gap Filter”);
//=========================================================
// Gap Filter
//=========================================================
“nGap filter:”;
gapTog = ParamToggle(“Gap Filter”,”On|Off”,0);
gapPercent = Param(“Gap %”,15,10,100,1);
gapPeriod = Param(“Gap Up Lookback”,100,20,100,5);
priceField1 = C;
priceField2 = Ref(C,-1);
ratio = ((priceField1-priceField2)/priceField2)*100;gap = (GapUp() OR GapDown()) AND abs(ratio) >= gapPercent;
gapNumber = Sum(gap,gapPeriod);
gapFilter = gapNumber == 0;
gapFilterOn = IIf(gapTog,1,gapFilter);
//=========================================================
_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;
BBParam = Param(“% BB width”,5,1,50,0.1);
consecCloses = Param(“consecutive closes below band”,1,1,5,1);
adxPeriod = Param(“ADX period”,8,8,30,2);
adxMin = Param(“ADX Min”, 30,20,60,5);
/*
%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 = LLV(percentb < lowerbandlimit,consecCloses); //close below lower band Cond2 = C > MA(C,MArange);
Cond3 = OptFilt AND IndexUp AND UniverseFilter AND HDBFilter;
Cond4 = BBWidth > BBParam;
Cond5 = ADX(adxPeriod) > adxMin;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 AND Cond5;
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;
ExitBars = Param(“# Exit Bars”,9,2,100,1);
StopLossPercentage = Param(“% Hard Stop Loss”,10,0,100,1); //Stop Loss
//====================================================================
//Looping
//====================================================================
Buy = 0;
Sell = 0;
LPriceAtBuy = 0;
LBIT = 0;
FlagExit = 0;
MaxLossPrice = Null;
//====================================================================
for( j = 1; j < BarCount; j++ ) { if( LPriceAtBuy == 0 AND LE[j] ) { Buy[j] = True; LPriceAtBuy = LEPrice[j]; BuyPrice[j] = LEPrice[j]; MaxLossPrice[j] = LPriceAtBuy * ( 1 - StopLossPercentage / 100 ); LBIT[j] = 1; if( LBIT[j] > 1 AND LEx[j] OR OnSecondLastBarOfDelistedSecurity[j] )
{Sell[j] = True;
SellPrice[j] = LExPrice[j];
LPriceAtBuy = 0;
}if( LBIT[j] > 1 AND L[j – 1] <= MaxLossPrice[j - 1] ) { Sell[j] = True; SellPrice[j] = LExPrice[j]; LPriceAtBuy = 0; } } else if( LPriceAtBuy > 0 )
{
LBIT[j] = LBIT[j – 1] + 1;
MaxLossPrice[j] = MaxLossPrice[j – 1];if( LBIT[j] > 1 AND L[j – 1] <= MaxLossPrice[j - 1] OR OnSecondLastBarOfDelistedSecurity[j] ) { Sell[j] = True; SellPrice[j] = LExPrice[j]; LPriceAtBuy = 0; } if( LBIT[j] == ExitBars ) //Exit trade after a certain number of bars { FlagExit[j] = True; } if( LBIT[j] > ExitBars )
{
Sell[j] = True;
SellPrice[j] = LExPrice[j];
LPriceAtBuy = 0;
}if( LBIT[j] > 1 AND LEx[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();
LeeDanelloParticipantI would pay 5k – 2.5k (Amibroker Coding) + 2.5k (Trading Course)
The clincher for me would be to walk away from the course with a system that is tradeable.
A lot of courses provide lots of information, but don’t provide the framework to use that information in trading.LeeDanelloParticipantMaybe we should have a depositry where people could put their disused systems in. One man’s garbage could be another man’s treasure.
LeeDanelloParticipantYes but copy all the good stuff and save it into AMIBROKER otherwise you’ll lose track
LeeDanelloParticipantYep one of the beauties of this course are the code snippets that you won’t find anywhere else. So without this course, unless you are an elite coder, chances are you’ve probably introduced some sort of bias into your system. I’ve been using AMIBROKER since about 2004 and still haven’t got my head around a lot of the coding even though I strip, deconstruct and piece together a lot of stuff I find on the forums. I don’t think coding comes naturally to a lot of people. It’s a work in progress.
LeeDanelloParticipantI like your graphs very much. A picture paints a thousand words.
LeeDanelloParticipantKey Performance Indicators
LeeDanelloParticipantYou’re right Julian. I would run the test over 20 years
LeeDanelloParticipantI thought there were 3 directions – up, down or sideways. What are the other two? 5 MR systems would sure have you covered.
LeeDanelloParticipantNick Radge wrote::woohoo:A lesser person will tell you the market is rigged.
Donald Trump
LeeDanelloParticipantIn most cases….The only source of knowledge is experience. Albert Einstein
LeeDanelloParticipantBetter. Wow 3 days where the system goes to the extreme. They must have been huge down days. Obviously not statistically significant.
LeeDanelloParticipantScott, the resolution of the image makes it difficult to see the detail. I post my images to postimage and then share the image by copying the image link (share then direct link) and pasting it using the image link from this forum.
It’s free. Example below.]
LeeDanelloParticipantRob, I wouldn’t know the first thing about the instruments you are trading. Sounds interesting and seems like you know the financial scene pretty well. Interesting to hear about the diverse cross section of people doing the mentor course. It’s interesting to know how others are getting on. I got a copy of Tharps Peak Performance course a few years ago from eBay – pretty cheap but haven’t gone through it. I was told that Mark Douglas book covered Van Tharps course at a fraction of the cost.
-
AuthorPosts