mike, what you are saying makes alot of sense. Can you do the same with sigscale out and showing arrows. Meaning to show a trade arrow when a sigscaleout takes place ( part of the trade is exited). Either by using turn trade arrows on, or by using the addtocomposite??
thanks zeek - -- In [email protected], "Mike" <sfclimb...@...> wrote: > > > The problem with what you are trying to do is that it is entirely > dependent upon the date range. > > For example; In one date range the Buy might occur first meaning that > any subsequent Short would have to be ignored until the Sell. Whereas > using a different date range a Short might occur first meaning that any > subsequent Buy would have to be ignored until the Cover. > > The other problem is that it ignores portfolio limitations. Presumably > you are doing this because you want to see actual positions. Charting > alone can not do this for you (technically you could, but it would be a > mamoth amount of code and excruciatingly slow). > > So, if you just want to see an accurate chart (as opposed to trying to > use the logic for signal generation), then the most reliable thing to do > would be to remove the PlotSymbols code from your AFL entirely, then run > a backtest (showing list of trades), then right click on the list of > trades and select the "Show arrows for actual trades" menu item. This > will show the *actual* trade arrows for you, including all portfolio > limitations such as max number of positions, lack of capital, etc. Every > time you run the backtest you would have to regenerate the trade arrows > this way. You may have to alter your chart parameters to allow showing > chart arrows. > > Alternatively, you can include the same arrow generation code directly > in your AFL via composite symbols and just run the backtest to update > the composite. The trade arrows will automatically update on the chart > without any need to generate from the trade list. See the code below for > an example. > > In the example I'm using smaller offsets and blue/orange instead of > green/red for my shapes so as to allow you to still use the trade list > to apply actual trades and confirm that the results are identical. > > The trade logic is dummy logic that just shorts on every bar index that > is evenly divisible by 2 and covers on every bar index that is evenly > divisible by 5. Equally simple, the buy logic buys the 1st day of the > week and sells the 5th day of the week. This logic will cause overlaps > with each other thereby demonstrating the removal of unwanted arrows. > You can use the "Show arrows for all raw signals" menu from the trade > list to see where signals have been ignored. > > Note that the code below will produce a composite symbol, of the form > ~symbol for each symbol for which a trade is taken by the backtester > e.g. ~AA if a long or short position was taken for symbol AA, etc. As > with all composites, the composites will show up in Group 253 in your > Symbols tree. You may delete them from there when no longer wanted. I > would not recommend running this code against a large watchlist since it > could result in many many composites. > > bars = BarIndex(); > Short = bars % 2 == 0; > Cover = bars % 5 == 0; > > days = DayOfWeek(); > Buy = days == 1; > Sell = days == 5; > > SetCustomBacktestProc(""); > > if (Status("action") == ActionPortfolio) { > bo = GetBacktesterObject(); > bo.BackTest(); > > dates = DateTime(); > > for (trade = bo.GetFirstTrade(); trade; trade = bo.GetNextTrade()) { > SetForeign(trade.Symbol); > bars = BarIndex(); > entryBar = LastValue(ValueWhen(trade.EntryDateTime == dates, > bars)); > exitBar = LastValue(ValueWhen(trade.ExitDateTime == dates, bars)); > temp = 0; > > if (trade.IsLong) { > temp[entryBar] = 1; > temp[exitBar] = 2; > } else { > temp[entryBar] = 4; > temp[exitBar] = 8; > } > > AddToComposite(temp, "~" + trade.Symbol, "X", atcFlagDefaults | > atcFlagEnableInPortfolio); > RestorePriceArrays(); > } > } > > _SECTION_BEGIN("Price1"); > SetChartOptions(0,chartShowArrows|chartShowDates); > _N(Title = StrFormat("{{NAME}} - {{INTERVAL}} {{DATE}} Open %g, Hi %g, > Lo %g, Close %g BarIndex %g {{VALUES}}", O, H, L, C, BarIndex() )); > Plot( C, "Close", ParamColor("Color", colorBlack ), styleNoTitle | > ParamStyle("Style") | GetPriceStyle() ); > _SECTION_END(); > > trades = Foreign("~" + Name(), "X"); > > PlotShapes(((trades & 1) == 1) * shapeUpArrow, colorBlue, 0, Low, -5); > // Buy arrows > PlotShapes(((trades & 2) == 2) * shapeDownArrow, colorOrange, 0, High, > -5); // Sell arrows > PlotShapes(((trades & 4) == 4) * shapeHollowDownArrow, colorOrange, 0, > High, -15); // Short arrows > PlotShapes(((trades & 8) == 8) * shapeHollowUpArrow, colorBlue, 0, Low, > -15); // Cover arrows > > > Mike > > > --- In [email protected], "gregg55554" <zeeking57@> wrote: > > > > I am using staticvars to tell the buy or sell not to put a 1 in the > buy if a short trade is currently in process. It is messing up all my > charting arrows. there are short arrows while still in the middle of > long trades. > > > > The shorton , longon vaiables i want to use will tell the buy/short > not to put a 1 in the buy/short array. BUt by definition they get set > after after the buy and short array are initiliazed in the code. so the > buy code will always look at the initialized value at 0, before it reads > the the variables.So I thought to use static variable but I am messing > up the code and not sure why. Then I thought to use the flip function > but that is also not working bc it gets set after the buy and sell code. > it is like a catch 22. > > > > For example: > > > > shorton=0; > > longon=0; > > > > Buy= (H>highsignal)AND Shorton==0 ; > > BuyPrice = Max(O,Highsignal+.05); > > Short = (Signallow>L) AND Longon==0; > > ShortPrice = Min(Open,Signallow-.05); > > Shorton = Flip( Short, Cover ); > > Longon = Flip( Buy, Sell ); > > > > This is not working. > > --- In [email protected], "Mike" sfclimbers@ wrote: > > > > > > Zeek, > > > > > > My first question would be: Why are you using static variables? > AmiBroker will not allow you to enter a Buy if you are already Short, > unless you override that behavior. So, I don't see a need for any of > what you are trying to do. > > > > > > Have you changed the default backtester mode? Or, perhaps you have > selected the checkbox "Reverse entry signal forces exit" in the AA > Settings. Leave the backtester mode at its default and unselect the > "Reverse ..." checkbox from the settings window. Then, just write your > vanilla Buy/Sell and Short/Cover code without any concern for what the > other is doing. AmiBroker will sort it out based on which signals occur > first. > > > > > > As an example, run a backtest on the following; Once with the > "Reverse ..." checkbox selected and again with it unselected: > > > > > > WeekDay = DayOfWeek(); > > > Short = WeekDay == 1; > > > Cover = 0; > > > Buy = WeekDay == 3; > > > Sell = 0; > > > > > > Notice that in one case you get both buys and shorts. In the other > you get only a single signal (whichever occurred first). > > > > > > As for what is being done "wrong". It's not so much wrong as > pointless. Making a call to StaticVarGet without storing the resulting > value has no purpose (that I'm aware of), yet your code is doing that > twice. > > > > > > Also, given that the value being stored is just the value of readily > available arrays, I don't see why you need to store anything at all. Why > not just use Flip() as in my previous post, or BarsSince(), or Ref()? > > > > > > Finally, if you are using the same AFL over multiple symbols, a > short position in one symbol will affect the logic of the remaining > symbols since you are not discriminating between statics among the > different symbols (i.e. you are using a single static variable rather > than one per symbol). > > > > > > Based on what I've read so far in your previous posts, I'm guessing > that unselecting the "Reverse ..." checkbox will solve all your > problems. > > > > > > Mike > > > > > > --- In [email protected], "gregg55554" <zeeking57@> wrote: > > > > > > > > thanks Mike for your reply, > > > > > > > > a) can you tell me what is wrong with the code, so I don't make > the same mistake again in the future. I tried to replicate code I had > seen for staticvars. > > > > > > > > b) In terms of what I am trying to do. I am trying to write a > staticvar that detects when there is a short trade. and then set it in > my buy condition not to have a buy if "onshort" == 1. so when staticvar > "onshort" equals 1 then no buys will occur. > > > > I would use the exrem function but as I understand it, it is not > very good in the backtester?? So Marcin suggested I use a staticvar. > > > > > > > > Can you help please > > > > zeek > > > > > > > > > > > > --- In [email protected], zeek ing <zeeking57@> wrote: > > > > > > > > > > I think I am having a little problem with my static var code. I > expected to > > > > > see in an exploration with the variable "onshort" a value of 1 > when a short > > > > > trade is on. Instead all I see is zeros in the exploration. I am > not sure > > > > > why. there are two parts to the code. If anyone can tell me what > is wrong > > > > > with this code it would be appreciated. thanks > > > > > > > > > > ///part a-- > > > > > StaticVarGet("onshort"); > > > > > > > > > > > > > > > > > > > > if( IsNull( StaticVarGet("onshort"))) StaticVarSet("onshort",0); > > > > > > > > > > Onshort= StaticVarGet("onshort"); > > > > > > > > > > > > > > > > > > > > //part b--- > > > > > > > > > > if (LastValue(Short)) > > > > > > > > > > > > > > > > > > > > {StaticVarSet("onshort",1);} > > > > > > > > > > if (LastValue(Cover)) > > > > > > > > > > > > > > > > > > > > {StaticVarSet("onshort",0);} > > > > > > > > > > > > > > > > > > > > StaticVarGet("onshort"); > > > > > > > > > > > > > > >
