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 [email protected], "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 [email protected], "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 [email protected], "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
> > >
> >
>