| 
 Hi TJ - I sent a couple of messages to support on 
this topic maybe 3-4 weeks ago and never received any reply. Sorry, I have 
deleted them now so can't give you a ticket number. The only problem with this 
method is that I don't see any way to sort the results by ticker. The first 
column shows the ticker symbol but it is preceded by the opt step and so won't 
sort by ticker. I tried to get around this by using the CBT to add a column with 
*only* the ticker name but that doesn't sort properly either. Could you please 
give me your thoughts on this, whether it is a sorting bug or whether there is 
any way to work around it, etc? Thank you very much. 
  
Steve 
  ----- Original Message -----  
  
  
  Sent: Wednesday, October 29, 2008 5:22 
  AM 
  Subject: Re: [amibroker] Re: Auto 
  optimize all stocks 
  
  
  If you are using JScript inside AFL (by the way I don't see 
  the reason to use JScript anymore since 
  looping, functions and all that stuff is in AFL), and call 
  any external ActiveX - they may change 
  the current working directory for current 
  process. 
    
  Also individual optimization for each symbol is built in feature - don't see the reason to make it hard way 
  as 
  you do.  It is called individual optimization and 
  available  via Optimize( 1 ) 
    
  
    
  Analysis.Optimize(Type = 2 ); - runs optimization Type 
  parameter can be one of the following values: 0 : portfolio 
  backtest/optimize 1 : individual 
  backtest/optimize 2 : old backtest/optimize 3 : 
  walk-forward test (AmiBroker version 5.11.0 or higher) 
    
  Best regards, Tomasz Janeczko amibroker.com 
  
    ----- Original Message -----  
    
    
    Sent: Wednesday, October 29, 2008 6:11 
    AM 
    Subject: [amibroker] Re: Auto optimize 
    all stocks 
    
  Thanks for the feedback.  I did a full symantec virus 
    scan today, and three different rootkit scans, and all came up with 
    nothing (except for some supposedly innocuous entries and cookies). 
     This computer is only a couple months old, and not used for much on 
    the internet (behind firewalls), so I doubt I have a virus or rootkit, 
    but I'll keep checking.
  I use #include_once for all includes, all 
    relative to the  "Standard include path", which is just 
    "Formulas\Include". Nothing in my script is trying to change the current 
    working directory for AmiBroker, so it must be some external program. 
     But if programs are running outside of AmiBroker, could any of them 
    change the current working directory for AmiBroker without being a virus 
    or rootkit?  I don't know how windows (XP) works well enough to 
    know, but that would be a bad situation if it were possible.
  Over 
    a couple years of using AmiBroker, on three different computers,  I have 
    frequently seen script error messages reported relative to the 
    wrong files.  But these are legitimate errors, just reported 
    incorrectly, which I  deal with just by editing carefully in only making 
    modest code changes so I have a chance of figuring out what has gone 
    wrong.
  I wonder if using EnableScript("jscript"); has 
    something to do with these file mixups.  I am not doing any file 
    manipulation in the jscript code, but I am doing AFL file 
    operations.  I can send you my code if you want to take a closer 
    look.
  I will try running my script with minimal other external 
    programs to see if that helps.  Thanks 
    again.
  dan
 
  --- In amibroker@xxxxxxxxxxxxxxx, "Tomasz 
    Janeczko" <groups@xxx> wrote: > > The error message you 
    get is clearly because the include can no longer be found. Apparently you 
    are using relative > paths, and something in your script or some 
    external program (virus?) has changed current working directory for 
    AmiBroker. > I suggest deep virus and rootkit scan using different 
    scanners, as rootkits can hide so ordinary scanners don't detect 
    anything. >  > Best regards, > Tomasz Janeczko > 
    amibroker.com > ----- Original Message -----  > From: liberte721 
     > To: amibroker@xxxxxxxxxxxxxxx  > Sent: Tuesday, October 28, 
    2008 5:18 AM > Subject: [amibroker] Re: Auto optimize all 
    stocks >  >  > I've made some progress figuring out the 
    crashes in my auto automize jscript.  >  > First, I tried using 
    the Commentary window like this: >  > 
    AB.Commentary.LoadFormula(saverFormula); > AB.Commentary.Apply(); 
     > AB.Commentary.close(); >  > But this had an undesirable 
    side effect in that the saverFormula was executed 4 times. (The first time 
    appeared to be using a cache of the previous version of the saverFormula, in 
    fact.) Why there are 4 executions, I don't know (I don't have AmiBroker open 
    in another window, and I start my auto-optimize script with no AmiBroker 
    running), and I don't see any easy way to detect when a particular execution 
    is one of the extras. So I gave up on that. >  > So using the 
    Backtest call as before, I added another Sleep call after loading the 
    formula and before the backtest, like so: >  > AA.LoadFormula( 
    saverFormula ); > WScript.Sleep( 1000 ); > 
    AA.Backtest(); > WScript.Sleep( 1000 ); >  > And this 
    seems to work much more reliably. I made it through one whole run without 
    incident. >  > On to the next crash... Gaining confidence, I was 
    simultaneously running a few browser windows (Firefox and IE) but I was not 
    using the computer otherwise, when, after 40 minutes of running, I got the 
    following interesting error. >  > DBVOn = 
    ParamToggle("DebugView","OFF|ON", 0); >  > function T > 
    ---------^ >  > Error 31. > Syntax error, expecting 
    IDENTIFIER >  > This is bizarre because this same bit of script 
    has been executing many thousands of times without problem. This is in my 
    debug.afl that is the first #include in my main afl. Here it is: > 
     >  >  > ClearDBV = ParamTrigger("Clear DebugView","CLEAR 
    DBV");  > if( ClearDBV ) _TRACE("# DBGVIEWCLEAR");  >  > 
    //traceIfScanning = Status("action") == actionBacktest;  >  > 
    DBVOn = ParamToggle("DebugView","OFF|ON", 0);  >  > function 
    TRACE( DBVString )  > {  > global DBVOn;  > global symbol; 
     > statusActionList = 
    "ZERO,INDICATOR,COMMENTARY,SCAN,EXPLORATION,BACKTEST / OPTIMIZE";  > 
    statusAction = StrExtract( statusActionList, Status( "action" ) );  > 
     > if ( DBVOn )  > _TRACE( "# " + symbol +  > " " + 
    statusAction +  > " " + DBVString  > );  > }  > 
     >  > So is AmiBroker totally confused at this point? Why does 
    it think there is a syntax error? It's pointing at what looks like a 
    perfectly fine identifier even. Is it maybe looking in the wrong file? 
     >  > I believe this AB OLE interface needs to be made much more 
    robust before we can expect mere mortals to use it. It needs a lot more 
    detailed documentation as well. I find I am guessing half the time what 
    things are supposed to be doing.  >  > Thanks for any 
    help. >  >  >  > dan >  >  > --- 
    In amibroker@xxxxxxxxxxxxxxx, "Daniel LaLiberte" daniel.laliberte@ 
    wrote: > > > > Thanks for your reply and ideas. > 
    >  > > 1. I'm not sure the delays are necessary, but adding the 
    first delay before > > the AB.documents.open call appeared to help. 
    The second delay was in the > > code that I had copied to start 
    with, and I didn't see any explanation why > > it was there. It is 
    disturbing to think that the delays would help, > > actually, 
    because there is no amount of delay time that would be correct all > 
    > the time. There should be a way to call things safely. I would be happy 
    to > > add a busy wait loop if necessary, or a call to some 
    function that doesn't > > return until it is safe to 
    proceed. > >  > > 2. Making the problem worse might be a 
    good strategy to figure it out. > > There are many more ways things 
    could go wrong than right, however, so I > > could easily get 
    distracted pursing the wrong things. Is there a list of > > known 
    causes of backtester failure? I doubt I have any obscure corner > > 
    cases in my afl script that cause runtime errors, e.g. divide by zero 
    and > > such, but it is possible. An "internal application error" 
    doesn't sound > > like that anyway. > >  > > 3. I 
    saw that use of the Commentary mode previously. Thanks for reminding > 
    > me. I'll try it. It would be handy if the optimizer would run one 
    more > > time after completing a run and set Status("ActionEx") 
    == > > actionExOptimizeShutdown. > >  > > 
    dan > >  > > On Sat, Oct 25, 2008 at 10:27 PM, Steve Davis 
    <_sdavis@ wrote: > >  > > > Thanks for posting this. 
    I intended to write something like this > > > myself and never 
    got around to it. Some thoughts: > > > > > > 1. Are 
    you sure the delays are needed? I've had good luck using AutoIt > > 
    > to watch for windows to open or close. > > > > > 
     > >  > > > 2. Instead of trying to fix the problem, 
    try to make it happen more > > > often. What would happen if you 
    never set the buy/sell arrays? Would > > > this cause the 
    backtester to fail? > > > > > > 3. The parameter 
    save script is invoking the backtester. There is > > > another 
    way to execute general purpose afl from a script without using > > 
    > the backtester. See this message: > > > 
    http://finance.groups.yahoo.com/group/amibroker/message/131038 > > 
    > > > > Cheers, > > > Steve > > 
    > > > > --- In amibroker@xxxxxxxxxxxxxxx 
    <amibroker%40yahoogroups.com>, > > > "liberte721" 
    daniel.laliberte@ > > > wrote: > > > > > 
    > > > > > > I have been using a JScript to run the AA 
    optimizer for each stock in a > > > > list and store the 
    optimum parameters in a file. The script is below. I > > > > 
    use a custom backtester that records the parameters that perform the > 
    > > > best so far, and after each optimization run, then I run 
    another script > > > > that saves the best 
    parameters. > > > > > > > > This works fine in 
    some cases and it runs through all of a 100 stocks, > > > > 
    but sometimes the application gets an error in one of a couple 
    different > > > > places. I'd like to find out why this fails 
    sometimes and how I can > > > > avoid it. More details on the 
    failures below. > > > > > > > > Here is the 
    custom backtester code, embedded in my afl script. > > > 
    > > > > > > > > > isOptimizeSetup = 
    Status("ActionEx") == actionExOptimizeSetup; > > > > > 
    > > > if (isOptimizeSetup) > > > > { > > 
    > > maxObjective = -999999999; > > > > 
    StaticVarSet("maxObjective", maxObjective); > > > > } > 
    > > > else > > > > { > > > > 
    maxObjective = StaticVarGet("maxObjective"); > > > > 
    } > > > > > > > > > > > > 
    SetOption("UseCustomBacktestProc", True ); > > > > > 
    > > > if ( Status( "action" ) == actionPortfolio ) > > 
    > > { > > > > bo = GetBacktesterObject( ); > > 
    > > bo.Backtest( ); // run default backtest procedure > > 
    > > > > > > st = bo.GetPerformanceStats(0); // get 
    stats for all trades > > > > > > > > // 
    Compute Objective value to be maximized. > > > > > > 
    > > // To minimize, maximize the negative. > > > > // 
    e.g. Objective = - ( abs( 100 - X * Y ) + abs( X - Y ) ); > > > 
    > > > > > NP = st.GetValue("NetProfit"); > > > 
    > LTL = st.GetValue("LosersTotalLoss"); > > > > objective 
    = NP - sqrt(-LTL); > > > > > > > > // 
    defaultParams is a string with all the parameter values assigned > 
    > > > by Optimize calls. > > > > _Trace( "max: " + 
    maxObjective + " objective: " + objective + " > > > > params: 
    " + defaultParams); > > > > > > > > if ( 
    objective > maxObjective ) > > > > { > > > 
    > maxObjective = objective; > > > > _Trace("new max: " + 
    maxObjective + " params: " + > > > defaultParams ); > > 
    > > StaticVarSet("maxObjective", maxObjective ); > > > 
    > StaticVarSetText("maxParams", defaultParams); > > > > 
    } > > > > > > > > // Add "objective" 
    column. > > > > // REMEMBER - Set the Optimization target to 
    "objective" in AA > > > > Settings / Walk-Forward > 
    > > > > > > > bo.AddCustomMetric( "objective", 
    objective ); > > > > } > > > > > > 
    > > > > > > In my afl script for saving the optimum 
    parameters I do the following: > > > > > > > > 
    maxParams = StaticVarGetText("maxParams"); > > > > 
    _Trace("Save params " + maxParams); > > > > 
    saveParams(maxParams); > > > > > > > > I am 
    leaving out a few details which should be irrelevant. The > > > 
    > saveParams function ultimately calls fputs to write the 
    parameters. > > > > > > > > And here is my 
    script for running the AA Optimize and calling the save > > > 
    > script for each stock: > > > > > > > 
    > > > > > // Loop through all stocks in a watchlist, or 
    (if negative) all stocks. > > > > // For each one, run the 
    optimizer, and then run the saverFormula, which > > > > 
    should do the right thing to save parameters. > > > > // I 
    use a custom backtester that remembers the optimum set of > > > 
    > parameters. > > > > > > > > database = 
    "C:\\Program Files\\Amibroker\\IB"; > > > > iWatchList = -1; 
    // negative means all symbols - see below > > > > > 
    > > > formula = "Formulas\\Systems\\Mine\\HLMA.afl"; > > 
    > > saverFormula = "Formulas\\Utilities\\SaveOptParams.afl"; > 
    > > > settingsFile = "path to settings file"; > > > 
    > > > > > AB = new ActiveXObject( "Broker.Application" 
    ); > > > > AB.LoadDatabase( database ); > > > 
    > AB.Visible = false; // Maybe visible mode causes problems? > > 
    > > AA = AB.Analysis; > > > > > > > > 
    Qty = AB.Stocks.Count; > > > > //WScript.echo("Total number 
    of stocks: " + Qty); > > > > > > > > for ( i = 
    0; i < Qty; i++ ) > > > > { > > > > Stk = 
    AB.Stocks( i ); > > > > > > > > if ( 
    iWatchList < 0 || > > > > ( iWatchList < 32 > 
    > > > ? ( Stk.WatchListBits & ( 1 << iWatchList ) 
    ) > > > > : ( Stk.WatchListBits2 & ( 1 << ( 
    iWatchList - 32 ) ) ) ) > > > > ) > > > > 
    { > > > > //WScript.echo("Optimize Stock: " + 
    Stk.Ticker); > > > > WScript.Sleep( 4000 ); // without this, 
    the script will crash > > > > occasionally. > > > 
    > > > > > try > > > > { > > > 
    > Doc = AB.Documents.Open( Stk.Ticker ); > > > > 
    WScript.Sleep( 4000 ); // 4 seconds delay. Why? > > > 
    > > > > > /* load formula from external file */ > 
    > > > AA.LoadFormula( formula ); > > > > > 
    > > > /* optional: load settings */ > > > > // 
    AA.LoadSettings( settingsFile ); > > > > > > > 
    > /* set apply to and range */ > > > > AA.ApplyTo = 1; // 
    use current stock > > > > AA.RangeMode = 2; // use last n 
    days of quotes > > > > AA.RangeN = 100; > > > 
    > > > > > /* run optimize for the portfolio, which is just 
    one stock > > > > */ > > > > AA.Optimize( 0 ); 
    // 0 == portfolio opt > > > > //AA.Export( "C:\\" + 
    Stk.Ticker + ".csv" ); > > > > > > > > 
    AA.LoadFormula( saverFormula ); > > > > 
    AA.Backtest(); > > > > } > > > > catch ( err 
    ) > > > > { > > > > > > > > 
    } > > > > > > > > finally > > > 
    > > > > > { > > > > Doc.Close(); > 
    > > > } > > > > WScript.Sleep( 1000 ); > > 
    > > } > > > > } > > > > > > 
    > > > > > > Regarding the failures, the lastest failure 
    is inside the custom > > > > backtester code, on the line 
    that says bo.Backtest(). The error message > > > > alert 
    says: > > > > > > > > Error 19. > > 
    > > COM method/function 'Backtest' call failed. > > > 
    > > > > > Internal application error. > > > 
    > > > > > Earlier, I was getting occasional errors in the 
    jscript on the line that > > > > says Doc = 
    AB.Documents.Open( Stk.Ticker ); . > > > > I don't recall the 
    error message. My stocks have not changed and I was > > > > 
    running the same script with errors occurring at different times. I > 
    > > > added the Sleep calls to maybe avoid the problem, but it kept 
    happening. > > > > I wrapped a try ... catch around the whole 
    body of the loop to hopefully > > > > continue even if an 
    error occurs, but now I am getting the error > > > > 
    described above inside. > > > > > > > > Any 
    suggestions appreciated. > > > > > > > > 
    dan > > > > daniel.laliberte@ > > > > > 
    > > > > >  > > > > >  > > 
     > >  > > --  > > Daniel LaLiberte > > 
    liberte@ > > daniel.laliberte@ > > >
    
__._,_.___
  
**** 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 
 
********************************* 
  
     
    
 
      
   
__,_._,___
 |