Mhingas

Following the trend

Category: Strategies By: Mhingas Created: May 18, 2016, 12:15 PM
May 18, 2016, 12:15 PM
Strategies
13 Comments
Following the trend

Trend Trading Model, following the trend By Mr Cleanow I recently finished reading following the trend by Andreas F Cleanow.

In the book, Mr Cleanow constructs a simple Trend following Module which he then thoroughly tests across a diverse investment Universe. He then compares the results achieved by this simple trend module to the results achieved by most successful hedge funds.

The equity curve achieved by this model is more or less the same as what the big CTA’s out there are achieving year on year with acceptable draw downs. I decided to code the model and put it to test my self, as i’m still learning the programming  language used here i thought this would be a great exercise to test what i’ve learnt so far. There’s code which i commented out which i was using in my back tests, the add on portion is not part of the model, but i figured the model is designed to catch trends, so if it does catch a trend it only makes sense to compound positions as the trend develops, it impacts on results drastically. But the main exercise here to code the main model and run the tests myself. Reading the book was an eye opener.

// Definition of code parameters

DEFPARAM CumulateOrders = true // Cumulating positions activated

//**********************************************Conditions to enter long positions***********************************************//
ema50 = ExponentialAverage[50](close)
ema100 = ExponentialAverage[100](close)

Uptrend = (ema50 > ema100)
donchianUpperBand=Highest[50](close[1])
donchianLowerBand=Lowest[50](low[1])

BuyCriteriaMet = (close CROSSES OVER donchianUpperBand)
initialstopExitPoint = Supertrend[3,10]
IF NOT LONGONMARKET AND Uptrend AND BuyCriteriaMet THEN
 BUY 1 SHARES AT high stop
ENDIF

//AddOn
//AddOnToLongPosition = close CROSSES UNDER SAR[0.02,0.02,0.2]
//IF LONGONMARKET AND COUNTOFLONGSHARES < 3 AND POSITIONPERF > 0.02 AND AddOnToLongPosition THEN
//BUY 1 SHARES AT MARKET
//ENDIF
//Exit Long
ExitLongPosition = close < initialstopExitPoint
IF LONGONMARKET AND ExitLongPosition THEN
 SELL AT MARKET
ENDIF
//********************************************End Conditions to enter long positions***********************************************//

//**************************************ShortSell Conditions to enter long positions***********************************************//
Downtrend = (ema50 < ema100)
SellCriteriaMet = (close CROSSES UNDER donchianLowerBand)
IF NOT SHORTONMARKET AND Downtrend AND SellCriteriaMet THEN
 SELLSHORT 1 SHARES AT MARKET
ENDIF

//AddOn
//AddOnToShortPosition = close < Supertrend[3,10] AND close CROSSES OVER SAR[0.02,0.02,0.2]
//IF SHORTONMARKET AND COUNTOFSHORTSHARES < 3 AND POSITIONPERF > 0.02 AND AddOnToShortPosition THEN

//SELLSHORT 1 SHARES AT MARKET
//ENDIF

//Exit Long
ExitShortPosition = close > initialstopExitPoint
IF SHORTONMARKET AND ExitShortPosition THEN
 EXITSHORT AT MARKET
ENDIF

 

Download
Filename: following-the-trend.itf
Downloads: 391
Mhingas
Mhingas Junior
Currently debugging life, so my bio is on hold. Check back after the next commit for an update.
Author’s Profile

Comments

elsys
7 years ago
#

Do you have a working version of the strategy?

MikeGC
10 years ago
#

Hi @Periho, 

Re "Buy at high stop", refer to this post http://www.prorealcode.com/topic/difference-between-buy-at-stop-and-buy-at-limit/.  The reason that buying at market does not work is that it seems the code depends on buying at a price higher than the current market price.  (This command was in the original code - I did not add it.)

Your will find some interesting code for money management at http://www.prorealcode.com/topic/grid-orders-with-one-combined-stop-loss-and-limit-can-it-be-done/.

Hope your coding is a great success - keep me posted.

MikeGC
10 years ago
#

Thank you @Periho, I got a very nice result with some minor mods to your code.  I have optimised the EMA's and the Donchian Bands to produce an ME of 1.75, and an IRR of 121%.  I had to preload 200 bars to get it to start.

// Definition of code parameters

DEFPARAM CumulateOrders = true // Cumulating positions activated
DEFPARAM PreLoadBars = 200

