Print Page | Close Window

Problem averaging only positive values

Printed From: BullCharts Forum
Category: BullCharts
Forum Name: BullScript
Forum Discription: Technical discussion related specifically to the BullScript programming language.
URL: http://www.bullcharts.com.au/forum/forum_posts.asp?TID=1012
Printed Date: 04 May 2024 at 8:38am
Software Version: Web Wiz Forums 9.69 - http://www.webwizforums.com


Topic: Problem averaging only positive values
Posted By: cudderbean
Subject: Problem averaging only positive values
Date Posted: 01 Jun 2017 at 10:02pm
I am trying to create an indicator that measures how far the close is drifting away from the simple 10 day moving average of the close. So that I can see when the close may (?!) be drifting too far away from the mean.

[target=default]

cma:= ma(c,10,simple);
drift := c-cma;
avedrift := ma(drift,250,s); {average amount it drifts away over last 250 periods}

[horzline=0]

[color=blue]
drift;
[color=red]
avedrift;

Try this coding out on WPL for previous 250 days up until 19 May 2017.

The average drift away appears as .098

The PROBLEM is that the code is also including in its calculations negative values where the close also drifts away below the average...where c-cma returns a value less than zero.

I need the code to calculate how far the bull drift tends to move upwards away ONLY when the close is positive above the average. 

When I use Excel to calculate ONLY the positive values >= the average, the average becomes quite different     .482   [and .89 when you add a standard deviation]

So I substituted these lines:
drift := if(c>=cma,c-cma,cma-c);
drift := if(c>=cma,c-cma,0);
drift := if(c>=cma,c-cma,abs(cma-c));

No good.

The problem is that the IF function in BC demands 3 arguments..if ( a, then b, otherwise c)
Whereas Excel technically may only demand 2 arguments:
if      close>cma,   then close-cma,   otherwise ""[i.e. blank which is numerically different from zero]

How can I get BC to calculate when averaging only the positive values above the MA

[I do plan to add refinements like standard deviations to find true extremes, but the basic average is proving tricky...will post end result if successful with coding]

Am I missing the obvious. Anyone with more coding experience, your help would be much appreciated.
Thank you.



Replies:
Posted By: administrator
Date Posted: 20 Jun 2017 at 10:54am

Please try undefined.

drift := if(C>cma,c-cma,undefined);



Posted By: cudderbean
Date Posted: 20 Jun 2017 at 9:07pm
Thank you very kindly for your help.

That neat little function "undefined" does the trick. I have a feeling I have come across this problem before in other coding, so with your help solving it, it opens up more coding possibilities for me.

I am travelling at the moment, but when I get back to Aus, I will post the completed code for my indicator above.

Thanks again.


-------------


Posted By: cudderbean
Date Posted: 25 Jul 2017 at 5:27pm
Thanks for your earlier help, admin.

As always, not the Holy Grail, but perhaps just a warning sign to help make a decision if you feel you are in an overbought or oversold position.

Play with the parameters to suit your trading style. Let me know coding errors or improvements. Thanks.

LINE CHART FORMAT

[description=" Drifter. Measures how far closing price tends to drift away before reverting to mean"]
[target=default]

cn := input("MA close time periods",10,1);
cma := ma(c,cn,simple);
drift := c-cma;
n := input("MA drift time periods",5,1);
method := inputma("Driftma method",SIMPLE);
driftma := hist(ma(drift,n,method),1);
driftup := if(c>=cma,c-cma,undefined);
driftdwn := if(c<cma,cma-c,undefined)*-1;
sdfactor := input("Multiple of stdev",1.0,0);

avedriftup := hist(ma(driftup,250,s),1); {average amount drifts up over last 250 periods}
sd_driftup := hist(stdev(driftup,250),1); {st dev amount drifts up over last 250 periods}
extremdriftup :=avedriftup+(sd_driftup*sdfactor);

avedriftdwn := hist(ma(driftdwn,250,s),1); {average amount drifts down over last 250 periods}
sd_driftdwn := hist(stdev(driftdwn,250),1); {st dev amount drifts down over last 250 periods}
extremdriftdwn :=avedriftdwn+(sd_driftdwn*sdfactor)*-1;

[horzline=0]

[color=blue;name=drift]
drift;

[color=red;name=driftma]
driftma;

[color=purple;name=extremdriftup]
extremdriftup;

[color=purple;name=extremdriftdwn]
extremdriftdwn;

...............................

RIBBON FORMAT

[description=" Drifter. Measures how far closing price tends to drift away before reverting to mean"]
[target=ribbon]

cn := input("MA close time periods",10,1);
cma := ma(c,cn,simple);
drift := c-cma;
n := input("MA drift time periods",5,1);
method := inputma("Driftma method",SIMPLE);
driftma := hist(ma(drift,n,method),1);
driftup := if(c>=cma,c-cma,undefined);
driftdwn := if(c<cma,cma-c,undefined)*-1;
sdfactor := input("Multiple of stdev",1.0,0);

avedriftup := hist(ma(driftup,250,s),1); {average amount drifts up over last 250 periods}
sd_driftup := hist(stdev(driftup,250),1); {st dev amount drifts up over last 250 periods}
extremdriftup :=avedriftup+(sd_driftup*sdfactor);

avedriftdwn := hist(ma(driftdwn,250,s),1); {average amount drifts down over last 250 periods}
sd_driftdwn := hist(stdev(driftdwn,250),1); {st dev amount drifts down over last 250 periods}
extremdriftdwn :=avedriftdwn+(sd_driftdwn*sdfactor)*-1;

[color=darkgreen]
[fillstyle=solid]
drift>=driftma;

[color=red]
[fillstyle=solid]
drift<driftma;

[color=white]


-------------


Posted By: maximo
Date Posted: 11 Jan 2018 at 10:54pm
Thanks, they work well!


I had a similar issue of 'only positive values' with calculating monthly returns in a scan. Min value fixed it.

((O-Ref(O,-21)) / min(O,Ref(O,-21)))*100;










Print Page | Close Window

Bulletin Board Software by Web Wiz Forums® version 9.69 - http://www.webwizforums.com
Copyright ©2001-2010 Web Wiz - http://www.webwiz.co.uk