This is a nice piece of coding, and solved some problems for me, too, thanks to Mike and Bill.
The only thing I would change is to add an "Exrem(Sell, Buy)" instruction to get rid of the extra "sell" arrows on the chart display. (It doesn't appear to change the backtest results, only the arrow display.) Sebastian --- In [email protected], "longt3rm" <longt...@...> wrote: > > droskill, > > First -- thanks for many posts (here and others) I've read of yours which > have helped me greatly. > > Code below: > ---------------------------------------- > //Created by Mike > http://finance.groups.yahoo.com/group/amibroker/message/146956 > //Updated per Mike > http://finance.groups.yahoo.com/group/amibroker/message/146967 > //Update by Bill to change EMA to MA and change from fixed shares to fixed > dollar > > SetTradeDelays(0, 0, 0, 0); > BuyPrice = Close; > SellPrice = Close; > > previousClose = Ref(Close, -1); > rsi2 = RSI(2); > > Sell = Cross(rsi2, 70); > > //bull100 = Close > EMA(Close, 200) AND Sum(rsi2 < 25, 2) == 2; > bull100 = Close > MA(Close, 200) AND MA(Close, 200) > 0 AND Sum(rsi2 < 25, > 2) == 2; > inFirstPos = Flip(bull100, Sell); > firstTrigger = ExRem(inFirstPos, Sell); > > bull200 = Close < ValueWhen(firstTrigger, Close) AND inFirstPos AND > Ref(inFirstPos, -1); > inSecondPos = Flip(bull200, Sell); > secondTrigger = ExRem(inSecondPos, Sell); > > bull300 = Close < ValueWhen(secondTrigger, Close) AND inSecondPos AND > Ref(inSecondPos, -1); > inThirdPos = Flip(bull300, Sell); > thirdTrigger = ExRem(inThirdPos, Sell); > > bull400 = Close < ValueWhen(thirdTrigger, Close) AND inThirdPos AND > Ref(inThirdPos, -1); > inFourthPos = Flip(bull400, Sell); > fourthTrigger = ExRem(inFourthPos, Sell); > > Buy = firstTrigger + (secondTrigger * sigScaleIn) + (thirdTrigger * > sigScaleIn) + (fourthTrigger * sigScaleIn); > //SetPositionSize(IIf(firstTrigger, 100, IIf(secondTrigger, 200, > IIf(thirdTrigger, 300, 400))), spsShares); > SetPositionSize(IIf(firstTrigger, 1000, IIf(secondTrigger, 2000, > IIf(thirdTrigger, 3000, 4000))), spsValue); > > > priceColors = IIf(Close > previousClose, colorDarkGreen, IIf(Close < > previousClose, colorDarkRed, colorDarkGrey)); > buyColors = IIf(firstTrigger, colorGreen, IIf(secondTrigger, colorLime, > IIf(thirdTrigger, colorYellow, colorOrange))); > > Plot(Close, "Price", priceColors, styleBar); > PlotShapes((Buy > 0) * shapeUpArrow, buyColors, 0, L, -10); > PlotShapes(Sell * shapeDownArrow, colorRed); > ---------------------------------------- > > --- In [email protected], "droskill" <droskill@> wrote: > > > > Bill - can you post the total code? I'd love to have an example of this as > > I have been trying to do the same thing. > > > > --- In [email protected], "longt3rm" <longt3rm@> wrote: > > > > > > Mike, > > > > > > Fantastic, it works! > > > > > > Thank you for your help! > > > > > > Bill > > > > > > --- In [email protected], "Mike" <sfclimbers@> wrote: > > > > > > > > Bill, > > > > > > > > You would need to calculate the trigger first (i.e. ExRem of position > > > > state), then use ValueWhen. > > > > > > > > e.g. Something like the following: > > > > > > > > thirdTrigger = ExRem(inThirdPos, Sell); > > > > bull400 = Close < ValueWhen(thirdTrigger, Close) AND inThirdPos AND > > > > Ref(inThirdPos, -1); > > > > > > > > The key being that Flip will give all 1's for the duration that we are > > > > in the position, whereas ExRem will remove redundant 1's leaving only > > > > those bars where the condition was first met. Thus, ValueWhen gives the > > > > Close of the most recent bar meeting that condition. > > > > > > > > Mike > > > > > > > > --- In [email protected], "longt3rm" <longt3rm@> wrote: > > > > > > > > > > Mike, > > > > > > > > > > Thank you! That helps significantly!! > > > > > > > > > > The one item I'm not able to figure out is how to track the last > > > > > entry price so we can check to see if the current close is lower than > > > > > our last entry. > > > > > > > > > > I believe (I could be mistaken) the sample you kindly provided is > > > > > checking to see if today's close is less than yesterday's close. I > > > > > would like to compare today's close to our last entry price. > > > > > > > > > > Thanks again for helping so much. I am slow to grasp AFL. > > > > > > > > > > Sincerely, > > > > > > > > > > > > > > > Bill > > > > > > > > > > --- In [email protected], "Mike" <sfclimbers@> wrote: > > > > > > > > > > > > Hi, > > > > > > > > > > > > I posted some code to a related question here: > > > > > > http://finance.groups.yahoo.com/group/amibroker/message/146956 > > > > > > > > > > > > Short answers: > > > > > > 1. Use Flip function to capture current position "state". > > > > > > 2. Use state captured above AND'ed with next criteria. > > > > > > > > > > > > See if that helps. > > > > > > > > > > > > Mike > > > > > > > > > > > > --- In [email protected], "longt3rm" <longt3rm@> wrote: > > > > > > > > > > > > > > Hello, > > > > > > > > > > > > > > Goal Description: > > > > > > > 1) Initial $500 position opened when RSI(2) < 25 > > > > > > > 2) Add $1000 to position when entry price for #1 is less than > > > > > > > current close. (regardless of value for RSI(2)) > > > > > > > 3) Add $1500 to position when entry price for #2 is less than > > > > > > > current close. (regardless of value for RSI(2)) > > > > > > > 4) If all three positions are entered, we would have a total > > > > > > > position of $3,000 > > > > > > > > > > > > > > > > > > > > > Two questions / problems: > > > > > > > 1) What is the most efficient way to determine if we have a > > > > > > > position and if we do, is it the first ($500) or second > > > > > > > ($500+$1000=$1500)? > > > > > > > 2) If the initial buy is "Buy = RSI(2)", how do we tell AmiBroker > > > > > > > that RSI(2) is not longer needed, we just need current close > > > > > > > > last position entry price. > > > > > > > > > > > > > > Thanks for any suggestions. > > > > > > > > > > > > > > Sincerely, > > > > > > > > > > > > > > > > > > > > > Bill > > > > > > > > > > > > > > > > > > > > > > > > > > > >
