Hi Louis,

What will show the smoothness of the pullback is r-squared. It tells you how 
well a set of data points fits a straight line by returning a number from 0 to 
1. 1 is a perfect fit. r-squared ins't built into AmiBroker, but it's simple to 
add:

function RSquared(array, periods) {
 return Correlation(BarIndex(), array, periods) ^ 2;
}

The array would be your price -- I use the highs, but you could use (H + O + 
C)/3, etc. The argument periods has to be a single-valued variable. That makes 
it tricky in this scenario, because the number of bars back to the highest high 
of the past n bars will vary bar-by-bar. I suppose you could pass an array, and 
add a loop to the function itself, and return a custom-built array. I kind of 
like that idea. Even better would be the addition of the formula to AB. I'll 
see if that's in the suggestion database.

Using a simple scan for pullbacks to a rising EMA20 that is in turn above a 
rising EMA40 (classic Pristine setup, but it's been around longer than that) 
showed CRI, BRKR and GEOY all on the same evening a little over a week ago 
among a total of only about 75 charts returned from the scan. r-squared helps 
filter and keep the list you manually scan through small.

By the way, perhaps someone can see why the following code doesn't work as I 
expect it to. Here's a section of code I use in the scan. It's not pretty, as 
you'll see. exploreStartIdx and exploreEndIdx both return a single value, and 
work fine in the for loop that follows. LastValue returns the desired number 
since only one bar satisifes the ValueWhen condition (otherwise LastValue in 
exploration code literally returns that last value in the array passed).

What confuses me is that the line of code in the loop

per = LastValue(ValueWhen(i==BarIndex(), BarsSince(H==HHV(H, 
BarsToLookBackForHHV))));

seems to assign an array to per -- or I should say, passing per as the 
"periods" argument to the r-squared function results in an error, and it is the 
error I see when I accidentally pass an array where a single value is required. 
I have work-around I'd love to do away with. It would eliminate a loop and 
speed up the code. Realizing while writing this that the loop should go inside 
the r-squared function will help a lot. Would probably want to use logic in the 
function to test to see if it is being called in an exploration or backtest to 
reduce the number of iterations of the loop. I'll write that function off-line 
and post separately.

// ************ start snippet *************

exploreStartIdx = LastValue(ValueWhen(DateNum()==Status("rangefromdate"), 
BarIndex()));
exploreEndIdx = LastValue(ValueWhen(DateNum()==Status("rangetodate"), 
BarIndex()));

BarsToLookBackForHHV = 30;
BarsBackToHigh = BarsSince(H==HHV(H, BarsToLookBackForHHV));

// -- Initialize arrays -- not sure this is needed
r2Arr = H-H;
BarsBackToNTHigh = H-H;
DT = DateTime();

for (i=exploreStartIdx; i<=exploreEndIdx; i++) {

  // -- would like this to work
  per = LastValue(ValueWhen(i==BarIndex(), BarsSince(H==HHV(H, 
BarsToLookBackForHHV))));
  
  // -- this is the workaround -- not very nice. 
  highestHigh = 0;
  if (i > (BarsToLookBackForHHV + 1)) {

    for (k=1; k<=BarsToLookBackForHHV; k++) {
      curHigh = H[i-k];
      if (curHigh >= highestHigh) {
        highestHigh = curHigh;
        BarsBackToNTHigh[i] = k;
      } 
 
    }
  
    per = BarsBackToNTHigh[i];
    r2 = RSquared(H, per) * 100;
    // -- array of r-squared values to use in exploration, etc.
    r2arr[i] = r2[i];

  }

}

// ************ end snippet *************


I emailed this to support, but didn't get a response on this one. That's not a 
knock on support -- Tomasz and Marcin provide excellent responses and usually 
quite quickly -- I think this one just slipped between the cracks, or even just 
got lost in the ether -- or a junk mail filter -- somewhere. But I would like 
to get to the bottom of it. It at least *seems* to me it should work, but I may 
just not be seeing an error I've made in the code.

Totally off-topic -- it's interesting to see that RIMM and GOOG and others are 
right on support after Friday's close.

Regards,

Gordon

  ----- Original Message ----- 
  From: Louis P. 
  To: [email protected] 
  Sent: Friday, September 05, 2008 8:23 PM
  Subject: Re: [amibroker] How to calculate a slope % with Rsquared without a 
loop?



  Hi again,

  Here is what I've done so far:

  higher= HHV(H,20);
  RL= LinearReg (higher,20);
  slope= ((RL - Ref(RL,-1)) /  Ref(RL,-1))*100;

  Ok so with this I first get the value of the highest high of the last 20 
periods.  Then I do a Linear regression of this High (is it correct or should I 
do a LR from the date/time of that High?).  Then I calculate the slope.  Are 
you sure about the -1 value?  Cause the result is not really meaningful.  I can 
have a very negative value and then 3-4 bars later (when we are out of the 
latest HHV bar that was in the last 20 bars) then the result is much higher.  
Do you think this formula looks good?

  Also, how do you do to calculate the minbars<barspast?

  Thanks,

  Louis



  2008/9/5 Ara Kaloustian <[EMAIL PROTECTED]>


    I think the best solution would come from linear regression ... along with 
some help from smoothing perhaps.

    The concept would be that you first qualify a setup.
    Exapmle: 
    You want 10% drop from HHV in a particular amount of time ... maximum 
number of bars. (MinBars to MaxBars)

    1. Close < 0.9 * HHV(High,Maxbars);       // 10 % drop in less then Numbars 
bars
    2. BarsPast = HHVBars(High,Maxbars);  // Bars since HHV
    3. MinBars < BarsPast;                          // Insure that a minimum 
number of bars since HHV
    4. Draw regression line - Plot(LinearReg(array,period) .... ) 
    5. Evaluate slope of regression line
        slope = RL - Ref(RL,-1) /  Ref(RL,-1);   //  Slope at any point on the 
line
    6. You can decide how to alternately evaluate to slope .... max or min 
slope value ...etc

    You may also use a smoothed price array instead of actual prices by using 
price = (H+L+C+O) / 4 or (H+L) / 2 . 

    Hope this gets you closer to your objective.

      ----- Original Message ----- 
      From: Louis P. 
      To: [email protected] 
      Sent: Friday, September 05, 2008 11:00 AM
      Subject: Re: [amibroker] How to calculate a slope % with Rsquared without 
a loop?


      Hi,

      @Joe Landry: Thanks for the tips.  I'm not sure how the K-ratio can help 
on this, but if it can help...

      @Ara: I'm sorry if what I said was not clear.  What I want to do is to 
calculate a % pullback from a HHV of a stock but I want the slope to be 
"smooth", that is, I am not happy to see a 5 or 10% pullback but would like to 
see a 5 or 10% pullback with a particular slope inclination.   That is: if the 
stock dropped 10% in a day is not the same as if it quietly lost 0.5% for 20 
days (would not be exactly 10%, but this is an image).  You understand what I 
mean?  I want the slope to be as smooth as possible with a particular inclation 
%.  Is this possible?

      Thanks,

      Louis




      2008/9/5 Ara Kaloustian <[EMAIL PROTECTED]>


        Louis,

        I am not quite sure what you mean by "a smooth slope".

        Do you want to have a plot of prices that are smoothed ... as you would 
gt with a filter??

        OR do you want a computed value of slope at some particular point? ... 
if so at what point ... or do you want a plot of the slope ... etc 

        If you can be moe specific that would be halpful!

        A



          ----- Original Message ----- 
          From: Louis P. 
          To: [email protected] 
          Sent: Friday, September 05, 2008 8:41 AM
          Subject: Re: [amibroker] How to calculate a slope % with Rsquared 
without a loop?


          Hi,

          Linear function is my big problem.  I'm so weak using that.  What is 
the difference between using this and doing it the other way?

          BTW, how would you set the number of bars in the current:


          HHVBars(Var,period); // Find number of bars - distance from HHV to 
current bar
          %slope = ((Highest high - currentclose) / Highest high) / number of 
bars * 100;

          Thanks,

          Louis




          2008/9/4 Ara Kaloustian <[EMAIL PROTECTED]>


            You can also use linearray to draw a stright line from HHV to 
current point.

            Look up LinearReg function
              ----- Original Message ----- 
              From: Ara Kaloustian 
              To: [email protected] 
              Sent: Thursday, September 04, 2008 10:37 AM
              Subject: Re: [amibroker] How to calculate a slope % with Rsquared 
without a loop?


              Try this:

              HHV(Var,period);   // find value of highest high
              HHVBars(Var,period); // Find number of bars - distance from HHV 
to current bar
              %slope = ((Highest high - currentclose) / Highest high) / number 
of bars * 100;

              You may choose to define slope in a different way, but this is 
the basic structure

              A
                ----- Original Message ----- 
                From: Louis P. 
                To: [email protected] 
                Sent: Thursday, September 04, 2008 9:34 AM
                Subject: Re: [amibroker] How to calculate a slope % with 
Rsquared without a loop?


                Hi,

                Thanks for your response.  I should have said I want to 
calculate a slope from a high point; I'd like to get a smooth slope from a 
HHV... How would you do that?

                Thanks a lot!
                Louis


                2008/9/4 Ara Kaloustian <[EMAIL PROTECTED]>


                  %slope = (variable - Ref(Variable,-x) ) / Ref(Variable,-x) * 
100;
                    ----- Original Message ----- 
                    From: Louis P. 
                    To: [email protected] 
                    Sent: Thursday, September 04, 2008 9:20 AM
                    Subject: [amibroker] How to calculate a slope % with 
Rsquared without a loop?


                    Hi,

                    I was wondering how to calculate the % of a slope without 
doing any loop.  Anybody has any idea?

                    Thanks,

                    Louis










   

Reply via email to