[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[amibroker] Re: functions to take an array as a parameter



PureBytes Links

Trading Reference Links

#include_once <varPeriodRSI.afl>
#include_once <hilDominantPeriod.afl>

CP = (CyclePeriod((H+L)/2, .07))/2;

Plot(Varperiodrsi(C,Cp),"CyclePeriod", colorRed, styleLine);

The above code works for me.

I've been using this for a while without problems. I had to modify the
CyclePeriod function because the 1st 6 values are zero and that caused
a problem.

Below is my modified code.

Also, I have found period multipliers between .01 to 5 "work" under
different circumstances.

-----------
function CyclePeriod(array, alpha)
// Figure 9.4 on p. 111
{
    smooth = (array + 2*Ref(array, -1) + 2*Ref(array, -2) + Ref(array,
-3))/6;

// for(i = 0; i < 7; i++) cycle[i]=array[i]; // Initialize early
values and as array

    for(i = 0; i < 6; i++)
    {
        InstPeriod[i] = 0; // Initialize early values and as array
        DeltaPhase[i] = 0;
        cycle[i]=0;
        Period[i]=0;
    }
    for(i = 6; i < BarCount; i++)
    {
        cycle[i] = (1 - .5*alpha)*(1 - .5*alpha)*(smooth[i] -
2*smooth[i-1] + smooth[i-2]) + 2*(1 - alpha)*cycle[i-1] - (1 -
alpha)*(1 - alpha)*cycle[i-2];
        Q1[i] = (.0962*cycle[i] + .5769*cycle[i-2] -.5769*cycle[i-4] -
.0962*cycle[i-6])*(.5 + .08*InstPeriod[i-1]);
        I1[i] = cycle[i-3];

        if(Q1[i] != 0 AND Q1[i-1] != 0) DeltaPhase[i] = (I1[i]/Q1[i] -
I1[i-1]/Q1[i-1])/(1 + I1[i]*I1[i-1]/(Q1[i]*Q1[i-1]));

        if(DeltaPhase[i] < 0.1) DeltaPhase[i] = 0.1;
        if(DeltaPhase[i] > 1.1) DeltaPhase[i] = 1.1;

    //----- Speed up the median calculation by placing it inline

        mlen = 5;
        for(k = mlen - 1; k >= 0; k--) {temparray[k] = DeltaPhase[i +
k - (mlen - 1)];}

        temp=0;
        for(k = mlen - 1; k > 0; k--)
        {
            for (j = mlen - 1; j > 0; j--)
            {
                if (temparray[j-1] > temparray[j])
                {
                    temp = temparray[j-1];
                    temparray[j-1] = temparray[j];
                    temparray[j] = temp;
                }
            }
        }
        MedianDelta[i] = temparray[mlen - 1 - (mlen / 2)];

    //----- End median calculation

        if(MedianDelta[i] == 0) DC[i] = 15;
        else DC[i] = 6.28318/MedianDelta[i] + .5;

        InstPeriod[i] = .33*DC[i] + .67*InstPeriod[i-1];
        Period[i] = .15*InstPeriod[i] + .85*Period[i-1];
    }
//fix zero periods
    for(i = 0; i < 6; i++)
    {
       Period[i]=Period[6];
    }

    return Period;

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


--- In amibroker@xxxxxxxxxxxxxxx, "jeffro861" <jeffro861@xxx> wrote:
>
> I'm still getting a blank in the chart.
> 
> thanks,
> Jeff H.
> 
> // from Ehlers, John F. Cybernetic Analysis for Stocks and Futures. 
> Wiley. 2004. 
> // Chapter 9, p. 107. Code on p. 111.
> 
> function CyclePeriod(array, alpha)
> // Figure 9.4 on p. 111
> {
>   smooth = (array + 2*Ref(array, -1) + 2*Ref(array, -2) + Ref(array, -
> 3))/6;
> 
> //  for(i = 0; i < 7; i++) cycle[i]=array[i]; // Initialize early 
> values and as array
> 
>   for(i = 0; i < 6; i++) 
>   {
>      InstPeriod[i] = 0; // Initialize early values and as array
>      DeltaPhase[i] = 0;
>      cycle[i]=0;
>      Period[i]=0;
>   }
> 
>   for(i = 6; i < BarCount; i++)
>   {
>      cycle[i] = (1 - .5*alpha)*(1 - .5*alpha)*(smooth[i] - 2*smooth[i-
> 1] + smooth[i-2]) +
>                 2*(1 - alpha)*cycle[i-1] - (1 - alpha)*(1 - alpha)
> *cycle[i-2];
>      Q1[i] = (.0962*cycle[i] + .5769*cycle[i-2] -.5769*cycle[i-4] -
>  .0962*cycle[i-6])*(.5 + .08*InstPeriod[i-1]);
>      I1[i] = cycle[i-3];
> 
>      if(Q1[i] != 0 AND Q1[i-1] != 0) 
>         DeltaPhase[i] = (I1[i]/Q1[i] - I1[i-1]/Q1[i-1])/(1 + I1[i]*I1
> [i-1]/(Q1[i]*Q1[i-1]));
>      if(DeltaPhase[i] < 0.1) DeltaPhase[i] = 0.1;
>      if(DeltaPhase[i] > 1.1) DeltaPhase[i] = 1.1;
> 
>      //----- Speed up the median calculation by placing it inline
> 
>      mlen = 5;
>      for(k = mlen - 1; k >= 0; k--) {temparray[k] = DeltaPhase[i + k -
>  (mlen - 1)];}
> 
>      temp=0;
>      for(k = mlen - 1; k > 0; k--)
>      {for (j = mlen - 1; j > 0; j--)
>        {if (temparray[j-1] > temparray[j])
>          {
>            temp = temparray[j-1];
>            temparray[j-1] = temparray[j];
>            temparray[j] = temp;
>          }
>        }
>      }
>      MedianDelta[i] = temparray[mlen - 1 - (mlen / 2)];
> 
>      //----- End median calculation
> 
>      if(MedianDelta[i] == 0) DC[i] = 15; 
>      else DC[i] = 6.28318/MedianDelta[i] + .5;
> 
>      InstPeriod[i] = .33*DC[i] + .67*InstPeriod[i-1];
>      Period[i] = .15*InstPeriod[i] + .85*Period[i-1];
>   }
>   return Period;
> }
> 
> Med = (H+L)/2;
> 
> // CyclePeriod
> CP = (CyclePeriod(Med, .07))/2;
> 
> 
> #include_once <varPeriodRSI.afl>
> Plot(Varperiodrsi(C,Cp),"CyclePeriod", colorRed, styleLine);
> _SECTION_END();
> 
> 
> 
> 
> --- In amibroker@xxxxxxxxxxxxxxx, "bilbo0211" <bilbod@> wrote:
> >
> > --- In amibroker@xxxxxxxxxxxxxxx, "jeffro861" <jeffro861@> wrote:
> > >
> > > Thanks for the response!  This seems like it would work but when 
> I 
> > > try and plot this function it doesn't show anything, but at least 
> I'm 
> > > not getting an error message.  Does anybody have any idea why?
> > 
> > #include_once <varPeriodRSI.afl>
> > 
> > Plot(varPeriodRSI(C,14),"",colorRed);
> > 
> > period=IIf(C>O,5,25);
> > 
> > Plot(varPeriodRSI((H+L)/2,period),"",colorBlue);
> > 
> > The above code works for me, show the code you are using.
> > 
> > Bill
> >
>




Please note that this group is for discussion between users only.

To get support from AmiBroker please send an e-mail directly to 
SUPPORT {at} amibroker.com

For NEW RELEASE ANNOUNCEMENTS and other news always check DEVLOG:
http://www.amibroker.com/devlog/

For other support material please check also:
http://www.amibroker.com/support.html
 
Yahoo! Groups Links

<*> To visit your group on the web, go to:
    http://groups.yahoo.com/group/amibroker/

<*> Your email settings:
    Individual Email | Traditional

<*> To change settings online go to:
    http://groups.yahoo.com/group/amibroker/join
    (Yahoo! ID required)

<*> To change settings via email:
    mailto:amibroker-digest@xxxxxxxxxxxxxxx 
    mailto:amibroker-fullfeatured@xxxxxxxxxxxxxxx

<*> To unsubscribe from this group, send an email to:
    amibroker-unsubscribe@xxxxxxxxxxxxxxx

<*> Your use of Yahoo! Groups is subject to:
    http://docs.yahoo.com/info/terms/