[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[amibroker] Re: Help with barssince



PureBytes Links

Trading Reference Links

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@xxxxxxxxxxxxxxx, "Mike" <sfclimbers@xxx> 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@xxxxxxxxxxxxxxx, "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@xxxxxxxxxxxxxxx, "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
> > >
> >
>




------------------------------------

**** IMPORTANT PLEASE READ ****
This group is for the discussion between users only.
This is *NOT* technical support channel.

TO GET TECHNICAL SUPPORT send an e-mail directly to 
SUPPORT {at} amibroker.com

TO SUBMIT SUGGESTIONS please use FEEDBACK CENTER at
http://www.amibroker.com/feedback/
(submissions sent via other channels won't be considered)

For NEW RELEASE ANNOUNCEMENTS and other news always check DEVLOG:
http://www.amibroker.com/devlog/

Yahoo! Groups Links

<*> To visit your group on the web, go to:
    http://groups.yahoo.com/group/amibroker/

<*> Your email settings:
    Individual Email | Traditional

<*> To change settings online go to:
    http://groups.yahoo.com/group/amibroker/join
    (Yahoo! ID required)

<*> To change settings via email:
    mailto:amibroker-digest@xxxxxxxxxxxxxxx 
    mailto:amibroker-fullfeatured@xxxxxxxxxxxxxxx

<*> To unsubscribe from this group, send an email to:
    amibroker-unsubscribe@xxxxxxxxxxxxxxx

<*> Your use of Yahoo! Groups is subject to:
    http://docs.yahoo.com/info/terms/