Yup, Your solution is more direct. If you want it to perform even faster, then just calculate RSI(14) once and store it in a local variable. Then use the local variable throughout the rest of the code, rather than recalculating over and over again.
Currently, you've got 5 occurences of the same calculation, this can be reduced to a single occurence, resulting in better performance. Mike --- In [email protected], "alogicalinvestor" <[EMAIL PROTECTED]> wrote: > > Mike, > > Thanks! The formula you gave does exactly what I wanted to do. > > However, I wrote the following which gives the same result but is a > bit faster. > > // RSI going below 70 after being above for 3 days or more and RSI > going above 30 after being below 30 for 3 days or more > Buy = Cross(RSI(14),30) AND (BarsSince(Cross(30,RSI(14))) >= 3); > Sell = Cross(70,RSI(14)) AND (BarsSince(Cross(RSI(14),70)) >= 3); > > Filter = (Buy OR Sell); > > AddTextColumn(FullName(), "Security", 1.0, colorDefault, > colorDefault,200); > AddColumn(RSI(14),"RSI(14)",1.2, colorDefault, colorDefault,200); > AddTextColumn( WriteIf(Buy, "BULLISH", WriteIf (Sell, "BEARISH", "")), > "BULLBEAR", 1.0, colorDefault, colorDefault,100); > > However, I learned a couple of new things with your approach. > > Best, > vps > --- In [email protected], "Mike" <sfclimbers@> wrote: > > > > Have a look at the Sum function. I believe that the following will do > > what you are looking for. > > > > Change the values of UpDays and Threshold to be any number of > > consecutive up days (e.g. 3) and the threshold required to cross > > (e.g. 70). Change the CountRSIAbove comparrison to an inequality for > > more flexibility > > e.g. > > ... AND CountRSIAbove >= 2; // 2 of last 3 days > > ... AND CountRSIAbove >= UpDays - 1; // Generic x-1 of x last days > > > > UpDays = 3; > > Threshold = 70; > > > > CurrentRSI = RSI(); > > PreviousRSIAbove = Ref(CurrentRSI, -1) >= Threshold; > > CountRSIAbove = Sum(PreviousRSIAbove, UpDays); > > RSIBelow = Cross(Threshold, CurrentRSI); > > Filter = RSIBelow AND CountRSIAbove == UpDays; > > > > for (i = UpDays; i > 0; i--) { > > AddColumn(Ref(CurrentRSI, -i), "" + i + " days ago"); > > } > > > > AddColumn(CurrentRSI, "Today"); > > > > Mike > > > > --- In [email protected], "alogicalinvestor" > > <alogicalinvestor@> wrote: > > > > > > Friends, > > > > > > A very basic Amibroker formula question from a newbie. > > > > > > I am trying to write an exploration that finds stocks whose RSI line > > > moved below 70 today after being above 70 for the previous three > > days. > > > > > > I am not sure how to handle the 'previous three days' part. > > > > > > One way I can think of is Ref(RSI, -1), Ref(RSI,-2) and then > > checking > > > these RSI values individually to determine if they were above 70. > > > > > > But I am sure there is a simpler way. > > > > > > Thanks, > > > vps > > > > > >
