Hello,

Wrong! WatchListBits is obsolete and is provided *only* for backward 
compatibility
and works ONLY for first 64 watch lists.

There are now *native* AmiBroker functions for adding/removing symbols
not only to watch lists but to *any* kind of category (including of 
course watch lists).

When everything fails, read the manual.

http://www.amibroker.com/f?categoryaddsymbol
http://www.amibroker.com/f?categoryremovesymbol

Best regards,
Tomasz Janeczko
amibroker.com


On 2009-11-30 18:44, bistrader wrote:
> Yep, got it.  Nice explanation.  Something you did not have to do!  Thanks 
> again!!
>
> --- In amibroker@yahoogroups.com, "Mike"<sfclimb...@...>  wrote:
>    
>> Let me prefix my comments by saying that there may be a more efficient way 
>> of doing it.
>>
>> I did not see any obvious OLE access for watchlists. However, there is 
>> access to the stocks in the database. Part of that stock access includes a 
>> bit field for which watchlists the stock belongs to.
>>
>> Therefore, to empty the watchlist we could iterate through the universe of 
>> stocks and remove each from the target watchlist by clearing (i.e. setting 
>> to 0) the bit identifying the target watchlist. In the world of bitwise 
>> manipulation, you can clear a bit by "and-ing" it with 0 (i.e. false) since 
>> anything "and false" will always be false as a whole.
>>
>> Similarly, to add all stocks to the watchlist, we could iterate through the 
>> universe of stocks and set (i.e. change to 1) the bit for the target 
>> watchlist. In the world of bitwise manipulation, you can set a bit by 
>> "or-ing" it with 1 (i.e. true) since anything "or true" will always be true 
>> as a whole.
>>
>> Combining the two approaches, a single loop can be employed to either set or 
>> clear the watchlist bit based on the desirability of the stock being 
>> considered. Thus leaving the only question to be which stocks to include?
>>
>> In your case the answer is those stocks found in your .csv file.
>>
>> Approach 1.
>> Using a single iteration through the universe of database stocks, we could 
>> have searched for each stock in your file, and upon finding the stock set 
>> it's watchlist bit, else cleared it's watchlist bit. But, if there were 'n' 
>> stocks in the database, that would mean n searches of your .csv file. File 
>> manipations are not cheap.
>>
>> Approach 2.
>> Alternatively, we could have done an initial sweep of the universe of 
>> database stocks to clear the bit for all of them. Then done a single 
>> iteration of your .csv file and for each stock compared it to every stock in 
>> the database until we found the match, at which point we would set the bit 
>> for that database stock. But, if there were 'n' stocks in your watchlist, we 
>> would have done at least a partial iteration through the database of stocks 
>> n+1 times (once to clear all, then n more times up until each stock was 
>> found).
>>
>> Assuming that searching a string is less expensive than searching line by 
>> line through a file, I instead constructed a single string prefixed with a 
>> comma, followed by a comma separated list of all the stocks in your .csv 
>> file, and suffixed with a comma.
>>
>> e.g.
>> ",ORCL,IBM,AAPL,"
>>
>> Now, using Approach 1 above, we can simply search the string instead of 
>> searching your .csv file. Since there may be overlap between stock names 
>> (e.g. A and AA), we rely on the commas as delimeters for complete names and 
>> search for ",A," and ",AA," respectively.
>>
>> Make sense?
>>
>> Mike
>>
>> --- In amibroker@yahoogroups.com, "bistrader"<bistrader@>  wrote:
>>      
>>> Thanks Mike.  I did each, will do more and give it a try.  I am sure I will 
>>> get it,  Today, I do not totally understand exactly what the following code 
>>> you provided is doing.  It seems to be comparing 2 strings by looping thru 
>>> all stocks in the database.  I have read via google and am not clear.
>>>
>>>     for (j = 0; j<  count; j++) {
>>>        stock = stocks.Item(j);
>>>
>>>        if (tickers.indexOf("," + stock.Ticker + ",")>= 0) {
>>>           stock.WatchListBits |= 1<<  20;      // Add to watchlist 20
>>>        } else {
>>>           stock.WatchListBits&= !(1<<  20);   // Remove from watchlist 20
>>>        }
>>>
>>>
>>>
>>> --- In amibroker@yahoogroups.com, "Mike"<sfclimbers@>  wrote:
>>>        
>>>> Microsoft's MSDN has good coverage for much of what is available.
>>>>
>>>> e.g. file usage:
>>>> http://msdn.microsoft.com/en-us/library/czxefwt8(VS.85).aspx
>>>>
>>>> They also have an area dedicated to JScript, which I haven't sifted 
>>>> through yet.
>>>>
>>>> http://msdn.microsoft.com/en-us/library/4yyeyb0a(VS.85).aspx
>>>>
>>>> Whenever I need something, I just google for an english description of 
>>>> what I want, like "how to ... in JScript". You usually end up wading 
>>>> through a bunch of javascript web development specific stuff. But, 
>>>> eventually you hit a JScript example in a user forum somewhere.
>>>>
>>>> Mike
>>>>
>>>> --- In amibroker@yahoogroups.com, "bistrader"<bistrader@>  wrote:
>>>>          
>>>>> Mike, I did not see this and do not know how I missed it.  I studied.  I 
>>>>> understand all of the basic code and loop.  I do not understand first 4 
>>>>> lines and will do google search on these.  Maybe you or someone else has 
>>>>> a good site or document to go to, to do better job at JavaScript.  Thanks 
>>>>> so much for your help.
>>>>>
>>>>> --- In amibroker@yahoogroups.com, "Mike"<sfclimbers@>  wrote:
>>>>>            
>>>>>>
>>>>>> I believe that the following will serve as a skeleton for the desired
>>>>>> steps 1, 2, 5.
>>>>>>
>>>>>> fso = new ActiveXObject("Scripting.FileSystemObject");
>>>>>> ab = new ActiveXObject("Broker.Application");
>>>>>> stocks = ab.Stocks;
>>>>>> count = stocks.Count;
>>>>>> aa = ab.Analysis;
>>>>>>
>>>>>> for (i = 1; i<= 10; i++) {
>>>>>>      f = fso.GetFile("c:\\temp\\Input" + i + ".csv");
>>>>>>      ts = f.OpenAsTextStream(1, 0);  // Open for read of ASCII
>>>>>>      tickers = ",";
>>>>>>
>>>>>>      while (!ts.AtEndOfStream) {
>>>>>>         tickers += ts.ReadLine();   // Assume one ticker per line in .csv
>>>>>> file
>>>>>>         tickers += ",";
>>>>>>      }
>>>>>>
>>>>>>      ts.Close();
>>>>>>
>>>>>>
>>>>>>      for (j = 0; j<  count; j++) {
>>>>>>         stock = stocks.Item(j);
>>>>>>
>>>>>>         if (tickers.indexOf("," + stock.Ticker + ",")>= 0) {
>>>>>>            stock.WatchListBits |= 1<<  20;      // Add to watchlist 20
>>>>>>         } else {
>>>>>>            stock.WatchListBits&= !(1<<  20);   // Remove from watchlist
>>>>>> 20
>>>>>>         }
>>>>>>      }
>>>>>>
>>>>>>      ab.RefreshAll();
>>>>>>
>>>>>>      // Your backtest here.
>>>>>>      // Your exploration here.
>>>>>> }
>>>>>>
>>>>>> Mike
>>>>>>
>>>>>>
>>>>>> --- In amibroker@yahoogroups.com, "bistrader"<bistrader@>  wrote:
>>>>>>              
>>>>>>> I am working on a second JavaScript that I will post when done. I want
>>>>>>>                
>>>>>> it to do the following.
>>>>>>              
>>>>>>> 1. Makes watchlist 20 empty.
>>>>>>> 2. Reads Input1.csv symbols into watchlist 20.
>>>>>>> 3. Runs a backtest on MyBacktest.afl with filter at watchlist 20.
>>>>>>> 4. Then, runs an exploration on MyExploration.afl using current symbol
>>>>>>>                
>>>>>> loaded in AB. This exploration creates a text file called Output1.csv to
>>>>>> match up with Input1.csv
>>>>>>              
>>>>>>> 5. Loops thru Step 1 thru Step4 for a total of 10 times starting with
>>>>>>>                
>>>>>> Input1.csv and ending with Input10.csv. In the end, there are
>>>>>> Output1.csv thru Output10.csv.
>>>>>>              
>>>>>>> I know how to do Steps 3 and 4. I do not know as of yet how to do
>>>>>>>                
>>>>>> Steps 1, 2 and 5 in JavaScript. Help is appreciated and thanks!!
>>>>>>              
>>>>>>> Bert
>>>>>>>
>>>>>>>                
>>>>>>              
>>>>>            
>>>>          
>>>        
>>      
>
>
>
> ------------------------------------
>
> **** IMPORTANT PLEASE READ ****
> This group is for the discussion between users only.
> This is *NOT* technical support channel.
>
> TO GET TECHNICAL SUPPORT send an e-mail directly to
> SUPPORT {at} amibroker.com
>
> TO SUBMIT SUGGESTIONS please use FEEDBACK CENTER at
> http://www.amibroker.com/feedback/
> (submissions sent via other channels won't be considered)
>
> For NEW RELEASE ANNOUNCEMENTS and other news always check DEVLOG:
> http://www.amibroker.com/devlog/
>
> Yahoo! Groups Links
>
>
>
>
>    

Reply via email to