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
> > >
> >
>


Reply via email to