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

[amibroker] Re: Cycling Through a Dynamically Modified Include File



PureBytes Links

Trading Reference Links

Ozzy,

In your more complex implementation of your condition generation, are 
you able to actually evaluate the result, rather than writing AFL to 
a file?

In the example you've given, I see no reason why you couldn't just 
have the function return the result of the evaluation (without 
bothering at all with any variables) as shown below. The example 
below gives the same results as your hard coded working version.

In other words, rather than generate strings, go ahead and evaluate 
what you would have generated. The actual values are preserved in the 
Score property of the trade. So, you no longer need a variable from 
which to recall the value later.

Mike

//---------------------------------------------------------
// FUNCTION:     ConditionGenerator()
//
// When called, this function calculates buying
// conditions based on a simple algorithm.
//
// For e.g. ConditionGenerator(2) calculates:
//
//  C > Ref(C, -2) AND Cross(C, MA(C,4) )
//---------------------------------------------------------

function ConditionGenerator( X )
{
    local Y;

    Y = X * 2;
    return ( C > Ref( C, -X ) AND Cross( C, MA( C, Y ) ) );
}

//--------------------------------------------------------
//  BACKTEST SOME CONDITIONS:
//--------------------------------------------------------

Buy = Sell = Short = Cover = PositionScore = 0;

for ( a = 1; a < 10; a++ )
{
    Condition = ConditionGenerator( a );
    Buy = Buy OR Condition;

    // Reserved variable "PositionScore" is used to store the
    // Condition numbers whenever a Condition is True:

    PositionScore = IIf( Condition AND NOT PositionScore, a, 
PositionScore );
}

Buy  = ExRemSpan( Buy, 12 );
Sell = Ref( Buy, -12 );


//--------------------------------------------------------
// 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@xxx> wrote:
>
> Hello, I got some great help from Mike (sfclimbers) in solving the 
first
> half of this problem, of cycling through a group of Buy conditions,
> adding a custom metric, and identifying conditions per trade . 
Thought
> all my issues were completely solved, but ran into an unexpected
> stumbling block when I tried to apply it to my actual trading 
system,
> which makes extensive use of Include files, and string generating
> algorithms. Hoping someone can help in pointing out my error (maybe 
even
> Mike if he ain't tired of me yet ;-) First, here is a block of code 
that
> *does* work, and gives the simple essence of what I want to achieve.
> This system outlines 9 different conditions, cycles through all in a
> backtest, and adds a column to the backtester to indicate which
> Condition was used for which trade:
> 
> 
> //--------------------------------------------------------
> // SIMPLE TRADING SYSTEM BASED ON VARIOUS CONDITIONS
> //--------------------------------------------------------
> 
> 
> Condition1 = C > Ref(C, -1) AND Cross(C, MA(C,2)  );
> Condition2 = C > Ref(C, -2) AND Cross(C, MA(C,4)  );
> Condition3 = C > Ref(C, -3) AND Cross(C, MA(C,6)  );
> Condition4 = C > Ref(C, -4) AND Cross(C, MA(C,8)  );
> Condition5 = C > Ref(C, -5) AND Cross(C, MA(C,10) );
> Condition6 = C > Ref(C, -6) AND Cross(C, MA(C,12) );
> Condition7 = C > Ref(C, -7) AND Cross(C, MA(C,14) );
> Condition8 = C > Ref(C, -8) AND Cross(C, MA(C,16) );
> Condition9 = C > Ref(C, -9) AND Cross(C, MA(C,18) );
> 
> 
> 
> //--------------------------------------------------------
> //  BACKTEST THE ABOVE GROUP OF CONDITIONS:
> //--------------------------------------------------------
> 
> Buy = Sell = Short = Cover = PositionScore = 0;
> 
> for ( a = 1; a < 10; a++ )
> {
> Condition = VarGet( "Condition" + NumToStr( a, 1.0, 0 ) );
> 
> Buy = Buy OR Condition;
> 
> // Reserved variable "PositionScore" is used to store the
> // Condition numbers whenever a Condition is True:
> 
> PositionScore = IIf( Condition AND NOT PositionScore, a, 
PositionScore
> );
> }
> 
> Buy  = ExRemSpan(Buy, 12);
> Sell = Ref(Buy, -12);
> 
> 
> 
> //--------------------------------------------------------
> // 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();
> }
> 
> Now in my actual trading system, I rely on a rather complex 
algorithm,
> to generate "Conditions" on the fly. Each such variable assignment 
is
> generated as a block of code, a few lines long, in string format. 
If I
> wanted to test out a handful of such conditions, it's no problem to
> simply paste the variable assignments directly into the AFL. 
However,
> when I want to cycle through thousands of such conditions, pasting 
does
> not work. Amibroker understandbly crashes. So the solution is to
> generate each variable assignment, one at a time, and dump to an
> external file which is #Included into the main AFL. At any one 
time, the
> external file only contains a single variable assignment. The 
problem
> arises when I loop through the external file. Only the last 
Condition is
> ever recognized as a Buy. I've tried using interim static 
variables, and
> AddToComposite to store true/false data for each condition, and test
> against that. But nothing seems to work.  Below is the basic code. 
Note
> that the function ConditionGenerator() is not the one in my actual
> trading system, but a much more simplified version for debug 
purposes.
> 
> As mentioned, only Condition9 ever gets set as a Buy in the backtest
> report. How do I get *all* conditions to be properly tested for
> potential Buys, so that this block of code essentially mimics the 
above
> block? (note you may first have to create a blank file on your 
drive,
> "c:\\ConditionsFile.afl" before running the code).
> 
> 
> //---------------------------------------------------------
> // FUNCTION:     ConditionGenerator()
> //
> // When called, this function generators buying
> // conditions, as a string, based on a simple algorithm.
> //
> // For e.g. ConditionGenerator(2) results in:
> //
> //  " Condition2 = C > Ref(C, -2) AND Cross(C, MA(C,4) ); "
> //---------------------------------------------------------
> 
>    function ConditionGenerator(X)
>     {
>      Y = X * 2;
> 
>      string = "Condition"+ NumToStr(X, 1.0,0) +" = C > Ref(C, -"
>             + NumToStr(X, 1.0,0)+ ") AND "
>             + "Cross(C, MA(C,"+NumToStr(Y, 1.0,0) + ") );" ;
> 
>      return string;
>     }
> //--------------------------------------------------------
> 
> 
> 
> 
> //--------------------------------------------------------
> //  BACKTEST SOME CONDITIONS:
> //
> //  Want to backtest a group of 9 Conditions
> //
> //  So we dump to an Include file and cycle through
> //  the conditions against historical data
> //--------------------------------------------------------
> 
> #include "c:\\ConditionsFile.afl";
> 
> Buy = Sell = Short = Cover = PositionScore = 0;
> 
> for ( a = 1; a < 10; a++ )
> {
> fh = fopen( "c:\\ConditionsFile.afl", "w");
> fputs(ConditionGenerator(a), fh);
> fclose( fh );
> 
> Condition = VarGet( "Condition" + NumToStr( a, 1.0, 0 ) );
> 
> Buy = Buy OR Condition;
> 
> PositionScore = IIf( Condition AND NOT PositionScore, a, 
PositionScore
> );
> 
> Buy  = ExRemSpan(Buy, 12);
> Sell = Ref(Buy, -12);
> }
> //--------------------------------------------------------
> 
> 
> 
> 
> //--------------------------------------------------------
> // 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();
> }
>



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

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

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