I will have to digest what you are saying. I don't understand flip yet. While I was waiting for an answer to my post I tried something else. It keeps track of the states but will not back test and the shape arrows are not displayed correctly. If I am in long state the sell and short arrows are shown. If I am short the buy and cover arrows are shown. I have seen this before but I do not know why Ami does not back test and show the arrows correctly. Any ideas why?
Thanks, Barry The code: r1 = Param( "Fast avg", 3, 2, 20, 1 ); r2 = Param( "Slow avg", 9, 2, 50, 1 ); r3 = Param( "Signal avg", 2, 2, 20, 1 ); fMacd = MACD(r1, r2); fSig = Signal(r1,r2,r3); Up = fMacd > fSig; Dn = fMacd < fSig; pStoch = Param("Stoch period", 10, 1, 30, 1 ); pKavg = Param("%K avg", 3, 1, 20, 1 ); Line = Param("Line", 15, 5, 40, 1); fStoch = StochK(pStoch, pKavg); stoUp = fStoch > Ref(fStoch, -1); stoDn = fStoch < Ref(fStoch, -1); state = Nz(StaticVarGet("State")); Buy = (state == 0 OR state == 4) AND fMACD > fSig AND stoUp; state = IIf(Buy, 1, state); // set long state Sell = state == 1 AND fSig > fMACD; state = IIf(Sell, 2, state); // flat after long state Short = (state == 2 OR state == 0) AND fSig > fMACD AND stoDn; state = IIf(Short, 3, state); // set short state Cover = state == 3 AND fMACD > fSig; state = IIf(Cover, 4, state); // flat after short state printf("\nState1=" + NumToStr(state, 1) + " State2=" + NumToStr(Ref(state, -1), 1) + " State3=" + NumToStr(Ref(state, -2), 1)); StaticVarSet("state", LastValue(state)); printf("\nbuy=" + NumToStr(Buy, 1) + " sell=" + NumToStr(Sell, 1) + " short=" + NumToStr(Short, 1) + " Cover=" + NumToStr(Cover, 1)); Plot(fMacd, StrFormat(_SECTION_NAME()+ "(%g,%g)", r1, r2), ParamColor("MACD color", colorRed ), ParamStyle("MACD style") ); Plot(fSig, "Signal" + _PARAM_VALUES(), ParamColor("Signal color", colorBlue ), ParamStyle("Signal style") ); Plot( fMacd - fSig, "MACD Histogram", ParamColor("Histogram color", colorBlack ), styleNoTitle | ParamStyle("Histogram style", styleHistogram | styleNoLabel, maskHistogram ) ); Plot(0,"",colorBlack); Plot(state, "State", colorGreen, styleOwnScale) | styleStaircase; PlotShapes(Buy * shapeUpArrow, colorGreen, 0, fMACD, 5 ); PlotShapes(Sell * shapeDownArrow, colorRed, 0, fMACD, 20 ); PlotShapes(Short * shapeHollowDownArrow,colorRed, 0, fMACD, -5 ); PlotShapes(Cover * shapeHollowUpArrow, colorGreen, 0, fMACD, -20 ); --- In amibroker@yahoogroups.com, "Mike" <sfclimb...@...> wrote: > > A quick follow up to prevent (hopefully) any misinterpretation of what I was > trying to say. > > 1. The ExRem is only there for the plotting. You generally shouldn't use it > for the Buy/Sell/Short/Cover arrays since the backtester does it better. > > 2. I did not attempt to prevent a Short if already in a Buy or vice versa > because you cannot know which takes precedence without looping bar by bar > through the range under analysis (to see which would have occurred first). > These are the decisions that the backtester makes with full information. > > Mike > > --- In amibroker@yahoogroups.com, "Mike" <sfclimbers@> wrote: > > > > > > Barry, > > > > You cannot reliably do what you are attempting. The only way to truely > > know whether or not you are in a position is via iterating through the > > open position list within custom backtester code. The backtester employs > > numerous rules that affect whether or not a position is actually taken, > > despite the signals given (e.g. availability of funds, max positions, > > limits on number of positions per symbol, etc.). > > > > In answer to your other questions, BarsSince is entirely dependent upon > > the state of the arrays at the time that you call it. So, of course, it > > matters a great deal where you place the call in your code. > > > > To illustrate the problem, here is code that will do what you want. But, > > you will notice that it is wrong since it allows simultaneous positions > > of both long and short, does not take into consideration availability of > > funds, etc. all of which only the custom backtester would be able to > > filter reliably. > > > > MA1 = MA(Close, 5); > > MA2 = MA(Close, 25); > > MA3 = MA(Close, 7); > > MA4 = MA(Close, 35); > > > > Buy = Cross(MA1, MA2); > > Sell = Cross(MA2, MA1); > > AmLong = Flip(Buy, Sell); > > > > Short = Cross(MA4, MA3); > > Cover = Cross(MA3, MA4); > > AmShort = Flip(Short, Cover); > > > > State = IIF(AmLong, 1, IIF(AmShort, 2, 0)); > > > > Buy = ExRem(Buy, Sell); > > Sell = ExRem(Sell, Buy); > > Short = ExRem(Short, Cover); > > Cover = ExRem(Cover, Short); > > > > Plot(Close, "Close", colorLightGrey, styleBar); > > Plot(State, "State", colorRed, styleStairCase | styleOwnScale); > > PlotShapes(Buy * shapeUpArrow, colorGreen); > > PlotShapes(Sell * shapeDownArrow, colorRed); > > PlotShapes(Short * shapeHollowDownArrow, colorRed); > > PlotShapes(Cover * shapeHollowUpArrow, colorGreen); > > > > Mike > > > > > > --- In amibroker@yahoogroups.com, "Barry Scarborough" <razzbarry@> > > wrote: > > > > > > I am trying to set states based on whether I have a position and the > > position type. If AFL has a getPositions function I can't find it. I > > tried to create states using the following code but barssince does not > > return a valid value. > > > > > > // buy control > > > BarsSB = Nz(BarsSince(Buy), 0); > > > BarsSSl = Nz(BarsSince(Sell), 0); > > > BarsSSh = Nz(BarsSince(Short), 0); > > > BarsSC = Nz(BarsSince(Cover), 0); > > > > > > state = 0; > > > // 0 = no position, 1 = buy last, 2 = short last; > > > state = IIf(BarsSB == BarsSSh, 0, IIf(BarsSB < BarsSSh, 1, 2)); > > > // if sell after buy we are flat > > > state = IIf(state == 1 AND BarsSSl < BarsSB, 0, state); > > > // if cover after short we are flat > > > state = IIf(state == 2 AND BarsSC < BarsSSh, 0, state); > > > > > > If I don't use NZ then BarsSince returns Empty. > > > When I use NZ then I can see trades using plot shapes. But all the > > barsSince returns 0 so state is always 0. What am I doing wrong? > > > > > > The really interesting thing is that I can put the barsince lines > > below the logic where I set buy, sell, short and cover, then I get > > correct values returned. Why does the position matter? > > > > > > I can use static vars to keep the state but when I do that > > AutoAnalysis will not work and the shapes don't show properly. So I am > > tryng to find a way that allows auto analysis to work. I tried to use > > switch and found it only works with numbers and not arrays. > > > > > > Thanks, > > > Barry > > > > > >