PureBytes Links
Trading Reference Links
|
Mike, thanks a bunch! That's amazingly helpful!
I will take some time to wrap my head around your code. Didn't realize my own code was so buggy.
For now, just a few follow-up questions (for you, or anyone who is kind enough to chime in):
A. I looked up PosistionSize in the help manual, and did not see any reference to negative numbers. What does PositionSize = -10 mean?
B. While I do want to only track the first condition that is true, in (2) you mention that if I wanted to track ALL conditions, I should use a bit flag. Not sure what you mean by that. Could you please give me an example of that in this line, as I might also want an alternative version that does track all conditions:
PositionScore = IIf( Condition AND NOT PositionScore, a, PositionScore );
C. I agree that using values that the backtester needs could prove dangerous. That's why I also posted an example using AddToComposite. I realize that code also had the same bugs you pointed out earlier. But what about my use of AddToComposite. If I subsituted ATC instead of position score...is the following the correct use? I can't seem to recall the values from the composite symbol when I get to the backtester portion of the code. Condition column remains blank in the report:
//--------------------------------------------------------------------
// SIMPLE TRADING SYSTEM BASED ON VARIOUS CONDITIONS //--------------------------------------------------------------------
FastMA = MA( C, 10 ); SlowMA = MA( C, 200 );
Condition1 = Cross( FastMA, SlowMA ); Condition2 = Cross( SlowMA, FastMA ); Condition3 = Cross( C, SlowMA ); Condition4 = Cross( SlowMA, C );
Buy = Sell = Short = Cover = 0; PositionSize = -10;
for ( a = 1; a < 5; a++ ) { Condition = VarGet( "Condition" + NumToStr( a, 1.0, 0 ) );
Buy = Buy OR Condition;
// Use Composite symbol to store the Condition numbers whenever a Condition is True. AddToComposite( IIf(Condition, a, 0), "~Condition", "V", 1+2+8+16); // 1+2+8+16 enables all ATC in all AA procedures }
Buy = ExRemSpan(Buy, 12); Sell = Ref(Buy, -12);
//--------------------------------------------------------------------
// WANT TO ADD THE CUSTOM COLUMN, "CONDITION" TO BACKTEST REPORT //--------------------------------------------------------------------
SetCustomBacktestProc( "" );
if ( Status( "action" ) == actionPortfolio ) { bo = GetBacktesterObject();
bo.Backtest( 1 ); // run default backtest procedure
// iterate through closed trades first
for ( trade = bo.GetFirstTrade(); trade; trade = bo.GetNextTrade() ) { trade.AddCustomMetric("Condition", Foreign("~Condition", "V") );
bo.ListTrades(); } }
--- In amibroker@xxxxxxxxxxxxxxx, "Mike" <sfclimbers@xxx> wrote: > > Ozzy, > > Your immediate problem is that you are refering to the MarginDeposit > *variable* in your backtester code, when what you actually want to do > is refer to the MarginDeposit *property* of the trade object. > > However, using MarginDeposit or PointValue, do not seem to work. So I > would suggest not going with option e) of Thomasz's note unless > overloading the Score property (which maps to PositionScore > variable). I have provided an example below taking that approach, > though I do not encourage it since PostionScore is used by the > backtester when deciding which trades to take (in other words, don't > mess with values that the backtester needs!). > > A few other observations: > > 1) Your Buy logic appears buggy. As written, Buy will always be set > to the value returned by Condition4 (i.e. you clobber the Buy value > at each iteration of the loop, so the last iteration will always > win). I suspect that you want an OR operation here to Buy whenever > any of the conditions are met. > > 2) Same problem with your MarginDeposit calculation; It is > destructive. If you want to keep the *first* condition that was true, > do as is provided in the example. If you want to keep the *last* > condition that was true, remove the "AND NOT PositionScore" clause. > If you want to track *all* conditions, you'll need to use a bit flag. > > 3) Given that your Sell condition is a function of Buy, there is no > need to keep recalculating it within the loop. Wait 'till Buy has > finished being defined, then calculate Sell once after the fact. > > 4) If I understand your Sell intent correctly (i.e. hold for 12 days > then sell), there is a better way to do it. See ExRemSpan usage in > example below. > > Mike > > //-------------------------------------------------------------------- > ---- > // SIMPLE TRADING SYSTEM BASED ON VARIOUS CONDITIONS > //-------------------------------------------------------------------- > ---- > > FastMA = MA( C, 10 ); > SlowMA = MA( C, 200 ); > > Condition1 = Cross( FastMA, SlowMA ); > Condition2 = Cross( SlowMA, FastMA ); > Condition3 = Cross( C, SlowMA ); > Condition4 = Cross( SlowMA, C ); > > Buy = Sell = Short = Cover = PositionScore = 0; > PositionSize = -10; > > for ( a = 1; a < 5; a++ ) > { > Condition = VarGet( "Condition" + NumToStr( a, 1.0, 0 ) ); > Buy = Buy OR Condition; > PositionScore = IIf( Condition AND NOT PositionScore, a, > PositionScore ); // Reserved variable "PositionScore" is used to > store the > // Condition numbers whenever a Condition is True. > } > > Buy = ExRemSpan(Buy, 12); > Sell = Ref(Buy, -12); > > //-------------------------------------------------------------------- > ------- > // WANT TO ADD THE CUSTOM COLUMN, "CONDITION" TO BACKTEST REPORT > //-------------------------------------------------------------------- > ------- > > SetCustomBacktestProc( "" ); > > if ( Status( "action" ) == actionPortfolio ) > { > bo = GetBacktesterObject(); > > bo.Backtest( 1 ); // run default backtest procedure > > // iterate through closed trades first > > for ( trade = bo.GetFirstTrade(); trade; trade = bo.GetNextTrade > () ) > { > trade.AddCustomMetric( "Condition", trade.Score ); > } > > bo.ListTrades(); > } > > --- In amibroker@xxxxxxxxxxxxxxx, "ozzyapeman" zoopfree@ wrote: > > > > Taking the suggestion from Tomasz, I use the reserved variable > > "MarginDeposit" to store my condition numbers, which I then feed > back > > into the custom backtester. In my mind, the following code should > do the > > trick. I don't get any syntax errors and I can't see any flaw in > logic. > > Yet my "Condition" column in the backtest report contains no values. > > > > In the code below, shouldn't the MarginDeposit array contain all > values > > of "a" for each Buy? If not, why not, and what would be the right > > approach? Been pulling my hair out for a couple of days on this > problem. > > And I know it has to be something simple: > > > > > > > > //------------------------------------------------------------------ > ----\ > > -- > > // SIMPLE TRADING SYSTEM BASED ON VARIOUS CONDITIONS > > //------------------------------------------------------------------ > ----\ > > -- > > > > FastMA = MA( C, 10 ); > > SlowMA = MA( C, 20 ); > > > > Condition1 = Cross(FastMA, SlowMA); > > Condition2 = Cross(SlowMA, FastMA); > > Condition3 = Cross(C, SlowMA); > > Condition4 = Cross(SlowMA, C ); > > > > > > for(a = 1; a < 5; a++) > > { > > Condition = VarGet( "Condition" + NumToStr( a, 1.0, 0 ) ); > > > > Buy = Condition; > > MarginDeposit = IIf(Condition, a, 0); // Reserved variable > > "MarginDeposit" is used to store the > > // Condition numbers > whenever a > > Condition is True. > > > > Sell = BarsSince(Buy) > 12; > > } > > > > > > //------------------------------------------------------------------ > ----\ > > ----- > > // WANT TO ADD THE CUSTOM COLUMN, "CONDITION" TO BACKTEST REPORT > > //------------------------------------------------------------------ > ----\ > > ----- > > > > SetCustomBacktestProc(""); > > > > if( Status("action") == actionPortfolio ) > > { > > bo = GetBacktesterObject(); > > > > bo.Backtest(1); // run default backtest procedure > > > > // iterate through closed trades first > > for( trade = bo.GetFirstTrade(); trade; trade = bo.GetNextTrade > () ) > > { > > trade.AddCustomMetric("Condition", MarginDeposit ); > > } > > > > bo.ListTrades(); > > } > > > > > > > > > > > > > > > > > > > > > > --- In amibroker@xxxxxxxxxxxxxxx, "ozzyapeman" <zoopfree@> wrote: > > > > > > Thanks Tomasz. That's helpful. I had forgotten that we can use > one of > > > the setoptions to store and recall data. > > > > > > One last key question (for anyone). And I feel like a klutz asking > > > something so simple, given that I've been doing AFL now for six > > months. > > > But sometimes these simple things can be elusive. > > > > > > How do I flag each "a" value every time there is a Buy, without > going > > > into a Barcount loop? I find that Barcount loops always slow down > my > > > AFLs. > > > > > > I can't just do: > > > > > > if(Buy) {then do something} > > > > > > since if() does not work with arrays. > > > > > > Is there any way around this, so that I can dynamically pass "a" > > values > > > into a setoption or static var? Or is this simply a case where a > > > Barcount loop *must* be used? > > > > > > > > > > > > > > //------------------------------------------------------------------ > ----\ > > \ > > > -- > > > // SIMPLE TRADING SYSTEM BASED ON VARIOUS CONDITIONS > > > > > //------------------------------------------------------------------ > ----\ > > \ > > > -- > > > > > > FastMA = MA( C, 10 ); > > > SlowMA = MA( C, 20 ); > > > > > > Condition1 = Cross(FastMA, SlowMA); > > > Condition2 = Cross(SlowMA, FastMA); > > > Condition3 = Cross(C, SlowMA); > > > Condition4 = Cross(SlowMA, C ); > > > > > > for(a = 1; a < 5; a++) > > > { > > > Condition = VarGet( "Condition" + NumToStr( a, 1.0, 0 ) ); > > > Buy = Condition; > > > Sell = BarsSince(Buy) > 12; > > > } > > > > > > > > > > > //------------------------------------------------------------------ > ----\ > > \ > > > ----- > > > // WANT TO ADD THE CUSTOM COLUMN, "CONDITION" TO BACKTEST REPORT > > > > > //------------------------------------------------------------------ > ----\ > > \ > > > ----- > > > > > > SetCustomBacktestProc(""); > > > > > > if( Status("action") == actionPortfolio ) > > > { > > > bo = GetBacktesterObject(); > > > > > > bo.Backtest(1); // run default backtest procedure > > > > > > // iterate through closed trades first > > > for( trade = bo.GetFirstTrade(); trade; trade = > bo.GetNextTrade() > > ) > > > { > > > trade.AddCustomMetric("Condition", a ); > > > } > > > > > > bo.ListTrades(); > > > } > > > > > > > > > --- In amibroker@xxxxxxxxxxxxxxx, "Tomasz Janeczko" groups@ wrote: > > > > > > > > You need to pass that in either > > > > a) series (set) of static variables > > > > or > > > > b) addtocomposite/foreign > > > > or > > > > c) files (fopen/fputs/fgets/fclose) > > > > or > > > > d) unused trade/position variable (can be for example > margindeposit > > if > > > you don't use it). > > > > > > > > Best regards, > > > > Tomasz Janeczko > > > > amibroker.com > > > > ----- Original Message ----- > > > > From: "ozzyapeman" zoopfree@ > > > > To: amibroker@xxxxxxxxxxxxxxx > > > > Sent: Friday, December 26, 2008 5:50 PM > > > > Subject: [amibroker] Re: Adding a Custom Metric to Backtest > Report > > > > > > > > > > > > > Thanks Mike. I eventually figured as much. > > > > > > > > > > Still trying to figure out a way to dynamically pass the > correct > > "a" > > > > > value to the backtester. > > > > > > > > > > Any ideas on a general approach to this? I need to somehow > collect > > > an > > > > > "a" value each time there is a Buy, and store those somewhere > so > > > they > > > > > can be read back by the custom backtester code. > > > > > > > > > > > > > > > --- In amibroker@xxxxxxxxxxxxxxx, "Mike" sfclimbers@ wrote: > > > > >> > > > > >> Hi, > > > > >> > > > > >> Note that your loop will iterate until 'a' equals 5, at which > > point > > > > >> the looping will terminate. In your backtest code, you are > > > referring > > > > >> to the value of 'a' which we've just established will always > be > > 5. > > > > >> The custom backtest code is run *after* the rest of the > script > > code > > > > >> has been run for all symbols. > > > > >> > > > > >> Mike > > > > >> > > > > >> --- In amibroker@xxxxxxxxxxxxxxx, "ozzyapeman" <zoopfree@> > wrote: > > > > >> > > > > > >> > Thank you for pointing out that specific example. That > helps me > > > add > > > > >> the > > > > >> > column to the backtest report. > > > > >> > > > > > >> > But I am still at a loss in feeding back the > actual "Condition" > > > > >> value to > > > > >> > the custom metric. If I was building that custom metric > from > > > other > > > > >> > metrics already in the report, it would be easy (and I have > > done > > > so > > > > >> in > > > > >> > the past). > > > > >> > > > > > >> > But how do I pass back the value of an actual variable > from my > > > > >> trading > > > > >> > AFL, each time a Buy is true? > > > > >> > > > > > >> > This is what I now have, but the Condition column always > shows > > > "5" > > > > >> in > > > > >> > the backtest report : > > > > >> > > > > > >> > > > > > >> > > > > //---------------------------------------------------------------- > -- > > > > >> ----\ > > > > >> > -- > > > > >> > // SIMPLE TRADING SYSTEM BASED ON VARIOUS CONDITIONS > > > > >> > > > > //---------------------------------------------------------------- > -- > > > > >> ----\ > > > > >> > -- > > > > >> > > > > > >> > FastMA = MA( C, 10 ); > > > > >> > SlowMA = MA( C, 20 ); > > > > >> > > > > > >> > Condition1 = Cross(FastMA, SlowMA); > > > > >> > Condition2 = Cross(SlowMA, FastMA); > > > > >> > Condition3 = Cross(C, SlowMA); > > > > >> > Condition4 = Cross(SlowMA, C ); > > > > >> > > > > > >> > for(a = 1; a < 5; a++) > > > > >> > { > > > > >> > Condition = VarGet( "Condition" + NumToStr( a, 1.0, > 0 ) ); > > > > >> > Buy = Condition; > > > > >> > Sell = BarsSince(Buy) > 12; > > > > >> > } > > > > >> > > > > > >> > > > > > >> > > > > //---------------------------------------------------------------- > -- > > > > >> ----\ > > > > >> > ----- > > > > >> > // WANT TO ADD THE CUSTOM COLUMN, "CONDITION" TO BACKTEST > > REPORT > > > > >> > > > > //---------------------------------------------------------------- > -- > > > > >> ----\ > > > > >> > ----- > > > > >> > > > > > >> > SetCustomBacktestProc(""); > > > > >> > > > > > >> > if( Status("action") == actionPortfolio ) > > > > >> > { > > > > >> > bo = GetBacktesterObject(); > > > > >> > > > > > >> > bo.Backtest(1); // run default backtest procedure > > > > >> > > > > > >> > // iterate through closed trades first > > > > >> > for( trade = bo.GetFirstTrade(); trade; trade = > > > bo.GetNextTrade > > > > >> () ) > > > > >> > { > > > > >> > trade.AddCustomMetric("Condition", a ); > > > > >> > } > > > > >> > > > > > >> > bo.ListTrades(); > > > > >> > } > > > > >> > > > > > >> > > > > > >> > > > > > >> > > > > > >> > > > > > >> > --- In amibroker@xxxxxxxxxxxxxxx, "Tomasz Janeczko" > <groups@> > > > wrote: > > > > >> > > > > > > >> > > Everything is explained with examples in the User's Guide > > > > >> > > http://www.amibroker.com/guide/a_custommetrics.html > > > > >> > > > > > > >> > > See example 3. > > > > >> > > ============ > > > > >> > > > > > > >> > > Best regards, > > > > >> > > Tomasz Janeczko > > > > >> > > amibroker.com > > > > >> > > ----- Original Message ----- > > > > >> > > From: ozzyapeman > > > > >> > > To: amibroker@xxxxxxxxxxxxxxx > > > > >> > > Sent: Friday, December 26, 2008 1:26 AM > > > > >> > > Subject: [amibroker] Adding a Custom Metric to Backtest > > > Report > > > > >> > > > > > > >> > > > > > > >> > > I have been able to add custom metrics to the > Optimization > > > > >> Reports, > > > > >> > but for some reason can't add a column to the Trade List > > Backtest > > > > >> > report. Hoping someone might be able to chime in here, as > the > > > custom > > > > >> > backtester confuses me. > > > > >> > > > > > > >> > > What I want to do is fairly simple. In my actual > trading > > > > >> system, I > > > > >> > cycle through hundreds of possible conditions per bar. If > any > > one > > > > >> > condition is true, then I Buy. I want to add a custom > metric to > > > the > > > > >> > backtest report that lists which condition generated the > Buy > > > signal. > > > > >> > > > > > > >> > > For the sake of debugging, below is a very simplified > AFL > > > (not > > > > >> my > > > > >> > actual system). I simply want to feedback the condition > number > > > into > > > > >> the > > > > >> > backtester. But it does not work. If I add an optimize > > statement > > > at > > > > >> the > > > > >> > top, it will add the custom metric to the Optimization > report. > > > But > > > > >> even > > > > >> > then that column does not reflect correct values. > > > > >> > > > > > > >> > > So how do I add the column to the Backtest report? I > would > > > have > > > > >> > thought the below code would do the trick. And how do I > > feedback > > > the > > > > >> > correct values? Perhaps I need to FPUT each condition, > during > > the > > > > >> loop, > > > > >> > to an external file, then FGET the file for every trade in > the > > > > >> > backtester? That might work, but feels inefficient: > > > > >> > > > > > > >> > > > > > > >> > > > > > > >> > > > > //---------------------------------------------------------------- > -- > > > > >> ----\ > > > > >> > -- > > > > >> > > // SIMPLE TRADING SYSTEM BASED ON VARIOUS CONDITIONS > > > > >> > > > > > > >> > > > > //---------------------------------------------------------------- > -- > > > > >> ----\ > > > > >> > -- > > > > >> > > > > > > >> > > FastMA = MA( C, 10 ); > > > > >> > > SlowMA = MA( C, 20 ); > > > > >> > > > > > > >> > > Condition1 = Cross(FastMA, SlowMA); > > > > >> > > Condition2 = Cross(SlowMA, FastMA); > > > > >> > > Condition3 = Cross(C, SlowMA); > > > > >> > > Condition4 = Cross(SlowMA, C ); > > > > >> > > > > > > >> > > for(a = 1; a < 5; a++) > > > > >> > > { > > > > >> > > Condition = VarGet( "Condition" + NumToStr( a, 1.0, > 0 ) > > ); > > > > >> > > Buy = Condition; > > > > >> > > Sell = BarsSince(Buy) > 12; > > > > >> > > } > > > > >> > > > > > > >> > > > > > > >> > > > > > > >> > > > > //---------------------------------------------------------------- > -- > > > > >> ----\ > > > > >> > ----- > > > > >> > > // WANT TO ADD THE CUSTOM COLUMN, "CONDITION" TO > BACKTEST > > > REPORT > > > > >> > > > > > > >> > > > > //---------------------------------------------------------------- > -- > > > > >> ----\ > > > > >> > ----- > > > > >> > > > > > > >> > > SetCustomBacktestProc( "" ); > > > > >> > > > > > > >> > > if ( Status( "action" ) == actionPortfolio ) > > > > >> > > { > > > > >> > > bo = GetBacktesterObject(); > > > > >> > > bo.Backtest( 1 ); // > > Call > > > > >> > Backtest but set NoTradeLists to true > > > > >> > > bo.AddCustomMetric( "Condition", a, > 0,0,0 ); // Add > > > the > > > > >> > custom metric > > > > >> > > bo.ListTrades > (); // Now > > > > >> generate > > > > >> > the backtest report with custom metric > > > > >> > > } > > > > >> > > > > > > >> > > > > > >> > > > > > > > > > > > > > > > > > > > > ------------------------------------ > > > > > > > > > > **** IMPORTANT **** > > > > > This group is for the discussion between users only. > > > > > This is *NOT* technical support channel. > > > > > > > > > > ********************* > > > > > TO GET TECHNICAL SUPPORT from AmiBroker please send an e-mail > > > directly to > > > > > SUPPORT {at} amibroker.com > > > > > ********************* > > > > > > > > > > For NEW RELEASE ANNOUNCEMENTS and other news always check > DEVLOG: > > > > > http://www.amibroker.com/devlog/ > > > > > > > > > > For other support material please check also: > > > > > http://www.amibroker.com/support.html > > > > > > > > > > ********************************* > > > > > Yahoo! Groups Links > > > > > > > > > > > > > > > > > > > > > > > > >
__._,_.___
**** IMPORTANT ****
This group is for the discussion between users only.
This is *NOT* technical support channel.
*********************
TO GET TECHNICAL SUPPORT from AmiBroker please send an e-mail directly to
SUPPORT {at} amibroker.com
*********************
For NEW RELEASE ANNOUNCEMENTS and other news always check DEVLOG:
http://www.amibroker.com/devlog/
For other support material please check also:
http://www.amibroker.com/support.html
*********************************
__,_._,___
|