Hi all,
If anyone has some tips or advice for how to do this it would be greatly appreciated. I haven't found anything on the forum about this.
I'm trying to run an optimization across a set of entry conditions. The entry is selected by the value of one optimization parameter, then the code for each entry is a case in the following switch statement. Each entry has different optimization parameters. Like this
EntrySelection = Optimize( "Entry type", 1, 1, 2, 1 );
//Entry type 1 parameters
ET1param1 = Optimize( "ET1param1", 1, 1, 5, 1 );
ET1param2 = Optimize( "ET1param2", 1, 1, 5, 1 );
//Entry type 2 parameters
ET2param1 = Optimize( "ET2param1", 1, 1, 5, 1 );
ET2param2 = Optimize( "ET2param2", 1, 1, 5, 1 );
switch( EntrySelection )
{
case 1:
// Entry type 1
//code using ET1param1 and ET1param2, ET2xxx is not used
break;
case 2:
// Entry type 2
//code using ET2param1 and ET2param2, ET1xxx is not used
break;
default:
// default action
break;
}
How do I avoid running through all combinations of entry 1 parameters when entry 2 is selected? This results in many backtests with identical parameters and same results.
I know I could split this up and run each entry type separately, but I'm interested in doing the lot in one go.
Anyone? Thanks!
I've tried couple options, but looks like within the same formula all parameters need to be run. I would put each entry in a separate formulas and then run all of them using batch mode.
Yes that would work of course, but I had the idea (eventually) to run through all permutations of a set of entries and a set of exits, each with their own optimization parameters. So, would have been nice with a solution to do this in one hit.
As an idea - you can use only one number parameter which codes entry type and corresponding entry parameters. For example, first digit defines your entry type, next digit (or 2) defines 1st parameter for this entry type, next digit (or 2) defines 2nd parameter for this entry type etc.
p = Optimize( "Entry param", 100, 100, 299, 1);
EntrySelection = int(p/100);
switch( EntrySelection )
{
case 1:
// Entry type 1
// ET1param1 = function11(p)
// ET1param2 = function12(p)
//code using ET1param1 and ET1param2, ET2xxx is not used
break;
case 2:
// Entry type 2
// ET2param1 = function21(p)
// ET2param2 = function22(p)
//code using ET2param1 and ET2param2, ET1xxx is not used
break;
default:
// default action
break;
}
Playing with the number of digits and step size can give you quite large variety of the parameters.
Optimize() calls must be on global level and must not be called conditionally because
BEFORE your optimization is run, there is a SETUP phase that executes your code once, reads all optimize statements and calculates how many steps entire optimization would take.
What you can do is to use Exclude to exclude given parameter combinations
Exclude = ( param1 == 5 ); // exclude result when param1 is equal 5
When backtester sees Exclude equal to True it will NOT perform backtest for this combination and assume zero result (gain = 0).
Thanks for the ideas! @ab-trader: That's a creative idea. If I define a function that exhaustively lists only the combinations I'd like to test I should be able to do it. @Tomasz: This is the most elegant solution. Here's the code and it works nicely.
@Tomasz: When I use this method together with OptimizerSetEngine( "cmae" ); ,
I get very few results, so my assumption here is that I must use Exclude only with exhaustive optimization.
Also there can't be more than one Exclude statement.
Is my understanding correct?