//**********************************************Conditions to enter long positions***********************************************//
ema50 = ExponentialAverage[c](close)
ema100 = ExponentialAverage[d](close)

Uptrend = (ema50 > ema100)
donchianUpperBand=Highest[a](high[1])
donchianLowerBand=Lowest[b](low[1])

BuyCriteriaMet = (close > donchianUpperBand)
initialstopExitPoint = Supertrend[3,10]
IF NOT LONGONMARKET AND Uptrend AND BuyCriteriaMet THEN
BUY 1 SHARES AT high stop
ENDIF

//AddOn
AddOnToLongPosition = close CROSSES UNDER SAR[0.02,0.02,0.2]
IF LONGONMARKET AND COUNTOFLONGSHARES < 3 AND POSITIONPERF > 0.02 AND AddOnToLongPosition THEN
BUY 1 SHARES AT MARKET
ENDIF

//Exit Long
ExitLongPosition = close < initialstopExitPoint
IF LONGONMARKET AND ExitLongPosition THEN
SELL AT MARKET
ENDIF
//********************************************End Conditions to enter long positions***********************************************//

//**************************************ShortSell Conditions to enter long positions***********************************************//
Downtrend = (ema50 < ema100)
SellCriteriaMet = (close < donchianLowerBand)
IF NOT SHORTONMARKET AND Downtrend AND SellCriteriaMet THEN
SELLSHORT 1 SHARES AT MARKET

ENDIF

//AddOn
AddOnToShortPosition = close < Supertrend[3,10] AND close CROSSES OVER SAR[0.02,0.02,0.2]
IF SHORTONMARKET AND COUNTOFSHORTSHARES < 3 AND POSITIONPERF > 0.02 AND AddOnToShortPosition THEN
SELLSHORT 1 SHARES AT MARKET
ENDIF

2Nicolas, I am having trouble uploading the code and the image: HTTP Error. //Exit Long ExitShortPosition = close > initialstopExitPoint IF SHORTONMARKET AND ExitShortPosition THEN EXITSHORT AT MARKET ENDIF

 

Periho
10 years ago
#

This is great, the code is interesting - kindly clarify:

  1. Line 18: BUY 1 SHARES AT high stop | Please explain the function of: «high stop»
  2. Buying 1 SHARES at market is hardly profitable in my back testing . Any suggestions regarding calculation of position sizing?  
  3. Same for calculated losses, for example sizing of positions based on 2-3% losses  of the total risk capital?

I am working on this myself and I will share it when its ready, however thoughts and ideas will be appreciated

Periho
10 years ago
#

My contribution is more on the strategy side; the method of catching a lasting trend on upper Doncian can benefit of being supported by a break out of volume of more than 1,5 the average daily volume over the last 20 days. Trailing SL 5-7 x ATR and holding time 4.5 months. Check that the paper have high volume > 200000/day and is within the range of institutional investor (US is USD5+) (i will be careful with Forex doing this)

trendfollower86
10 years ago
#

Thanks for the code. How do you intent to implement the position sizing. From my experience entries and exits are less important that correct and optimum position sizing.

Mhingas
10 years ago
#

Hi wedret1,

I run the strategy across all markets. commodities (including non agricultural commodities) ,energies, financials. Equities, but because this latter class is highly correlated, i don't run it on individual stocks but the main indices. If one asset class is in a range, funds ( trends ) are moving in other asset classes. the strategy just needs to catch 2-4 directional trends a year, pay for losses incurred when markets are range bound, leave enough on the table to be up on the year.

Rgds,

Mathonsi c 

wedret1
10 years ago
#

Hi Mhingas

What instruments do you trade with this system in South Africa?

Nicolas
10 years ago
#

For your information, I have changed the code in the post, accordingly to Mhingas comment.

Mhingas
10 years ago
#

Hi Stef,

will take a look shortly, and advise. 

Rgds,

 

Mhingas
10 years ago
#

hi Stef,

the first two lines of code need to change to the last two respectively, so we put on a buy stop order tomorrow if the close today
is the highest close in the past 50 days than, the logic is reversed for a short position
donchianUpperBand=Highest[50](high)
donchianLowerBand=Lowest[50](low)

donchianUpperBand=Highest[50](close[1])
donchianLowerBand=Lowest[50](low[1])

Stef
10 years ago
#

Backtesting from 1 July 1979 to today results in 2 trades. Looks like there is a problem somewhere.

ladefense
10 years ago
#

Doesn t work ...no signals

Marche pas chez moi ....

 

ProRealCode ProRealCode
Loading...