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

Re: [amibroker] Re: Help with More Complicated JavaScript Needed


  • Date: Mon, 30 Nov 2009 18:51:02 +0100
  • From: Tomasz Janeczko <groups@xxxxxxxxxxxxx>
  • Subject: Re: [amibroker] Re: Help with More Complicated JavaScript Needed

PureBytes Links

Trading Reference Links

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@xxxxxxxxxxxxxxx, "Mike"<sfclimbers@xxx>  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@xxxxxxxxxxxxxxx, "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@xxxxxxxxxxxxxxx, "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@xxxxxxxxxxxxxxx, "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@xxxxxxxxxxxxxxx, "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@xxxxxxxxxxxxxxx, "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
>
>
>
>
>    


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

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

<*> 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:
    amibroker-digest@xxxxxxxxxxxxxxx 
    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/